如何获得杀死玩家 bukkit 的实体?

How to get entity that killed player bukkit?

我正在尝试在您以某种方式被杀时制作自定义死亡消息。当你被 TNT 炸毁或被爬行者炸毁时,我想要单独的消息。我尝试调试它并生成爬行者和 TNT,并在控制台中将 e.getEntity().getKiller() 输出为 null。如果我这样做 e.getEntity().getKiller().getName(),它会给出一个错误。

这是我的调试器代码:

package me.Pale_Gray.BetterDeathMessages.deathmessages;

import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.PlayerDeathEvent;

public class DeathByTnt implements Listener{

    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent e) {
        String msg = e.getDeathMessage();
        System.out.println((Player) e.getEntity().getKiller());
        if (e.getEntity().getLastDamageCause().getCause().equals(DamageCause.ENTITY_EXPLOSION)) {
            msg = ChatColor.translateAlternateColorCodes('&', "&cIt went off with a BANG!");
            e.setDeathMessage(msg);
        }
    }
    
}

我只要求关注 System.out.println((Player) e.getEntity().getKiller());,因为我知道 if 语句对实体没有选择性。

  1. 方法和 javadoc 上有 @Nullable 注释,因此您知道什么方法可以是 null
  2. PlayerDeathEvent#getEntity#getKiller 方法 returns Player 所以你不需要向它投射 Player 对象。
    • 否则,此方法仅 returns Player,如果它被另一个活着的 Player 杀死。
  3. Entity#getLastDamageCause 方法可以 return null
  4. getCause()方法return是一个枚举,所以你不需要使用equals,你只需要==来比较枚举值。
  5. 您可以检查其他一些 DamageCause 字段,包括 ENTITY_EXPLOSION。有时苦力怕爆炸的伤害原因可能是BLOCK_EXPLOSION,可能是因为太远了。