Как получить сущность, убившую буккита игрока?

Я пытаюсь создать индивидуальные сообщения о смерти, когда вас убивают определенным образом. Мне нужны отдельные сообщения, когда вас взорвет TNT или вас взорвет крипер. Я попытался отладить его и создать крипер и TNT, и в консоли он выводит e.getEntity().getKiller() как 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 не избирательно относится к сущностям.


person Pale_Gray    schedule 14.02.2021    source источник


Ответы (1)


  1. Есть @Nullable аннотации к методам и документации javadoc, поэтому вы знаете, какой метод может быть null.
  2. PlayerDeathEvent#getEntity#getKiller method returns Player so you don't need to cast Player object to it.
    • Otherwise, this method only returns Player, if it killed by another living Player.
  3. Entity#getLastDamageCause метод может возвращать null
  4. getCause() метод возвращает перечисление, поэтому вам не нужно использовать equals, вам нужно только == для сравнения значений перечисления.
  5. Вы можете проверить некоторые другие поля DamageCause, включая ENTITY_EXPLOSION. Иногда, когда крипер взрывается, ущерб может быть BLOCK_EXPLOSION, может быть, потому что он слишком далеко.
person montlikadani    schedule 17.02.2021