cnYeqi
本帖最后由 cnYeqi 于 2023-10-25 20:45 编辑

如题,我使用如下方法监听按钮触发和保护按钮,但是getHolder时发现,打开的gui玩家背包那部分点击物品时获得的是Player Holder,可以按住shift+左键把物品强行放到菜单里.有没有什么优雅的方法解决这个问题?
    public void onClick(InventoryClickEvent e){
        if(e.getClickedInventory()==null || e.getClickedInventory().getHolder()==null){
            return;
        }
        if(e.getClickedInventory().getHolder() instanceof MagicGui) {
            MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
            int slot = e.getSlot();
            if (!gui.getUnLimitSlots().contains(slot)) {
                e.setCancelled(true);
            }
            gui.getContext().putVariable("slot", slot);
            gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
            gui.getContext().putVariable("click", e.getClick().name());
            gui.getContext().putVariable("action", e.getAction().name());
            gui.executeSpell(slot, (Player) e.getWhoClicked());
        }
    }


nsju7
InventoryDragEvent

cnYeqi

这个不能解决这个问题,我自行解决了,不通过getClick获得背包,而是直接从事件获得背包就可以了

xiacca2
可以添加额外的条件来检查是否点击的是GUI中的物品,而不是玩家背包中的物品。通常,GUI中的物品会具有某种特定的标识,例如一个特殊的物品或特定的slot范围。
public void onClick(InventoryClickEvent e) {
    if (e.getClickedInventory() == null || e.getClickedInventory().getHolder() == null) {
        return;
    }

    if (e.getClickedInventory().getHolder() instanceof MagicGui) {
        MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
        int slot = e.getSlot();
        
        // Check if the slot is within the valid range for GUI items
        if (gui.isValidSlot(slot)) {
            e.setCancelled(true);
            gui.getContext().putVariable("slot", slot);
            gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
            gui.getContext().putVariable("click", e.getClick().name());
            gui.getContext().putVariable("action", e.getAction().name());
            gui.executeSpell(slot, (Player) e.getWhoClicked());
        }
    }
}