Skip to content

共享玩法事件 ID ​

共享玩法事件能填的 ID, 以及每个事件会带哪些变量, 汇总如下. EmakiCoreLib 会把一部分 Bukkit 和 MythicMobs 玩法事件统一整理成共享玩法事件, 再分发给 EmakiLevel 和 EmakiCodex 使用

它能直接回答你两个常见的配置问题:

  • EmakiLevel 的 sources.*.trigger 可以填写哪些触发器 ID
  • EmakiCodex 的 triggers.entries[].event 可以填写哪些事件 ID

NOTE

这些 ID 是配置用的规范字符串, 不是 Bukkit 事件类名. 照表格直接填小写 ID 就行, 例如 entity_kill, craft_item

使用位置 ​

插件配置位置字段用途
EmakiLevelplugins/EmakiLevel/sources/*.ymlsources.<source_id>.trigger触发经验来源规则
EmakiCodexplugins/EmakiCodex/advancements/*.ymladvancements.<node_id>.triggers.entries[].event触发成就节点自动授予

可填写的事件 ID ​

事件 ID原始来源EmakiLevelEmakiCodex变量
entity_kill玩家击杀实体; 优先使用 Bukkit killer, 必要时使用最近伤害玩家归属可用于经验来源可用于成就触发器%entity_type%
mythic_mob_killentity_kill 同次死亡中识别到 MythicMobs 活动怪物可用于经验来源可用于成就触发器%mythic_id%, %mythic_level%
block_break玩家破坏方块可用于经验来源可用于成就触发器%block_type%
crop_harvestblock_break 的派生触发; 被破坏方块是已成熟 Ageable 作物可用于经验来源可用于成就触发器%block_type%
craft_item玩家通过合成配方合成物品可用于经验来源可用于成就触发器%result_type%, %result_amount%
furnace_extract玩家从熔炉取出冶炼产物可用于经验来源可用于成就触发器%result_type%, %result_amount%
player_fish玩家钓鱼事件可用于经验来源可用于成就触发器%fish_state%
brew_complete炼药完成, 并归属到最近操作该炼药台的玩家可用于经验来源可用于成就触发器%potion_type%
entity_tame玩家驯服实体可用于经验来源可用于成就触发器%entity_type%
block_place玩家放置方块仅用于 Level 防刷记录, 不作为经验来源规则触发器Codex 当前未订阅%block_type%

变量说明 ​

变量说明
%entity_type%Bukkit EntityType 名称, 例如 ZOMBIE, WOLF, ENDER_DRAGON
%mythic_id%MythicMobs 内部怪物 ID
%mythic_level%MythicMobs 怪物等级; 无法取得时使用默认等级
%block_type%Bukkit Material 名称, 例如 STONE, WHEAT, OAK_LOG
%result_type%合成或冶炼结果的 Bukkit Material 名称
%result_amount%合成或冶炼结果数量. 合成结果至少为 1; 冶炼使用本次取出数量
%fish_state%PlayerFishEvent.State 名称, 例如 CAUGHT_FISH, CAUGHT_ENTITY, FISHING
%potion_type%炼药台产物中第一个可识别药水的基础类型; 无法识别时为 UNKNOWN

EmakiCodex 还会为所有已转发的触发器额外补充:

变量说明
%player%玩家名
%world%玩家所在世界名

Level 示例 ​

yaml
sources:
  main_entity_kill_bonus:
    enabled: true
    type: "main"
    trigger: "entity_kill"
    include_players: false
    rules:
      - entity_types: ["ZOMBIE", "SKELETON"]
        exp_formula: "10"

成熟作物收获:

yaml
sources:
  farming:
    enabled: true
    type: "farming"
    trigger: "crop_harvest"
    rules:
      - blocks: ["WHEAT", "CARROTS", "POTATOES"]
        exp_formula: "4"

Codex 示例 ​

yaml
advancements:
  craft_table:
    icon: "minecraft-crafting_table"
    title: "<green>开始合成</green>"
    description: "<gray>合成一个工作台。</gray>"
    triggers:
      entries:
        - event: "craft_item"
          condition:
            type: "all_of"
            entries:
              - '%result_type% == "CRAFTING_TABLE"'

击杀指定 MythicMobs:

yaml
advancements:
  ancient_guardian:
    icon: "minecraft-nether_star"
    title: "<gold>古代守卫</gold>"
    description: "<gray>击败指定 MythicMobs。</gray>"
    triggers:
      entries:
        - event: "mythic_mob_kill"
          condition:
            type: "all_of"
            entries:
              - '%mythic_id% == "ancient_guardian"'
              - '%mythic_level% >= 10'

CoreLib 侧配置 ​

事件发布由 CoreLib 自己的 plugins/EmakiCoreLib/config.yml 控制, 几个关键字段:

字段类型必填默认值取值范围说明
gameplay_events.enabledboolean否truetrue / false总开关. 关闭后 CoreLib 不再发布玩法事件, 依赖它的插件收不到事件
gameplay_events.last_damager_expire_ticksinteger否200≥ 0entity_kill 的"最后攻击者"归属窗口, 也就是判断这笔击杀算谁的时候往前看多久, 单位是 1/20 秒 (一个游戏刻). Bukkit 没有直接记下击杀者时 (弓箭, 延迟死亡等情况), 在这个窗口内仍然算最后一名攻击过的玩家. 这是粗一点的上限, 订阅方可以再收紧; 小于 0 时按 0 处理
gameplay_events.brew_attribution_expire_ticksinteger否6000≥ 0brew_complete 的酿造归属保留窗口, 单位是 1/20 秒 (一个游戏刻), 6000 刻大约是 5 分钟. 这是宽松的上限, 只用来防止归属记录一直留着; 真正的业务窗口由订阅方自己收紧 (例如 EmakiLevel 各来源的 attribution.expire_ticks, 默认 1200). 这个值要大于所有订阅方可能配的业务窗口, 否则会在订阅方判断之前就被提前截断; 小于 0 时按 0 处理

插件自带的默认值长这样:

yaml
gameplay_events:
  enabled: true
  last_damager_expire_ticks: 200
  brew_attribution_expire_ticks: 6000

也可以这样配, 把"最后攻击者"的归属窗口拉长, 让远距离弓箭击杀也能正常触发 entity_kill:

yaml
gameplay_events:
  enabled: true
  last_damager_expire_ticks: 400
  brew_attribution_expire_ticks: 6000

注意事项 ​

  • crop_harvest 不是独立 Bukkit 事件, 而是 CoreLib 在 block_break 基础上判断成熟作物后派生出来的配置 ID
  • mythic_mob_kill 会与同一次 entity_kill 分开发出; 如果你同时配置两个触发器, 两条规则都可能被处理
  • brew_complete 需要先把炼药台事件归属到最近操作过该炼药台的玩家; Codex 使用较短归属窗口, Level 可在来源规则里配置自己的 attribution.expire_ticks
  • block_place 当前主要供 EmakiLevel 记录玩家放置过的方块, 用来避免玩家放置后再破坏刷经验; 别把它当成普通经验来源或 Codex 成就触发器使用