Runtime events fire during gameplay. Keep these in server_scripts/.
PmmoJS.trigger
This is the broadest hook in PmmoJS. It fires whenever PMMO's internal EventTriggerRegistry activates, which covers most of PMMO's gameplay events: breaking blocks, crafting items, dealing damage, jumping, swimming, taming, and more.
Think of it as "listen to PMMO's built-in event system from KubeJS."
PmmoJS.trigger(EventType.BLOCK_BREAK, event => {const player = event.getPlayer()if (player && player.stages.has('peaceful_mining')) {event.addXpAward('mining', 25)}if (player && player.isCreative()) {event.setCancelled(true)}})
Trigger types covered on PMMO 1.7.40
- Interaction:
BLOCK_BREAK,BLOCK_PLACE,HIT_BLOCK,ACTIVATE_BLOCK,ACTIVATE_ITEM,CRAFT,BREW,CONSUME - Combat:
DEAL_DAMAGE,RECEIVE_DAMAGE,DEATH,SHIELD_BLOCK - Entity:
BREED,TAMING,ENTITY,GIVEN_AS_TRADE,RECEIVED_AS_TRADE - Utility:
ANVIL_REPAIR,ENCHANT,FISH,GROW,BREAK_SPEED - Movement:
JUMP,SPRINT_JUMP,CROUCH_JUMP,RIDING,SPRINTING,CROUCH,SUBMERGED,SWIMMING,DIVING,SURFACING,SWIM_SPRINTING - Status:
BREATH_CHANGE,HEALTH_CHANGE,HEALTH_INCREASE,HEALTH_DECREASE,EFFECT
Some PMMO handlers (dimension travel, login, mount, piston, explosion, player death, sleep, potion brewing) do not go through the trigger registry. Use PmmoJS.internal for those.
Key methods on the trigger event
getType()andgetTypeId()— which trigger type firedgetForgeEvent()andgetForgeEventClassName()— the underlying Forge event, if anyhasPlayer(),getPlayer(),getServerPlayer()— the player involvedgetContextBoolean(key),getContextString(key),getContextInt(key),getContextLong(key),getContextDouble(key)— read context valuesputContextBoolean(key, value),putContextString(key, value), etc. — write context valueshasContextKey(key),removeContextKey(key),getContextKeys()— manage context keysaddXpAward(skill, amount)— add an XP awardsetXpAwards(map),getXpAwards(),clearXpAwards()— manage all XP awardssetCancelled(true)— tell PMMO to skip processing this trigger
PmmoJS.xp
Fires when PMMO changes a player's XP.
PmmoJS.xp(event => {const player = event.getEntity()const skill = event.getSkill()if (event.isLevelUp() && event.endLevel() % 10 === 0) {player.give(Item.of('minecraft:diamond'))}if (skill === 'mining') {event.cancel()}})
PmmoJS.enchant
Fires when a player enchants an item.
PmmoJS.enchant(event => {const ench = event.getEnchantmentInstance()SkillHelper.addXP(event.getEntity(), 'magic', 10 * ench.level)})
PmmoJS.furnace
Fires from PMMO's furnace burn event.
PmmoJS.furnace(event => {const input = event.getInput()if (input.id === 'minecraft:iron_ore') {// custom logic here}})
PmmoJS.salvage
Fires when a player salvages an item.
PmmoJS.salvage(event => {const builder = event.getBuilder()builder.setSalvageMax(2)event.setOutputStack(Item.of('minecraft:iron_nugget', 2))})
Damage penalty hooks
Use these to scale PMMO's damage penalty instead of only canceling it.
PmmoJS.itemstackDamagePenalty(event => {event.setDamage(event.getDamage() * 0.75)})PmmoJS.entityDamagePenalty(event => {event.setDamage(event.getDamage() * 0.5)})
The first applies to item durability loss; the second applies to entity damage received.
PmmoHelper in server scripts
PmmoHelper gives you direct access to PMMO's API without KubeJS overload ambiguity. This is useful for custom commands, Forge event listeners, and places where the PmmoJS event wrappers are not the right fit.
ServerEvents.loaded(event => {const player = event.server.getPlayerList().getPlayers()[0]if (!player) returnconsole.log(PmmoHelper.getSkillLevel(player, 'mining'))console.log(PmmoHelper.getItemRequirements(player.mainHandItem, ReqType.WEAR))console.log(PmmoHelper.getCurrentVeinCharge(player))})
Key method groups:
- Skill state:
getSkillLevel,setSkillLevel,addSkillXp,getAllSkillLevels - Data lookups:
getItemXpAwards,getBlockRequirements,getConsolidatedModifiers - Direct registration:
registerRequirementData,registerXpAwardData,registerBonusData, tooltip registrations, predicates - Discovery helpers:
getTriggerTypeIds,getInternalTypeIds - PMMO systems:
awardXpToPlayer,awardXpToPartyInRange,getPartyMembers,applyVeinMining,triggerSalvage
已有脚本如果还在用 SkillHelper,可以继续保留;新写的 server script 用 PmmoHelper。