本帖最后由 早晨解说 于 2022-5-17 18:43 编辑
复制代码
用getplayer可以获取被击杀的玩家
复制代码用getkiller可以获取击杀者,
当问题来了,如果击杀者是生物怎么办,
如果直接用getkiller的话会null
getkiller获取的是player类型:(
那么如果是生物击杀玩家呢,比如说zombie
纯新手,不怎么会描述
解决方法(详见tcejorPoiK
复制代码
- getEntity().getPlayer()
用getplayer可以获取被击杀的玩家
- getEntity().getKiller()
当问题来了,如果击杀者是生物怎么办,
如果直接用getkiller的话会null
getkiller获取的是player类型:(
那么如果是生物击杀玩家呢,比如说zombie
纯新手,不怎么会描述
解决方法(详见tcejorPoiK
- var entityDamageEvent = player.getLastDamageCause();
- if (entityDamageEvent instanceof EntityDamageByEntityEvent) {
- var entityDamageByEntityEvent = (EntityDamageByEntityEvent) entityDamageEvent;
- final Entity entity = entityDamageByEntityEvent.getDamager();
- // something...
- }
Player#getLastDamageCause()可以获取玩家最后一次受到伤害的EntityDamageEvent,将其转为EntityDamageByEntityEvent或者EntityDamageByBlockEvent再获取造成此次伤害的实体/方块。
你可以用getEntityType来判断是什么类型的实体
tcejorPoiK 发表于 2022-5-17 16:11
Player#getLastDamageCause()可以获取玩家最后一次受到伤害的EntityDamageEvent,将其转为EntityDamageByEn ...
- .getEntity().getPlayer().getLastDamageCause().getEntity().getName()
是这样吗……会null
- Cannot invoke "org.bukkit.event.entity.EntityDamageEvent.getEntity()" because the return value of "org.bukkit.entity.Player.getLastDamageCause()" is null
本帖最后由 tcejorPoiK 于 2022-5-17 16:54 编辑
如果没受到过伤害是null,你这应该是用指令一类的kill吧。
获取玩家被生物杀死时的生物:
复制代码
如果是被小白等生物远程击杀,那么造成伤害的实体是弹射物(比如箭)而非小白。你需要获取弹射物的Shooter,并判断Shooter是实体or方块
早晨解说 发表于 2022-5-17 16:44
是这样吗……会null
如果没受到过伤害是null,你这应该是用指令一类的kill吧。
获取玩家被生物杀死时的生物:
- var entityDamageEvent = player.getLastDamageCause();
- if (entityDamageEvent instanceof EntityDamageByEntityEvent entityDamageByEntityEvent) {
- final Entity entity = entityDamageByEntityEvent.getDamager();
- // something...
- }
如果是被小白等生物远程击杀,那么造成伤害的实体是弹射物(比如箭)而非小白。你需要获取弹射物的Shooter,并判断Shooter是实体or方块
tcejorPoiK 发表于 2022-5-17 16:48
如果没受到过伤害是null,你这应该是用指令一类的kill吧。
获取玩家被生物杀死时的生物:
那个是被僵尸杀死的
- Could not pass event PlayerDeathEvent to DieMessage v1.14(宇之大特供版)
- java.lang.NullPointerException: Cannot invoke "org.bukkit.event.entity.EntityDamageEvent.getEntity()" because the return value of "org.bukkit.entity.Player.getLastDamageCause()" is null
- [16:43:32] [Server thread/INFO]: Zao_chen was slain by Zombie
早晨解说 发表于 2022-5-17 16:54
那个是被僵尸杀死的
完整的代码发出来看看
本帖最后由 早晨解说 于 2022-5-17 17:13 编辑
复制代码
tcejorPoiK 发表于 2022-5-17 17:01
完整的代码发出来看看
- public void PlayerDeathEvent(PlayerDeathEvent event)
- {
- event.getEntity().getPlayer().sendMessage(event.getEntity().getPlayer().getLastDamageCause().getEntity().getName());
- }
不清楚什么原因,如果有加和RPG、怪物有关的操作伤害的插件,可能会有兼容问题。你可以在没插件的服务端测试看看
tcejorPoiK 发表于 2022-5-17 17:43
不清楚什么原因,如果有加和RPG、怪物有关的操作伤害的插件,可能会有兼容问题。你可以在没插件的服务端 ...
我这样写get出来的是玩家自己的名字……
var entityDamageEvent = player.getLastDamageCause();
if (entityDamageEvent instanceof EntityDamageByEntityEvent entityDamageByEntityEvent) {
final Entity entity = entityDamageByEntityEvent.getDamager();
// something...
}
编译的时候显示
java: -source 8 中不支持 instanceof 中的模式匹配 (请使用 -source 16 或更高版本以启用 instanceof 中的模式匹配)
我sdk都是17为什么会这样
早晨解说 发表于 2022-5-17 17:59
我这样写get出来的是玩家自己的名字……
编译的时候显示
- var entityDamageEvent = player.getLastDamageCause();
- if (entityDamageEvent instanceof EntityDamageByEntityEvent) {
- var entityDamageByEntityEvent = (EntityDamageByEntityEvent) entityDamageEvent;
- final Entity entity = entityDamageByEntityEvent.getDamager();
- // something...
- }
出问题了……
在1.12.2可以正常获取,到1.17.1就
- if(entityDamageEvent instanceof EntityDamageByEntityEvent)
返回false了……
早晨解说 发表于 2022-5-17 18:54
出问题了……
在1.12.2可以正常获取,到1.17.1就
https://bukkit.windit.net/javado ... #getLastDamageCause() 返回的是 EntityDamageEvent