Помогите Открытие инвентаря игрока

Dark_Pro

Старожил
Пользователь
Баллы
103
Имя в Minecraft
Nick
Как возможно отследить, что открывается инвентарь игрока (по стандарту кнопка Е).
И как положить в этот момент (или не в этот момент), предмет в крафт 2х2.
upload_2020-5-19_22-20-37.png
 
Открытие собственного инвентаря детектится только через пакеты. Насчет скрина выше, могу с неуверенностью сказать, что слоты на разных версия разные, так что проверяй слоты через инвентари клик.
 
Открытие собственного инвентаря детектится только через пакеты. Насчет скрина выше, могу с неуверенностью сказать, что слоты на разных версия разные, так что проверяй слоты через инвентари клик.
Проверял, и по нумерации они совпадают с обычным инвентарем(а именно нумеруется как 1,2,3,4), что соответствует нижней части инвентаря самого игрока.
 
В инвенторе клике есть такая штука как *event.getView()*, там ты получаешь 2 инвентаря и их типы, у которых своя нумерация, если ты хочешь делать что-то при нажатии на кнопку E, детекти это через пакеты.
 
В инвенторе клике есть такая штука как *event.getView()*, там ты получаешь 2 инвентаря и их типы, у которых своя нумерация, если ты хочешь делать что-то при нажатии на кнопку E, детекти это через пакеты.
Хорошо, открытие я отслежу через пакет, через getView(), я не как заблаговременно не запихну в нужные слоты предмет, т.к. ивент сработает после клика,а не до.
Я знаю номер слота, знаю тип, но как положить туда что-то пока загадка
 
Хорошо, открытие я отслежу через пакет, через getView(), я не как заблаговременно не запихну в нужные слоты предмет, т.к. ивент сработает после клика,а не до.
Я знаю номер слота, знаю тип, но как положить туда что-то пока загадка
Отследил пакет ==> получил игрока ==> засетил ему айтемстак в нужный слот, если не обновится попробуй updateInventory()
 
Отследил пакет ==> получил игрока ==> засетил ему айтемстак в нужный слот, если не обновится попробуй updateInventory()
Нет пакета на открытие инвентаря, есть только на закрытие.
Вопрос как засетить в нужный слот айтемстак, если этот слот нельзя указать?
 
Нет пакета на открытие инвентаря, есть только на закрытие.
Вопрос как засетить в нужный слот айтемстак, если этот слот нельзя указать?
И не должно, это же инвентарь игрока и он всегда при нем. То есть инвентарь игрока всегда открыт.
 
https://bukkit.org/threads/open-player-inventory-event.402205/ - Про пакет открытия собственного инвентаря.
Код:
    @EventHandler
    public void pice(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        InventoryView inventory = p.getOpenInventory();
        for (int i = 0; i < inventory.countSlots(); i++) {
            p.sendMessage("item " + inventory.getItem(i) + " slot " + i);
        }
    }
Так ты узнаешь какой слот тебе нужен(помести туда шмотку чтобы в чате написало), потом сетаешь что тебе надо и все
 
Возможно что-то с версиями выше моей динозавровской сделали.
Код:
    public static void pl1() {
        ProtocolManager pm = ProtocolLibrary.getProtocolManager();
        pm.addPacketListener(new PacketAdapter(Core.main, ListenerPriority.NORMAL, PacketType.Play.Client.CLIENT_COMMAND) {
            @Override
            public void onPacketReceiving(PacketEvent event) {
                Bukkit.broadcastMessage("" + event.getPacket());
            }
        });
    }
открываю инвентарь результат -
Код:
[20:38:40 INFO]: PacketContainer[type=CLIENT_COMMAND[class=PacketPlayInClientCommand, id=4], structureModifier=StructureModifier[fieldType=class java.lang.Object, data=[private net.minecraft.server.v1_8_R3.PacketPlayInClientCommand$EnumClientCommand net.minecraft.server.v1_8_R3.PacketPlayInClientCommand.a]]]
 
https://bukkit.org/threads/open-player-inventory-event.402205/ - Про пакет открытия собственного инвентаря.
Код:
    @EventHandler
    public void pice(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        InventoryView inventory = p.getOpenInventory();
        for (int i = 0; i < inventory.countSlots(); i++) {
            p.sendMessage("item " + inventory.getItem(i) + " slot " + i);
        }
    }
Так ты узнаешь какой слот тебе нужен(помести туда шмотку чтобы в чате написало), потом сетаешь что тебе надо и все
Это не пакет открытия инвенторя, а ачивка. И это работает до 1.12 вроде, не помню точно верию. Если игрок зайдет с 1.12+ ивент соснет.
 
Последнее редактирование:
Это не пакет открытия инвенторя, а ачивка. И это работает до 1.13 кстати. Если игрок зайдет с 1.13+ ивент соснет.
В таком случае можно обойтись эвентами получения ачивок. Делать что-то когда далась ачивка *открой инвентарь* , и сразу ремувать ее
 
В таком случае можно обойтись эвентами получения ачивок. Делать что-то когда далась ачивка *открой инвентарь* , и сразу ремувать ее
Вот только клиент больше не шлет тот пакет и ачивка то не сработает. :D.
 
Вон чел скинул скрин выше, получается уже в 1.12 не работает. Исправил ответ выше.
 
В общем тема такова, где-то миллион раз перебирал различные варианты решения данной ситуации и подобрал, что-то подобное.
Код:
    Inventory inventory = e.getPlayer().getOpenInventory().getTopInventory();
        if(inventory instanceof CraftingInventory) {
            setItems(inventory); //это предметы
    }
Как правильно сказали инвентарь у игрока всегда открыт, поэтому я получаю крафтер при входе игрока и заполняю их нужными предметами. Но помимо этого еще много проблем.
Например в InventoryClickEvent дополнительно требовалось проверять на event.getSlotType()==SlotType.CRAFTING
А так как при закрытии инвентаря (InventoryCloseEvent) все предметы из крафтера сваливаются в инвентарь или дропаются при полном инвентаре, пришлось удалять их при дропе.
Самое бредовое было при очистке инвентаря когда есть свободные слоты, нужно было очистить инвентарь и одновременно его заполнить.
Комбинация получилась такая.
1. Удалил предметы из инвентаря
и через 1 тик
2. Добавил предметы в крафтер
3. Обновил инвентарь
4. Удалил предметы из инвентаря
И только в таком порядке, это настолько бредово, однако почему то работает))
 
Назад
Верх