1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Dark_Pro, 19 май 2020.

  1. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Как возможно отследить, что открывается инвентарь игрока (по стандарту кнопка Е).
    И как положить в этот момент (или не в этот момент), предмет в крафт 2х2.
    upload_2020-5-19_22-20-37.png
     
  2. SaberCraft

    SaberCraft Участник Пользователь

    Баллы:
    36
    upload_2020-5-19_21-58-29.png
     
  3. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Открытие собственного инвентаря детектится только через пакеты. Насчет скрина выше, могу с неуверенностью сказать, что слоты на разных версия разные, так что проверяй слоты через инвентари клик.
     
  4. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Проверял, и по нумерации они совпадают с обычным инвентарем(а именно нумеруется как 1,2,3,4), что соответствует нижней части инвентаря самого игрока.
     
  5. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    В каждой версии своя нумерация. И там она бесполезна
     
  6. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    В инвенторе клике есть такая штука как *event.getView()*, там ты получаешь 2 инвентаря и их типы, у которых своя нумерация, если ты хочешь делать что-то при нажатии на кнопку E, детекти это через пакеты.
     
  7. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Хорошо, открытие я отслежу через пакет, через getView(), я не как заблаговременно не запихну в нужные слоты предмет, т.к. ивент сработает после клика,а не до.
    Я знаю номер слота, знаю тип, но как положить туда что-то пока загадка
     
  8. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Отследил пакет ==> получил игрока ==> засетил ему айтемстак в нужный слот, если не обновится попробуй updateInventory()
     
  9. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Нет пакета на открытие инвентаря, есть только на закрытие.
    Вопрос как засетить в нужный слот айтемстак, если этот слот нельзя указать?
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    И не должно, это же инвентарь игрока и он всегда при нем. То есть инвентарь игрока всегда открыт.
     
  11. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    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);
            }
        }
        
    Так ты узнаешь какой слот тебе нужен(помести туда шмотку чтобы в чате написало), потом сетаешь что тебе надо и все
     
  12. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Вот пакеты, которые отправляются с клиента когда я открываю инвентарь(то есть он не проверяет)
    upload_2020-5-20_20-35-52.png
     
  13. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Возможно что-то с версиями выше моей динозавровской сделали.
    Код:
        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]]]
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Это не пакет открытия инвенторя, а ачивка. И это работает до 1.12 вроде, не помню точно верию. Если игрок зайдет с 1.12+ ивент соснет.
     
    Последнее редактирование: 20 май 2020
  15. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    В таком случае можно обойтись эвентами получения ачивок. Делать что-то когда далась ачивка *открой инвентарь* , и сразу ремувать ее
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Вот только клиент больше не шлет тот пакет и ачивка то не сработает. :D.
     
  17. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Я чего-то не так понял? Овнер темы юзает 1.12.2 все должно сработать
     
  18. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Вон чел скинул скрин выше, получается уже в 1.12 не работает. Исправил ответ выше.
     
  19. Автор темы
    Dark_Pro

    Dark_Pro Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    Nick
    В общем тема такова, где-то миллион раз перебирал различные варианты решения данной ситуации и подобрал, что-то подобное.
    Код:
        Inventory inventory = e.getPlayer().getOpenInventory().getTopInventory();
            if(inventory instanceof CraftingInventory) {
                setItems(inventory); //это предметы
        }
    
    Как правильно сказали инвентарь у игрока всегда открыт, поэтому я получаю крафтер при входе игрока и заполняю их нужными предметами. Но помимо этого еще много проблем.
    Например в InventoryClickEvent дополнительно требовалось проверять на event.getSlotType()==SlotType.CRAFTING
    А так как при закрытии инвентаря (InventoryCloseEvent) все предметы из крафтера сваливаются в инвентарь или дропаются при полном инвентаре, пришлось удалять их при дропе.
    Самое бредовое было при очистке инвентаря когда есть свободные слоты, нужно было очистить инвентарь и одновременно его заполнить.
    Комбинация получилась такая.
    1. Удалил предметы из инвентаря
    и через 1 тик
    2. Добавил предметы в крафтер
    3. Обновил инвентарь
    4. Удалил предметы из инвентаря
    И только в таком порядке, это настолько бредово, однако почему то работает))
     

Поделиться этой страницей