首页 > 解决方案 > 如何获得杀死玩家 bukkit 的实体?

问题描述

当你以某种方式被杀时,我正在尝试制作自定义的死亡信息。当你被 TNT 炸毁或被爬行者炸毁时,我想要单独的消息。我尝试调试它并生成爬行者和 TNT,并在控制台中输出控制台中的e.getEntity().getKiller()as 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 语句对实体没有选择性。

标签: javaminecraftbukkit

解决方案


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

推荐阅读