如何禁止玩家无法将物品放入任何宝箱中

问题描述 投票:0回答:1

我想禁止将我的自定义物品放入任何箱子中,我尝试过,但不知何故,我的常规库存中的物品奇怪地摇晃,但仍然可以放入其他物品栏中,我想问如何禁止这样做作为拐杖,因为我现在正在做。

这是我当前的代码:

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        Inventory clickedInventory = event.getClickedInventory();
        if (clickedInventory != null && clickedInventory.getType() == InventoryType.PLAYER) {
            ItemStack itemStack = event.getHotbarButton() == -1 ? event.getCursor() : clickedInventory.getItem(event.getHotbarButton());
            if ((customItemService.isCustomItem(itemStack) || customItemService.isCustomItem(event.getCurrentItem())) && event.getSlotType() == InventoryType.SlotType.ARMOR) {
                event.setCancelled(true);
            }
            if (customItemService.isCustomItem(event.getCurrentItem()) && event.isShiftClick()) {
                event.setCancelled(true);
            }
            return;
        }

        Inventory inventory = event.getView().getTopInventory();
        if (inventory.getType() == InventoryType.WORKBENCH || inventory.getType() == InventoryType.CRAFTING) {
            return;
        }
        boolean found = inventory.getType() == InventoryType.CHEST;
        Location location = inventory.getLocation();
        if (location == null) {
            return;
        }
        boolean cancelled = false;
        Inventory playerInventory = event.getWhoClicked().getInventory();
        if (event.getHotbarButton() != -1 && customItemService.isCustomItem(playerInventory.getItem(event.getHotbarButton()))) {
            if (location.getBlockY() < 5 && found) {
                cancelled = true;
            }
            if (!found) {
                cancelled = true;
            }
        }
        if (customItemService.isCustomItem(event.getCurrentItem()) || customItemService.isCustomItem(event.getCursor())) {
            if (location.getBlockY() < 5) {
                cancelled = true;
            }
            if (!found) {
                cancelled = true;
            }
        }
        if (cancelled) {
            event.setCancelled(true);
            event.getWhoClicked().sendMessage(locale.get("not-allow"));
        }
    }


    @EventHandler
    public void onInventoryDrag(InventoryDragEvent event) {
        if (event.getInventory().getType() == InventoryType.PLAYER || event.getInventory().getType() == InventoryType.CRAFTING) {
            if (customItemService.isCustomItem(event.getCursor()) || customItemService.isCustomItem(event.getOldCursor())) {
                event.setCancelled(true);
            }
            return;
        }
        Inventory inventory = event.getView().getTopInventory();
        if (inventory.getType() == InventoryType.WORKBENCH) {
            return;
        }
        boolean found = inventory.getType() == InventoryType.CHEST;
        Location location = event.getView().getTopInventory().getLocation();
        if (location == null) {
            return;
        }
        boolean cancelled = false;
        if (customItemService.isCustomItem(event.getOldCursor()) || customItemService.isCustomItem(event.getCursor())) {
            if (location.getBlockY() < 5) {
                cancelled = true;
            }
            if (!found) {
                cancelled = true;
            }
        }
        if (cancelled) {
            event.setCancelled(true);
            event.getWhoClicked().sendMessage(locale.get("not-allow"));
        }
    }

我需要它,这样玩家就无法不通过shift、不通过键盘上的按钮、不通过鼠标来放置我的自定义项目

我尝试使用库存点击事件,它似乎有效,但你仍然可以将物品放在带有箱子的手推车中。

java bukkit spigot
1个回答
-1
投票

为了防止玩家将自定义物品放入宝箱中,请务必通过重置

InventoryClick
InventoryDrag
事件处理来取消所有将物品移入库存(包括宝箱)的尝试。

@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
    ItemStack itemStack = event.getCurrentItem();
    if (customItemService.isCustomItem(itemStack)) {
        event.setCancelled(true);
        event.getWhoClicked().sendMessage(locale.get("not-allow"));
    }
}

@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
    for (int slot : event.getRawSlots()) {
        ItemStack itemStack = event.getInventory().getItem(slot);
        if (customItemService.isCustomItem(itemStack)) {
            event.setCancelled(true);
            event.getWhoClicked().sendMessage(locale.get("not-allow"));
            break;
        }
    }
}

通过此调整,玩家将无法将您的自定义物品放入库存中,包括宝箱。

© www.soinside.com 2019 - 2024. All rights reserved.