🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
🇨🇳 中文 (Chinese - China)
🇨🇳 中文 (Chinese - China)
外观
本页面基于这个版本编写:
1.21.4
本页面基于这个版本编写:
1.21.4
状态效果,又称效果,是一种可以影响实体的状况, 可以是正面、负面或中性的。 游戏本体通过许多不同的方式应用这些效果,如食物和药水等等。
命令 /effect
可用来给实体应用效果。
在这篇教程中我们将加入一个叫 土豆 的新状态效果,每游戏刻给你 1 点经验。
StatusEffect
让我们通过继承所有状态效果的基类 StatusEffect
来创建一个自定义状态效果类。
public class TaterEffect extends StatusEffect {
protected TaterEffect() {
// category: StatusEffectCategory - describes if the effect is helpful (BENEFICIAL), harmful (HARMFUL) or useless (NEUTRAL)
// color: int - Color is the color assigned to the effect (in RGB)
super(StatusEffectCategory.BENEFICIAL, 0xe9b8b3);
}
// Called every tick to check if the effect can be applied or not
@Override
public boolean canApplyUpdateEffect(int duration, int amplifier) {
// In our case, we just make it return true so that it applies the effect every tick
return true;
}
// Called when the effect is applied.
@Override
public boolean applyUpdateEffect(ServerWorld world, LivingEntity entity, int amplifier) {
if (entity instanceof PlayerEntity) {
((PlayerEntity) entity).addExperience(1 << amplifier); // Higher amplifier gives you experience faster
}
return super.applyUpdateEffect(world, entity, amplifier);
}
}
与注册方块和物品类似,我们使用 Registry.register
将我们的自定义状态效果注册到 STATUS_EFFECT
注册表。 这可以在我们的初始化器内完成。
public class FabricDocsReferenceEffects implements ModInitializer {
public static final RegistryEntry<StatusEffect> TATER;
static {
TATER = Registry.registerReference(Registries.STATUS_EFFECT, Identifier.of("fabric-docs-reference", "tater"), new TaterEffect());
}
@Override
public void onInitialize() {
// ...
}
}
状态效果的图片是一个 18x18 的 PNG,显示在玩家的背包中。 将你的自定义图标放在:
resources/assets/fabric-docs-reference/textures/mob_effect/tater.png
像其它翻译一样,你可以在语言文件中添加一个 ID 格式的条目 "effect.<mod-id>.<effect-identifier>": "Value"
。
{
"effect.fabric-docs-reference.tater": "Tater"
}
不妨看看你会如何将效果应用到实体。
TIP
For a quick test, it might be a better idea to use the previously mentioned /effect
command:
effect give @p fabric-docs-reference:tater
要在代码内部应用状态效果,需要使用 LivingEntity#addStatusEffect
方法,接收一个 StatusEffectInstance
实例,返回布尔值,以表示效果是否成功应用了。
var instance = new StatusEffectInstance(FabricDocsReferenceEffects.TATER, 5 * 20, 0, false, true, true);
entity.addStatusEffect(instance);
参数 | 类型 | 描述 |
---|---|---|
effect | RegistryEntry<StatusEffect> | 代表效果的注册表项。 |
duration | int | 效果的时长,单位为刻,而非秒 |
amplifier | int | 效果等级的倍率。 不是与效果的等级直接对应,而是有增加的。 比如,amplifier 为 4 => 等级为 5 |
ambient | boolean | 这个有些棘手, 基本上是指定效果是由环境(比如信标)施加的,没有直接原因。 如果是 true ,HUD内的效果图标会以青色覆盖层的形式出现。 |
particles | boolean | 是否显示粒子。 |
icon | boolean | 是否在 HUD 中显示效果的图标。 效果会在物品栏中显示,无论其设置的属性。 |
INFO
要创建使用此效果的药水,请参阅药水指南。