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

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));
Так как в работе ивента и его обработчике ошибок нет, полагаю, что ошибка в том классе, который вызывает событие.
Что делать, и как это исправить?
Я так понял, что не существует ивента просто для изменения опыта игрока, не важно, по каким причинам?
 

Вложения

  • 2018-12-23_20.07.35.png
    2018-12-23_20.07.35.png
    677,7 КБ · Просмотры: 9
getTotalExperience() - количество опыта за всю "жизнь" игрока. Относится только как очки после смерти. Это не тот опыт, который отображается в игрока на шкале.
В игрока есть два обозначения:
- Уровень (int) - от 0 до N
- Опыт (float) - от 0 до 1 (заполненность шкалы)
 
Я забил на это дело, и сделал обработку события по росту уровня. Так проще 😁
 
Назад
Верх