Комбинирование PotionEffect'ов

Версия Minecraft
1.12.2
API
Forge
25
0
Всем привет! Возникла проблема, хочу реализовать механику своего эффекта, когда на сущности уже весит ЭФФЕКТ 1 ЛВЛ и когда я попытаюсь навешать на нее такой же ЭФФЕКТ (любого другого уровня) то Новый уровень ЭФФЕКТА будет = старый ЛВЛ + новый ЛВЛ1637607718460.png
Но вот незадача, ивент onEffectApply делает этот код бесконечным, т.к он срабатывает когда накладывается эффект, а в конце кода мы повторно "пересобираем" этот эффект и по новой накладываем...
Прошу помочь с решением этой проблемы, подсказать другую логику, или другой ивент, или что-то другое...
Заранее спасибо за помощь!!!
 
Решение
Java:
@SubscribeEvent
public static void onEffect(PotionEvent.PotionAddedEvent event) {
    PotionEffect addable = event.getPotionEffect();
    PotionEffect currect = event.getOldPotionEffect();
    if (currect != null) {
       //Для твоей задачи нужно повысить уровень эффекта, а не понизить, поэтому модификация эффекта подойдет.
        currect.combine(
                new PotionEffect(
                        addable.getPotion(),
                        Math.max(currect.getDuration(), addable.getDuration()),
                        currect.getAmplifier() + addable.getAmplifier()));
    }
}
~~~
Для этой задачи лучше юзать событие PotionAddedEvent, потому что после PotionApplicableEvent не...
104
4
15
Это же ивент, он будет по кругу крутиться.. Тебе нужно этот же код помещать в метод, где он будет вызываться.
Т.Е. Если накладывать эффект после удара меча, то в onImpact помещай этот код.
Но это не точно.

UPD
или в ивент EntityHurtEvent
 
25
0
Не получится юзать этот ивент, начну немного с далека, может это поможет решению проблемы...
Вообще я хочу что бы мой меч накладывал мой эффект
Можно было бы сделать через этот ивент, но были бы проблемы, например:
Бью я одну цель сразу несколькими мечами с разными наклад.эффектами (были бы баги т.к в момент ивента работало наложение разных эффектов и дамаг приходится на какой-то из эффектов),поэтому по сути этот ивент не стоит юзать в моем случае... :/
 
104
4
15
Вообще я хочу что бы мой меч накладывал мой эффект
Java:
@Override
    public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) {
        // YOUR CODE HERE
        return super.hitEntity(stack, target, attacker);
    }

У меча можно переопределить метод hitEnitity, загони свой код сюда и сделай разные классы мечей с разными эффектами. А лучше создай один единый класс меча и наследуйся от него + оверрайд функцию hitEnitity.
UPD
Или наследуйся от ванильного меча.
 

tox1cozZ

aka Agravaine
Модератор
8,092
554
2,652
Я пытался так сделать, но у меня зелье сделано не через PotionEffects, а через расширение Potion..., поэтому его заоверрайдить не выходит(
Дак это разные вещи.
Эффект - это эффект, в нем есть тип - Potion. Хукнись, это нельзя оверрайдить.
 
25
0
Дак это разные вещи.
Эффект - это эффект, в нем есть тип - Potion. Хукнись, это нельзя оверрайдить.
тут такое дело, я не знаю что такое хук... Есть ли тут статья на форуме про хуки (что это такое? как и для чего юзать?), или это же все дело в знании джавы, поэтому я не знаю что это такое....?
 

tox1cozZ

aka Agravaine
Модератор
8,092
554
2,652
 
6,870
301
1,413
Java:
@SubscribeEvent
public static void onEffect(PotionEvent.PotionAddedEvent event) {
    PotionEffect addable = event.getPotionEffect();
    PotionEffect currect = event.getOldPotionEffect();
    if (currect != null) {
       //Для твоей задачи нужно повысить уровень эффекта, а не понизить, поэтому модификация эффекта подойдет.
        currect.combine(
                new PotionEffect(
                        addable.getPotion(),
                        Math.max(currect.getDuration(), addable.getDuration()),
                        currect.getAmplifier() + addable.getAmplifier()));
    }
}
~~~
Для этой задачи лучше юзать событие PotionAddedEvent, потому что после PotionApplicableEvent не факт, что эффект будет применен (метод isPotionApplicable может быть вызван не из addPotionEffect или просто отменен позже другим обработчиком)
 
Последнее редактирование:
Сверху