- Баллы
- 6
- Имя в Minecraft
- reker2050
Здравствуйте:
Проблема следующая: отслеживаю ивент PlayerExpChangeEvent, но он срабатывает только через естественное получение XP (т.е, например, убить моба и забрать XP, которые с него дропаются), а нужно отслеживать событие любого изменения опыта игрока.
Что делать?
Находил вот такое решение, но оно очень уж неадекватно себя ведёт:
И в onEnable добавляем это:
Исправил ошибки, получилось вот так:
Выдаёт следующую пургу:
* пикча
Что это значит? В начале кода ивента есть следующий участок:
Так как в работе ивента и его обработчике ошибок нет, полагаю, что ошибка в том классе, который вызывает событие.
Что делать, и как это исправить?
Я так понял, что не существует ивента просто для изменения опыта игрока, не важно, по каким причинам?
Проблема следующая: отслеживаю ивент 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());
}
}
}
Код:
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));
Что делать, и как это исправить?
Я так понял, что не существует ивента просто для изменения опыта игрока, не важно, по каким причинам?