为什么这段代码只在我穿上靴子时输出 "Test",而当我脱下靴子时却从不输出 "no"?

Why does this code only output "Test" when I have the boots on but, it never outputs "no" when I take the boots off?

代码如下:

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    Player p = event.getPlayer();
    ItemStack boots = p.getInventory().getBoots();
    if (!boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.sendMessage("no");
        p.setAllowFlight(false);
    }
    if (boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.setAllowFlight(true);
        p.sendMessage("Test");
    }

}

具体来说,当我穿上靴子并移动时,它会输出测试。当我取下它们时,它什么也没有输出。请告诉我我做错了什么,谢谢!

因为你没有穿靴子。 我会逐行分解:)

前三行很明显

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    Player p = event.getPlayer();

这里你创建了一个变量 boots 并赋予它 inventory.getBoots() 的值;这将 return 一个 ItemStack 如果玩家佩戴它们。 如果您查看服务器控制台,您可能会收到 NullPointerException,因为如果玩家没有穿任何靴子,靴子变量将为空。

    ItemStack boots = p.getInventory().getBoots();

现在检查靴子的显示名称是否不等于“§3Elemental Boots”,这很好如果玩家穿着靴子。在您的情况下,当靴子关闭并且引导变量 exuals null 时,您正在尝试访问不存在的项目的显示名称,因此什么都不会发生(NPE 错误除外)。 (这一行还有一个问题,我会在回复的底部解释)

    if (!boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.sendMessage("no");
        p.setAllowFlight(false);
    }

同样的问题发生在这里

    if (boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.setAllowFlight(true);
        p.sendMessage("Test");
    }
}

解决这个问题的方法是添加另一个 if 语句来确保玩家穿着靴子。您可以这样做:

if(p.getInventory().getBoots().equals(null)) {
    //Gets called when the player isn't wearing boots
    p.sendMessage("You aren't wearing any boots!")
} else {
    //Gets called when the player is wearing boots
    ItemStack boots = p.getInventory().getBoots();
    //Rest of your code
}

上面的第二个问题是使用 Java 时文本的颜色可能会很奇怪,您可以 运行 使用 .equals("§3Elemental Boots") 时遇到问题 你有两个选择,

  • 选项 1,使用: .equals(ChatColor.translateAlternateColorCodes('§', "§3Elemental Boots")) 在制作任何带有颜色的字符串时,您还应该使用 ChatColor 方法。
  • 选项 2,使用: ChatColor.stripColors(boots.getItemMeta().getDisplayName()).equals("Elemental Boots")

我个人会选择选项 2

希望对您有所帮助!