Вопрос Баг с InventoryClickEvent

Версия Minecraft
1.16.X

1Love_Artix001

Пользователь
Сообщения
40
Разрешается выкладывание кода, файлов конфигураций, логов и т.д. только под BB-код CODE
Всем здравствуйте, у меня в плагине есть метод InventoryClickEvent который отвечает за запрет перемещения некоторых предметов (шалкеровых ящиков) в инвентаре. вот код:
if (backpacks.containsKey(uuid)) {
ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
if (!isBackpack(item) || (!player.getInventory().containsAtLeast(item, 1) && !player.getInventory().getItemInOffHand().equals(item))) {
event.setCancelled(true);
player.closeInventory();
backpacks.remove(uuid);
openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
} else {
ItemStack clickedItem = event.getCurrentItem();
if (isShulkerBox(clickedItem) || isShulkerBox(event.getCursor())) {
event.setCancelled(true);
}

// Проверка на -1 перед тем, как пытаться получить предмет из горячей клавиши
int hotbarButton = event.getHotbarButton();
if (hotbarButton != -1) {
ItemStack hotbarItem = player.getInventory().getItem(hotbarButton);
if (isShulkerBox(hotbarItem)) {
event.setCancelled(true);
}
}
}
}
}
проблема заключается в том, что когда игрок держит во 2 руке предмет, то этот метод попросту не работает.
 
Решение
Форматирование (BB-код):
    private static final Map<UUID, Boolean> air = new HashMap<UUID, Boolean>();


Форматирование (BB-код):
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_AIR) {
            handleClick(event, event.getPlayer().getInventory().getItemInHand());
            handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
        }
    }

    private void handleClick(PlayerInteractEvent event, ItemStack item) {
        Bukkit.getLogger().warning(event.getPlayer().getName());
        if (isBackpack(item)) {...
Да, часть подправлял
Я из-за неё запутался просто П... (Делай сам прошу, апи в публике и там много примеров)
Решение твоей задачи:

Форматирование (BB-код):
    private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(27), "Рюкзак"));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }
 
Я из-за неё запутался просто П... (Делай сам прошу, апи в публике и там много примеров)
Решение твоей задачи:

Форматирование (BB-код):
    private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(27), "Рюкзак"));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }
Извини.. Просто прикол в том, что у рюкзаков должно быть 3 уровня. На первом слотов будет 9, на втором 18, а на 3 27.
 
Извини.. Просто прикол в том, что у рюкзаков должно быть 3 уровня. На первом слотов будет 9, на втором 18, а на 3 27.
исправь как там было, я просто под себя корректировал
Объединено

Форматирование (BB-код):
private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(level), "Рюкзак"));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }
 
исправь как там было, я просто под себя корректировал
Объединено

Форматирование (BB-код):
private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(level), "Рюкзак"));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }
Код:
private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        int level = getBackpackLevel(item);
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(level), "Рюкзак"));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }

ничего не поменялось, проблема почему то не пропала
 
ура баг вернулся
капец
Объединено

ура баг вернулся
всё впринципе тоже самое. если открываю рюкзак (шалкеровый ящик) через ПКМ, то InventoryClickEvent отменяется без проблем, если во время открытого рюкзака пытаюсь переместить "SHULKER_BOX" или "_SHULKER_BOX". если же я открываю его держа предмет во второй руке, то ничего не работает 😎
 
Последнее редактирование:
короче...

Форматирование (BB-код):
    private static final Map<UUID, Boolean> air = new HashMap<UUID, Boolean>();


Форматирование (BB-код):
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
            if (event.getAction() == Action.RIGHT_CLICK_AIR) {
                air.put(event.getPlayer().getUniqueId(), false);
            }
            handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
        }
    }


Форматирование (BB-код):
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (air.get(uuid) != null && air.get(uuid) == false) {
            air.remove(uuid);
        }
        else if (backpacks.containsKey(uuid)) {
            ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
            if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                saveItemsToShulker(item, backpacks.get(uuid), player);
            }
            backpacks.remove(uuid);
            openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
        }
    }
Объединено

более легче патч мне лень делать, но это работает. интересно почему при воздухе такой баг...
 
короче...

Форматирование (BB-код):
    private static final Map<UUID, Boolean> air = new HashMap<UUID, Boolean>();


Форматирование (BB-код):
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
            if (event.getAction() == Action.RIGHT_CLICK_AIR) {
                air.put(event.getPlayer().getUniqueId(), false);
            }
            handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
        }
    }


Форматирование (BB-код):
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (air.get(uuid) != null && air.get(uuid) == false) {
            air.remove(uuid);
        }
        else if (backpacks.containsKey(uuid)) {
            ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
            if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                saveItemsToShulker(item, backpacks.get(uuid), player);
            }
            backpacks.remove(uuid);
            openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
        }
    }
Объединено

более легче патч мне лень делать, но это работает. интересно почему при воздухе такой баг...
'saveItemsToShulker(org.bukkit.inventory.ItemStack, org.bukkit.inventory.Inventory)' in 'me.artix001.shulkerpacks.BackPackInventory' cannot be applied to '(org.bukkit.inventory.ItemStack, org.bukkit.inventory.Inventory, org.bukkit.entity.Player)'
 
'saveItemsToShulker(org.bukkit.inventory.ItemStack, org.bukkit.inventory.Inventory)' in 'me.artix001.shulkerpacks.BackPackInventory' cannot be applied to '(org.bukkit.inventory.ItemStack, org.bukkit.inventory.Inventory, org.bukkit.entity.Player)'
у меня просто другой код, так трудно переделатц? :(

Форматирование (BB-код):
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (air.get(uuid) != null && air.get(uuid) == false) {
            air.remove(uuid);
        }
        else if (backpacks.containsKey(uuid)) {
            ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
            if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                saveItemsToShulker(item, backpacks.get(uuid));
            }
            backpacks.remove(uuid);
            openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
        }
    }
 
у меня просто другой код, так трудно переделатц? :(

Форматирование (BB-код):
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (air.get(uuid) != null && air.get(uuid) == false) {
            air.remove(uuid);
        }
        else if (backpacks.containsKey(uuid)) {
            ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
            if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                saveItemsToShulker(item, backpacks.get(uuid));
            }
            backpacks.remove(uuid);
            openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
        }
    }
я туплю, прости пожалуйста..
Объединено

у меня просто другой код, так трудно переделатц? :(

Форматирование (BB-код):
    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (air.get(uuid) != null && air.get(uuid) == false) {
            air.remove(uuid);
        }
        else if (backpacks.containsKey(uuid)) {
            ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
            if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                saveItemsToShulker(item, backpacks.get(uuid));
            }
            backpacks.remove(uuid);
            openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
        }
    }
такс, есть проблемка.. когда я закрываю рюкзак, гуишка по сути закрывается, но по факту он досих пор открыт..
также, есть баги с сохранением предметов
 
Последнее редактирование:
я туплю, прости пожалуйста..

я туплю, прости пожалуйста..
Объединено


такс, есть проблемка.. когда я закрываю рюкзак, гуишка по сути закрывается, но по факту он досих пор открыт..
также, есть баги с сохранением предметов
Какие у меня работает всё
 
Форматирование (BB-код):
    private String name = "Рюкзак";
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_AIR) {
            handleClick(event, event.getPlayer().getInventory().getItemInHand());
            handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
        }
    }

    private void handleClick(PlayerInteractEvent event, ItemStack item) {
        Bukkit.getLogger().warning(event.getPlayer().getName());
        if (isBackpack(item)) {
            event.setCancelled(true);
            if (item.isSimilar(event.getPlayer().getInventory().getItemInMainHand())) {
                if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
                    openBackpack(event.getPlayer(), event.getPlayer().getInventory().getItemInMainHand());
                }
            }
        }
    }

    private void openBackpack(Player player, ItemStack item) {
        UUID uuid = player.getUniqueId();
        backpacks.put(uuid, Bukkit.createInventory(null, getInventorySize(27), name));
        Inventory backpack = backpacks.get(uuid);
        loadItemsFromShulker(item, backpack);
        player.openInventory(backpack);
        openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
    }

    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (name == event.getView().getTitle()) {
            if (backpacks.containsKey(uuid)) {
                ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
                if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                    saveItemsToShulker(item, backpacks.get(uuid));
                }
                backpacks.remove(uuid);
                openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
            }
        }
    }
 
Последнее редактирование:
Форматирование (BB-код):
    private static final Map<UUID, Boolean> air = new HashMap<UUID, Boolean>();


Форматирование (BB-код):
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_AIR) {
            handleClick(event, event.getPlayer().getInventory().getItemInHand());
            handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
        }
    }

    private void handleClick(PlayerInteractEvent event, ItemStack item) {
        Bukkit.getLogger().warning(event.getPlayer().getName());
        if (isBackpack(item)) {
            event.setCancelled(true);
            if (item.isSimilar(event.getPlayer().getInventory().getItemInMainHand())) {
                if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
                    if (event.getAction() == Action.RIGHT_CLICK_AIR) {
                        if (!event.getPlayer().getInventory().getItemInOffHand().getType().equals(Material.AIR)) {
                            air.put(event.getPlayer().getUniqueId(), false);
                        }
                    }
                    openBackpack(event.getPlayer(), event.getPlayer().getInventory().getItemInMainHand());
                }
            }
        }
    }

    @EventHandler
    public void onInventoryClose(InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        UUID uuid = player.getUniqueId();
        if (name == event.getView().getTitle()) {
            if (air.get(uuid) != null && air.get(uuid) == false) {
                air.put(uuid, true);
            }
            else if (backpacks.containsKey(uuid)) {
                ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
                if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
                    saveItemsToShulker(item, backpacks.get(uuid));
                }
                backpacks.remove(uuid);
                openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
            }
        }
    }
 
Назад
Сверху Снизу