Skip to content

伤害类型

伤害类型定义了实体能受到的伤害的种类。 从 Minecraft 1.19.4 开始,创建新的伤害类型的方式已经变为数据驱动的,也就是说它们由 JSON 文件创建。

创建一种伤害类型

让我们创建一种叫 土豆 的伤害类型。 我们先从为你的自定义伤害创建 JSON 文件开始。 这个文件将被放在你的模组的 data 目录下的 damage_type 子目录。

resources/data/fabric-docs-reference/damage_type/tater.json

它有以下的结构:

json
{
  "exhaustion": 0.1,
  "message_id": "tater",
  "scaling": "when_caused_by_living_non_player"
}

这个自定义伤害类型在玩家每次受到来自非玩家的生物(例:方块)造成的伤害时增加 0.1 消耗度。 此外,造成的伤害量将随存档难度而变化。

INFO

所有可用的键值详见 Minecraft Wiki

通过代码访问伤害类型

当我们需要在代码中访问我们的自定义伤害类型时,我们将用它的 RegistryKey 来创建一个 DamageSource 实例。

所需的 RegistryKey 可用以下方式获取:

java
public static final RegistryKey<DamageType> TATER_DAMAGE = RegistryKey.of(RegistryKeys.DAMAGE_TYPE, new Identifier("fabric-docs-reference", "tater"));

使用伤害类型

为了演示自定义伤害类型如何使用,我们将使用一个自定义方块 土豆块 。 让我们实现当生物踩在 土豆块 上时,它会对生物造成 土豆 伤害。

你可以重写 onSteppedOn 方法来造成这个伤害。

我们从创建一个属于我们的自定义伤害类型的 DamageSource 开始。

java
DamageSource damageSource = new DamageSource(
		world.getRegistryManager()
				.get(RegistryKeys.DAMAGE_TYPE)
				.entryOf(FabricDocsReferenceDamageTypes.TATER_DAMAGE));

然后,我们调用 entity.damage() 并传入 我们的 DamageSource 和伤害量。

java
entity.damage(damageSource, 5.0f);

方块的完整实现:

java
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> 的格式定义伤害类型的死亡信息。

json
"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

包含以下内容:

json
{
  "replace": false,
  "values": [
    "fabric-docs-reference:tater"
  ]
}

replace 设置为 false 以确保你的标签不会替换既有的标签。