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

Помогите Проблемы со смертью

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Всем привет. Я делаю мини игру типа GhostCraft, и когда призрак умирает, игра должна закончиться. Я использую PlayerDeathEvent, делаю вроде всё правильно (код представлен ниже), но когда призрака убивают, почему то ничего не происходит. Как будто сервер просто игнорирует этот ивент, не выдает ни ошибок, ни WARN. Подскажите, в чем может быть проблема?
    Вот код:
    Код:
    public void onDeath(PlayerDeathEvent d)
        {
            if(d.getEntity() instanceof Player){
                Player player1 = (Player) d.getEntity();
                if(player1 == p)
                {
                    Bukkit.broadcastMessage("Призрак" + player1.getName() + " мертв!" + " Его убил " + player1.getKiller().getName());
                    for(Player player: Bukkit.getOnlinePlayers()){
                        player.getInventory().clear();           
                    }
                    player1.sendMessage("Вы умерли!");
                    player1.removePotionEffect(PotionEffectType.INVISIBILITY);
                    player1.removePotionEffect(PotionEffectType.JUMP);
                    player1.removePotionEffect(PotionEffectType.SPEED);
                   
                    sec = 11;
                    }
            else{
                player1.getInventory().remove(pboots);
                player1.getInventory().remove(phelm);
                player1.getInventory().remove(pleg);
                player1.getInventory().remove(pplate);
            player1.getInventory().clear();
            player1.sendMessage("Вы умерли!");
                Bukkit.broadcastMessage(player1.getName() + " уже покойник!" + " Его убил " + player1.getKiller().getName());
                }
            }
        }
    Для справки: p - это переменная, в которой лежит призрак.
    И еще, объясните пожалуйста, в чем разница между ивентами PlayerDeathEvent и EntityDeathEvent? В PlayerDeathEvent тоже нельзя получить игрока методом getPlayer();
     
  2. Хостинг MineCraft
    <
  3. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    @EventHandler есть ? Зарегал его в Bukkit ?
     
  4. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ваша проблема не в данном куске кода.
    Впрочем в том куске кода тоже есть проблемы. Когда ж вы блин научитесь сравнивать объекты через equals вашу мать.
     
  5. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Зачем вы в PlayerDeathEvent проверяете энтити на игрока?
     
  6. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    d.getEntity() instanceof Player замени на d.getEntity().getType()==EntityType.PLAYER
    Через equals имеет смысл сравнивать объекты, когда их может быть несколько одинаковых(они поддерживают метод clone и/или создаются простым конструктором), но в данном случае для одного игрока всегда будет один экземпяр Player'а.
     
  7. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Зачем? PlayerDeathEvent же!
     
  8. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Не гарант. В последних версиях ой как не гарант. Объект Player создаётся каждый раз новый при телепорте в другой мир, при смерти, при респавне, и при многих других действиях. Так что я бы не стал сравнивать объекты типа Player на одинаковость ссылок.
     
  9. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Это из разряда где getHighestBlockAt(int x, int y) возвращает самый верхний блок (но только если он является непрозрачным)? Если это так, то спасибо за информацию. С таким я ещё ни разу не сталкивался.
    Каюсь, был пьян, не углядел.
     
  10. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    А я вот сталкивался. Каждую новую версию штудирую исходники чтобы посмотреть не случилась ли очередная хрень. getHighestBlockAt кстати возвращает блок из внутренней хейтмапы чанка сервера и работает ну крайне хреново зачастую, так что там не только условие непрозрачности.
     
  11. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    То есть, в PlayerDeathEvent d.getEntity(); всегда будет player? А зачем тогда пишут d.getEntity()?
     
  12. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Наследование посмотри.
     
  13. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Cпасибо. Сделал всё, что предложили, но теперь появилась новая ошибка: Could not pass PlayerDeathEvent to GhostCraft v0.1. Вроде и EventHandler есть, и ивенты зарегистрированы, подскажите пожалуйста, в чем может быть ошибка? Вот что я изменил: Объявил переменную player1, и поместил в нее d.getEntity, затем убрал условие if(d.getEntity() instanceof Player).
     
  14. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Читать джавадоки надо потому что.
    getKiller() может вернуть null.
     
  15. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Ну хорошо, я добавил условие if(player1.getKiller() != null), и теперь он вообще не выдает ошибок=) Это значит, что getkiller() все-таки равно null, хотя меня убивает другой игрок=) Как вообще это работает?[DOUBLEPOST=1407577059,1407576910][/DOUBLEPOST]Вот что у меня получилось после всех изменений:
    Код:
    @EventHandler
        public void onDeath(PlayerDeathEvent d)
        {
            player1 = d.getEntity();
            if(player1.getKiller() != null){   
                if(player1 == p)
                {
                   
                    Bukkit.broadcastMessage("Призрак" + player1.getName() + " мертв!" + " Его убил " + player1.getKiller().getName());
                    for(Player player: Bukkit.getOnlinePlayers()){
                        player.getInventory().clear();           
                    }
                    player1.sendMessage("Вы умерли!");
                    player1.removePotionEffect(PotionEffectType.INVISIBILITY);
                    player1.removePotionEffect(PotionEffectType.JUMP);
                    player1.removePotionEffect(PotionEffectType.SPEED);
                    player1.teleport(deserializeLocation(config.getConfigurationSection("lobbyspawn")));
                    sec = 11;
                    }
               
            else{
                player1.getInventory().remove(pboots);
                player1.getInventory().remove(phelm);
                player1.getInventory().remove(pleg);
                player1.getInventory().remove(pplate);
            player1.getInventory().clear();
            player1.sendMessage("Вы умерли!");
            player1.teleport(deserializeLocation(config.getConfigurationSection("lobbyspawn")));
                Bukkit.broadcastMessage(player1.getName() + " уже покойник!" + " Его убил " + player1.getKiller().getName());
                }
        }
            }
     
  16. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    if(player1 == p)

    Сообщения не читай@Хрень выдавай.
     
  17. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    Не понял, а что тут не так?=) Я понял, что когда игрок не является призраком (p), все работает нормально, а когда призрака убивает какой-либо игрок, киллер = null
     
  18. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Объекты надо сравнивать через equals.
    А во вторых у прекрати копипастить код.
     
  19. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    ааа, все, дошло, спасибо, что объяснил мне настолько простую вещь=)[DOUBLEPOST=1407578830,1407577877][/DOUBLEPOST]
    Я поставил условие if(player1.getKiller() == null)
    {
    Bukkit.broadcastMessage("Killer is null");
    }
    И сравнил через equals if(player1.equals(p)), но все равно, когда призрака убивает другой игрок, пишет killer is null. А сейчас в чем проблема? А когда призрак убивает другого игрока, киллер почему то не равен null.
    Поправка: Если игрок убивает призрака с лука, то все работает нормально, а если с меча, то killer is null
     
  20. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Бред какой-то.
    Ну либо призрака добили ударом не игрока, а чем-то ещё.
     
  21. Автор темы
    GodlikE

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

    Баллы:
    103
    Имя в Minecraft:
    GodlikE
    На сервере есть встроенный плагин, который пишет в чат сообщения, когда кто-то умирает (Пишет, от чего умер такой-то игрок). Так вот, когда игрок убивает призрака с меча, то даже этот встроенный плагин пишет "Игрок умер", ни причины смерти, ни ника убийцы нет=) странно все это=) Впрочем, я уже решил эту проблему=) просто не буду писать имя киллера, когда его нет=)
     

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