为什么这段代码只在我穿上靴子时输出 "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
希望对您有所帮助!
代码如下:
@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
希望对您有所帮助!