1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Wida, 18 авг 2022.

Статус темы:
Закрыта.
  1. Автор темы
    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());
                }
            }
        }
     
  2. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    И в чём проблема? Регистрируешь листенер и вставляешь это туда
     
  3. Автор темы
    Wida

    Wida Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Wida
    upload_2022-8-18_16-38-42.png

    Если нажать "import class" DamageCause меняется на EntityDamageEvent. Код начинается работать, но при смерти идёт ошибка в консоль, что killer = null
     
  4. Автор темы
    Wida

    Wida Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Wida
    [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
     
  5. Автор темы
    Wida

    Wida Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Wida
    Другие ивенты у меня работают отлично. Именно этот код не работает
     
  6. Arght

    Arght Ньюби

    Баллы:
    1
    Не очень понимаю для чего у тебя проверки на игрока и типы 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());
        }
    }
     
  7. Автор темы
    Wida

    Wida Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Wida
    Спасибо. Завтра проверю
     
  8. Автор темы
    Wida

    Wida Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Wida
    работает. Спасибо
     
Статус темы:
Закрыта.

Поделиться этой страницей