Создание кольца полета.

Версия Minecraft
1.12.2
API
Forge
122
4
6
Здорова всем, вопрос вроде простой но крайне тяжелый, создаю кольцо полета вроде работает но из за постоянного обновления полет нормально не выдается, а так как предмет проверяется в инвентаре то это нормально не получается пофиксить, а создавать отдельный эффект для этого чуда не хочется.
Java:
@SubscribeEvent
public void livingUpdate(LivingEvent.LivingUpdateEvent e) {
for (int i = 0; i < trinkets_hand.getSlots(); i++) {
                ItemStack stack = trinkets_hand.getStackInSlot(i);
                ITrinket trinket = stack.getCapability(CAPTrinket.INV_CAP_TRINKET_ITEM, null);

                if (trinket == ItemsInit.RING_FLIGHT && stack != null) {
                    startFlying(player);
                } else stopFlying(player);
Кто знает как разрешить данный вопрос, помогите советом буду очень признателен.
 
Решение
Потому что у тебя полёт отрубается, даже если в первом слоте нет кольца, а во втором есть кольцо.
Не уверен, что за API ты используешь (мб вообще кастомное), поэтому предлагаю следующее:
1) Найти метод hasItem() в IInventory (если он есть: исходников от 1.12.2 под рукой нет, только от 1.16.5).
2) Задать какой-нить булеан hasRing = false. Затем, циклом пробегаться по тринкетам, и если есть кольцо - сделать hasRing = true (не забудь после этого остановить цикл). Следующим делом - проверка на hasRing - там уже делаешь startFlying. В случае же, когда !hasRing, делаешь stopFlying
Примерный код - делал на коленке, т.к. исходников 1.12.2 нет под рукой:
boolean hasItem = false;
for(int i = 0; i < trinkets_hand.getSlots(); i++) {
    ItemStack stack = trinkets_hand.getStackInSlot(i);
    if(stack.getItem() ==...
1,374
113
241
Потому что у тебя полёт отрубается, даже если в первом слоте нет кольца, а во втором есть кольцо.
Не уверен, что за API ты используешь (мб вообще кастомное), поэтому предлагаю следующее:
1) Найти метод hasItem() в IInventory (если он есть: исходников от 1.12.2 под рукой нет, только от 1.16.5).
2) Задать какой-нить булеан hasRing = false. Затем, циклом пробегаться по тринкетам, и если есть кольцо - сделать hasRing = true (не забудь после этого остановить цикл). Следующим делом - проверка на hasRing - там уже делаешь startFlying. В случае же, когда !hasRing, делаешь stopFlying
Примерный код - делал на коленке, т.к. исходников 1.12.2 нет под рукой:
boolean hasItem = false;
for(int i = 0; i < trinkets_hand.getSlots(); i++) {
    ItemStack stack = trinkets_hand.getStackInSlot(i);
    if(stack.getItem() == Items.APPLE) {
        hasItem = true;
        break;
    }
}
if(hasItem) startFlying(player);
else stopFlying(player);
 
1,202
31
185
А можно сделать еще проще

Java:
@SubscribeEvent
public void livingUpdate(LivingEvent.LivingUpdateEvent e) {
for (int i = 0; i < trinkets_hand.getSlots(); i++) {
                ItemStack stack = trinkets_hand.getStackInSlot(i);
                ITrinket trinket = stack.getCapability(CAPTrinket.INV_CAP_TRINKET_ITEM, null);

                if (trinket == ItemsInit.RING_FLIGHT && stack != null) {
                    startFlying(player);
                    return;
                }
}
stopFlying(player);
}
 
Сверху