Skip to content

工具耐久度

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

简介

1.16.100+版本的物品耐久机制与1.10和1.16版本存在差异。现在需要明确定义物品何时会受到耐久损耗,并通过事件触发损耗行为。本教程将涵盖以下内容:

  • 耐久度组件
  • 更新耐久度的事件
  • 实体伤害机制
  • 方块破坏机制
  • repair_amount 参数
  • on_tool_used 事件

组件

json
"minecraft:durability": {
    "max_durability": 200
}

minecraft:durability组件用于定义物品的最大耐久值

事件机制

物品事件

json
"durability_update": {
    "damage": {
        "type": "none",
        "amount": 1,
        "target": "self"
    }
}

当该事件被触发时,物品(self目标)将承受耐久损耗。看似简单,不是吗?

脚本事件

对于脚本实现,我们将使用自定义函数处理耐久损耗

该函数支持物品的"耐久"附魔效果

js
function damage_item(item) {
    // 获取耐久度组件
    const durabilityComponent = item.getComponent("durability")
    var unbreaking = 0
    // 获取耐久附魔等级
    if (item.hasComponent("enchantments")) {
        unbreaking = item.getComponent("enchantments").enchantments.getEnchantment("unbreaking")
        if (!unbreaking) {
            unbreaking = 0
        } else {
            unbreaking = unbreaking.level
        }
    }
    // 应用损耗
    if (durabilityComponent.damage == durabilityComponent.maxDurability) {

        return
    }
    durabilityComponent.damage += Number(Math.round(Math.random() * 100) <= durabilityComponent.getDamageChance(unbreaking))
    return item
}

实体伤害

脚本实现

实验性脚本

本脚本使用@minecraft/server 1.9.0-beta,该版本将在后续游戏更新中变更。

对于1.20.40及更高格式版本,on_hurt_entity已失效。

以下脚本实现了武器耐久损耗机制:

js
// 在此数组中添加你的物品ID
const my_items = ["wiki:silver_dagger"]

world.afterEvents.entityHurt.subscribe(event => {
    // 无伤害来源实体则跳过
    if (!event.damageSource.damagingEntity) return

    // 获取装备的武器
    const equipment = event.damageSource.damagingEntity.getComponent("minecraft:equippable")
    if (!equipment) return
    const weapon = equipment.getEquipment(EquipmentSlot.Mainhand)

    // 无武器则跳过
    if (!weapon) return

    // 物品不在列表则跳过
    if (!my_items.includes(weapon.typeId)) return
    let newItem = damage_item(weapon)
    equipment.setEquipment(EquipmentSlot.Mainhand, newItem)
    if (!newItem) {
        if (event.damageSource.damagingEntity instanceof Player) {
            event.damageSource.damagingEntity.playSound("random.break")
        }
    }
})

on_hurt_entity事件

WARNING

on_hurt_entity在格式版本1.20.40后已移除

minecraft:weapon组件中定义on_hurt_entity,用于指定玩家使用该物品攻击实体时触发的事件

json
"minecraft:weapon": {
    "on_hurt_entity": {
        "event": "durability_update"
    }
}

方块破坏

脚本实现

实验性脚本

本脚本使用@minecraft/server 1.9.0-beta,该版本将在后续游戏更新中变更。

对于1.20.20及更高格式版本,on_dig已失效。

以下脚本实现了工具耐久损耗机制:

js
// 在此数组中添加你的物品ID
const my_items = ["wiki:obsidian_pickaxe"]

world.afterEvents.playerBreakBlock.subscribe(event => {
    // 无物品则跳过
    if (!event.itemStackAfterBreak) return
    // 物品不在列表则跳过
    if (!my_items.includes(event.itemStackAfterBreak.typeId)) return

    // 创造模式玩家跳过
    if (world.getPlayers({
        gameMode: GameMode.creative
    }).includes(event.player)) return
    const newItem = damage_item(event.itemStackAfterBreak)
    event.player.getComponent("minecraft:equippable").setEquipment(EquipmentSlot.Mainhand, newItem)
    if (!newItem) {
        event.player.playSound("random.break")
    }
})

on_dig事件

WARNING

on_dig在格式版本1.20.20后已移除

minecraft:digger组件中定义on_dig,用于指定玩家使用该物品破坏方块时触发的事件

json
"minecraft:digger": {
    "use_efficiency": true,
    "destroy_speeds": [
        {
            "block": {
                "tags": "q.any_tag('wood')"
            },
            "speed": 8,
            "on_dig": {
                // 定义破坏带有wood标签的方块时触发的事件
                "event": "durability_update"
            }
        }
    ],
    "on_dig": {
        // 定义破坏任意方块时触发的事件
        "event": "durability_update"
    }
}

repair_amount参数

minecraft:repairable组件中定义repair_amount,用于指定物品修复时的耐久恢复量

json
"minecraft:repairable": {
    "repair_items": [
        {
            "repair_amount": "context.other->q.remaining_durability + 0.05 * context.other->q.max_durability",
            "items": [
                "bs:silver",
                "bs:silver_axe"
            ]
        }
    ]
}

公式解析:

"context.other->q.remaining_durability + 0.05 * context.other->q.max_durability"

最终耐久 = 第一把斧的剩余耐久 + 第二把斧的剩余耐久 + 第二把斧最大耐久的5%

on_tool_used事件

(当前可能不可用) on_tool_used是通过标签系统触发的特殊事件。标签类似于实体的运行时标识符。已知标签:

标签效果触发方式
minecraft:is_axe剥离原木与斧头可交互的方块互动时触发
minecraft:is_hoe制作耕地与锄头可交互的方块互动时触发
minecraft:is_pickaxe未知未知
minecraft:is_sword未知未知

可通过以下方式应用标签:

json
"tag:minecraft:is_axe": {}