启动事件注册 PMMO 在游戏开始之前需要的结构。这些属于 startup_scripts/,不是 server_scripts/。
什么放在哪里
放在 startup_scripts/ 中:
PmmoJS.registerPredicate(...)—— 自定义需求谓词PmmoJS.registerPerk(...)—— 新 Perk 类型定义PmmoHelper.registerRequirementData(...)—— 直接 PMMO 数据注册PmmoHelper.registerXpAwardData(...)—— 直接 XP 奖励注册PmmoHelper.registerTriggerListener(...)—— 直接触发器监听器注册ForgeEvents.onEvent(...)—— 原始 Forge 事件监听器
放在 server_scripts/ 中:
PmmoJS.trigger(...)、PmmoJS.internal(...)—— 运行时钩子- 所有配置事件 ——
PmmoJS.skillsConfig(...)、PmmoJS.perksConfig(...)等 PmmoJS.settings(...)—— 物品/方块/实体数据ProbeJSEvents.generateDoc(...)—— ProbeJS 文档生成
PmmoJS.registerPredicate
注册 PMMO 在需求检查期间评估的自定义谓词。提供三种方法:
registerActionPredicate(resourceId, reqType, predicate)—— 用于物品操作registerBreakPredicate(resourceId, reqType, predicate)—— 用于方块破坏registerEntityPredicate(resourceId, reqType, predicate)—— 用于实体交互
每个谓词接收当前 Player 和相关目标对象。
PmmoJS.registerPredicate(event => {event.registerActionPredicate(PmmoHelper.id('minecraft:stick'),ReqType.WEAPON,(player, stack) => player.experienceLevel >= 5)})
PmmoJS.registerPerk
定义新的 PMMO Perk 类型。这是用于创建带生命周期回调的自定义 Perk 的重量级 API。
参见 Perk 注册 获取完整指南。
直接 PMMO 注册
PmmoHelper 在 startup_scripts/ 中可用,用于将数据直接注册进 PMMO 的 API。当你希望精确控制注册内容,而不通过 KubeJS 事件系统时,这很有用。
常用辅助方法:
// 注册需求PmmoHelper.registerRequirementData(ObjectType.ITEM, 'minecraft:diamond_pickaxe', ReqType.TOOL,{ mining: 10, endurance: 4 }, true)// 注册 XP 奖励PmmoHelper.registerXpAwardData(ObjectType.ITEM, 'minecraft:diamond_pickaxe', EventType.BLOCK_BREAK,{ mining: 8 }, true)// 注册触发器监听器PmmoHelper.registerTriggerListener('kubejs:example', EventType.BLOCK_BREAK,(forgeEvent, context) => {context.putInt('bonus_roll', 1)context.putBoolean('is_cancelled', false)return context})
对于上面的直接数据注册方法,最后一个参数(true)告诉 PMMO 替换已有数据而不是与它合并。
Raw trigger listener 返回的 tag 必须包含 is_cancelled;PMMO 会用这个键判断 listener 输出是否有效。普通运行时脚本优先用 PmmoJS.trigger(...)。
完整直接注册方法列表:registerRequirementData、registerXpAwardData、registerDamageXpAwardData、registerBonusData、registerPositiveEffects、registerNegativeEffects、registerSalvageData、registerVeinData、registerMobModifierData、registerTriggerListener,以及对应的工具提示注册变体。
原始 Forge 事件
在 KubeJS 1.20.1 上,ForgeEvents.onEvent(...) 是启动脚本 API:
ForgeEvents.onEvent('net.minecraftforge.event.entity.player.PlayerEvent$PlayerLoggedInEvent',event => {console.info(`[PmmoJS] ${event.getEntity().getScoreboardName()} 已登录`)})
注意:ProbeJSEvents.generateDoc(...) 是服务端脚本 API,不是启动 API。这两个事件系统尽管看起来相似,但有各自不同的生命周期。