Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

  1. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Есть метод.
    По ниму мы видим, если умирает игрок, то мы берём киллера, проверяем живой ли он и если да, то выдаём ему вещи. Проблема в том, что если игрок падает и умирает, возникает исключение, как это можно обойти? Какую проверку добавить?
    Код:
    @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());
    
            }
        }
    
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    [​IMG]
    Вырежи себе этот купон, используй где-нибуть, потом прочти ошибку (ту самую которая NullPointerException (Ага, я Ванга 100%)) и подумай сам как ее исправить.[DOUBLEPOST=1474191224,1474191121][/DOUBLEPOST]И кстати подсказка. Это ошибка будет кидаться тебе не только когда "игрок падает и умирает", а вообще ВСЕГДА, когда убийца не игрок.
     
  4. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Код:
    if(event.getEntity().getLastDamageCause().getCause() == DamageCause.FALL)
        return;
     
  5. Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    От падения это поможет, а от сгорания в лаве? Утопления в воде? Застревания в блоках?
     
  6. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Ошибка у меня только одна. Когда игрок умирает не от игрока.
    В остальных случаях жертва и киллер выводится корректно без исключений.
    Ошибка возникает здесь.
    Код:
    if (!event.getEntity().getKiller().isDead())
    
    Понятное дело, что у игрока, который упал и разбился нет киллера. Но повторяю вопрос первого поста, как тогда обходить это?
     
  7. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    instanceof LivingEntity || != null
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Спасибо. Вот работает.
    Код:
    @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() + " умер.");
                }
            }
        }
    
     
  9. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    ПОЧЕМУ Вы так любите получать лист из всей глубоко вложенной структуры сразу?!?
    upload_2016-9-18_23-59-8.png
    Код:
    @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));
                }
            }
        }
    Ведь это быстрее работает, понятнее и красивее.
     
  10. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Спасибо за помощь, дома буду гляну внимательнее.[DOUBLEPOST=1474621993,1474449484][/DOUBLEPOST]
    Смотрю и не могу понять, вы ошиблись с if else ?
    Ведь если киллер жив, то мы ему даём вещи, а если его и в помине нет в живых, а тем более вообще нет (самойубийство), то мы просто выведем сообщение о том, что игрок умер.
     
  11. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну поменяй их местами, да.
    Я вроде их твоего кода переделывал, но почему-то инвертировал, да.
    Ввело в заблуждение твоё instanceof LivingEntity и потом || != null.
     
  12. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Хорошо, спасибо)[DOUBLEPOST=1474657245,1474624860][/DOUBLEPOST]
    Ругается http://joxi.ru/12Mj9XRI4ekbLA
     
  13. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    скорее всего нужно поменять broadcast и код в esle метсами, и закостовать киллера в ливинг энтити
     
  14. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Меня смущала вот эта строчка:
    Код:
    Entitykiller = victim.getKiller();
    
    Поменял на это:
    Код:
    Player killer = victim.getKiller();
    
    Ошибки пропали. Я правильно сделал?
     
  15. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Неа.
    И прекращай скриншотить код - используй pastebin. Из-за вредности даже не буду писать код, который лишён некоторых недостатков.
     
  16. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Как вы заметили Выше, вот так: http://pastebin.com/JSqY7GTj пользователь slavik123123123, любезно помог довести до ума поднятый вопрос в теме, но, при попытки применить его в действии, IDE ругается. Я попытался исправить это, но согласно Вашим словам, я сделал это не правильно.
     
  17. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
    @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() + " умер.");
            }
        }
    }
    Решение конечно не "ах", но работает.
     
  18. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Не сработает. Для игрока есть PlayerDeathEvent. EntityDeathEvent не включает в себя игрока
     
  19. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я бы написал внутри if-а: Player killerPlayer = (Player)killer;
    и потом уже юзал эту переменную.
     
  20. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    как бы PlayerDeathEvent наследует EntityDeathEvent
    public class PlayerDeathEvent extends EntityDeathEvent

    Именно поэтому в PlayerDeathEvent не getPlayer(), а getEntity()
     
  21. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Ну все же EntityDeathEvent не ловит игрока, для чего то же создали PlayerDeathEvent.
     

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