PotionEffect применяется только в первый раз - PullRequest
1 голос
/ 25 марта 2020

Я создаю крошечный мод, в котором я создал яблоко, которое дает 4 эффекта. Вот мой код:

public class AmethystApple extends FoodBase
{
    List<PotionEffect> effects = new ArrayList<PotionEffect>();

    public AmethystApple(String name, int amount, float saturation, boolean isWolfFood) {
        super(name, amount, saturation, isWolfFood);
        setAlwaysEdible();
        this.registerAppleEffects();
    }

    private void registerAppleEffects()
    {
        PotionEffect speedEffect = new PotionEffect(MobEffects.SPEED, 400, 2);
        PotionEffect resistanceEfect = new PotionEffect(MobEffects.RESISTANCE, 400, 9);
        PotionEffect nauseaEffect = new PotionEffect(MobEffects.NAUSEA, 400, 0);
        PotionEffect hungerEffect = new PotionEffect(MobEffects.HUNGER, 500, 1);
        effects.add(speedEffect); // Speed 3 - 20 sec
        effects.add(resistanceEfect); // Resistance 10 - 20 sec
        effects.add(nauseaEffect); // Nausea 1 - 20 sec
        effects.add(hungerEffect); // Hunger 2 - 25 sec
    }

    @Override
    protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
    {
        if (!worldIn.isRemote) {
            for (PotionEffect effect : effects) {
                player.addPotionEffect(effect);
            }
            System.out.println("POTION EFFECTS APPLIED");
        }
    }

    @SideOnly(Side.CLIENT)
    public boolean hasEffect (ItemStack stack)
    {
        return true;
    }
}

Эффекты применяются в первый раз, когда я ем яблоко, но не когда я ем другое. Я вижу эффекты для 1 галочки в правом верхнем углу экрана, поэтому я предполагаю, что эффекты применяются с неправильным значением duration или сбрасываются сразу после их применения. Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

В настоящее время вы используете одни и те же объекты PotionEffect для каждого съеденного яблока. Вам нужно создавать новые объекты PotionEffect каждый раз, когда игрок ест яблоко. Может быть, изменить свой класс на что-то вроде этого:

public class AmethystApple extends FoodBase
{


    public AmethystApple(String name, int amount, float saturation, boolean isWolfFood) {
        super(name, amount, saturation, isWolfFood);
        setAlwaysEdible();
    }

    private List<PotionEffect> registerAppleEffects()
    {
        List<PotionEffect> effects = new ArrayList<PotionEffect>
        PotionEffect speedEffect = new PotionEffect(MobEffects.SPEED, 400, 2);
        PotionEffect resistanceEfect = new PotionEffect(MobEffects.RESISTANCE, 400, 9);
        PotionEffect nauseaEffect = new PotionEffect(MobEffects.NAUSEA, 400, 0);
        PotionEffect hungerEffect = new PotionEffect(MobEffects.HUNGER, 500, 1);
        effects.add(speedEffect); // Speed 3 - 20 sec
        effects.add(resistanceEfect); // Resistance 10 - 20 sec
        effects.add(nauseaEffect); // Nausea 1 - 20 sec
        effects.add(hungerEffect); // Hunger 2 - 25 sec
        return effects
    }

    @Override
    protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player)
    {
        if (!worldIn.isRemote) {
            List<PotionEffect> effects = this.registerAppleEffects();
            for (PotionEffect effect : effects) {
                player.addPotionEffect(effect);
            }
            System.out.println("POTION EFFECTS APPLIED");
        }
    }

    @SideOnly(Side.CLIENT)
    public boolean hasEffect (ItemStack stack)
    {
        return true;
    }
}
1 голос
/ 25 марта 2020

Я нашел причину. Я не создавал новый PotionEffect каждый раз, когда я ем яблоко, поэтому количество тиков PotionEffect было равно 0;

Счетчик тика эффекта хранится в самом PotionEffect и не связан с EntityPlayer!

Я исправил это, переписав содержимое моего for l oop в:

for (PotionEffect effect : effects) {
    player.addPotionEffect(new PotionEffect(effect));
}
...