Войти или зарегистрироваться

Помогите Как понять кто убил игрока?

  • Автор темы Автор темы Wida
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Wida

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
Wida
Мне надо проверить от чего умер игрок и вывести нужное мне сообщение, что игрок умер от того того.
Нашёл код на форуме
Код:
    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent e){
        Player p = e.getEntity();
        EntityDamageEvent damevent = p.getLastDamageCause();
        DamageCause cause = damevent.getCause();

        if (cause == DamageCause.ENTITY_ATTACK){
            LivingEntity killer = p.getKiller();
            if (killer instanceof Player){
                Player pkiller = (Player) killer;
                e.setDeathMessage("Игрок " + p.getName() + " был убит игроком " + pkiller.getName());
            }else{
                e.setDeathMessage("Игрок " + p.getName() + " был убит " + killer.getType().toString());
            }
        }
    }
 
И в чём проблема? Регистрируешь листенер и вставляешь это туда
 
И в чём проблема? Регистрируешь листенер и вставляешь это туда
upload_2022-8-18_16-38-42.png

Если нажать "import class" DamageCause меняется на EntityDamageEvent. Код начинается работать, но при смерти идёт ошибка в консоль, что killer = null
 
[15:45:51 ERROR]: Could not pass event PlayerDeathEvent to LoseMoney v1.0 Final
java.lang.NullPointerException: Cannot invoke "org.bukkit.entity.LivingEntity.getType()" because "killer" is null
at org.nelit.mc.losemoney.EventListener.onPlayerDeath(EventListener.java:33) ~[LoseMoney.jar:?]
at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor7.execute(Unknown Source) ~[?:?]
at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.17.1.jar:git-Purpur-1428]
at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.17.1.jar:git-Purpur-1428]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.17.1.jar:git-Purpur-1428]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:628) ~[patched_1.17.1.jar:git-Purpur-1428]
at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:899) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.level.ServerPlayer.die(ServerPlayer.java:851) ~[app:?]
at net.minecraft.world.entity.LivingEntity.hurt(LivingEntity.java:1479) ~[app:?]
at net.minecraft.world.entity.player.Player.hurt(Player.java:965) ~[app:?]
at net.minecraft.server.level.ServerPlayer.hurt(ServerPlayer.java:1033) ~[app:?]
at net.minecraft.world.entity.Mob.doHurtTarget(Mob.java:1646) ~[app:?]
at net.minecraft.world.entity.monster.Zombie.doHurtTarget(Zombie.java:388) ~[app:?]
at net.minecraft.world.entity.ai.goal.MeleeAttackGoal.checkAndPerformAttack(MeleeAttackGoal.java:142) ~[app:?]
at net.minecraft.world.entity.ai.goal.MeleeAttackGoal.tick(MeleeAttackGoal.java:134) ~[app:?]
at net.minecraft.world.entity.ai.goal.ZombieAttackGoal.tick(ZombieAttackGoal.java:28) ~[app:?]
at net.minecraft.world.entity.ai.goal.WrappedGoal.tick(WrappedGoal.java:53) ~[app:?]
at net.minecraft.world.entity.ai.goal.GoalSelector.tick(GoalSelector.java:154) ~[app:?]
at net.minecraft.world.entity.Mob.serverAiStep(Mob.java:883) ~[app:?]
at net.minecraft.world.entity.LivingEntity.aiStep(LivingEntity.java:3246) ~[app:?]
at net.minecraft.world.entity.Mob.aiStep(Mob.java:662) ~[app:?]
at net.minecraft.world.entity.monster.Monster.aiStep(Monster.java:43) ~[app:?]
at net.minecraft.world.entity.monster.Zombie.aiStep(Zombie.java:292) ~[app:?]
at net.minecraft.world.entity.LivingEntity.tick(LivingEntity.java:2972) ~[app:?]
at net.minecraft.world.entity.Mob.tick(Mob.java:424) ~[app:?]
at net.minecraft.world.entity.monster.Zombie.tick(Zombie.java:285) ~[app:?]
at net.minecraft.server.level.ServerLevel.tickNonPassenger(ServerLevel.java:1204) ~[app:?]
at net.minecraft.server.level.ServerLevel.lambda$tick$7(ServerLevel.java:802) ~[app:?]
at net.minecraft.world.level.entity.EntityTickList.forEach(EntityTickList.java:43) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.level.ServerLevel.tick(ServerLevel.java:781) ~[app:?]
at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1652) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:528) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1507) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1300) ~[patched_1.17.1.jar:git-Purpur-1428]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:322) ~[patched_1.17.1.jar:git-Purpur-1428]
at java.lang.Thread.run(Thread.java:831) ~[?:?]
[15:45:51 INFO]: Nelit was slain by Zombie
 
Другие ивенты у меня работают отлично. Именно этот код не работает
 
Не очень понимаю для чего у тебя проверки на игрока и типы LivingEntity, когда все методы возвращают Player... Попробуй это:
Код:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
    Player player = event.getEntity().getPlayer();
    Player killer = event.getEntity().getKiller();
    if (player != null && killer != null) {
        event.setDeathMessage("Игрок " + player.getDisplayName() + " был убит игроком " + killer.getDisplayName());
    }
}
 
Не очень понимаю для чего у тебя проверки на игрока и типы LivingEntity, когда все методы возвращают Player... Попробуй это:
Код:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
    Player player = event.getEntity().getPlayer();
    Player killer = event.getEntity().getKiller();
    if (player != null && killer != null) {
        event.setDeathMessage("Игрок " + player.getDisplayName() + " был убит игроком " + killer.getDisplayName());
    }
}
Спасибо. Завтра проверю
 
работает. Спасибо
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх