库存ClickEvent不起作用

时间:2017-09-06 16:27:33

标签: java minecraft bukkit inventory

当我点击清单中的项目时,它什么都不做,我可以把它拖到我想要的任何地方。然后我重新打开库存,项目又回来了。我希望项目单击(在这种情况下为Notify项)来切换notify boolean并关闭Inventory。请帮忙。这可能是一个愚蠢的解决方案,但有时简单的东西可以逃脱我。感谢。

这是库存:

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 个答案:

答案 0 :(得分:4)

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

#1

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

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

您需要对此行代码进行一些更改。您需要将this替换为侦听器对象new GUI()的新实例。还建议你使用调用它的插件注册监听器,但幸运的是,如果你把它放在你的onEnable中,你的onEnable方法就在你的插件类中。这意味着您可以将插件更改为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")){

注意:由于案例始终匹配,我还将equalsIgnoreCase替换为equals,因此进行了不必要的检查。