gpt4 book ai didi

java - 库存 ClickEvent 不工作

转载 作者:行者123 更新时间:2023-11-29 08:33:19 26 4
gpt4 key购买 nike

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

这是库存:

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

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

Bukkit.getPluginManager().registerEvents(这, 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());
如果 (itemName.equals("AutoBan")){

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

关于java - 库存 ClickEvent 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46080208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com