无法检测使用的项目
Trouble detecting item used
我正在尝试检查玩家使用的物品是否是我添加的自定义物品,但由于某种原因它没有检测到该物品。这是代码。
@EventHandler
public void damage(EntityDamageByEntityEvent event){
if(event.getEntity() instanceof Player && event.getDamager() instanceof Player){
if(((Player) event.getDamager()).getInventory().getItemInMainHand() == CustomItems.potator()){
System.out.println("potato");
}
else{
//When i looked @ console this logged the same exact thing
System.out.println("Damager Main Item = " + ((Player) event.getDamager()).getInventory().getItemInMainHand());
System.out.println("Potator Item = " + CustomItems.potator());
}
}
}
自定义项目Class:
public static ItemStack potator(){
ArrayList<String> lore = new ArrayList<String>();
lore.add(ChatColor.GOLD + "Turns a random slot in the hotbar to a potato.");
lore.add(ChatColor.GRAY + "1/100% chance from dropping from a potato.");
ItemStack item = new ItemStack(Material.STONE_HOE);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(ChatColor.GOLD + "The Potator");
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
if(((Player) event.getDamager()).getInventory().getItemInMainHand() == CustomItems.potator())
在这一行中,通过使用 ==
,您将检查左右引用是否相同。您想进行内容比较,例如使用 .equals()
。 GeeksForGeeks.
上的差异有很好的解释
Spigot 提供了一种独立于堆栈大小的方法 isSimilar()
,这比 .equals()
更好。
但是,这可能会使您的代码针对任何石锄执行,因此您需要自己进行检查。我会做这样的事情:
public boolean isPotator(ItemStack i){
if(i == null || !i.hasItemMeta())
return false;
ItemMeta meta = i.getItemMeta();
if(!meta.hasDisplayName() || !meta.hasLore())
return false;
return meta.getDisplayName().equals(ChatColor.GOLD + "The Potator");
}
然后像这样执行检查:
@EventHandler
public void damage(EntityDamageByEntityEvent event)
{
if(!(event.getEntity() instanceof Player && event.getDamager() instanceof Player))
return;
Player damager = (Player) event.getDamager();
if(!isPotator(damager.getInventory().getItemInMainHand()))
return;
System.out.println("potato");
}
因为你有一个 CustomItem
class,你可以通过为项目名称创建一个最终字符串来改进这段代码,然后你可以在 ItemStack 创建和 isPotator
检查。
我正在尝试检查玩家使用的物品是否是我添加的自定义物品,但由于某种原因它没有检测到该物品。这是代码。
@EventHandler
public void damage(EntityDamageByEntityEvent event){
if(event.getEntity() instanceof Player && event.getDamager() instanceof Player){
if(((Player) event.getDamager()).getInventory().getItemInMainHand() == CustomItems.potator()){
System.out.println("potato");
}
else{
//When i looked @ console this logged the same exact thing
System.out.println("Damager Main Item = " + ((Player) event.getDamager()).getInventory().getItemInMainHand());
System.out.println("Potator Item = " + CustomItems.potator());
}
}
}
自定义项目Class:
public static ItemStack potator(){
ArrayList<String> lore = new ArrayList<String>();
lore.add(ChatColor.GOLD + "Turns a random slot in the hotbar to a potato.");
lore.add(ChatColor.GRAY + "1/100% chance from dropping from a potato.");
ItemStack item = new ItemStack(Material.STONE_HOE);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(ChatColor.GOLD + "The Potator");
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
if(((Player) event.getDamager()).getInventory().getItemInMainHand() == CustomItems.potator())
在这一行中,通过使用 ==
,您将检查左右引用是否相同。您想进行内容比较,例如使用 .equals()
。 GeeksForGeeks.
Spigot 提供了一种独立于堆栈大小的方法 isSimilar()
,这比 .equals()
更好。
但是,这可能会使您的代码针对任何石锄执行,因此您需要自己进行检查。我会做这样的事情:
public boolean isPotator(ItemStack i){
if(i == null || !i.hasItemMeta())
return false;
ItemMeta meta = i.getItemMeta();
if(!meta.hasDisplayName() || !meta.hasLore())
return false;
return meta.getDisplayName().equals(ChatColor.GOLD + "The Potator");
}
然后像这样执行检查:
@EventHandler
public void damage(EntityDamageByEntityEvent event)
{
if(!(event.getEntity() instanceof Player && event.getDamager() instanceof Player))
return;
Player damager = (Player) event.getDamager();
if(!isPotator(damager.getInventory().getItemInMainHand()))
return;
System.out.println("potato");
}
因为你有一个 CustomItem
class,你可以通过为项目名称创建一个最终字符串来改进这段代码,然后你可以在 ItemStack 创建和 isPotator
检查。