1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Модифицированный PlayerExpChangeEvent

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

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

    EvilBeaver Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    reker2050
    Здравствуйте:
    Проблема следующая: отслеживаю ивент PlayerExpChangeEvent, но он срабатывает только через естественное получение XP (т.е, например, убить моба и забрать XP, которые с него дропаются), а нужно отслеживать событие любого изменения опыта игрока.
    Что делать?
    Находил вот такое решение, но оно очень уж неадекватно себя ведёт:
    Код:
    public class ExpChangeEventTimer extends BukkitRunnable{
        public HashMap<Player, Integer> exps = new HashMap<Player, Integer>();
        public void run() {
            for(Player p : Bukkit.getOnlinePlayers()) {
                if(exps.contains(p)) {
                    if(exps.get(p) != p.getExperience()) {
                        Bukkit.getPluginManager().callEvent(new PlayerExpChangeEvent(p, p.getExperience());
                        exps.remove(p);
                    }else{
                        exps.remove(p);
                        exps.put(p, p.getExperience());
                    }
                }else exps.put(p, p.getExperience());
            }
        }
    }
    И в onEnable добавляем это:
    Код:
    new ExpChangeEventTimer().runTaskTimer(this, 20, 20);
    Исправил ошибки, получилось вот так:
    Код:
    public class ExpChangeEventTimer extends BukkitRunnable{
        public HashMap<Player, Integer> exps = new HashMap<Player, Integer>();
        public void run() {
            for(Player player : Bukkit.getOnlinePlayers()) {
                if(exps.containsKey(player)) {
                    if(exps.get(player) != player.getTotalExperience()) {
                        Bukkit.getPluginManager().callEvent(new PlayerExpChangeEvent(player, player.getTotalExperience());
                        exps.remove(player);
                    }else{
                        exps.remove(player);
                        exps.put(player, player.getTotalExperience());
                    }
                }else exps.put(player, player.getTotalExperience());
            }
        }
    }
    Выдаёт следующую пургу:
    * пикча
    Что это значит? В начале кода ивента есть следующий участок:
    Код:
    int amount = event.getAmount();
    int exp    = (int) player.getTotalExperience();
    
    player.sendMessage("Изменение: "+amount);
    player.sendMessage("Текущий опыт: "+exp);
    player.sendMessage("Предыдущий опыт: "+(exp-amount));
    Так как в работе ивента и его обработчике ошибок нет, полагаю, что ошибка в том классе, который вызывает событие.
    Что делать, и как это исправить?
    Я так понял, что не существует ивента просто для изменения опыта игрока, не важно, по каким причинам?
     

    Вложения:

  2. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    getTotalExperience() - количество опыта за всю "жизнь" игрока. Относится только как очки после смерти. Это не тот опыт, который отображается в игрока на шкале.
    В игрока есть два обозначения:
    - Уровень (int) - от 0 до N
    - Опыт (float) - от 0 до 1 (заполненность шкалы)
     
  3. Автор темы
    EvilBeaver

    EvilBeaver Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    reker2050
    Я забил на это дело, и сделал обработку события по росту уровня. Так проще :D
     

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