如何检测主手的自定义十字弓?

How to detect a custom Crossbow in mainhand?

我正在尝试检测玩家手中的弩(这是一个自定义物品),但只有弓(也是一个自定义物品)似乎按照我现在设置的方式工作。当我测试每个项目时,只有弓会显示“fire”(并且 运行 代码正确)。

    @EventHandler
public void playerBowShoot(EntityShootBowEvent e) {
    Entity entity = e.getEntity();
    Entity arrow = e.getProjectile();
    if (entity.getType().equals(EntityType.PLAYER)) {
        Player p = (Player) entity;
        if (p.getInventory().getItemInMainHand().getItemMeta().equals(Weapons.crossbow.getItemMeta())) {
            Bukkit.broadcastMessage("fire");
            arrow.setVelocity(p.getLocation().getDirection().multiply(100.0D));
        }
        if (p.getInventory().getItemInMainHand().getItemMeta().equals(Weapons.bow.getItemMeta())) {
            Bukkit.broadcastMessage("fire");
            arrow.setVelocity(p.getLocation().getDirection().multiply(100.0D));
        }

    }
}

你不应该使用项目元来检查类型,但是 getType() :

@EventHandler
public void playerBowShoot(EntityShootBowEvent e) {
    Entity entity = e.getEntity();
    Entity arrow = e.getProjectile();
    if (entity instanceof Player) {
        Player p = (Player) entity;
        ItemStack hand = p.getInventory().getItemInMainHand();
        if(hand == null) { // nothing in hand
        }  else if (hand.getType().equals(Material.CROSSBOW) && hand.getItemMeta().getDisplayName().equals(theNameOfTheCrossbow)) { // it's a crossbow
            Bukkit.broadcastMessage("fire");
            arrow.setVelocity(p.getLocation().getDirection().multiply(100.0D));
        }
    }
}

要检查它是否是好货,您可以:

  • 如果要应用于所有项目,只需检查类型
  • 检查自定义 names/lores/enchants 等...
  • 检查类似。如果物品可能会损坏(例如带有耐久度的剑)则不能使用,或者你应该复制物品,设置相同的耐久度以检查两者 firstItem.isSimilar(secondItem)