我有一个方法,每当玩家右键单击一个胸部(Minecraft项目)时调用该方法,并且如果该块的位置与HashMap中的一个值匹配,则应检查该玩家的用户名是否与该键匹配在HashMap中。简单地说:这个位置是否已保存,并且尝试与之交互的玩家是否拥有它?我的if
语句用于检查播放器和位置是否匹配无效。
有问题的一行:
if (DeathChestManager.deathChestLocation.get(playerName) == b.getLocation()) {}
HashMap和block(b)位置值(`println()输出的内容):
HashMap值:
Location{world=CraftWorld{name=world},x=59.0,y=64.0,z=-30.0,pitch=0.0,yaw=0.0}
阻止位置值:
Location{world=CraftWorld{name=world},x=59.0,y=64.0,z=-30.0,pitch=0.0,yaw=0.0}
来自DeathChestManager
类的HashMap:
public static Map<String, Location> deathChestLocation = new HashMap<String, Location>();
PlayerInteract Class:
public void onPlayerInteract(PlayerInteractEvent e) {
Player p = e.getPlayer();
String playerName = p.getName();
Block b = e.getClickedBlock();
if (b != null && b.getType() == Material.CHEST) {
if (DeathChestManager.deathChestLocation.containsValue(b.getLocation())) {
e.setCancelled(true);
System.out.println(DeathChestManager.deathChestLocation.get(playerName));
System.out.println(b.getLocation());
if (DeathChestManager.deathChestLocation.get(playerName) == b.getLocation()) {
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
b.setType(Material.AIR);
Location loc = p.getLocation();
for (final ItemStack item : DeathChestManager.inventoryContents.get(p.getName())) {
int count = 0;
for (ItemStack i : p.getInventory().getContents()) {
if (i == null) {
count++;
} else if (i.getType() == Material.AIR) {
count++;
}
}
if (count == 0) {
if (item.getType() != Material.AIR) {
p.getWorld().dropItemNaturally(loc, item);
}
} else {
if (item != null) {
p.getInventory().addItem(item);
p.updateInventory();
}
}
}
DeathChestManager dcManager = new DeathChestManager();
dcManager.endTimer(p, p.getWorld().getName());
}
} else {
MessageManager.getInstance().severe(p, "You do not own that death-chest.");
}
}
}
}
答案 0 :(得分:2)
比较对象时使用.equals()
而不是==
。 ==
将比较内存中对象的地址,而.equals()
将检查它们是否具有相同的值。由于两个对象很少具有相同的地址,所以除了比较基本类型(int,char,但String 不是基本类型!)之外,你不应该使用==
。物质
所以你想要:
if (DeathChestManager.deathChestLocation.get(playerName).equals(b.getLocation())) {}
答案 1 :(得分:1)
您正在比较对象引用。只有当它们都引用相同的实例时,才会返回true。
如果您想比较这些对象的内容,请使用.equals()
。
答案 2 :(得分:1)
在测试基元以外的任何内容(int,boolean等)时,应该使用.equals()
,而不是==
。这包括字符串。