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

Energy warrior

Активный участник
Пользователь
Баллы
76
Я ловлю ивент PlayerInteractEntityEvent и когда открываю инвентарь, то он закрывается! Есть лодка, есть шалкер бокс. Когда я кликаю на лодку без шаклера и у меня в руке бокс, у меня забирается шалкер, и его данные: инвентарь, название, шалкер в лодке к которому привязан бокс, и сама лодка, уходят в контейнер, а он в Set. Когда я кликаю по лодке, у меня перебирается весь сэт и находится нужный контейнер, от туда я беру инвентарь и открываю, но он автоматически закрывается, тогда я взял и создал копию инвентаря и открыл её и всё работает.
 
Последнее редактирование:
Консоль чиста. А код я уже исправил, чтобы работало, просто интересно почему так работает?
Я откуда знаю, ты не дал код который не работал, откуда мне знат ьпочему он не работает
 
Я откуда знаю, ты не дал код который не работал, откуда мне знат ьпочему он не работает
Код:
@EventHandler
public void onInteract(PlayerInteractEntityEvent event){
Entity clicked = event.getRightClicked();
if(clicked.getType.equals(EntityType.BOAT){
event.getPlayer().openInventory(inventory);
}
}
 
Последнее редактирование:
Возможно ядро закрывает инвентарь при попытке взаимодействовать с энтити.
Попробуй отменять событие или вызывать открытие шедулером через 1 тик
 
разве при клине на ентити, не правильнее юзать PlayerInteractEntityEvent?
 
Возможно ядро закрывает инвентарь при попытке взаимодействовать с энтити.
Попробуй отменять событие или вызывать открытие шедулером через 1 тик
Пробовал, не помогает, шедуляр не пробовал, но пробовал цикл(МБ, наверное, эффект один и тот же) у меня OutOfMemory. Да как тогда ловить когда закроется. Пофиксил добавлением копии инвентаря и её открытием. МБ проблема в том что нельзя открывать инвентарь напрямую из BlockState...
 
Пробовал, не помогает, шедуляр не пробовал, но пробовал цикл(МБ, наверное, эффект один и тот же) у меня OutOfMemory
Цикл и шедулер - не одно и то же. Шедулер бы выполнил открытие уже после завершения обработки события.
Своим циклом ты лишь зафлудил клиент пакетами. А откуда OutOfMemoty вообще ХЗ. Без кода не понять.
МБ проблема в том что нельзя открывать инвентарь напрямую из BlockState...
Вот тут я вообще не понял, о чём ты
 
Цикл и шедулер - не одно и то же. Шедулер бы выполнил открытие уже после завершения обработки события.
Своим циклом ты лишь зафлудил клиент пакетами. А откуда OutOfMemoty вообще ХЗ. Без кода не понять.
та там обычный do while с Player#openInventory();
Вот тут я вообще не понял, о чём ты
Когда я кликаю на лодку у меня забирается шалкер и засовываются данные в контейнер, когда я кликаю по лодке с шалкером это инвентарь должен открываться, но он этого не делает.
 
Когда я кликаю на лодку у меня забирается шалкер и засовываются данные в контейнер, когда я кликаю по лодке с шалкером это инвентарь должен открываться, но он этого не делает.
Ты бы весь код скинул ибо большая часть твоих сообщений выглядит как бессвязный бред. Вообще ничего не понятно. Ты ставишь шалкер в лодку и после взаимодействуешь с ним, или что?
 
Ты бы весь код скинул ибо большая часть твоих сообщений выглядит как бессвязный бред. Вообще ничего не понятно. Ты ставишь шалкер в лодку и после взаимодействуешь с ним, или что?
Есть лодка, есть шалкер бокс. Когда я кликаю на лодку без шаклера и у меня в руке бокс, у меня забирается шалкер, и его данные: инвентарь, название, шалкер в лодке к которому привязан бокс, и сама лодка, уходят в контейнер, а он в Set. Когда я кликаю по лодке, у меня перебирается весь сэт и находится нужный контейнер, от туда я беру инвентарь и открываю, но он автоматически закрывается, тогдя я взял и создал копию инвентаря и открыл её и всё работает.
 
Есть лодка, есть шалкер бокс. Когда я кликаю на лодку без шаклера и у меня в руке бокс, у меня забирается шалкер, и его данные: инвентарь, название, шалкер в лодке к которому привязан бокс, и сама лодка, уходят в контейнер, а он в Set. Когда я кликаю по лодке, у меня перебирается весь сэт и находится нужный контейнер, от туда я беру инвентарь и открываю, но он автоматически закрывается, тогдя я взял и создал копию инвентаря и открыл её и всё работает.
В чем сейчас состоят твой вопрос и задача?
И в чем проблема показать код? Он явно более красноречив, чем твои попытки объяснить суть кода плагина. Если уж объясняешь на словах - в первую очередь объясняй конечную задачу, а не механику работы своего кода.
Учу изъясняться на русском языке:

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

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

Если я правильно тебя понял, то сразу вопрос. Зачем ты помещаешь объект/айдишник лодки в контейнер? Если бы ты использовал HashMap вместо Set - ты бы мог отказаться от перебора в пользу более быстрого получения контейнера по хешу.
Ну, и ещё один вопрос - что мешает тебе создать инвентарь для лодки один раз, и потом использовать его вместо объекта контейнера?
Подозреваю, что ты постоянно создавал инвентари и потом их либо куда-то складировал, либо вообще зачем-то создавал их в цикле, из-за чего забивался heap
 
Последнее редактирование:
В чем сейчас состоят твой вопрос и задача?
И в чем проблема показать код? Он явно более красноречив, чем твои попытки объяснить суть кода плагина. Если уж объясняешь на словах - в первую очередь объясняй конечную задачу, а не механику работы своего кода.
Учу изъясняться на русском языке:

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

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

Если я правильно тебя понял, то сразу вопрос. Зачем ты помещаешь объект/айдишник лодки в контейнер? Если бы ты использовал HashMap вместо Set - ты бы мог отказаться от перебора в пользу более быстрого получения контейнера по хешу.
Ну, и ещё один вопрос - что мешает тебе создать инвентарь для лодки один раз, и потом использовать его вместо объекта контейнера?
Подозреваю, что ты постоянно создавал инвентари и потом их либо куда-то складировал, либо вообще зачем-то создавал их в цикле, из-за чего забивался heap
Код:
@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);
}
}
}
 
Последнее редактирование:
Назад
Верх