- Баллы
- 76
- Имя в Minecraft
- CKATEPTb
В реализации такого есть значимый недостаток. Если изменять чанк (даже если изменить один блок в чанке) асинхронно, например с помощью FasyAsyncWorldEdit или AsyncWorldEdit, все игроки находящиеся в изменяемом чанке станут невидимыми для других игроков. Это проблема клиента и самый простой способ исправить это вызвать перезагрузку мира для игроков, т.е. они увидят экран загрузки. Самым правильным решением данной задачи было разбивать высушивание блоков следующим образом. В отдельном потоке за тик собрать N'ое кол-во блоков и на следующий синхронный тик разбить собранные блоки на очередь, делая replace синхронно, пока очередь не останется пустой. Но это все равно не малая нагрузка для сервера, которую можно уменьшить если не применять физику к блокам, в прочем этого все равно будет недостаточно для онлайна свыше 30.Ну, если брать определенную небольшую локация неподалеку от онлайн игроков и если сервер имеет нормальные характеристики, то нет
Хотя и игроков может быть много, но вроде это как-то в асинхроне можно провернуть
UPD. Более того, в новых версиях FAWE реализация EditSession ведет себя очень (ОЧЕНЬ) не предсказуемо. В каких-то моментах в одну сессию лучше запихнуть как можно больше изменений. В каких-то моментах лучше разбить множество изменений на несколько EditSession. В любом случае - реализовать можно с помощью реактора, описывая логику publisher'ов с таймаутами и параллельной итерацией очереди. Только вот кодеров которым знакомо понятие реактивное программирование в майне не много и привлечь их без бюджета у тебя не получится.
У меня у самого сейчас проект на паузе, который позволяет работать с блоками не из главного потока. Когда разберусь с основной работой и доделаю реализацию ThreadSafeBlockPlacer, оставлю репозиторий, если конечно не забуду.