早晨解说
本帖最后由 早晨解说 于 2022-5-17 18:43 编辑
  1. getEntity().getPlayer()
复制代码

用getplayer可以获取被击杀的玩家
  1. getEntity().getKiller()
复制代码
用getkiller可以获取击杀者,
当问题来了,如果击杀者是生物怎么办,
如果直接用getkiller的话会null
getkiller获取的是player类型:(
那么如果是生物击杀玩家呢,比如说zombie
纯新手,不怎么会描述



解决方法(详见‮tcejorPoiK
  1.         var entityDamageEvent = player.getLastDamageCause();
  2.         if (entityDamageEvent instanceof EntityDamageByEntityEvent) {
  3.             var entityDamageByEntityEvent = (EntityDamageByEntityEvent) entityDamageEvent;
  4.             final Entity entity = entityDamageByEntityEvent.getDamager();
  5.             // something...
  6.         }
复制代码



‮tcejorPoiK
Player#getLastDamageCause()可以获取玩家最后一次受到伤害的EntityDamageEvent,将其转为EntityDamageByEntityEvent或者EntityDamageByBlockEvent再获取造成此次伤害的实体/方块。

比巴卜c
你可以用getEntityType来判断是什么类型的实体

早晨解说
‮tcejorPoiK 发表于 2022-5-17 16:11
Player#getLastDamageCause()可以获取玩家最后一次受到伤害的EntityDamageEvent,将其转为EntityDamageByEn ...
  1. .getEntity().getPlayer().getLastDamageCause().getEntity().getName()
复制代码

是这样吗……会null
  1. Cannot invoke "org.bukkit.event.entity.EntityDamageEvent.getEntity()" because the return value of "org.bukkit.entity.Player.getLastDamageCause()" is null
复制代码

‮tcejorPoiK
本帖最后由 ‮tcejorPoiK 于 2022-5-17 16:54 编辑
早晨解说 发表于 2022-5-17 16:44
是这样吗……会null

如果没受到过伤害是null,你这应该是用指令一类的kill吧。

获取玩家被生物杀死时的生物:
  1.         var entityDamageEvent = player.getLastDamageCause();
  2.         if (entityDamageEvent instanceof EntityDamageByEntityEvent entityDamageByEntityEvent) {
  3.             final Entity entity = entityDamageByEntityEvent.getDamager();
  4.             // something...
  5.         }
复制代码


如果是被小白等生物远程击杀,那么造成伤害的实体是弹射物(比如箭)而非小白。你需要获取弹射物的Shooter,并判断Shooter是实体or方块

早晨解说
‮tcejorPoiK 发表于 2022-5-17 16:48
如果没受到过伤害是null,你这应该是用指令一类的kill吧。

获取玩家被生物杀死时的生物:

那个是被僵尸杀死的
  1. Could not pass event PlayerDeathEvent to DieMessage v1.14(宇之大特供版)
  2. java.lang.NullPointerException: Cannot invoke "org.bukkit.event.entity.EntityDamageEvent.getEntity()" because the return value of "org.bukkit.entity.Player.getLastDamageCause()" is null
  3. [16:43:32] [Server thread/INFO]: Zao_chen was slain by Zombie
复制代码

‮tcejorPoiK
早晨解说 发表于 2022-5-17 16:54
那个是被僵尸杀死的

完整的代码发出来看看

早晨解说
本帖最后由 早晨解说 于 2022-5-17 17:13 编辑
‮tcejorPoiK 发表于 2022-5-17 17:01
完整的代码发出来看看

  1. public void PlayerDeathEvent(PlayerDeathEvent event)
  2. {
  3.     event.getEntity().getPlayer().sendMessage(event.getEntity().getPlayer().getLastDamageCause().getEntity().getName());
  4. }
复制代码

‮tcejorPoiK

不清楚什么原因,如果有加和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为什么会这样

‮tcejorPoiK
早晨解说 发表于 2022-5-17 17:59
我这样写get出来的是玩家自己的名字……

编译的时候显示
  1.         var entityDamageEvent = player.getLastDamageCause();
  2.         if (entityDamageEvent instanceof EntityDamageByEntityEvent) {
  3.             var entityDamageByEntityEvent = (EntityDamageByEntityEvent) entityDamageEvent;
  4.             final Entity entity = entityDamageByEntityEvent.getDamager();
  5.             // something...
  6.         }
复制代码

早晨解说

出问题了……
在1.12.2可以正常获取,到1.17.1就
  1. if(entityDamageEvent instanceof EntityDamageByEntityEvent)
复制代码

返回false了……

结冰的离季
早晨解说 发表于 2022-5-17 18:54
出问题了……
在1.12.2可以正常获取,到1.17.1就

https://bukkit.windit.net/javado ... #getLastDamageCause() 返回的是 EntityDamageEvent

第一页 上一页 下一页 最后一页