
Cerulean Fork
Cerulean Fork - серверный мод оптимизации достижений для Minecraft. Убирает лаги от InventoryChangeTrigger в сборках с сотнями ачивок, работает с Fabric, Forge, NeoForge и Quilt.
Cerulean Fork - это обновлённый форк мода Cerulean, который сам по себе был форком Icterine. Простыми словами: оригинальный автор год не трогал проект, и кто-то взял и портировал его на актуальные версии Minecraft под тем же именем, добавив пару полезных фишек. Скачать Cerulean Fork стоит, если у вас в сборке модов сотни достижений и вы устали от просадок TPS при каждом подборе предмета.
Зачем этот мод вообще нужен
Если коротко - он оптимизирует систему проверки достижений в Майнкрафт. Точнее, тот самый лагучий InventoryChangeTrigger, который в больших модпаках с кучей кастомных ачивок способен знатно просадить производительность сервера. Виной всему ванильная механика: при любом изменении стака в инвентаре игрока игра запускает проверку по всем зарегистрированным критериям достижений. И если у вас установлен условный BlazeandCave's Advancements Pack с 950+ ачивками - каждый чих в инвентаре превращается в мини-обсчёт всего этого списка.
Для любителей тяжёлых сборок модов вроде Simple Performance или Voxyris (где Cerulean Fork уже идёт как компонент) это буквально мастхэв. Для ванильного выживания без кастомных пакетов - почти незаметно, хотя хуже точно не станет.
Что нового в ветке Cerulean
Помимо порта на Minecraft 1.21.1 и выше, здесь появилась опция обрабатывать достижения не каждый тик, а раз в несколько. Такой же подход применяется в моде Achievements Optimizer (который, к слову, не работает с оригинальным Icterine). Сделано это аккуратно: первый подбор предмета игроком всегда обрабатывается корректно, так что достижения не будут зависать в ожидании, пока вы начнёте двигать предметы по инвентарю.
Возможности
- Оптимизация срабатывания достижений при получении предметов
- Возможна небольшая рассинхронизация с ванильным поведением, но на ванильные достижения это не влияет и в большинстве случаев не заденет другие моды и датапаки
- Даже если что-то поедет - достижение всё равно получается, если бросить и снова поднять нужный предмет
- Известных несовместимостей и багов на данный момент нет
- Каждую инъекцию в ванильный код можно отключить в конфиге
- Все изменения работают на стороне сервера
Практические результаты
Автор проводил живой тест на выделенном сервере с тремя активными игроками. Кастомная сборка на Forge, свыше 200 модов плюс BlazeandCave's Advancements Pack с 950+ ачивками. Замеры снимались через Spark в течение часа.
С Icterine вызов InventoryChangeTrigger выполняется почти в 2.5 раза быстрее (для версии 1.1.0). Доля времени тика, которую он занимал, упала с примерно 20% до 7.5%. Совсем другой разговор, правда? На больших онлайн-серверах с кучей игроков эта разница становится ещё заметнее - TPS перестаёт прыгать при каждом открытии сундука.
Как работает ванильный InventoryChangeTrigger
Чтобы понимать, что вообще оптимизируется, разберём ванильную логику по шагам:
- Когда игра видит, что стак в инвентаре игрока изменился, она вызывает
InventoryChangeTrigger. Это включает подбор предметов, выбрасывание, выбрасывание целых стаков, перемещение вещей внутри инвентаря.- Ещё нюанс: при открытии контейнера (сундук, печь и т.д.) игра считает, что все слоты инвентаря изменились, и вызывает триггер для каждого из них, включая пустые.
InventoryChangeTriggerподсчитывает пустые, непустые и полностью заполненные слоты в инвентаре. Эта информация могла бы использоваться в триггерах достижений, но в ваниле не применяется.- Триггер проходит по всем зарегистрированным критериям достижений.
- Если у критерия есть требования к количеству слотов и они не совпадают со значениями из шага 2, или если у критерия нет требований к предметам, критерий пропускается.
- Если у критерия только одно требование к предмету, изменённый стак проверяется на соответствие этому требованию.
- Если требований несколько (например, "Засыпь меня обломками" требует полный сет незеритовой брони), каждый стак в инвентаре проверяется против каждого требования (но выполненные требования удаляются из списка и больше не проверяются).
- Сопоставление предметов, особенно по тегу, крайне тяжёлое. Но игра сначала проверяет, совпадает ли тип предмета игрока с типом из требования, и только потом смотрит остальные параметры вроде количества, зачарований и прочих NBT-данных.
Как оптимизирует Icterine (и Cerulean Fork)
- На шаге 1 не вызываем
InventoryChangeTrigger, когда вы выбрасываете стаки или переносите их из инвентаря (например, в сундук). Управляется параметромignore_triggers_for_emptied_stacksв конфиге. - Аналогично не вызываем, если изменение стака было вызвано уменьшением количества, но не полным опустошением (например, игрок выбросил один предмет из полного стака). Отвечает за это
ignore_triggers_for_decreased_stacks. - Не вызываем триггер, если размер стака увеличился, но не пересёк порог ни для одного достижения. Пример: стак земли вырос с 52 до 53, но ачивки на 53 блока земли в вашем модпаке нет. Параметр
optimize_triggers_for_increased_stacks. - Меняем проверку изменений предметов при открытии контейнера, чтобы игра не считала все слоты изменившимися в момент открытия. Отвечает
initialize_inventory_last_slots. - На шаге 6 сначала проверяем, соответствует ли изменённый слот какому-либо требованию, и только потом - остальные стаки в инвентаре. Параметр
optimize_multiple_predicate_trigger. - На шаге 7 сначала сравниваем количество предметов, чтобы не запускать лишнее сопоставление по тегу. Плюс используем предыдущее значение количества, чтобы отсечь ещё больше ненужных проверок. Отвечает
check_count_before_item_predicate_match.
Совет: если вы запускаете сборку модов на слабом сервере, начните с включённых по умолчанию оптимизаций и смотрите на TPS через Spark. Большинство настроек в конфиге трогать не приходится - они и так работают из коробки.
Важный нюанс: проект лицензирован под GPL-3.0-or-later, работает в одиночной игре и на сервере. То есть ставить его нужно и на клиент (в одиночке), и на сервер. Все изменения - серверные, так что игрокам на мультиплеере отдельно ничего скачивать не нужно.
Поддерживаемые версии
Исходный Icterine v1.2.0 работает с Minecraft Fabric/Quilt от 1.18.2 до 1.19.4, и с Forge от 1.18.2 до 1.19.2.
Icterine v1.3.0 повторяет фичи v1.2.0 и работает с Fabric/Quilt 1.20 - 1.20.4, Forge 1.19.3 - 1.20.4, а также NeoForge 1.20.1 - 1.20.4.
Актуальная ветка Cerulean Fork поддерживает Minecraft Java 1.21.4 - 1.21.11, а также снапшоты 26.1.x, 26.2 и 26.3. Доступен под Fabric, Forge, NeoForge и Quilt. Последний опубликованный релиз - 1.0.1 для Minecraft 26.2 на Fabric и Quilt, ему требуется Fabric API. Changelog автор не указал, так что встречайте по факту.
Если нужен порт на другую версию - используйте фильтр версий, чтобы выбрать подходящий файл.
Совместимость
Проект плотно связан с экосистемой оптимизации достижений: его прямо сравнивают с Icterine, оригинальным Cerulean и Achievements Optimizer. Несовместимостей с другими популярными модами на данный момент не выявлено, но всегда стоит проверять конфиг после крупных обновлений сборки - особенно если вы обновляете Minecraft через несколько версий сразу.
Если вы собираете сервер под друзей или публичный проект с большим модпаком - Cerulean Fork по факту бесплатный прирост производительности без изменения геймплея. Скачайте мод Cerulean Fork, поставьте его на сервер и клиент, и забудьте про просадки при подборе лута.
Как поиграть с друзьями с модом Cerulean Fork?
Мод Cerulean Fork куда интереснее в компании: поднимите сервер Майнкрафт с уже установленным модом, позовите друзей и играйте по своим правилам. Хостинг Майнкрафт для мода Cerulean Fork будет готов за пару минут - BungeeHost сделает всё за вас.
