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

Помогите Проблемы с открытием инвентаря

Тема в разделе "Разработка плагинов для новичков", создана пользователем Energy warrior, 15 дек 2019.

  1. Автор темы
    Energy warrior

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

    Баллы:
    76
    Я ловлю ивент PlayerInteractEntityEvent и когда открываю инвентарь, то он закрывается! Есть лодка, есть шалкер бокс. Когда я кликаю на лодку без шаклера и у меня в руке бокс, у меня забирается шалкер, и его данные: инвентарь, название, шалкер в лодке к которому привязан бокс, и сама лодка, уходят в контейнер, а он в Set. Когда я кликаю по лодке, у меня перебирается весь сэт и находится нужный контейнер, от туда я беру инвентарь и открываю, но он автоматически закрывается, тогда я взял и создал копию инвентаря и открыл её и всё работает.
     
    Последнее редактирование: 16 дек 2019
  2. Luminate_

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

    Баллы:
    76
    Имя в Minecraft:
    Luminate_
    Код скинь, и чистая ли консоль?
     
  3. Автор темы
    Energy warrior

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

    Баллы:
    76
    Консоль чиста. А код я уже исправил, чтобы работало, просто интересно почему так работает?
     
  4. Luminate_

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

    Баллы:
    76
    Имя в Minecraft:
    Luminate_
    Я откуда знаю, ты не дал код который не работал, откуда мне знат ьпочему он не работает
     
  5. Автор темы
    Energy warrior

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

    Баллы:
    76
    Код:
    @EventHandler
    public void onInteract(PlayerInteractEntityEvent event){
    Entity clicked = event.getRightClicked();
    if(clicked.getType.equals(EntityType.BOAT){
    event.getPlayer().openInventory(inventory);
    }
    }
     
    Последнее редактирование: 15 дек 2019
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Возможно ядро закрывает инвентарь при попытке взаимодействовать с энтити.
    Попробуй отменять событие или вызывать открытие шедулером через 1 тик
     
  7. Luminate_

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

    Баллы:
    76
    Имя в Minecraft:
    Luminate_
    разве при клине на ентити, не правильнее юзать PlayerInteractEntityEvent?
     
  8. Автор темы
    Energy warrior

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

    Баллы:
    76
    Опечатка.
     
  9. Автор темы
    Energy warrior

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

    Баллы:
    76
    Пробовал, не помогает, шедуляр не пробовал, но пробовал цикл(МБ, наверное, эффект один и тот же) у меня OutOfMemory. Да как тогда ловить когда закроется. Пофиксил добавлением копии инвентаря и её открытием. МБ проблема в том что нельзя открывать инвентарь напрямую из BlockState...
     
  10. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Цикл и шедулер - не одно и то же. Шедулер бы выполнил открытие уже после завершения обработки события.
    Своим циклом ты лишь зафлудил клиент пакетами. А откуда OutOfMemoty вообще ХЗ. Без кода не понять.
    Вот тут я вообще не понял, о чём ты
     
  11. Автор темы
    Energy warrior

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

    Баллы:
    76
    Когда я кликаю на лодку у меня забирается шалкер и засовываются данные в контейнер, когда я кликаю по лодке с шалкером это инвентарь должен открываться, но он этого не делает.
     
  12. CoolBoy

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

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Ты бы весь код скинул ибо большая часть твоих сообщений выглядит как бессвязный бред. Вообще ничего не понятно. Ты ставишь шалкер в лодку и после взаимодействуешь с ним, или что?
     
  13. Автор темы
    Energy warrior

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

    Баллы:
    76
    Есть лодка, есть шалкер бокс. Когда я кликаю на лодку без шаклера и у меня в руке бокс, у меня забирается шалкер, и его данные: инвентарь, название, шалкер в лодке к которому привязан бокс, и сама лодка, уходят в контейнер, а он в Set. Когда я кликаю по лодке, у меня перебирается весь сэт и находится нужный контейнер, от туда я беру инвентарь и открываю, но он автоматически закрывается, тогдя я взял и создал копию инвентаря и открыл её и всё работает.
     
  14. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    В чем сейчас состоят твой вопрос и задача?
    И в чем проблема показать код? Он явно более красноречив, чем твои попытки объяснить суть кода плагина. Если уж объясняешь на словах - в первую очередь объясняй конечную задачу, а не механику работы своего кода.
    Учу изъясняться на русском языке:

    "Я делаю возможность добавлять лодкам инвентарь (как у лам). Эта механика реализована посредством связывания лодок с шалкерами. Для связывания конкретной лодки с конкретным шалкером игроку нужно нажать по лодке держа при этом шалкер с вещами в руке. После нажатия шалкер пропадает из руки, а игрок при нажатии на лодку получает возможность просматривать содержимое шалкера - шалкер будто вставляется в лодку. Проблема в том, что при попытке открыть инвентарь шалкера этот инвентарь открывается и моментально закрывается. Чтобы это исправить я создаю копию инвентаря шалкера и открываю игроку уже эту копию - в этом случае инвентарь не закрывается. Объясните, пожалуйста, почему так происходит?"
    А потом либо твой код, либо что-то по типу "для хранения связей лодка<>шалкер я использую Set<Container>. Container - объект, в котором хранятся UUID лодки, название шалкера и его содержимое"

    Я прочитал твое сообщение раз 5, но все равно не уверен, что понял тебя до конца. Так что проведи работу над ошибками и объясни, наконец, нормально, чего ты хочешь получить/понять/изменить/исправить.

    Если я правильно тебя понял, то сразу вопрос. Зачем ты помещаешь объект/айдишник лодки в контейнер? Если бы ты использовал HashMap вместо Set - ты бы мог отказаться от перебора в пользу более быстрого получения контейнера по хешу.
    Ну, и ещё один вопрос - что мешает тебе создать инвентарь для лодки один раз, и потом использовать его вместо объекта контейнера?
    Подозреваю, что ты постоянно создавал инвентари и потом их либо куда-то складировал, либо вообще зачем-то создавал их в цикле, из-за чего забивался heap
     
    Последнее редактирование: 17 дек 2019
  15. Автор темы
    Energy warrior

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

    Баллы:
    76
    Код:
    @EventHandler
        public void onClick(PlayerInteractEntityEvent entityEvent){
            Entity clicked = entityEvent.getRightClicked();
            Player player = entityEvent.getPlayer();
            ItemStack hand = entityEvent.getPlayer().getInventory().getItemInMainHand();
            if(clicked.getType().equals(EntityType.BOAT)){
                Boat boat = (Boat) clicked;
                if(isShulker(hand)&&!contains(boat,containers)&&player.isSneaking()){
                    entityEvent.setCancelled(true);
                    putShulkerBox(hand,boat);
                }
            } else if(clicked.getType().equals(EntityType.SHULKER)){
                Shulker shulker = (Shulker) clicked;
                if(contains(shulker,containers)){
                    BoxContainer boxContainer = getByShulker(shulker,containers);
                    if(boxContainer!=null){
                        entityEvent.setCancelled(true);
                        player.openInventory(boxContainer.getInventory());
                        getNear(10,shulker.getLocation()).forEach(p->p.playSound(shulker.getLocation(), Sound.BLOCK_SHULKER_BOX_OPEN,1,1));
                    }
                }
            }
        }
    public class BoxContainer
    {
    private final Boat boat;
    private final Shulker box;
    private Inventory inventory;
    private final ItemStack itembox;

    public BoxContainer(Boat boat, Shulker box, Inventory inventory, String title, ItemStack itembox) {
    this.boat = boat;
    this.box = box;
    this.inventory = inventory;
    this.itembox = itembox;
    }

    public void dropBox(){
    Location location = this.boat.getLocation();
    this.box.remove();
    if(itembox.getItemMeta() instanceof BlockStateMeta) {
    BlockStateMeta bsm = (BlockStateMeta) itembox.getItemMeta();
    if(bsm.getBlockState() instanceof ShulkerBox) {
    ShulkerBox b = (ShulkerBox) bsm.getBlockState();
    b.getInventory().setContents(inventory.getContents());
    bsm.setBlockState(b);
    itembox.setItemMeta(bsm);
    }
    }
    location.getWorld().dropItem(location, itembox);
    }

    public Boat getBoat() {
    return boat;
    }

    public Shulker getBox() {
    return this.box;
    }

    public Inventory getInventory() {
    return inventory;
    }

    public void returnShulker(){
    if(!boat.getPassengers().contains(box)){
    box.teleport(boat);
    boat.addPassenger(box);
    }
    }

    public void update(){
    inventory.getViewers().stream().map(h->(Player)h).forEach(Player::updateInventory);
    }

    public void closeInventory(){
    if(inventory.getViewers().size()>0){
    inventory.getViewers().stream().map(h->(Player)h).forEach(Player::closeInventory);
    }
    }
    }
     
    Последнее редактирование: 17 дек 2019

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