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

Помогите Проблема с асинком

Тема в разделе "Разработка плагинов для новичков", создана пользователем Energy warrior, 30 ноя 2019.

  1. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Недавно столкнулся с проблемой, мне начал вылетать IllegalStateException от AsyncCatcher, мол нельзя это делать в асинке.Так вот я не могу понять почему нельзя спавнить энтитей и перебирать ближайших энтитей в асинке? И ещё, я пофиксил асинк, теперь getNearbyEntities работает в основном потоке, но он не ищет никого!
     
  2. alexandrage

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

    Баллы:
    173
    Потому что это не безопасно.
     
  3. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Чем? Каюсь я не шарю в многопоточности!
     
  4. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    Не безопасно потому, что может произойти ситуация, когда 2 потока одновременно обращаются к одному элементу и пытаются его изменить, в итоге выходит исключение, предотвращающая повреждение объекта. (это поверхностно так, более подробно можно узнать в гугле)
    Что бы избежать это, доступ должен быть последовательным, используя synchronized. Но в нашем случае это тоже не поможет, потому что блокировка должна быть и с основного потоке, а там это не учтено.
    Лучше запускать шедулер который запускает задачу в основном потоке.
     
  5. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Я запустил, но у меня он не хочет перебирать, я юзаю runTask и засунул туда getNearbyEntities, встал рядом, а метод ничего не нашёл!
     
  6. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Судя по твоим словам, дело не в том, что ты таск запускаешь. Не смешивай две проблемы.
    Показывай свой код
     
  7. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Код:
     Bukkit.getScheduler().runTask(plugin,()-> player.getNearbyEntities(50,50,50).stream().filter(entity -> entity instanceof Player).forEach(entity -> {
                        Player p = (Player) entity;
                        event.getRecipients().add(p);
                    }));
    Мне кажется я догадываюсь в чём проблема! Но я не уверен!
     
  8. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    event.getRecipients().add(p); происходит уже после того как ивент произошел.
     
  9. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Проблема в том, что ты работаешь с эвентом уже после того, как он отработал. Так это не прокатит
     
  10. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Ясно. Спасибо! Есть ещё один вопрос, есть ли способ отслеживать кол-во символов в чат баре. Типо ивента когда игрок пишет сообщение...
     
  11. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для отдельных команд можешь реализовать метод onTabComplete в своем плагине. Для работы с произвольными командами придется работать напрямую с пакетом с соответствующим названием. Не уверен, что он отсылается, если сообщение начинается не со слеша
     
  12. alexandrage

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

    Баллы:
    173
    Сказочный долбанафт :D. Bukkit.getOnlinePlayers() в помощь.
     
  13. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    У меня "оптимизация мозга" я подумал что если на Серве будет овердохрена онлайна то он сдохнет от вечного опроса. Я исправился ещё до того как сюда тему выложил, просто было интересно почему так!
     
  14. Автор темы
    Energy warrior

    Energy warrior Активный участник Пользователь

    Баллы:
    76
    Я сделал прослушку пакетов, но не нашёл того, который отвечает за открытие чата или набор символов, я так понял это происходит только на стороне клиента, но тогда откуда ивенты берут строку чата? Можно ли как-то отследить набор игроком символов в чате?
     
  15. alexandrage

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

    Баллы:
    173
    А то, что там будет дохрена мобов, ну такое да.
     
  16. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Речь об этом пакете: https://wiki.vg/Protocol#Tab-Complete_.28serverbound.29
     

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