Skip to content

物品修复系统

物品修复系统允许装备在耐久归零后进入"禁用"状态而非消失,玩家可以使用指定材料修复装备恢复使用。

耐久度禁用机制

当物品耐久即将归零时:

  1. PlayerItemDamageEvent 被取消,物品不会消失。
  2. 物品 damage 设为 max_damage,标记为禁用状态。
  3. PDC 写入 emakiitem:disabled (BYTE=1)。
  4. 执行 on_disabled 动作列表。

该流程只对启用了 repair 的物品生效;未启用 repair 的物品仍按原版规则损坏。

主手持有被禁用的物品时,该物品的触发器不再执行;攻击实体时 attack 判定不通过,伤害事件会被取消。

配置字段

repair 是物品定义文件中的顶层字段:

字段类型说明
enabledboolean是否启用修复系统。为 false 或缺失时整个 repair 块失效。
materialslist材料修复列表。
economyobject货币修复配置。
on_disabledlist物品变为禁用状态时执行的动作列表。
on_repairedlist物品修复成功后执行的动作列表。

materials 条目字段

字段类型说明
item_sourceslist材料物品来源列表(ItemSource shorthand,如 minecraft-diamond)。也接受 item_sourceitem 作为键名。
amountinteger需要消耗的数量,最小 1
restorestring恢复耐久量。支持固定值(如 250)或百分比(如 50%,相对于 max_damage)。

条目必须同时具备可解析的来源和非空 restore 才会被加载。

economy 字段

字段类型说明
enabledboolean是否启用货币修复。缺失时按“存在有效货币条目即启用”处理。
restorestring单次货币修复恢复的耐久量,支持固定值或百分比;默认 100%
currencieslist货币成本列表。

currencies 条目字段:

字段类型说明
providerstring经济提供者,默认 auto
currency_idstring货币 ID;留空使用提供者默认货币。
amountnumber固定费用。大于 0 时直接生效并忽略公式。
base_costnumber基础费用,可在公式中以 %base_cost% 引用。
cost_formulastring费用公式,可使用 max_damagedamagecurrent_damagemissing_durabilitymissing_ratiorestore_amountrestore_ratiobase_cost
display_namestring提示消息中显示的货币名称。

只有产生正费用的条目才会保留;同 provider + currency_id 的条目会合并累加。扣费失败时会回滚已扣除的货币。

修复触发方式

有两条修复路径。

背包直接修复:玩家用光标持有修复材料,点击被禁用的物品。要求光标数量不小于该材料条目的 amount,命中后扣除材料、恢复耐久并执行 on_repaired

修复界面/ei repair 打开 gui/repair_gui.yml。界面提供待修复装备槽(target_item)、四个材料槽(material_input_1material_input_4)、预览槽(preview_display)以及材料修复(material_repair)和经济修复(economy_repair)按钮。Shift 点击背包物品可快速放入。修复完成或关闭界面时,装备与未消耗材料都会归还玩家;背包已满则改为掉落并提示。

两条路径修复后都会:

  • 按 restore 值减少 damage;
  • damage 低于 max_damage 时自动清除 PDC 禁用标记;
  • 执行 on_repaired 动作列表。

界面路径还会在修复成功后刷新玩家物品、重算套装并触发 Attribute 装备同步。

修复事件

材料与货币修复在扣费和恢复耐久之前都会触发可取消的 ItemRepairEvent,监听器可改写恢复量或取消本次修复。详见 事件 API

完整示例

yaml
id: legendary_sword
item:
  source: minecraft-netherite_sword
  components:
    custom_name: "<gold>传说之剑</gold>"
repair:
  enabled: true
  materials:
    - item_sources:
        - "minecraft-netherite_ingot"
      amount: 1
      restore: "50%"
    - item_sources:
        - "minecraft-diamond"
      amount: 3
      restore: 200
  economy:
    enabled: true
    restore: "100%"
    currencies:
      - provider: "vault"
        currency_id: "default"
        display_name: "金币"
        cost_formula: "100 + missing_durability * 0.25"
  on_disabled:
    - 'sendmessage text="<red>你的装备已损坏!</red>"'
    - "playsound sound=minecraft:entity.item.break volume=1 pitch=0.5"
  on_repaired:
    - 'sendmessage text="<green>装备修复成功!</green>"'
    - "playsound sound=minecraft:block.anvil.use volume=1 pitch=1.2"

动作上下文

on_disabled 会注入 item_idon_repaired 在界面路径下注入 item_idrepair_sourcematerialeconomy)和 restore;背包直接修复路径只注入 item_id