【Java 1.21.5+】用数据包&资源包做一个毒苹果
-
检测玩家使用了物品
首先,我们需要检测玩家是否食用了苹果。由于没有使用mod,纯原版实现目前都是在原版物品上进行一些修改和调整。为了与普通苹果区分开来,我们使用
custom_data
组件为苹果添加自定义数据custom_item:1b
(表示当前物品为自定义物品)和id:"generic:poisonous_apple"
(该标签用来模拟一个新的物品id)。give @p minecraft:apple[minecraft:custom_data={custom_item:1b, id:"generic:poisonous_apple"}]
这样,我们就获得了一个比较特殊的苹果。
接下来,我们利用进度准则触发器
consume_item
来检测玩家食用了自定义物品:{ "criteria": { "generic:player_consumed_item": { "trigger": "consume_item", "conditions": { "item": { "predicates": { "minecraft:custom_data": { "custom_item": true } } } } } }, "rewards": { "function": "generic:player/consumed_item" } }
对使用的物品进行判断
编写相应的处理函数
generic:player/consumed_item
:# 在聊天栏输出消息,用于测试 tellraw @s[tag=debug] {text:"使用了一个自定义物品"} # 判断当前使用的物品是否为毒苹果 execute if items entity @s weapon.* *[custom_data~{id:"generic:poisonous_apple"}] run function generic:item/poisonous_apple/consumed # 剥夺进度,使得该进度可以反复触发 advancement revoke @s only generic:player/consumed_item
实现中毒效果
函数:
generic:item/poisonous_apple/consumed
tellraw @s[tag=debug] {text:"毒苹果被食用了"} effect give @s poison 3 0
测试效果
为自己添加
debug
标签以进行测试:tag @s add debug
使用之前的
give
命令获取一个苹果,吃下去后可以通过聊天栏的输出判断有哪些函数被执行。经过测试后可以看到自身获得了一个3秒的中毒效果。添加毒苹果模型
为了让毒苹果看起来与众不同,我们需要利用资源包为其指定一个新的物品模型。这里直接仿照原版资源包中的文件内容和结构。在自己的资源包中新建一个命名空间,这里为
generic
,然后新建models
文件夹,并在其中建立item
子文件夹以放置物品模型文件。在
item
子文件夹中新建poisonous_apple.json
文件,将原版的apple.json
文件内容复制过来并稍作修改:{ "parent": "minecraft:item/generated", "textures": { "layer0": "generic:item/poisonous_apple" } }
设置苹果的物品模型映射
在
generic
命名空间中新建items
文件夹,在该文件夹中新建文件poisonous_apple.json
,该JSON文件即为毒苹果的物品模型映射文件。这里采用model
类型,直接映射到之前所创建的item/poisonous_apple
烘焙模型:{ "model": { "type": "minecraft:model", "model": "generic:item/poisonous_apple" } }
绘制毒苹果纹理
打开BlockBench软件,将
item/poisonous_apple
烘焙模型文件拖入,为其创建一个新的纹理,路径在generic/textures/item
下,名称同样为poisonous_apple
。设定物品名称
为了兼容多个语言,需要在资源包中使用翻译键分别指定不同的物品名称。在资源包
generic
命名空间下,新建lang
目录,并在其中创建如下文件:en_us.json
,该文件为英文US翻译。{ "item.generic.poisonous_apple": "Poisonous Apple" }
zh_cn.json
,该文件为简体中文翻译。{ "item.generic.poisonous_apple": "毒苹果" }
添加战利品表
为了方便物品被我们获取,我们可以给毒苹果单独添加一个战利品表。在数据包的
generic
命名空间中,新建loot_table
目录,并添加如下文件:
poisonous_apple.json
{ "pools": [ { "entries": [ { "type": "item", "name": "apple", "functions": [ { "function": "set_components", "components": { "custom_data": { "custom_item": true, "id": "generic:poisonous_apple" }, "item_model": "generic:poisonous_apple", "item_name": { "translate": "item.generic.poisonous_apple" } } } ] } ], "rolls": 1 } ] }
这样,我们就可以通过如下命令获取到一个拥有翻译名称的毒苹果了:
loot give @s loot generic:poisonous_apple
为了使纹理正常加载,你可以通过
F3 + T
来在游戏内重载资源包。 -