Server Events
This section covers functional server events that trigger during gameplay actions.
XP Event
Triggered when a player gains or loses XP in a skill:
PmmoJS.xp((event) => {const player = event.getEntity(); // get the playerconst skill = event.getSkill(); // get the skillconst startLevel = event.startLevel(); // get the start levelconst endLevel = event.endLevel(); // get the end levelconst isLevelUp = event.isLevelUp(); // get if the player is level upconst context = event.getContext(); // get the contextif (isLevelUp) {// Reward players with diamond every 10 levelsif (endLevel % 10 === 0) {player.give(Item.of("minecraft:diamond", 1));}// Special reward for reaching magic level 50if (skill === "magic" && endLevel === 50) {player.give(Item.of("minecraft:enchanted_book"));}}// Block all mining XP gainsif (skill === "mining") {event.cancel();}// Check for experience source contextif (context.contains("source")) {const source = context.getString("source");}});
Enchant Event
Triggered when a player enchants an item:
PmmoJS.enchant((event) => {const player = event.getEntity(); // get the playerconst enchantment = event.getEnchantmentInstance(); // get the enchantment instanceconst stack = event.getStack(); // get the stack// Only process high-level enchantments (III+)if (enchantment.level >= 3) {// Extract clean enchantment name from translation keyconst enchantName = enchantment.enchantment.getDescriptionId().replace("enchantment.minecraft.", "");// Assign XP based on enchantment typeif (enchantName === "sharpness" || enchantName === "power") {SKillHelper.addXP(player, "combat", 50 * enchantment.level) // Melee/ranged combat XP} else if (enchantName === "efficiency" || enchantName === "fortune") {SKillHelper.addXP(player, "mining", 50 * enchantment.level) // Mining/utility XP} else {SKillHelper.addXP(player, "magic", 30 * enchantment.level) // General magic XP}}});
Furnace Event
Triggered when a furnace completes smelting:
PmmoJS.furnace((event) => {const level = event.getLevel(); // get the levelconst pos = event.getPos(); // get the positionconst input = event.getInput(); // get the input// Check for players in 5 block radius around furnacelevel.getEntitiesWithin(AABB.of(pos.x - 5,pos.y - 5,pos.z - 5,pos.x + 5,pos.y + 5,pos.z + 5)).filter((entity) => entity.isPlayer()).forEach((player) => {// Grant smithing XP for ore processingif (input.item.id.includes("ore")) {SKillHelper.addXP(player, "smiting", 10);}// Grant cooking XP for food itemselse if (input.getId().includes("food")|| input.item.getFoodProperties() != null|| input.is("#forge:food")) {SKillHelper.addXP(player, "cooking", 10);}});});
Salvage Event
Triggered when a player salvages an item:
PmmoJS.salvage((event) => {const player = event.getEntity(); // get the playerconst inputStack = event.getInputStack(); // get the input stackconst outputStack = event.getOutputStack(); // get the output stackconst salvageData = event.getSalvage(); // get the salvage dataconst craftingLevel = SkillHelper.getLevel(player, "crafting")// Special handling for apple salvage by high-level craftersif (craftingLevel >= 50 && inputStack.item.id.equals("apple")) {const salvageBuilder = event.getBuilder();// Add combat requirement to salvage operationsalvageBuilder.setLevelReq({combat:1});// Multiply output apples by 60event.setOutputStack(Item.of("apple").withCount(60));}});
Heads up!
These events trigger in real-time during gameplay, allowing you to hook into PMMO actions and modify their behavior or add custom features.