我正在尝试制作一种食物(冰毒),当你吃它时,它每次都会叠加效果放大器。所以我制作这个方法是为了尝试弄清楚玩家是否已经具有该效果,如果是,则使效果放大器为 2 而不是默认的 0。我的大问题是,当我尝试使用该方法时,它当然需要一个 LivingEntity(玩家)使用该方法,我应该在方法参数中放入什么以及如何获取 LivingEntity。
package net.tyrique.banhammermod.item.custom;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.food.FoodProperties;
import net.tyrique.banhammermod.effect.ModEffects;
public class MethFood {
public static final FoodProperties METH = (new FoodProperties.Builder()).alwaysEat().nutrition(0).saturationMod(0F).effect(
() -> new MobEffectInstance(ModEffects.METH_EFFECT.get(), 1500, isAlreadyHigh(**WHAT DO I PUT HERE!?**)), 1.0F).fast().build();
private static int isAlreadyHigh(LivingEntity player) {
int lvl = 0;
if (player.hasEffect(ModEffects.METH_EFFECT.get())) {
lvl = 2;
}
return lvl;
}
}
我已经尝试使用其他一些技术或可能的方法来获取播放器,但我不知道还能做什么。我确信解决方案很简单。
您无法在该声明中获得
LivingEntity
,因为它独立于任何实体。它在任何实体存在之前就已声明。
应用效果时,您需要找到您的实体。
一种方法是订阅
PotionAddedEvent
并将逻辑放入事件处理程序中。 PotionAddedEvent
甚至为您提供了一个方法getOldPotionEffect()
,当且仅当实体尚不具有相同类型的效果时,该方法才为空。您可能必须在此处使用更高的放大器再次应用该效果,因为该事件不可取消,这不是超级干净。还要确保您不会在此处造成应用效果的无限循环。
或者,您可以创建自己的
MobEffectInstance
子类,它重写 update(MobEffectInstance)
方法。这是每当应用效果并且该实体上已存在相同效果时调用的方法。在这里您可以创建专门针对您的项目的自己的逻辑。然后,您可以在 METH
对象的声明中使用自定义类。这可能是更干净但可能更困难的方法。