Skip to content

物品修复系统 ​

物品修复系统包含两块: 装备耐久归零后怎样变成禁用状态而不是直接消失, 以及用哪些材料或货币把它修回来

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

耐久度禁用机制 ​

装备耐久快用完时, 插件会按下面四步处理:

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

这套流程只对启用了 repair 的物品生效; 没启用 repair 的物品仍按原版规则损坏

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

配置字段 ​

修复相关字段都写在物品定义文件的顶层 repair 下:

字段类型必填默认值取值范围说明示例
enabledboolean否falsetrue / false是否启用修复系统. 为 false 或缺失时整个 repair 块失效 (等价于没配)true
materialslist否空—材料修复列表; 条目必须同时具备可解析来源 (或 matcher) 与非空 restore 才会加载见下方
economyobject否禁用—货币修复配置见下方
disabled_displayobject否空—禁用状态下的显示覆盖name_prefix: "<dark_gray>[已损坏] </dark_gray>"
disabled_display.name_prefixstring否""—禁用时加在物品名前面的字符串"<dark_gray>[已损坏] </dark_gray>"
disabled_display.lore_appendlist否空—禁用时追加到物品 Lore 的行列表- "<red>此物品已损坏, 属性不生效</red>"
on_disabledlist否空—物品变为禁用状态时执行的动作列表- 'send_message text="..."'
on_repairedlist否空—物品修复成功后执行的动作列表- 'play_sound sound=...'

materials 条目字段 ​

字段类型必填默认值取值范围说明示例
item_sourceslist否空—允许的材料物品来源列表 (ItemSource 短横线写法). 这是唯一可用的键名 (item_source 与 item 已下线)- "minecraft-diamond"
matcherobject否无见 物品匹配器可选的通用物品匹配器, 只写组件, PDC, Lore 等非物品源条件, 与同级的 item_sources 取 ANDtype: component
amountinteger否1>= 1 (源码按 max(1, 值) 处理)需要消耗的数量1
restorestring是无固定整数, 或 N% 百分比恢复的耐久量, 百分比相对于 max_damage. 缺失或非数字时该条目被丢弃 (等于没有有效恢复量)"50%"

一个材料条目必须同时有可解析的来源和非空 restore, 才会被加载

DANGER

repair.materials[].matcher 可以写, 但同一个文件里的 item.source 不能写 matcher

item.source 是"用哪个原版物品构造出这个自定义物品", 在那里写 matcher 会让物品无法生成; repair.materials[] 是"玩家放进来的物品算不算修复材料", 才是匹配器用得上的地方. 两者形状相似, 含义完全不同, 详见 只有输入匹配点支持 matcher

下面这个例子用 matcher 收窄修复材料 -- 物品源写 item_sources, 组件条件写 matcher, 两者取 AND:

yaml
repair:
  enabled: true
  materials:
    - item_sources:
        - minecraft-netherite_ingot
      matcher:
        type: component
        component: custom_name
        operator: absent
      amount: 1
      restore: "50%"

这样就只接受没有被重命名过的下界合金锭, 避免玩家用改过名的特殊材料来修复

WARNING

matcher 内部不能写物品源条件 (type: item_source / item_sources / source / sources 会被拒绝并告警). 两个字段都省略时该材料条目永不命中. 完整语法见 物品匹配器

economy 字段 ​

字段类型必填默认值取值范围说明示例
enabledboolean否有有效货币条目时 truetrue / false是否启用货币修复. 缺失时按"存在有效货币条目就启用"处理true
restorestring否"100%"固定整数, 或 N% 百分比单次货币修复恢复的耐久量, 百分比相对于 max_damage"100%"
currencieslist否空—货币成本列表见下方

currencies 条目字段:

字段类型必填默认值取值范围说明示例
providerstring否auto—经济提供者; 空白时回退 auto, 非空时统一转小写vault
currency_idstring否""—货币 ID; 留空则用提供者的默认货币default
amountnumber否0>= 0 (源码按 max(0, 值) 处理)固定费用. 大于 0 时直接生效, 并忽略公式100
base_costnumber否0>= 0 (源码按 max(0, 值) 处理)基础费用, 可以在公式里用 base_cost 引用100
cost_formulastring否""—费用公式, 可以使用 max_damage, damage, current_damage, missing_durability, missing_ratio, restore_amount, restore_ratio 与 base_cost"100 + missing_durability * 0.25"
display_namestring否""—提示消息里显示的货币名称; 留空时依次回退为 currency_id, provider金币

费用只在会产生正数时才保留条目; 相同 provider + currency_id 的条目会合并累加. 扣费失败时会回滚已经扣掉的货币

修复触发方式 ​

游戏里有两种修复方式

背包直接修复: 你用光标拿着修复材料, 点击被禁用的物品. 光标上的数量不能少于该材料条目的 amount, 命中后扣掉材料, 恢复耐久并执行 on_repaired

修复界面: 用 /ei repair 打开 gui/repair_gui.yml. 界面提供待修复装备槽 (target_item), 四个材料槽 (material_input_1 到 material_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:
    - 'send_message text="<red>你的装备已损坏!</red>"'
    - "play_sound sound=minecraft:entity.item.break volume=1 pitch=0.5"
  on_repaired:
    - 'send_message text="<green>装备修复成功!</green>"'
    - "play_sound sound=minecraft:block.anvil.use volume=1 pitch=1.2"

动作上下文 ​

on_disabled 会注入 item_id. on_repaired 在界面路径下注入 item_id, repair_source (material 或 economy) 和 restore; 背包直接修复路径只注入 item_id