Нужна сборка
DenizenM-Core из этого же релиза - ядро вшивается в джарник плагина, так что смешивать джарники из разных релизов нельзя.
Асинхронные скрипты Главное в этом релизе: очереди скриптов теперь умеют выполняться вне главного потока сервера. Собственная логика скрипта - теги, математика, текст, списки, карты - больше не тратит время главного потока, и медленный скрипт не может лагать сервер.
- async:
- define sorted <server.flag[scores].sort_by_value>
- narrate "Top: <[sorted].keys.last>"
- run my_task async
- ~define result <[huge_list].parse_tag[<[parse_value].to_uppercase>]>
- async detached copy_defs:path|index:
- runlater nightly_report delay:1h async
Всё, что вне главного потока небезопасно, передаётся главному потоку автоматически, а скрипт ждёт ответа. Скрипты поэтому остаются корректными - просто на таких строках ничего не выигрывают.
Первый переход в главный поток стоит до целого тика, все следующие за ним - микросекунды. Команды, которые только отправляют что-то и ничего не возвращают (
narrate,
playsound,
playeffect,
runlater, ...), передаются вообще без ожидания.
Полное описание, включая списки команд и тегов, безопасных вне главного потока:
README ядра либо meta-разделы
Async Queues и
Async Tag Safety.
Новая секция конфига
Scripts.Async:
Allow,
Main thread wait timeout,
Shutdown timeout,
Main thread task budget ms,
Main thread wait linger us,
Warn at queue count,
Max queue count.
Новые теги<ListTag.activation[<type>]>, <ListTag.matrix_mul[<list>]>, <ListTag.dot_product[<list>]><EntityTag.is_enemy><&sprite[(<atlas>:)<sprite>]> - текстовый компонент atlas_sprite, рядом с уже существующим &head<QueueTag.is_async>, <QueueTag.async_stats>, <util.is_main_thread>, <util.current_thread>, <util.linger_stats>, <util.current_time_nanos>
Новые механизмы -
MaterialTag.chain_part -
LEFT/
CENTER/
RIGHT/
UNCONNECTED для полок (в ванилле это состояние называется
side_chain); тег и механизм
### Новые аргументы команд
playsound ... source:<entity> - звук идёт от энтити, следует за ней и обрывается, когда она умирает. Работает и на фейковых энтити из fakespawn — для тех игроков, которым её показали.playsound ... targets:<player>|... - задаёт, кто именно слышит звук, и заодно позволяет команде не уходить в главный потокrunlater ... async — запускает отложенный скрипт в собственной очереди, когда придёт время
Исправленияshowfake в 26.2 падал с NoSuchMethodError, а на материале без block entity ушёл бы в NPE; теперь block entity строится через NMS, как это давно делают остальные модули&head и &sprite молча терялись при любом преобразовании туда-обратно - raw JSON, лор предмета, страницы книги, — а внутри градиента повторялись на каждом символе&shadow_color / .shadow_color протекали за пределы своей области, сбрасывали цвет текста, обрывали объемлющий цветовой блок и не давали задать полностью непрозрачную тень; градиенты заодно избавились от String.format на каждый символ- Ряд пакетных обработчиков (таблист, actionbar, звук) сделаны потокобезопасными