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

Energy warrior

Активный участник
Пользователь
Баллы
76
Недавно столкнулся с проблемой, мне начал вылетать IllegalStateException от AsyncCatcher, мол нельзя это делать в асинке.Так вот я не могу понять почему нельзя спавнить энтитей и перебирать ближайших энтитей в асинке? И ещё, я пофиксил асинк, теперь getNearbyEntities работает в основном потоке, но он не ищет никого!
 
Недавно столкнулся с проблемой, мне начал вылетать IllegalStateException от AsyncCatcher, мол нельзя это делать в асинке.Так вот я не могу понять почему нельзя спавнить энтитей и перебирать ближайших энтитей в асинке? И ещё, я пофиксил асинк, теперь getNearbyEntities работает в основном потоке, но он не ищет никого!
Не безопасно потому, что может произойти ситуация, когда 2 потока одновременно обращаются к одному элементу и пытаются его изменить, в итоге выходит исключение, предотвращающая повреждение объекта. (это поверхностно так, более подробно можно узнать в гугле)
Что бы избежать это, доступ должен быть последовательным, используя synchronized. Но в нашем случае это тоже не поможет, потому что блокировка должна быть и с основного потоке, а там это не учтено.
Лучше запускать шедулер который запускает задачу в основном потоке.
 
Не безопасно потому, что может произойти ситуация, когда 2 потока одновременно обращаются к одному элементу и пытаются его изменить, в итоге выходит исключение, предотвращающая повреждение объекта. (это поверхностно так, более подробно можно узнать в гугле)
Что бы избежать это, доступ должен быть последовательным, используя synchronized. Но в нашем случае это тоже не поможет, потому что блокировка должна быть и с основного потоке, а там это не учтено.
Лучше запускать шедулер который запускает задачу в основном потоке.
Я запустил, но у меня он не хочет перебирать, я юзаю runTask и засунул туда getNearbyEntities, встал рядом, а метод ничего не нашёл!
 
Я запустил, но у меня он не хочет перебирать, я юзаю runTask и засунул туда getNearbyEntities, встал рядом, а метод ничего не нашёл!
Судя по твоим словам, дело не в том, что ты таск запускаешь. Не смешивай две проблемы.
Показывай свой код
 
Судя по твоим словам, дело не в том, что ты таск запускаешь. Не смешивай две проблемы.
Показывай свой код
Код:
 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);
                }));
Мне кажется я догадываюсь в чём проблема! Но я не уверен!
 
Код:
 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);
                }));
Мне кажется я догадываюсь в чём проблема! Но я не уверен!
event.getRecipients().add(p); происходит уже после того как ивент произошел.
 
Код:
 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);
                }));
Мне кажется я догадываюсь в чём проблема! Но я не уверен!
Проблема в том, что ты работаешь с эвентом уже после того, как он отработал. Так это не прокатит
 
Проблема в том, что ты работаешь с эвентом уже после того, как он отработал. Так это не прокатит
Ясно. Спасибо! Есть ещё один вопрос, есть ли способ отслеживать кол-во символов в чат баре. Типо ивента когда игрок пишет сообщение...
 
Ясно. Спасибо! Есть ещё один вопрос, есть ли способ отслеживать кол-во символов в чат баре. Типо ивента когда игрок пишет сообщение...
Для отдельных команд можешь реализовать метод onTabComplete в своем плагине. Для работы с произвольными командами придется работать напрямую с пакетом с соответствующим названием. Не уверен, что он отсылается, если сообщение начинается не со слеша
 
Код:
 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);
                }));
Мне кажется я догадываюсь в чём проблема! Но я не уверен!
Сказочный долбанафт 😁. Bukkit.getOnlinePlayers() в помощь.
 
Сказочный долбанафт 😁. Bukkit.getOnlinePlayers() в помощь.
У меня "оптимизация мозга" я подумал что если на Серве будет овердохрена онлайна то он сдохнет от вечного опроса. Я исправился ещё до того как сюда тему выложил, просто было интересно почему так!
 
Для отдельных команд можешь реализовать метод onTabComplete в своем плагине. Для работы с произвольными командами придется работать напрямую с пакетом с соответствующим названием. Не уверен, что он отсылается, если сообщение начинается не со слеша
Я сделал прослушку пакетов, но не нашёл того, который отвечает за открытие чата или набор символов, я так понял это происходит только на стороне клиента, но тогда откуда ивенты берут строку чата? Можно ли как-то отследить набор игроком символов в чате?
 
У меня "оптимизация мозга" я подумал что если на Серве будет овердохрена онлайна то он сдохнет от вечного опроса. Я исправился ещё до того как сюда тему выложил, просто было интересно почему так!
А то, что там будет дохрена мобов, ну такое да.
 
Я сделал прослушку пакетов, но не нашёл того, который отвечает за открытие чата или набор символов, я так понял это происходит только на стороне клиента, но тогда откуда ивенты берут строку чата? Можно ли как-то отследить набор игроком символов в чате?
Речь об этом пакете: https://wiki.vg/Protocol#Tab-Complete_.28serverbound.29
 
Назад
Верх