782 发表于 2022-5-24 20:04:02

附加包教程第十五期——物品:盔甲高级

本帖最后由 782 于 2022-6-2 17:05 编辑


物品(八)
盔甲高级
一、前言
我们之前学习了盔甲,它们可以自定义各种功能,但不能添加效果、粒子。
然而,使用动画、MoLang和物品标签,这很容易做到!
今天,我们就来学习如何在装备盔甲的时候执行命令!
请记住,这需要修改玩家的行为包文件,这是许多附加包的常见问题;
因此,如果这样做,附加包可能与其他人做的不兼容。
本教程假定读者已经制作了第十三期(物品:盔甲基础)的全套盔甲。
提示:使用此附加包时,必须打开“假日创造者功能”实验性玩法!
static/image/hrline/line4.png
二、动画文件
第一步是创建一个动画文件,这是一个可以在某些关键帧上运行命令或事件的文件。
我们可以首先使用以下内容作为示例:
路径:行为包/animations/player.json
{
    "format_version": "1.10.0",
    "animations": {
      "animation.player.my_armor": {
            "timeline": {
                "0.0": []
            },
            "animation_length": 0.05,
            "loop": true
      }
    }
}

让我们来看看这个示例中的内容以及所有功能:
“animation.player.my_armor”是我们动画的标识符。
可以将其更改为其他内容,例如 “animation.player.phantom_armor”。
“timeline”用于在给定的关键帧上运行命令和事件。
“animation_length”是动画持续的时间,填写浮点数(小数)。我们将使用0.05秒,因为那是游戏刻的时长。
“loop”非常通俗易懂:将其设置为true会使动画循环,填写布尔值。

我们可以将命令添加到“timeline”中的0.0数组中以执行,例如/effect命令:
{
    "0.0": [
      "/effect @s speed 1 0"
    ]
}

当然了,不只是/effect命令可以,还有其他命令也可以生效哦!
static/image/hrline/line3.png
三、物品行为包文件
为了实际检查我们的物品是否配备齐全,我们可以使用Molang查询来检查物品标签。
在我们物品的行为文件中,我们必须在“components”中添加标签。
例如,如果我们想添加demo:my_tier标签,我们会添加“tag:demo:my_tier”组件:
"tag:demo:my_tier": {}
就这样,现在可以给物品分配的任何标签!
如果你愿意,还可以为物品添加更多标签。

static/image/hrline/line9.png
四、玩家行为文件
我们需要修改玩家的行为包文件来运行动画。
没有原版玩家行为包文件的可以在本期教程的底部下载。
首先,我们需要为我们的动画设置一个简短的名称;
然后,将动画添加到描述中,并再次设置一个简短的名称,例如:
{
    "identifier": "minecraft:player",
    "is_spawnable": false,
    "is_summonable": false,
    "is_experimental": false,
    "animations": {
      "my_armor": "animation.player.my_armor"
    }
}
将“scripts”添加到“description”中,并设置要运行的Molang。

要检查物品,我们可以使用以下Molang之一:
1. query.is_item_name_any:在指定槽位中检查给定的物品标识符。
此示例将在主手检查“demo:totem_of_retreat”:
query.is_item_name_any('slot.weapon.mainhand',0,'demo:totem_of_retreat')
2. query.equipped_item_any_tag:检查指定槽位中至少一个的指定的物品标签。
此示例将检查在头盔槽位具有“demo:emerald_tier”或“demo:phantom_tier”物品标签的物品:
query.equipped_item_any_tag('slot.armor.head','demo:emerald_tier','demo:phantom_tier')
3. query.equipped_item_all_tags:检查指定槽位中所有的指定的物品的标签。
此示例将检查在头盔槽位同时具有“demo:emerald_tier”和“demo:phantom_tier”物品标签的物品:
query.equipped_item_all_tags('slot.armor.head','demo:phantom_tier','demo:emerald_tier')
让我们来看看使用query.equipped_item_any_tag的示例:
{
    "identifier": "minecraft:player",
    "is_spawnable": false,
    "is_summonable": false,
    "is_experimental": false,
    "animations": {
      "my_armor": "animation.player.my_armor"
    },
    "scripts": {
      "animate": [
            {
                "my_armor": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier')"
            }
      ]
    }
}
如果头盔槽位中配备了具有标签“demo:my_tier”的物品,此示例将运行带有“my_armor”短名称的动画。
可以更改Molang表达式以匹配物品标签,使用其他方法或添加其他方法。
static/image/hrline/line2.png
五、拓展
我们还可以拓展我们的Molang,比如说:
多个条件
如果想在装备多个盔甲时运行命令,我们可以扩展我们的Molang:
"animate": [
    {
      "my_armor": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier') && query.equipped_item_any_tag('slot.armor.chest','demo:my_tier') && query.equipped_item_any_tag('slot.armor.legs','demo:my_tier') && query.equipped_item_any_tag('slot.armor.feet','demo:my_tier')"
    }
]
此示例将检查所有四个装甲槽位中的具有“demo:my_tier”标签的物品,如果它们都存在了,则运行动画。
这里的“&&”意为“和,与,并(and)”。

根据这个语法,我们还可以制作以下示例:
如果我们想让盔甲仅在生命值较低时运行动画,我们可以在Molang中添加:
"animate": [
    {
      "my_armor": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier') && query.health <= 5"
    }
]
此示例将以5或更少的生命值播放动画,允许玩家在危险时快速逃跑。

我们也可以将此应用于上面的示例,变成更长的Molang:
{
    "animate": [
      {
            "my_armor": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier') && query.equipped_item_any_tag('slot.armor.chest','demo:my_tier') && query.equipped_item_any_tag('slot.armor.legs','demo:my_tier') && query.equipped_item_any_tag('slot.armor.feet','demo:my_tier') && query.health <= 5"
      }
    ]
}

多个效果
如果你想要更多具有独特效果的物品,不要担心,因为这很容易做到。
可以创建一个新的动画文件,也可以添加到之前文件中,例如:
{
    "format_version": "1.10.0",
    "animations": {
      "animation.player.my_armor_1": {
            "timeline": {
                "0.0": ["..."]
            },
            "animation_length": 0.05,
            "loop": true
      },
      "animation.player.my_armor_2": {
            "timeline": {
                "0.0": ["..."]
            },
            "animation_length": 0.05,
            "loop": true
      }
    }
}
这需要添加到player.json(description组件)中:
{
    "identifier": "minecraft:player",
    "is_spawnable": false,
    "is_summonable": false,
    "is_experimental": false,
    "animations": {
      "my_armor_1": "animation.player.my_armor_1",
      "my_armor_2": "animation.player.my_armor_2"
    },
    "scripts": {
      "animate": [
            {
                "my_armor_1": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier_1')"
            },
            {
                "my_armor_2": "query.equipped_item_any_tag('slot.armor.head','demo:my_tier_2')"
            }
      ]
    }
}
static/image/hrline/4.gif
六、本期文件下载
原版player.json文件:
static/image/hrline/5.gif
预告:下一期会教大家物品的事件函数
大家的打赏是对楼主最好的鼓励!
附加包教程系列导航
上一期下一期

782 发表于 2022-5-24 21:20:26

@lpyqzMinecraft
我又来更新了

MC_ZC 发表于 2022-5-24 22:43:33

大力支持一下

12boss 发表于 2022-11-26 04:47:17

666666666666666

挽泪. 发表于 2023-3-5 21:55:04

6666666666
页: [1]
查看完整版本: 附加包教程第十五期——物品:盔甲高级