物品修复系统
物品修复系统允许装备在耐久归零后进入"禁用"状态而非消失,玩家可以使用指定材料修复装备恢复使用。
耐久度禁用机制
当物品耐久即将归零时:
PlayerItemDamageEvent被取消,物品不会消失。- 物品 damage 设为 max_damage,标记为禁用状态。
- PDC 写入
emakiitem:disabled(BYTE=1)。 - 执行
on_disabled动作列表。
该流程只对启用了 repair 的物品生效;未启用 repair 的物品仍按原版规则损坏。
主手持有被禁用的物品时,该物品的触发器不再执行;攻击实体时 attack 判定不通过,伤害事件会被取消。
配置字段
repair 是物品定义文件中的顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
enabled | boolean | 是否启用修复系统。为 false 或缺失时整个 repair 块失效。 |
materials | list | 材料修复列表。 |
economy | object | 货币修复配置。 |
on_disabled | list | 物品变为禁用状态时执行的动作列表。 |
on_repaired | list | 物品修复成功后执行的动作列表。 |
materials 条目字段
| 字段 | 类型 | 说明 |
|---|---|---|
item_sources | list | 材料物品来源列表(ItemSource shorthand,如 minecraft-diamond)。也接受 item_source 或 item 作为键名。 |
amount | integer | 需要消耗的数量,最小 1。 |
restore | string | 恢复耐久量。支持固定值(如 250)或百分比(如 50%,相对于 max_damage)。 |
条目必须同时具备可解析的来源和非空 restore 才会被加载。
economy 字段
| 字段 | 类型 | 说明 |
|---|---|---|
enabled | boolean | 是否启用货币修复。缺失时按“存在有效货币条目即启用”处理。 |
restore | string | 单次货币修复恢复的耐久量,支持固定值或百分比;默认 100%。 |
currencies | list | 货币成本列表。 |
currencies 条目字段:
| 字段 | 类型 | 说明 |
|---|---|---|
provider | string | 经济提供者,默认 auto。 |
currency_id | string | 货币 ID;留空使用提供者默认货币。 |
amount | number | 固定费用。大于 0 时直接生效并忽略公式。 |
base_cost | number | 基础费用,可在公式中以 %base_cost% 引用。 |
cost_formula | string | 费用公式,可使用 max_damage、damage、current_damage、missing_durability、missing_ratio、restore_amount、restore_ratio 与 base_cost。 |
display_name | string | 提示消息中显示的货币名称。 |
只有产生正费用的条目才会保留;同 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。
完整示例
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_id。on_repaired 在界面路径下注入 item_id、repair_source(material 或 economy)和 restore;背包直接修复路径只注入 item_id。