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

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

Discussion in 'Разработка плагинов для новичков' started by CraftCoder, Sep 21, 2014.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    61
    Имя в Minecraft:
    CraftCoderr
    Тут:
     
  15. BeLkA

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

    Trophy Points:
    153
    Skype:
    FayStaff
    Ну эта да00)00))00)0)
     
  16. Reality_SC

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    Code:
    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);
         }
         
    }
    
     

Share This Page