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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @CraftCoder
    Я бы не сказал, что это костыльно. Лично на мой взгляд, это должно было быть добавлено изначально в 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
    Не советуй говнокод.
     
  8. serega6531

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

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

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

    Баллы:
    153
    Skype:
    FayStaff
    Ну да, эт костыльный метод.
    Это возможно, но это будет говнокод.
     
  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. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @Den_Abr
    В асинхронном шедулере смысла нет - тут нет такой нагрузки, что тормозило бы основной поток.
    Тут другой момент. Если создавать именно событие PlayerExpChangeEvent, то можно столкнуться с тем, что оно будет дублироваться.
    Т.е. будет вызываться родное событие, а потом то, которое создаем мы. Соответственно это нужно тоже учитывать.
     
  19. Reality_SC

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

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

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

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

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