【问题标题】:How to get entity that killed player bukkit?如何获得杀死玩家 bukkit 的实体?
【发布时间】:2021-02-14 02:53:26
【问题描述】:

当你以某种方式被杀时,我正在尝试制作自定义的死亡信息。当你被 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 语句对实体没有选择性。

【问题讨论】:

    标签: java minecraft bukkit


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多