首页 > 解决方案 > 如何添加一个1射击婴儿小怪的结界?

问题描述

我尝试过很多事件,例如 onAttack、EntityDeathEvent、EntityDamageByEntityEvent。这些似乎都不起作用。这可能是因为我写错了代码,这就是我想要的。我添加了一个命令,它会给你一把钻石剑,上面附有我试图添加的附魔,这将用于已经应用的 1 次射击婴儿小怪。代码:

@EventHandler
public void onAttack(EntityDamageByEntityEvent event) {
    Player player = (Player) event.getDamager();
    Ageable ageableEntity = (Ageable) event.getEntity();
    if (event.getEntity() instanceof Ageable) {
        if (ageableEntity.isAdult() == false) {
            if(player.getInventory().getItemInMainHand().containsEnchantment(OrphanEnchants.ORPHAN_OBLITERATOR)) {
                ageableEntity.setLastDamage(1000);
                ageableEntity.setHealth(0);
            }
        }
    }
    
}

告诉我,如果我;曾经事件错误,应该选择另一个事件或注册的结界错误。(我知道我没有给出注册的代码)

标签: javapluginsserverminecraftbukkit

解决方案


您的代码看起来很可靠,乍一看,我看不出它可能有什么问题(除非您只是没有注册该事件)。虽然有瑕疵。您可能应该在强制转换之前检查它是否event.getDamager()是一个实例。Player我还建议使用ageableEntity.damage(damage, player)这样游戏来处理它,就好像玩家真的杀死了它一样,它不会突然死亡。

我使用了您自己的代码并对其进行了一些更改,并添加了注释来解释所有内容的用途。假设您的代码确实不起作用,这只是另一种选择。

    @EventHandler
    public void onAttack(EntityDamageByEntityEvent event) {
        // check if damager is a Player and the entity is Ageable
        // otherwise there's no point of continuing
        if(event.getDamager() instanceof Player && event.getEntity() instanceof Ageable) {
            Player player = (Player) event.getDamager();
            Ageable ageableEntity = (Ageable) event.getEntity();
            // check if they're not an adult and the item has the enchantment required
            // otherwise there's no point of continuing
            if (!ageableEntity.isAdult() && player.getInventory().getItemInMainHand().containsEnchantment(OrphanEnchants.ORPHAN_OBLITERATOR)) {
                // cancel the event to handle it yourself
                event.setCancelled(true);
                
                // remove all potion effects to prevent absorbtion/regeneration/resistance
                // or other potions from keeping the entity alive
                ageableEntity.getActivePotionEffects().stream().map(PotionEffect::getType).forEach(ageableEntity::removePotionEffect);
                
                // set their health very low, but not zero, because then the
                // player doesn't get credit for killing it
                ageableEntity.setHealth(0.5D);
                
                // make the player damage the entity, set damage to MAX_VALUE
                // so the entity MUST die
                ageableEntity.damage(Double.MAX_VALUE, player);
            }
        }
    }

推荐阅读