java - 如何获得杀死玩家 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 语句对实体没有选择性。
解决方案
- 方法和 javadocs 上有
@Nullable
注释,因此您知道方法可以是什么null
。 PlayerDeathEvent#getEntity#getKiller
方法返回Player
,因此您不需要将Player
对象转换为它。- 否则,此方法仅返回 Player,如果它被另一个活着的 Player 杀死。
Entity#getLastDamageCause
方法可以返回 nullgetCause()
方法返回一个枚举,所以你不需要使用equals
,你只需要==
比较枚举值。- 您可以检查其他一些
DamageCause
字段,包括ENTITY_EXPLOSION
. 有时当爬行者爆炸时,伤害原因可能是BLOCK_EXPLOSION
,也许是因为太远了。
推荐阅读
- ios - 来自框架的 Localizable.strings 没有进入框架
- python - iOS 之外的 Apple Music (MusicKit) userToken
- node.js - 如何使用 sns 消息过滤器发送到特定电子邮件?
- javascript - 无法在此节点 http get 请求中添加超时
- mysql - 删除对 MySql 的依赖
- python - Pandas 删除重复项返回“None”值和“NoneType”对象没有属性“function”错误
- docker - 有没有办法在 Gitlab 共享运行器中运行 sbt-native-packager?
- r - R:重组子列表
- angular - Angular 9 我怎样才能等到请求完成
- excel - 优化慢 VBA 响应