Помогите Как сделать правильное условие?

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Есть метод.
По ниму мы видим, если умирает игрок, то мы берём киллера, проверяем живой ли он и если да, то выдаём ему вещи. Проблема в том, что если игрок падает и умирает, возникает исключение, как это можно обойти? Какую проверку добавить?
Java:
@EventHandler
    public void EntityDeathEvent(EntityDeathEvent event) {
        if (event.getEntityType() == PLAYER) {
            Entity entity = event.getEntity();
            Player victim = (Player) entity;

            if (!event.getEntity().getKiller().getPlayer().isDead()) {
               //выдаю какие то вещи.
            }

            getServer().broadcastMessage(ChatColor.RED + event.getEntity().getKiller().getDisplayName() + ChatColor.WHITE + " убил " + ChatColor.GREEN + victim.getDisplayName());

        }
    }
 
Java:
getKiller().getPlayer()
1eb509241252.png

Вырежи себе этот купон, используй где-нибуть, потом прочти ошибку (ту самую которая NullPointerException (Ага, я Ванга 100%)) и подумай сам как ее исправить.
И кстати подсказка. Это ошибка будет кидаться тебе не только когда "игрок падает и умирает", а вообще ВСЕГДА, когда убийца не игрок.
 
Java:
if(event.getEntity().getLastDamageCause().getCause() == DamageCause.FALL)
    return;
 
Вырежи себе этот купон, используй где-нибуть, потом прочти ошибку (ту самую которая NullPointerException (Ага, я Ванга 100%)) и подумай сам как ее исправить.
И кстати подсказка. Это ошибка будет кидаться тебе не только когда "игрок падает и умирает", а вообще ВСЕГДА, когда убийца не игрок.
Ошибка у меня только одна. Когда игрок умирает не от игрока.
В остальных случаях жертва и киллер выводится корректно без исключений.
Ошибка возникает здесь.
Java:
if (!event.getEntity().getKiller().isDead())
Понятное дело, что у игрока, который упал и разбился нет киллера. Но повторяю вопрос первого поста, как тогда обходить это?
 
instanceof LivingEntity || != null
Спасибо. Вот работает.
Java:
@EventHandler
    public void EntityDeathEvent(EntityDeathEvent event) {
        if (event.getEntityType() == PLAYER) {
            Entity entity = event.getEntity();
            Player victim = (Player) entity;

            if (event.getEntity().getKiller() instanceof LivingEntity || event.getEntity().getKiller() != null) {
                getServer().broadcastMessage(ChatColor.RED + event.getEntity().getKiller().getDisplayName() + ChatColor.WHITE + " убил " + ChatColor.GREEN + victim.getDisplayName());
                event.getEntity().getKiller().getInventory().addItem(new ItemStack(Material.EMERALD, 1));
                event.getEntity().getKiller().getInventory().addItem(new ItemStack(Material.RAW_BEEF, 1));
                event.getEntity().getKiller().getInventory().addItem(new ItemStack(Material.BONE, 1));

            } else {
                getServer().broadcastMessage(victim.getDisplayName() + " умер.");
            }
        }
    }
 
ПОЧЕМУ Вы так любите получать лист из всей глубоко вложенной структуры сразу?!?
upload_2016-9-18_23-59-8.png
Java:
@EventHandler
    public void EntityDeathEvent(EntityDeathEvent event) {
        if (event.getEntityType() == PLAYER) {
            Entity entity = event.getEntity();
            Player victim = (Player) entity;
            Entity killer = victim.getKiller();

            if (killer != null && killer instanceof LivingEntity) {
                   getServer().broadcastMessage(victim.getDisplayName() + " умер.");
            } else {
                getServer().broadcastMessage(ChatColor.RED
                    + killer.getDisplayName()
                    + ChatColor.WHITE + " убил "
                    + ChatColor.GREEN + victim.getDisplayName());
                Inventory inv = killer.getInventory();
                inv.addItem(new ItemStack(Material.EMERALD, 1));
                inv.addItem(new ItemStack(Material.RAW_BEEF, 1));
                inv.addItem(new ItemStack(Material.BONE, 1));
            }
        }
    }
Ведь это быстрее работает, понятнее и красивее.
 
ПОЧЕМУ Вы так любите получать лист из всей глубоко вложенной структуры сразу?!?
Посмотреть вложение 43065
Java:
@EventHandler
    public void EntityDeathEvent(EntityDeathEvent event) {
        if (event.getEntityType() == PLAYER) {
            Entity entity = event.getEntity();
            Player victim = (Player) entity;
            Entity killer = victim.getKiller();

            if (killer != null && killer instanceof LivingEntity) {
                   getServer().broadcastMessage(victim.getDisplayName() + " умер.");
            } else {
                getServer().broadcastMessage(ChatColor.RED
                    + killer.getDisplayName()
                    + ChatColor.WHITE + " убил "
                    + ChatColor.GREEN + victim.getDisplayName());
                Inventory inv = killer.getInventory();
                inv.addItem(new ItemStack(Material.EMERALD, 1));
                inv.addItem(new ItemStack(Material.RAW_BEEF, 1));
                inv.addItem(new ItemStack(Material.BONE, 1));
            }
        }
    }
Ведь это быстрее работает, понятнее и красивее.
Спасибо за помощь, дома буду гляну внимательнее.
ПОЧЕМУ Вы так любите получать лист из всей глубоко вложенной структуры сразу?!?
Посмотреть вложение 43065
Java:
@EventHandler
    public void EntityDeathEvent(EntityDeathEvent event) {
        if (event.getEntityType() == PLAYER) {
            Entity entity = event.getEntity();
            Player victim = (Player) entity;
            Entity killer = victim.getKiller();

            if (killer != null && killer instanceof LivingEntity) {
                   getServer().broadcastMessage(victim.getDisplayName() + " умер.");
            } else {
                getServer().broadcastMessage(ChatColor.RED
                    + killer.getDisplayName()
                    + ChatColor.WHITE + " убил "
                    + ChatColor.GREEN + victim.getDisplayName());
                Inventory inv = killer.getInventory();
                inv.addItem(new ItemStack(Material.EMERALD, 1));
                inv.addItem(new ItemStack(Material.RAW_BEEF, 1));
                inv.addItem(new ItemStack(Material.BONE, 1));
            }
        }
    }
Ведь это быстрее работает, понятнее и красивее.
Смотрю и не могу понять, вы ошиблись с if else ?
Ведь если киллер жив, то мы ему даём вещи, а если его и в помине нет в живых, а тем более вообще нет (самойубийство), то мы просто выведем сообщение о том, что игрок умер.
 
Ну поменяй их местами, да.
Я вроде их твоего кода переделывал, но почему-то инвертировал, да.
Ввело в заблуждение твоё instanceof LivingEntity и потом || != null.
 
Ну поменяй их местами, да.
Я вроде их твоего кода переделывал, но почему-то инвертировал, да.
Ввело в заблуждение твоё instanceof LivingEntity и потом || != null.
Хорошо, спасибо)
Ну поменяй их местами, да.
Я вроде их твоего кода переделывал, но почему-то инвертировал, да.
Ввело в заблуждение твоё instanceof LivingEntity и потом || != null.
Ругается http://joxi.ru/12Mj9XRI4ekbLA
 
скорее всего нужно поменять broadcast и код в esle метсами, и закостовать киллера в ливинг энтити
 
Меня смущала вот эта строчка:
Java:
Entitykiller = victim.getKiller();
Поменял на это:
Java:
Player killer = victim.getKiller();
Ошибки пропали. Я правильно сделал?
 
Неа.
И прекращай скриншотить код - используй pastebin. Из-за вредности даже не буду писать код, который лишён некоторых недостатков.
Как вы заметили Выше, вот так: http://pastebin.com/JSqY7GTj пользователь slavik123123123, любезно помог довести до ума поднятый вопрос в теме, но, при попытки применить его в действии, IDE ругается. Я попытался исправить это, но согласно Вашим словам, я сделал это не правильно.
 
Java:
@EventHandler
public void EntityDeathEvent(EntityDeathEvent event) {
    if (event.getEntityType() == PLAYER) {
        Entity entity = event.getEntity();
        Player victim = (Player) entity;
        Entity killer = victim.getKiller();

        if (killer != null && killer instanceof Player) {
            getServer().broadcastMessage(ChatColor.RED
                + ((Player)killer).getDisplayName()
                + ChatColor.WHITE + " убил "
                + ChatColor.GREEN + victim.getDisplayName());
            Inventory inv = ((Player)killer).getInventory();
            inv.addItem(new ItemStack(Material.EMERALD, 1));
            inv.addItem(new ItemStack(Material.RAW_BEEF, 1));
            inv.addItem(new ItemStack(Material.BONE, 1));
        } else {
               getServer().broadcastMessage(victim.getDisplayName() + " умер.");
        }
    }
}
Решение конечно не "ах", но работает.
 
Java:
@EventHandler
public void EntityDeathEvent(EntityDeathEvent event) {
    if (event.getEntityType() == PLAYER) {
        Entity entity = event.getEntity();
        Player victim = (Player) entity;
        Entity killer = victim.getKiller();

        if (killer != null && killer instanceof Player) {
            getServer().broadcastMessage(ChatColor.RED
                + ((Player)killer).getDisplayName()
                + ChatColor.WHITE + " убил "
                + ChatColor.GREEN + victim.getDisplayName());
            Inventory inv = ((Player)killer).getInventory();
            inv.addItem(new ItemStack(Material.EMERALD, 1));
            inv.addItem(new ItemStack(Material.RAW_BEEF, 1));
            inv.addItem(new ItemStack(Material.BONE, 1));
        } else {
               getServer().broadcastMessage(victim.getDisplayName() + " умер.");
        }
    }
}
Не сработает. Для игрока есть PlayerDeathEvent. EntityDeathEvent не включает в себя игрока
 
Я бы написал внутри if-а: Player killerPlayer = (Player)killer;
и потом уже юзал эту переменную.
 
Не сработает. Для игрока есть PlayerDeathEvent. EntityDeathEvent не включает в себя игрока
как бы PlayerDeathEvent наследует EntityDeathEvent
public class PlayerDeathEvent extends EntityDeathEvent

Именно поэтому в PlayerDeathEvent не getPlayer(), а getEntity()
 
как бы PlayerDeathEvent наследует EntityDeathEvent
public class PlayerDeathEvent extends EntityDeathEvent

Именно поэтому в PlayerDeathEvent не getPlayer(), а getEntity()
Ну все же EntityDeathEvent не ловит игрока, для чего то же создали PlayerDeathEvent.
 
Назад
Верх