库存 ClickEvent 不工作

Inventory ClickEvent not working

当我点击物品栏中的物品时,它什么也没做,我可以将它拖到任何我想要的地方。然后我重新打开库存,物品又回来了。我希望单击该项目(在本例中为通知项目)以切换通知布尔值并关闭库存。请帮忙。这可能是一个愚蠢的解决方案,但有时简单的东西会让我逃避。谢谢

这是库存:

public class GUI extends JavaPlugin implements Listener
{

    private API api;

    AlphaCommand command = new AlphaCommand();

    public static Inventory inv = Bukkit.createInventory(null, 9, ChatColor.AQUA + "Alpha Config");

      public static boolean isNotifyEnabled()
      {
        return AlphaCommand.notify;
      }

      protected String getCheckName()
      {
        return this.getCheckName();
      }

    public static void openGUI(Player player, Inventory inv)
    {   
        ItemStack checks = new ItemStack(Material.DIAMOND_SWORD);
        ItemStack banPlayer = new ItemStack(Material.GOLD_AXE);
        ItemStack autoBan = new ItemStack(Material.DIAMOND_AXE);
        ItemStack notify = new ItemStack(Material.SLIME_BALL);

        ItemMeta checksMeta = checks.getItemMeta();
        ItemMeta autoBanMeta = autoBan.getItemMeta();
        ItemMeta notifyMeta = notify.getItemMeta();
        ItemMeta banPlayerMeta = banPlayer.getItemMeta();


        checksMeta.setDisplayName(ChatColor.BLUE + "Checks");
        autoBanMeta.setDisplayName(ChatColor.BLUE + "AutoBan");
        notifyMeta.setDisplayName(ChatColor.BLUE + "Notify");
        banPlayerMeta.setDisplayName(ChatColor.BLUE + "Ban Player");


        checks.setItemMeta(checksMeta);
        autoBan.setItemMeta(autoBanMeta);
        notify.setItemMeta(notifyMeta);
        banPlayer.setItemMeta(banPlayerMeta);


        inv.setItem(7, banPlayer);  
        inv.setItem(1, checks);
        inv.setItem(3, autoBan);
        inv.setItem(5, notify);

        player.openInventory(inv);

    }

    public static void open(Player player, Inventory inv)
    {
        if(player instanceof Player)
        {
            player.openInventory(inv);
        }

    }
    public static Inventory getGUI(){
        return inv;
        }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent e)
    {
        Bukkit.getPluginManager().registerEvents(this, Bukkit.getPluginManager().getPlugins()[0]);
        String invName = ChatColor.stripColor(e.getClickedInventory().getName());

        Player player = (Player) e.getWhoClicked(); // The player that clicked the item
        ItemStack clicked = e.getCurrentItem(); // The item that was clicked
        @SuppressWarnings("unused")
        Inventory inventory = e.getInventory(); // The inventory that was clicked in

    if(invName.equalsIgnoreCase(inv.getName()))
    {

        if((clicked == null) || (clicked.getType() == Material.AIR) || (!clicked.hasItemMeta()))
        {
            player.closeInventory();
            return;
        }

        if(clicked.getItemMeta().getDisplayName().equalsIgnoreCase("AutoBan"))
        {
            Configuration config = this.api.getConfiguration();
            boolean autoBan = config.readBoolean("checks." + getCheckName() + ".AutoBan");

            if (config.readBoolean("checks." + getCheckName() + ".AutoBan") == true)
            {
                 autoBan = false;
                 e.setCancelled(true);
                 player.closeInventory();
                 return;
            }
            else if(autoBan == false)
            {
                autoBan = true;
                e.setCancelled(true);
                player.closeInventory();
                return;
            }
            else
            {
                e.setCancelled(true);
                player.closeInventory();
                return;
            }
        }

        if(clicked.getItemMeta().getDisplayName().equalsIgnoreCase("Notify"))
        {
            boolean notify = isNotifyEnabled();

            if(notify == true)
            {
                notify = false;
                e.setCancelled(true);
                player.closeInventory();
                return;
            }
            else if(notify == false)
            {
                notify = true;
                e.setCancelled(true);
                player.closeInventory();
                return;
            }
        }

        if(clicked.getItemMeta().getDisplayName().equalsIgnoreCase("Checks"))
        {
            player.sendMessage(ChatColor.RED + "This Feature is coming soon to Alpha.");
            e.setCancelled(true);
            player.closeInventory();
            return;
        }

        if(e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("Ban Player"))
        {
            player.sendMessage("This Feature is coming soon to Alpha V.4");
            e.setCancelled(true);
            player.closeInventory();
            return;

        }else
            {
            player.closeInventory();
            e.setCancelled(true);
            return;
            }

        }
    }

}

您上面提供的代码中似乎存在多个问题,会导致看不到预期的结果。

#1

首先,您在事件本身内部为这个 class 注册事件,这意味着它永远不会被注册,除非事件被调用,除非您注册它,否则永远不会发生...请参阅问题?因此,您需要做的是将以下代码行移动到您的 onEnable 方法中。

Bukkit.getPluginManager().registerEvents(this, Bukkit.getPluginManager().getPlugins()[0]);

您需要对这行代码进行一些更改。您需要将 this 替换为侦听器对象的新实例 new GUI()。还建议您使用调用它的插件注册侦听器,但幸运的是,如果您将它放在您的 onEnable 中,您的 onEnable 方法就在您的插件中 class。这意味着您可以将插件更改为 this。您的新代码行将如下所示。

Bukkit.getPluginManager().registerEvents(new GUI(), this);

将其放入您的 onEnable 中,此处的问题应该得到解决。

#2

第二个问题是,当您检查商品名称时,您没有去除颜色。这摆脱了字符串中的颜色。这是因为您的项目名称是 ChatColor.BLUE + "AutoBan" 但是您正在检查它是否等于 "AutoBan" 这是不同的。解决此问题所需要做的与您对清单名称所做的完全相同,并使用 ChatColor.stripColor(itemName) 获取可以检查的字符串。

例如:

String itemName = ChatColor.stripColor(clicked.getItemMeta().getDisplayName()); if (itemName.equals("AutoBan")){

注意:我还用 equals 替换了 equalsIgnoreCase 因为大小写总是匹配的,所以是一个不必要的检查。