在这篇指南中,你将制作一个红宝石苹果:一种能填满一大截饥饿值条的零食,即使吃饱了也能吃,吃完还会获得短暂的速度加成。你将了解饥饿值和饱和度的原理,以及进食需要多长时间。
这篇指南建立在你的第一个自定义物品的基础上。如果你还没做过物品,请先从那里开始:图标、纹理和名称的步骤完全一样。
快捷方式:GodCraft
GodCraft 有一个食物对象,下面提到的所有内容都有对应的滑块,它还会帮你写好状态效果的脚本。
- 打开工坊,在你的附加包中添加一个食物。
- 在像素编辑器中画出图标。
- 设置饥饿值、饱和度以及你想要的状态效果。
- 点击导出,然后进游戏吃掉它。
想看看它生成了哪些文件?就在下面。
手动制作
我们使用命名空间 myname。请在所有地方把它换成你自己的。
第 1 步:食物物品
在你的行为包中创建这个文件:
{
"format_version": "1.26.30",
"minecraft:item": {
"description": {
"identifier": "myname:ruby_apple",
"menu_category": {
"category": "items"
}
},
"components": {
"minecraft:icon": {
"textures": {
"default": "myname_ruby_apple"
}
},
"minecraft:display_name": {
"value": "item.myname:ruby_apple.name"
},
"minecraft:max_stack_size": 16,
"minecraft:food": {
"nutrition": 6,
"saturation_modifier": 0.8,
"can_always_eat": true
},
"minecraft:use_modifiers": {
"use_duration": 1.6,
"movement_modifier": 0.35
},
"minecraft:use_animation": "eat",
"minecraft:tags": {
"tags": ["minecraft:is_food"]
}
}
}
}新的部分是最后四个组件。我们逐一来看。
食物组件
minecraft:food 让物品可以被吃掉。
nutrition是它恢复的饥饿值点数。饥饿值条上的一个鸡腿是 2 点,所以6能填满三个鸡腿。原版苹果恢复 4 点,牛排恢复 8 点。saturation_modifier控制隐藏的“饱腹感”,它能让饥饿值条不那么快下降。游戏会增加nutrition x saturation_modifier x 2点饱和度。较低的数值(大约 0.1 到 0.3)感觉像零食,0.6 是普通水平,0.8 或更高就是一顿饱饭了。can_always_eat让玩家在饥饿值满的时候也能吃。普通食物不用写它(默认值是false)。
还有一个你可能会喜欢的字段:using_converts_to。它会在玩家吃完后给予另一个物品,比如喝完汤后留下碗:
"using_converts_to": "minecraft:bowl"进食需要多长时间
食物需要 minecraft:use_modifiers,否则玩家无法按住使用键来吃它。
use_duration是进食时间,单位是秒。原版食物需要 1.6 秒,干海带大约只需要一半时间。movement_modifier会在进食时让玩家减速。0.35是原版数值,1表示完全不减速。
动画和标签
- 把
minecraft:use_animation设为"eat",会显示咀嚼动画和食物碎屑粒子。如果是药水或奶昔之类的东西,就用"drink"。 minecraft:tags中的minecraft:is_food会把它标记为食物,和原版食物的标记方式一样。
第 2 步:纹理和名称
这些和第一篇指南中的做法完全一样。把纹理添加到你现有的 item_texture.json 中(放在 texture_data 里,和其他条目放在一起):
"myname_ruby_apple": {
"textures": "textures/items/ruby_apple"
}把一张 16x16 的 PNG 保存到 RP/textures/items/ruby_apple.png,然后添加名称:
item.myname:ruby_apple.name=Ruby Apple现在执行 /give @s myname:ruby_apple,咬一口试试。如果需要复习,请看 /give。
添加食用后的状态效果
旧的附加包会在 minecraft:food 中用 effects 列表给食物添加状态效果。这个字段已经不再是当前物品格式的一部分了。 如果你把它加到使用新版 format_version 的文件中,游戏会忽略它,并在内容日志中显示警告。
现在的做法是使用自定义组件:你的物品写上一个由你自己发明的组件名,再由一个小脚本决定它做什么。听起来有点吓人,但其实只有大约 15 行。
第 1 步:给物品添加组件
把下面的内容加到 ruby_apple.json 的 components 中。名字由你自己决定,对象里放的是你自己的设置:
"myname:eat_effect": {
"effect": "speed",
"seconds": 10,
"amplifier": 1
}第 2 步:编写脚本
为此,你的行为包需要在清单文件中加入一个 script module。项目设置讲解了如何添加。然后创建脚本:
import { system } from "@minecraft/server";
system.beforeEvents.startup.subscribe(({ itemComponentRegistry }) => {
itemComponentRegistry.registerCustomComponent("myname:eat_effect", {
onConsume(event, { params }) {
event.source.addEffect(params.effect, params.seconds * 20, {
amplifier: params.amplifier,
});
},
});
});它的工作原理:
- 世界启动时,脚本告诉游戏
myname:eat_effect是什么意思。 - 每当玩家吃完一个带有该组件的物品时,
onConsume就会运行。 params就是你在物品文件中写的那个对象,所以你可以用这一个脚本给许多食物设置不同的效果。- 脚本中的效果持续时间以刻为单位,1 秒等于 20 刻。这就是为什么
seconds要乘以 20。 amplifier为 0 表示 I 级,1 表示 II 级,以此类推。
状态效果名称
使用和 /effect 命令相同的效果 ID,比如 speed、regeneration、night_vision、absorption 或 fire_resistance。
GodCraft 会帮你完成这一整部分:在食物编辑器中选择状态效果,导出时它就会自动添加组件和脚本。
平衡食物的小技巧
- 向原版看齐。 零食的 nutrition 是 2 到 4,正餐是 6 到 8。数值过高会让其他所有食物都变得毫无意义。
- 效果要有代价。 强力效果放在稀有食物上很有趣,但放在用泥土就能合成的食物上就不合适了。给它配一个难做的配方(参见工作台和熔炉配方)。
- 让
can_always_eat保持特别。 原版只把它用在金苹果之类的东西上,这样才有奖励的感觉。 - 堆叠数量很重要。 较小的堆叠上限(16)让强力食物更难大量囤积。
出问题时
| 你看到的现象 | 最可能的原因 |
|---|---|
| 完全吃不了 | 缺少 minecraft:use_modifiers,或者 use_duration 为 0 |
| 能吃,但只有饿的时候才能吃 | 这是正常的。添加 can_always_eat 即可改变 |
| 吃完没有效果 | 清单文件中没有 script module,或者物品和脚本中的组件名不一致 |
出现关于 effects 的警告 | 你用了旧字段:请改用上面的自定义组件 |