Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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();
 
@EventHandler есть ? Зарегал его в Bukkit ?
 
Ваша проблема не в данном куске кода.
Впрочем в том куске кода тоже есть проблемы. Когда ж вы блин научитесь сравнивать объекты через equals вашу мать.
 
Зачем вы в PlayerDeathEvent проверяете энтити на игрока?
 
d.getEntity() instanceof Player замени на d.getEntity().getType()==EntityType.PLAYER
Ваша проблема не в данном куске кода.
Впрочем в том куске кода тоже есть проблемы. Когда ж вы блин научитесь сравнивать объекты через equals вашу мать.
Через equals имеет смысл сравнивать объекты, когда их может быть несколько одинаковых(они поддерживают метод clone и/или создаются простым конструктором), но в данном случае для одного игрока всегда будет один экземпяр Player'а.
 
d.getEntity() instanceof Player замени на d.getEntity().getType()==EntityType.PLAYER

Через equals имеет смысл сравнивать объекты, когда их может быть несколько одинаковых(они поддерживают метод clone и/или создаются простым конструктором), но в данном случае для одного игрока всегда будет один экземпяр Player'а.
Не гарант. В последних версиях ой как не гарант. Объект Player создаётся каждый раз новый при телепорте в другой мир, при смерти, при респавне, и при многих других действиях. Так что я бы не стал сравнивать объекты типа Player на одинаковость ссылок.
 
Не гарант. В последних версиях ой как не гарант. Объект Player создаётся каждый раз новый при телепорте в другой мир, при смерти, при респавне, и при многих других действиях. Так что я бы не стал сравнивать объекты типа Player на одинаковость ссылок.
Это из разряда где getHighestBlockAt(int x, int y) возвращает самый верхний блок (но только если он является непрозрачным)? Если это так, то спасибо за информацию. С таким я ещё ни разу не сталкивался.
Зачем? PlayerDeathEvent же!
Каюсь, был пьян, не углядел.
 
Это из разряда где getHighestBlockAt(int x, int y) возвращает самый верхний блок (но только если он является непрозрачным)? Если это так, то спасибо за информацию. С таким я ещё ни разу не сталкивался.

Каюсь, был пьян, не углядел.
А я вот сталкивался. Каждую новую версию штудирую исходники чтобы посмотреть не случилась ли очередная хрень. getHighestBlockAt кстати возвращает блок из внутренней хейтмапы чанка сервера и работает ну крайне хреново зачастую, так что там не только условие непрозрачности.
 
Наследование посмотри.
Cпасибо. Сделал всё, что предложили, но теперь появилась новая ошибка: Could not pass PlayerDeathEvent to GhostCraft v0.1. Вроде и EventHandler есть, и ивенты зарегистрированы, подскажите пожалуйста, в чем может быть ошибка? Вот что я изменил: Объявил переменную player1, и поместил в нее d.getEntity, затем убрал условие if(d.getEntity() instanceof Player).
 
Читать джавадоки надо потому что.
getKiller() может вернуть null.
 
Читать джавадоки надо потому что.
getKiller() может вернуть null.
Ну хорошо, я добавил условие if(player1.getKiller() != null), и теперь он вообще не выдает ошибок=) Это значит, что getkiller() все-таки равно null, хотя меня убивает другой игрок=) Как вообще это работает?
Вот что у меня получилось после всех изменений:
Код:
@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());
            }
    }
        }
 
if(player1 == p)

Сообщения не читай@Хрень выдавай.
 
if(player1 == p)

Сообщения не читай@Хрень выдавай.
Не понял, а что тут не так?=) Я понял, что когда игрок не является призраком (p), все работает нормально, а когда призрака убивает какой-либо игрок, киллер = null
 
Не понял, а что тут не так?=) Я понял, что когда игрок не является призраком (p), все работает нормально, а когда призрака убивает какой-либо игрок, киллер = null
Объекты надо сравнивать через equals.
А во вторых у прекрати копипастить код.
 
Объекты надо сравнивать через equals.
А вот вторых у прекрати копипастить код.
ааа, все, дошло, спасибо, что объяснил мне настолько простую вещь=)
Объекты надо сравнивать через equals.
А во вторых у прекрати копипастить код.
Я поставил условие if(player1.getKiller() == null)
{
Bukkit.broadcastMessage("Killer is null");
}
И сравнил через equals if(player1.equals(p)), но все равно, когда призрака убивает другой игрок, пишет killer is null. А сейчас в чем проблема? А когда призрак убивает другого игрока, киллер почему то не равен null.
Поправка: Если игрок убивает призрака с лука, то все работает нормально, а если с меча, то killer is null
 
Бред какой-то.
Ну либо призрака добили ударом не игрока, а чем-то ещё.
 
Бред какой-то.
Ну либо призрака добили ударом не игрока, а чем-то ещё.
На сервере есть встроенный плагин, который пишет в чат сообщения, когда кто-то умирает (Пишет, от чего умер такой-то игрок). Так вот, когда игрок убивает призрака с меча, то даже этот встроенный плагин пишет "Игрок умер", ни причины смерти, ни ника убийцы нет=) странно все это=) Впрочем, я уже решил эту проблему=) просто не буду писать имя киллера, когда его нет=)
 

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

Назад
Верх