🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
本页面基于这个版本编写:
1.21.1
伤害类型定义了实体能受到的伤害的种类。 从 Minecraft 1.19.4 开始,创建新的伤害类型的方式已是数据驱动,也就是说由 JSON 文件创建。
让我们创建一种叫 土豆 的伤害类型。 我们先从为你的自定义伤害创建 JSON 文件开始。 这个文件放在你的模组的 data 目录下的 damage_type 子目录。
resources/data/example-mod/damage_type/tater.json其结构如下:
{
"exhaustion": 0.1,
"message_id": "tater",
"scaling": "when_caused_by_living_non_player"
}这个自定义伤害类型在玩家每次受到来自非玩家的生物(例:方块)造成的伤害时增加 0.1 消耗度。 此外,造成的伤害量将随世界难度而变化。
INFO
所有可用的键值详见 Minecraft Wiki。
当需要在代码中访问我们的自定义伤害类型时,可以用它的 RegistryKey 来创建一个 DamageSource 实例。
这个 RegistryKey 可用以下方式获取:
public static final RegistryKey<DamageType> TATER_DAMAGE = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, Identifier.of("example-mod", "tater"));为了演示自定义伤害类型如何使用,我们将使用一个自定义方块 土豆块 。 让我们实现生物踩在 土豆块 上时会造成 土豆 伤害。
你可以重写 onSteppedOn 方法来造成这个伤害。
我们从创建一个属于我们的自定义伤害类型的 DamageSource 开始。
DamageSource damageSource = new DamageSource(
world.getRegistryManager()
.get(RegistryKeys.DAMAGE_TYPE)
.entryOf(ExampleModDamageTypes.TATER_DAMAGE));然后,调用 entity.damage() 并传入我们的 DamageSource 和伤害量。
entity.damage(damageSource, 5.0f);方块的完整实现:
public class TaterBlock extends Block {
public TaterBlock(Settings settings) {
super(settings);
}
@Override
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
if (entity instanceof LivingEntity) {
DamageSource damageSource = new DamageSource(
world.getRegistryManager()
.get(RegistryKeys.DAMAGE_TYPE)
.entryOf(ExampleModDamageTypes.TATER_DAMAGE));
entity.damage(damageSource, 5.0f);
}
}
}现在,每当生物踩在我们的自定义方块上时,都将受到使用我们的自定义伤害类型的 5 点伤害(2.5 颗心)。
你可以在你的模组的 en_us.json 文件中以 death.attack.<message_id> 的格式定义伤害类型的死亡信息。
Not Found: /home/runner/work/fabric-docs/fabric-docs/reference/1.21.1/src/main/resources/assets/example-mod/lang/en_us.json当死因是我们的伤害类型时,你将会看到如下的死亡信息:

有些伤害类型能够无视护甲、无视状态效果等等。 伤害类型的这些属性是由标签控制的。
你可以在 data/minecraft/tags/damage_type 中找到既有的伤害类型标签。
INFO
全部伤害类型的列表详见 Minecraft Wiki。
让我们把我们的土豆伤害类型加入伤害类型标签 bypasses_armor。
要将我们的伤害类型加入这些标签,需要在 minecraft 命名空间下创建一个 JSON 文件。
data/minecraft/tags/damage_type/bypasses_armor.json包含以下内容:
{
"values": [
"example-mod:tater"
]
}将 replace 设置为 false 以确保你的标签不会替换既有的标签。