782 发表于 2022-5-14 13:02:01

附加包教程第十一期——物品:武器进阶

本帖最后由 782 于 2022-5-20 20:20 编辑

物品(四)
武器进阶
一、前言
上一期,我们了解了武器的基本组件,
今天,我们就来给上一期制作的剑添加其他功能与事件。
本期教程假定读者已基本了解第八期(物品:基础)和上一期的内容。
提示:使用此附加包时,必须打开“假日创造者功能”实验性玩法!
static/image/hrline/line4.png
二、正文
“minecraft:weapon”组件
上一期是基础武器的教程,但你可能希望能够在游戏中显示剑会造成的伤害点数。
要做到这一点,需要添加“minecraft:weapon”组件,即使它只是空的,这也足以让mc在内部知道,这是武器。
因此,如果将上述组件添加到上一期制作的武器的json文件中,现在将在其工具提示中看到 +10攻击伤害。

你可能在想“你为什么不在上一期添加这个?”答案是,我们将扩充这个组件,在本期教程中添加更多很酷的东西,所以我想把它分开讲述。

添加伤害时事件
如果你想做这样的事情,我们需要利用“minecraft:weapon”组件,并在武器击中实体时执行一个事件。
就像这样:
"minecraft:weapon": {
    "on_hurt_entity": {
      "event": "demo:my_sword.hurt_entity"
    }
}
我们添加这一部分之后,那么每次用这把剑伤害实体时,它都会引发事件demo:my_sword.hurt_entity。
你可以随心所欲地命名它,但如果你有很多事件,建议有一定规则地命名,比较常用的是“命名空间:物品.名称”
例如,在这个示例中,demo是命名空间,my_sword指定事件运用在什么物品上,hurt_entity是该物品的事件名称。
我们可以用事件做我们想做的事。在下面这个例子中,我将做三件事:

[*]25%的概率传送玩家
[*]传送后,发出一条消息,让玩家知道发生了什么事。
[*]消耗剑的耐久度

然后,回到my_sword.item.json,并在components部分之后添加一个像这样的新部分。
"events": {
    "demo:my_sword.hurt_entity": {
      "sequence": [
            {
                "randomize": [
                  {
                        "weight": 1,
                        "teleport": {
                            "target": "holder",
                            "max_range":
                        },
                        "run_command": {
                            "command": [
                              "tellraw @s{\\"rawtext\\":[{\\"text\\":\\"§a你的剑大显神威§r\\"}]}"
                            ]
                        }
                  },
                  {
                        "weight": 4
                  }
                ]
            },
            {
                "damage": {
                  "type": "durability",
                  "target": "self",
                  "amount": 1
                }
            }
      ]
    }
}
详解:
“sequence”用于执行多个事件,是数组,内含各个事件的JSON对象。

“randomize”定义了多个随机运行的事件,是数组,内含各个事件的JSON对象。
这里面还有其他的内容:
“weight”表示执行事件的概率,填写整数。

“teleport”是事件的组成部分之一,表示传送实体。它里面有两个组件:

[*]“target”指传送的实体,填写字符串。
这里的“holder”表示“拿着该物品的生物”,也就是你。
[*]“max_range”指传送的最大范围,是一个数组。
顺序(应该)是。

“run_command”是事件组成的部分之一,表示执行命令。
其中的“command”定义要运行的命令,是一个数组,里面可以填写带有命令的字符串。
要注意的是,如果要在命令中使用双引号,必须使用转义符号(\),否则会引发重大错误!

不知道大家有没有注意,在主事件下面还有一个空的事件,这个空的事件可以理解为虚拟事件。
这个空的事件有一个重要的作用:调整概率。
我们有一个比重(weight)为1的主事件和第二个比重(weight)为4的第二个空事件,所以这说明有四分之一(25%)的概率执行主事件(传送玩家)。
如果我们使用比重(weight)为100的空事件,那么我们将有一百分之一(1%)的概率会执行主事件(传送玩家)。
如果我们没有第二个空事件,那么第一个事件的比重(weight)将被忽略,并且它会100%发生。

后面还有一个“damage”事件,是为了减少剑的耐久度。

[*]“type”指定伤害类型,填写字符串。
这里的“durability”表示耐久度减少
[*]“target”指定目标,填写字符串。
这里的“self”表示物品本身
[*]“amount”表示数量,填写整数。

拓展
在“minecraft:weapon”组件中,还可以添加其他内容
例如:
“on_hit_block”指定当破坏方块的时候执行的事件;
“on_not_hurt_entity”指定攻击生物但没有造成伤害的时候执行的事件。
static/image/hrline/line9.png
三、本期文件下载
行为包文件示例:
static/image/hrline/line2.png
预告:下一期会教大家制作自定义工具

大家的打赏是对楼主最好的鼓励!
附加包教程系列导航
上一期下一期

慕言sir 发表于 2022-12-2 07:33:48

开始懵逼了

EnderTrekker 发表于 2024-7-28 19:34:23

如何让武器右键后触发某个函数?
页: [1]
查看完整版本: 附加包教程第十一期——物品:武器进阶