Использование ведра с молоком

Версия Minecraft
1.12.1
4,045
63
645
Народ, посоветуйте, как отловить событие выпивания молока?
LivingEntityUseItemEvent.Finish не фурычит, так как не удаётся выяснить какой предмет игрок держал до использования. Дело в том, что в эвент передаётся начальный стак (без копирования), который в onItemUseFinish() заменяется на пустой. В итоге в эвенте на выходе мы видим пустое ведро, а на входе Empty стак...
Что делать?

Можно, конечно, ловить по пустому ведру, но мало ли в каком-нибудь моде добавят ведро с супом, например О_О
 
Решение
В смысле, записывать туда инфу?
Да. Я просто написал как пример, так как я ещё на 1.7.10 пишу код.
Ну, если вариантов нет, придётся действовать так.
К сожалению, у меня нету других вариантов.
Java:
public class EventsForge {

    private final static HashMap<EntityLivingBase, ItemStack> map = new HashMap<EntityLivingBase, ItemStack>();

    @SubscribeEvent
    public void food(LivingEntityUseItemEvent.Start event) {
        System.out.println(event.getItem());
        if (map.containsKey(event.getEntityLiving()))
            map.replace(event.getEntityLiving(), event.getItem().copy());
        else
            map.put(event.getEntityLiving(), event.getItem().copy());
    }

    @SubscribeEvent
    public void...

timaxa007

Модератор
5,831
409
672
Вроде как у Finish два ItemStack'а: первый getItem() должно что съедаешь, а второй то что возвращаться после съедания getResultStack(). Возможности проверить сейчас у меня нет. Но если не поможет, то типа костыльно использовать, т.е.: создать переменную ItemStack, в Start даёшь этой переменной из getItem(), в Stop переменная будет null, а в Finish проверяешь переменную и делаешь её потом null.
---
Переменная ItemStack, должен быть относительно игрока, который использует этот предмет.
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
Проверил в Finish:
Золотое яблоко (как и любая еда): getItem() и getResultStack() имею одинаковое значение, если было одна еда, то 0xtile.air@0, а если нет, то не полный стак 63xitem.appleGold@1.
Ведро с молоком: getItem() = 0xtile.air@0, а getResultStack() 1xitem.bucket@0.
---
В моём случаи, я бы использовал костыль, либо HashMap'у, либо через IEEP - всё зависит от цели их использования.
 

timaxa007

Модератор
5,831
409
672
В смысле, записывать туда инфу?
Да. Я просто написал как пример, так как я ещё на 1.7.10 пишу код.
Ну, если вариантов нет, придётся действовать так.
К сожалению, у меня нету других вариантов.
Java:
public class EventsForge {

    private final static HashMap<EntityLivingBase, ItemStack> map = new HashMap<EntityLivingBase, ItemStack>();

    @SubscribeEvent
    public void food(LivingEntityUseItemEvent.Start event) {
        System.out.println(event.getItem());
        if (map.containsKey(event.getEntityLiving()))
            map.replace(event.getEntityLiving(), event.getItem().copy());
        else
            map.put(event.getEntityLiving(), event.getItem().copy());
    }

    @SubscribeEvent
    public void food(LivingEntityUseItemEvent.Stop event) {
        System.out.println(event.getItem());
        if (map.containsKey(event.getEntityLiving()))
            map.remove(event.getEntityLiving());
    }

    @SubscribeEvent
    public void food(LivingEntityUseItemEvent.Finish event) {
        System.out.println(event.getItem());
        System.out.println(event.getResultStack());
        if (map.containsKey(event.getEntityLiving())) {
            ItemStack is = map.get(event.getEntityLiving());
            System.out.println(is);
            if (is.getItem() == Items.MILK_BUCKET) {
                //Бла-бла-бла
            }
            map.remove(event.getEntityLiving());
        }
    }

}
 
Сверху