通过装备物品执行命令
引言
附加包开发中一个常见概念是实现具有特殊效果的新护甲套装,就像海龟壳和下界合金护甲那样。虽然物品具有击退抗性组件,但它们没有在特定条件下施加生物效果、生成粒子等功能的组件。不过,通过使用服务器动画、Molang和物品标签,这可以轻松实现!
请注意,这需要修改玩家行为文件,这是许多附加包的常见做法;因此,如果您这样做,您的附加包可能与其他附加包不兼容。
不过有些人找到了不使用player.json的方法。他们用虚拟的骑乘实体来替代。您可以自己尝试实验!
服务器动画
第一步是创建一个服务器动画文件,该文件会在特定关键帧运行命令或触发事件。客户端动画位于资源包中,而服务器动画位于行为包中。您可以在此处了解更多信息。我们可以使用以下模板开始:
{
"format_version": "1.10.0",
"animations": {
"animation.player.emerald_armor": {
"timeline": {
"0.0": []
},
"animation_length": 0.05,
"loop": true
}
}
}让我们看看这个模板中的内容及其作用:
animation.player.emerald_armor是我们的动画标识符;您可以将其更改为其他名称,例如animation.player.phantom_armor。timeline在给定的关键帧运行命令和事件。animation_length是动画的持续时间;我们使用0.05秒,因为这是游戏内一个刻的长度。loop非常直观;设置为true会使动画循环播放。
我们可以向时间轴中的 0.0 数组添加要执行的命令,例如 /effect 命令:
{
"0.0": ["/effect @s speed 1 0"]
}当然,我们不仅限于 /effect。如果您想使用其他命令,例如 /function 或 /particle,请随意添加!
完成这一步后,我们的服务器动画部分就完成了,接下来我们将进入物品行为文件进行快速修改。
物品行为
为了实际检查物品是否被装备,我们可以使用一个Molang查询来检查物品标签。
如果您想实现以下情况,可以跳过本节:
- 您想检查原版物品,例如通过
minecraft:iron_tier标签检查铁质护甲 - 您想通过
q.is_item_name_any检查物品标识符(适用于任何槽位)
在我们的物品行为文件中,我们需要向 components 添加一个标签。例如,如果我们想添加 example:emerald_tier 标签,我们会添加 tag:example:emerald_tier 组件:
"tag:example:emerald_tier": {}就是这样,现在您的物品已经具有您分配的标签了!您可以添加更多标签,但对于我们的目标来说,这就足够了。
玩家行为
最后,我们需要修改玩家的行为文件以运行服务器动画。我们将完全在 description 部分进行操作。
首先,我们需要为动画设置一个简称。如果您熟悉客户端动画,这个过程会非常相似。在 description 中添加 animations,并设置一个简称,例如:
{
"identifier": "minecraft:player",
"is_spawnable": false,
"is_summonable": false,
"is_experimental": false,
"animations": {
"emerald_armor": "animation.player.emerald_armor"
}
}设置简称后,我们可以运行动画。
在 description 中添加 scripts,并设置一个Molang查询来运行。要检查物品,我们可以使用以下方法之一:
q.is_item_name_any,检查任何槽位中的物品标识符。此示例将检查主手或副手中是否有example:totem_of_retreat:
q.is_item_name_any('slot.weapon.mainhand',0,'example:totem_of_retreat') || q.is_item_name_any('slot.weapon.offhand',0,'example:totem_of_retreat')q.equipped_item_any_tag,检查给定槽位中是否存在至少一个指定标签。此示例将允许装备绿宝石或幻影级别的护甲:
q.equipped_item_any_tag('slot.armor.head','example:emerald_tier','example:phantom_tier')q.equipped_item_all_tags,检查给定槽位中是否同时具有所有指定标签。此示例仅允许同时具有远古和绿宝石级别的护甲:
q.equipped_item_all_tags('slot.armor.head','example:ancient_tier','example:emerald_tier')让我们看一个使用 q.equipped_item_any_tag 的示例:
{
"identifier": "minecraft:player",
"is_spawnable": false,
"is_summonable": false,
"is_experimental": false,
"animations": {
"emerald_armor": "animation.player.emerald_armor"
},
"scripts": {
"animate": [
{
"emerald_armor": "q.equipped_item_any_tag('slot.armor.head','example:emerald_tier')"
}
]
}
}此示例将在头盔槽位装备绿宝石级别物品时运行具有简称 emerald_armor 的服务器动画。您可以更改Molang字段以匹配您的物品标签,使用不同的查询,或添加其他查询。
您可以在 Minecraft Wiki 上查看其他槽位标识符的列表。
结论
通过设置服务器动画、玩家行为和物品标签,您的装备物品现在可以运行命令了!这种技术比局限于物品组件提供了更大的物品自定义空间。如果您想为效果或附加包添加更多内容,请查看下一部分;否则,恭喜您,您已经完成了!
扩展功能
需要多个物品
如果您想在装备多个护甲套装部件时运行命令,我们可以扩展之前的Molang:
"animate": [
{
"emerald_armor": "q.equipped_item_any_tag('slot.armor.head','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.chest','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.legs','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.feet','example:emerald_tier')"
}
]此示例将检查四个护甲槽位是否都装备了绿宝石级别的护甲,并在全部装备时运行动画。
附加条件
海龟壳并非总是提供水下呼吸效果,而是仅在玩家首次进入水中后的10秒内生效。如果我们希望绿宝石护甲仅在生命值较低时运行动画,可以向Molang添加另一个查询:
"animate": [
{
"emerald_armor": "q.equipped_item_any_tag('slot.armor.head','example:emerald_tier') && q.health <= 5"
}
]此示例将在生命值剩余2.5颗心或更少时运行动画,让玩家在危险时快速逃脱。
我们还可以将此应用于需要多个护甲部件的情况,Molang会更长:
{
"animate": [
{
"emerald_armor": "q.equipped_item_any_tag('slot.armor.head','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.chest','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.legs','example:emerald_tier') && q.equipped_item_any_tag('slot.armor.feet','example:emerald_tier') && q.health <= 5"
}
]
}您可以在 bedrock.dev 上查看已记录的Molang查询列表。
多个具有效果的物品
如果您想添加更多具有独特效果的物品,不用担心;这很容易实现。您可以创建一个新的服务器动画文件,或者在之前的文件中添加内容:
{
"format_version": "1.10.0",
"animations": {
"animation.player.emerald_armor": {
"timeline": {
"0.0": ["..."]
},
"animation_length": 0.05,
"loop": true
},
"animation.player.phantom_armor": {
"timeline": {
"0.0": ["..."]
},
"animation_length": 0.05,
"loop": true
}
}
}在我们的玩家行为文件中,您还需要在 animations 和 scripts 中添加内容。
{
"identifier": "minecraft:player",
"is_spawnable": false,
"is_summonable": false,
"is_experimental": false,
"animations": {
"emerald_armor": "animation.player.emerald_armor",
"phantom_armor": "animation.player.phantom_armor"
},
"scripts": {
"animate": [
{
"emerald_armor": "q.equipped_item_any_tag('slot.armor.head','example:emerald_tier')"
},
{
"phantom_armor": "q.equipped_item_any_tag('slot.armor.head','example:phantom_tier')"
}
]
}
}


