🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
This page is written for:
1.21
This page is written for:
1.21
伤害类型定义了实体能受到的伤害的种类。 从 Minecraft 1.19.4 开始,创建新的伤害类型的方式已是数据驱动,也就是说由 JSON 文件创建。
让我们创建一种叫 土豆 的伤害类型。 我们先从为你的自定义伤害创建 JSON 文件开始。 这个文件放在你的模组的 data
目录下的 damage_type
子目录。
resources/data/fabric-docs-reference/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("fabric-docs-reference", "tater"));
为了演示自定义伤害类型如何使用,我们将使用一个自定义方块 土豆块 。 让我们实现生物踩在 土豆块 上时会造成 土豆 伤害。
你可以重写 onSteppedOn
方法来造成这个伤害。
我们从创建一个属于我们的自定义伤害类型的 DamageSource
开始。
DamageSource damageSource = new DamageSource(
world.getRegistryManager()
.get(RegistryKeys.DAMAGE_TYPE)
.entryOf(FabricDocsReferenceDamageTypes.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(FabricDocsReferenceDamageTypes.TATER_DAMAGE));
entity.damage(damageSource, 5.0f);
}
}
}
现在,每当生物踩在我们的自定义方块上时,都将受到使用我们的自定义伤害类型的 5 点伤害(2.5 颗心)。
你可以在你的模组的 en_us.json
文件中以 death.attack.<message_id>
的格式定义伤害类型的死亡信息。
"item.minecraft.potion.effect.tater": "Tater Potion",
当死因是我们的伤害类型时,你将会看到如下的死亡信息:
有些伤害类型能够无视护甲、无视状态效果等等。 伤害类型的这些属性是由标签控制的。
你可以在 data/minecraft/tags/damage_type
中找到既有的伤害类型标签。
INFO
全部伤害类型的列表详见 Minecraft Wiki。
让我们把我们的土豆伤害类型加入伤害类型标签 bypasses_armor
。
要将我们的伤害类型加入这些标签,需要在 minecraft
命名空间下创建一个 JSON 文件。
data/minecraft/tags/damage_type/bypasses_armor.json
包含以下内容:
{
"replace": false,
"values": [
"fabric-docs-reference:tater"
]
}
将 replace
设置为 false
以确保你的标签不会替换既有的标签。