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

Помогите Событие выдачи игроку опыта

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

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

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Как отследить событие выдачи игроку опыта командой /xp или модами(думаю в модах xp выдается таким же образом что и команда /xp)? Если слушать PlayerExpChangeEvent то при подбирании сфер опыта срабатывает, а при команде /xp не срабатывает.
     
  2. Хостинг MineCraft
    <
  3. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Костыльный способ: перезаписывать всех игроков своими, наследующими правильных, и с перезаписанным setExp().
     
  4. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Таким образом в метод setExp добавить вызов эвента PlayerExpChangeEvent? Как-то слишком костыльно... Может еще как-то можно?
     
  5. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Если это не костыльно, то можно пожалуйста код, а то я понял что вы имеете в виду, а как сделать не понял.
     
  6. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Код:
        @EventHandler
        public void onExpCmd(PlayerCommandPreprocessEvent e) {
            if(e.getMessage().startsWith("/xp")) {
                Bukkit.getPluginManager().callEvent(new PlayerExpChangeEvent(e.getPlayer(), /*номер аргумента*/));
            }
        }
     
  7. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Не советуй говнокод.
     
  8. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    На все команды такого не сделаешь.
     
  9. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Ну да, эт костыльный метод.[DOUBLEPOST=1411333632,1411333591][/DOUBLEPOST]
    Это возможно, но это будет говнокод.
     
  10. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    это мне не подходит, т.к. мод кастом нпс, скорее всего тоже выдает методом setExp и если я просто буду слушать команду xp, то мне это не поможет.
     
  11. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Я пока тогда не знаю, чем помочь. По-любому что-то с командами делать надо будет. Попробуй пакеты, штоле.
     
  12. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ну какие пакеты то?
    Нормальный способ же предложили - шедулером сверять значения опыта игрока прошлое и предыдущее и кинуть эвент в случае различия.
     
  13. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Где это предложили? :D Или я слепой?
     
  14. CraftCoderr

    CraftCoderr Активный участник

    Баллы:
    61
    Имя в Minecraft:
    CraftCoderr
    Тут:
     
  15. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Ну эта да00)00))00)0)
     
  16. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Отличный вариант, плюс если требуемая реализация не требует супер-мгновенности, то замедлить до 1 тика в секунду или реже.
     
  17. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Чем чаще проверка, тем точнее результат и отсутствие возможности куда нибудь спустить опыт.
    Асинхронный ежетиковый шедулер тут в самый раз, хотя бросаемые эвенты получатся тоже асинхронные...
     
  18. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Конечная нагрузка это та, которая будет в теле вызываемого события, поэтому программист его "тела" должен решать, какие действия предпринимать синхронно, а какие отпускать в параллель. Так что я согласен с fromgate. А насчёт количества тиков в запланированном шедулере — можно вынести int в конфиг (config.yml/internal.events.onExpChange.granularity) и подбирать в зависимости от конкретной обстановки.
     
  19. BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Мега-идея - в методе setExp и т.д вызывать эвент. Правда, для этого чутка перелопатить классы придется, но ничего страшного :D
     
  20. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Это было предложено в первом сообщении :confused:
     
  21. Hilgert

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

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    Код:
    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());
              }
         }
    }
    
    public class MyPlugin extends JavaPlugin{
    
         public void onEnable(){
              new ExpChangeEventTimer().runTaskTimer(this, 20, 20);
         }
         
    }
    
     

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