Вопрос Баг с 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)) {...
Ничего не понял...
Подробнее, что ты выполняешь
В чём проблема: я пишу плагин на рюкзаки, и по сути, это шалкера которые открываются через ПКМ, но их нельзя поставить на землю. Так вот, если у меня во второй руке есть любой предмет, то событие InventoryClickEvent не срабатывает (оно если что ограничивает перемещение шалкеровых ящиков при открытом шалкере через ПКМ).
 
В чём проблема: я пишу плагин на рюкзаки, и по сути, это шалкера которые открываются через ПКМ, но их нельзя поставить на землю. Так вот, если у меня во второй руке есть любой предмет, то событие InventoryClickEvent не срабатывает (оно если что ограничивает перемещение шалкеровых ящиков при открытом шалкере через ПКМ).
короче я запутался
 
Последнее редактирование:
короче я запутался
Есть моментик( То, что ты видишь связанное с хотбаром, это чтобы запретить игроку перекладывать ресурсы с помощью цифр на клавиатуре (0-9)
 
Есть моментик( То, что ты видишь связанное с хотбаром, это чтобы запретить игроку перекладывать ресурсы с помощью цифр на клавиатуре (0-9)
А что именно происходит, когда ты ложишь предмет во вторую руку?
 
А что именно происходит, когда ты ложишь предмет во вторую руку?
В том то и дело, что по сути - ничего. Когда я открываю рюкзак через ПКМ, в него я не могу положить шалкеровые ящики, ибо InventoryClickEvent запрещает это делать. А когда я открываю шалкеровые ящики при этом держа предмет во второй руке, то этого метода словно и не бывало - шалкера спокойно перемещаются.
 
В том то и дело, что по сути - ничего. Когда я открываю рюкзак через ПКМ, в него я не могу положить шалкеровые ящики, ибо InventoryClickEvent запрещает это делать. А когда я открываю шалкеровые ящики при этом держа предмет во второй руке, то этого метода словно и не бывало - шалкера спокойно перемещаются.
ошибка в консоли может имеется?
Объединено

Я тут задумался, у тебя же есть метод PlayerInteractEvent?
Объединено

Мне кажется ошибка где-то в нём, ибо шалкер наверное не передаётся
 
Последнее редактирование:
ошибка в консоли может имеется?
Объединено

Я тут задумался, у тебя же есть метод PlayerInteractEvent?
Да. Он запрещает ставить рюкзаки на землю, будь он в основной руке, или 2. Сразу скажу, что это не из за него проблема, я проверял
 
Можно посмотреть?
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
} else if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
}
}

private void handleClick(PlayerInteractEvent event, ItemStack item) {
if (isBackpack(item)) {
event.setCancelled(true);
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (item.equals(event.getPlayer().getInventory().getItemInMainHand())) {
openBackpack(event.getPlayer(), item);
}
}
}
}
 
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
} else if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
}
}

private void handleClick(PlayerInteractEvent event, ItemStack item) {
if (isBackpack(item)) {
event.setCancelled(true);
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (item.equals(event.getPlayer().getInventory().getItemInMainHand())) {
openBackpack(event.getPlayer(), item);
}
}
}
}
openBackpack нужен
 
private void openBackpack(Player player, ItemStack item) {
int level = getBackpackLevel(item);
UUID uuid = player.getUniqueId();
Inventory backpack = backpacks.computeIfAbsent(uuid, k -> Bukkit.createInventory(null, getInventorySize(level), "Рюкзак"));
loadItemsFromShulker(item, backpack);
player.openInventory(backpack);
openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
}
 
А предметы в шалкере сохраняются?
Да, если нету предмета во второй руке. Если есть - такая же проблема как с InventoryClickEvent.
Объединено

А предметы в шалкере сохраняются?
Объединено

Мне кажется тут проблема с взаимодействием правым и левым кликом
Могу скинуть сразу полный код класса, всё равно делаю плагин публичным
 
Да, если нету предмета во второй руке. Если есть - такая же проблема как с InventoryClickEvent.
Добавь проверку в InteractClickEvent, чтобы он изучал только левую руку. Сделай такой эксперимент
 
Добавь проверку в InteractClickEvent, чтобы он изучал только левую руку. Сделай такой эксперимент
Ты имеешь ввиду handleClick из кода? Если да, то я уже тестировал. Он разрешает открытие рюкзака только с правой руки (дабы избежать дюпы), а если игрок будет пытаться нажимать ПКМ держа рюкзак в левой руке, то рюкзак просто не будет ставиться на землю, в то время как если игрок нажимает ПКМ с основной руки, то рюкзак не ставится на землю + сразу открывается.
 
Назад
Сверху Снизу