Denizen 1.3.4-b7314M
Скрипты стали быстрее, лагов меньше, и много исправлений. Просто замените jar: скрипты менять не нужно.
Стало быстрее
- Запись флагов быстрее примерно на 20%,
injectпочти вдвое быстрее,runбыстрее примерно на 15%.- Математика с целыми числами и округление (
round,round_up,round_down,round_to) больше не идут медленным путём через точные десятичные дроби. Результат тот же, а работы гораздо меньше.- События, под которые не подошёл ни один скрипт, стоят примерно втрое меньше, а свитч
flagged:разбирается один раз, а не на каждом событии.list.get,map.get, сравнение чисел,replaceиfilterработают быстрее.- Скрипты, которые обрабатывают много пакетов, создают гораздо меньше мусора в памяти, поэтому пауз на сборку мусора стало меньше.
Асинхронность
- Новый свитч
thread:networkдля событий пакетов,player receives message,player receives actionbarиplayer hears sound. Такие события выполняются прямо в сетевом потоке и не ждут тика сервера.- Намного больше тегов работает в асинхронных скриптах без ожидания главного потока, в том числе
location.block,entity.is_sneakingиlocation.find_blocks.- Плейсхолдеры PlaceholderAPI
%denizen_...%теперь работают из любого потока (включено по умолчанию).- Исправлены редкие случайные ошибки при большой асинхронной нагрузке.
✨ Новое
<PlayerTag.plugin_channels>: каналы модов, которые использует клиент игрока.<LocationTag.collision_boxes>: твёрдые коробки блока, в том же формате, что иbounding_box.- Новые свойства предметов:
tooltip_style,enchantment_glint_overrideиintangible_projectile.
Исправлено
fake_playerчерезfakespawnснова работает на Paper.- Позиции в
advancement,ItemTag.json,<&head>и пространства имён спрайтов.<LocationTag.highest>больше не выдаёт ошибку в незагруженных чанках.- Обработка ошибок асинхронного телепорта, событие
server list pingи исправления для Minecraft 26.1–26.3.- Аддоны, которые напрямую читают определения очереди (например, denizen-reflect), снова работают.
Denizen 1.3.4-b7309M - Теперь БЫСТРЕЕ, УМНЕЕ и уже на 26.3! 🚀
Это большое обновление с момента7302M: поддержка Minecraft 26.3, огромная работа над скоростью ядра скриптов, доработки async и куча исправлений. Версия поднята до 1.3.4.
⚡ Скорость скриптов (Core)
Основной упор этого релиза - ядро выполняет скрипты заметно экономнее: меньше аллокаций, меньше повторных разборов, меньше лишней работы на каждой строке.
ЦиклыDefinitions (
- Тело цикла (
foreach,repeat,while) теперь выполняется из одной копии с «рамкой» (frame) на очереди, а не копируется и вставляется заново на каждом шаге.- Счётчик цикла меняется «на месте», без создания нового значения и массива на каждый шаг; все счётчики теперь числа.
- Тело
ifберётся только если условие прошло; условияif/whileразбираются один раз при компиляции.if,else,defineиforeachпереведены наautoCompile.<[name]>)Аргументы и теги
- Определения получили «слоты» и кэширование: чтение
<[name]>и<[name].sub.tag>больше не ищет имя по списку и не разбивает точечные имена каждый раз.- Определения очереди вынесены в отдельный объект-хранилище.
- Тег вида
<[name]>читает определение напрямую, без лишних построений.🧵 Async
- Аргументы без тегов больше не парсятся повторно; форма аргумента определяется один раз, а не при каждом выполнении.
- Контекст тега клонируется только там, где это реально нужно.
- Меньше аллокаций на
Attribute, быстрее разбор префиксов типов объектов и чтение «плоских» флагов без разбиения имени.definemap: карта строится один раз, если строка состоит из фиксированного текста, и кэшируется для YAML-блоков без тегов.✨ Улучшения
- Окно ожидания главного потока теперь адаптивное: оно растёт для скриптов, которым это выгодно, и сжимается обратно, если не помогает.
- Команда
asyncполучила отчёт для отладки.- README приведён в соответствие с новой логикой окна ожидания.
🐛 Исправления
adjustblockтеперь принимаетMapTag, как иadjust.- Механизм
attributeуBiomeTagмодернизирован. Теперь принимает тип аттрибутовgameplayиaudio.- Событие
PlayerChangesUncheckedSignScriptEvent: обновлено название и мета. Теперь в скриптах этоplayer changes unchecked sign- Дубликат ключа в YAML теперь сообщает, в каком файле он найден и при чтении старого файла сохранений указывается его имя.
- Из плагина убрана отправка отладочных логов на сервер оригинального плагина Denizen вместе с настройками в
config.yml.
- Тело цикла не видело смену привязанного игрока/NPC (
__player,__npc,linked_player,linked_npc):foreachпо онлайн-игрокам мог держать первого игрока. Теперь исправлено.- Поиск игрока и NPC внутри тела цикла теперь читает реальную следующую запись очереди.
- Айтем скрипты теперь загружаются до проверки ивентов. Баг был с версии 7302M, исправлено.
- Исправлены
shadow_color,shadow_gradientиdual_gradient.- Исправления тега
gameruleуWorldTag.- Исправления
showfakeдля 26.3 версии.- Исправления NPE и работы команды
fakeequip.- Исправление ошибки детерймана у ивента
server list ping.
Полный список изменений:7302M...master· Core
Нужна сборка 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 asyncnarrate,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, звук) сделаны потокобезопасными
⚡ Важное обновление! В этой сборке устранены проблемы с производительностью. Настоятельно рекомендуется обновиться как можно скорее.
- В событии
on player joinопределены и исправлены ошибки <context.message> с использованием новых компонентов Paper.- Асинхронная телепортация: добавлены более строгие проверки успешности (теперь проверяется наличие объекта) для предотвращения ложных отладочных сообщений об ошибках телепортации.
- Исправлены проблемы с производительностью при использовании команды
showfake.- Расширена поддержка тега
.optimize_jsonдля компонентов головы игрока в сообщениях чата.- Добавлена более строгая проверка материалов для команды
schematic.- Оптимизирована производительность команды
playeffectпри использовании API ParticleBuilder.- Обновление до версии 7299.
- Модернизация тега
<&head[#.#]>: теперь он принимает PlayerTag, имя, UUID, base64 и PlayerTag.skin_blob.- Тег <&player_head> был удален. Используйте новый тег <&head>.
- Добавлены недостающие методы в PaperAPIToolsImpl, что исправило привязку тега
.variantк EntityTag и.recent_tpsк ServerTag.- Исправлен метод setMapData.
- Исправлен механизм
fake_teleportдля всех версий.- Исправлено использование параметра типа falling_block в команде fakespawn.
- Удалено огромное количество неиспользуемых импортов и проверок NMSVersion.
Спасибо m1ha1lk за помощь!