Icterine для Minecraft: ускоряем триггеры достижений без лишней нагрузки на сервер
Если вы держите модовый сервер с сотнями достижений, вы наверняка замечали, как «мелочи» вроде проверки инвентаря начинают съедать тики. Мод Icterine как раз про это: он оптимизирует срабатывание InventoryChangeTrigger — механики, которая реагирует на изменения стаков в инвентаре игрока и связывает их с прогрессом в advancements. В статье разберём, зачем это нужно, как работает ваниль и что именно меняет Icterine, плюс на каких версиях и лоадерах мод доступен.
Зачем вообще оптимизировать InventoryChangeTrigger
В Minecraft достижения часто завязаны на получение предметов, крафт, биомы и десятки других условий. Когда стак в инвентаре меняется, игра может вызывать триггер для этой ячейки — и это происходит не только при подборе блока с земли. Срабатывания возможны при выбрасывании, перекладывании предметов, работе с контейнерами и других рутинных действиях. На крупных сборках с тяжёлыми датапаками и модами количество критериев растёт, и каждая лишняя проверка превращается в заметную нагрузку на серверный тик.
Как это устроено в ваниле (коротко и по делу)
Чтобы понять ценность Icterine, полезно увидеть «цепочку» ванильной логики:
- Игра замечает изменение стака и вызывает InventoryChangeTrigger для затронутой ячейки.
- Триггер считает пустые, непустые и полностью заполненные слоты — данные могут использоваться критериями, хотя в ваниле это не всегда задействовано.
- Дальше перебираются зарегистрированные критерии достижений: если по слотам не сходится или нет требований к предметам, критерий пропускается.
- Если требование одно — проверяется изменённый стак. Если требований несколько (как у наборов брони), игра может гонять сопоставление по многим стакам.
- Сопоставление с тегами и NBT — самое тяжёлое; ваниль старается сначала сравнить тип предмета, а уже потом считать количество, зачарования и прочие данные.
Отдельный «сюрприз» — открытие сундука, печи или другого контейнера: игра может воспринимать массовое «изменение» слотов инвентаря и дергать триггеры шире, чем кажется игроку.
Что именно оптимизирует Icterine
Icterine не «ломает» саму систему достижений целиком: изменения серверные, а гибкость даёт конфиг — почти каждую вставку в ванильный код можно отключить. По смыслу мод убирает заведомо бессмысленные вызовы и удешевляет самые дорогие проверки.
Например, можно не вызывать триггер при опустошении стака или переносе предметов из инвентаря в контейнер (параметр ignore_triggers_for_emptied_stacks), а также при уменьшении стака без полного опустошения — когда выкинули один предмет из полного стака (ignore_triggers_for_decreased_stacks). Есть оптимизация для ситуаций, когда стак вырос, но это не пересекает пороги ни одного advancement в вашем модпаке (optimize_triggers_for_increased_stacks). Для экранов контейнеров мод меняет инициализацию «последних» слотов, чтобы открытие сундука не выглядело как волна изменений по всему инвентарю (initialize_inventory_last_slots).
Когда критериев с несколькими предметами много, Icterine сначала смотрит, подходит ли изменённый слот под требования, и только потом разгребает остальной инвентарь (optimize_multiple_predicate_trigger). А в тяжёлом этапе сопоставления с тегами мод может сравнивать количество раньше, используя и предыдущее значение счётчика, чтобы не гонять лишние проверки (check_count_before_item_predicate_match).
Производительность: цифры с реального теста
Авторы приводят замер на выделенном сервере с тремя активными игроками, кастомным Forge-модпаком на 200+ модов и паком BlazeandCave's Advancements (более 950 достижений). Статистику собирали через Spark в течение часа: с Icterine (версия 1.1.0) InventoryChangeTrigger выполнялся примерно в 2,5 раза быстрее, занимая около 7,5% времени тика вместо 20%. Для сравнения, в 1.0.0 прирост был около двукратным — то есть апдейты мода действительно двигают метрику в правильную сторону.
Совместимость, паритет и «что если что-то поедет»
Мод заявлен как оптимизация триггеров получения предметов: теоретически это может отличаться от ванильного поведения в редких краевых случаях, но ванильные достижения и большинство модов/датапаков не должны пострадать. Если вдруг что-то ведёт себя странно, обычно достижение всё равно можно «дожать» классическим трюком: выбросить нужный предмет и подобрать снова — это снова запускает цепочку проверок. На момент описания известных несовместимостей не отмечено, а любой спорный кусок логики можно отключить в конфиге.
Если вы собираете тяжёлую сборку и хотите меньше возни с ручной установкой зависимостей, имеет смысл поставить моды через удобный лаунчер: этот мод можно легко установить через лаунчер foxygame.net — гибкий и современный лаунчер для Minecraft, где моды можно скачать прямо из меню, без лишних переходов по сайтам.
Версии и лоадеры: куда ставить Icterine
Ориентиры по файлам такие: Icterine v1.2.0 — Fabric/Quilt для Minecraft 1.18.2–1.19.4 и Forge для 1.18.2–1.19.2. Icterine v1.3.0 сохраняет функциональность 1.2.0 и расширяет охват: Fabric/Quilt 1.20–1.20.4, Forge 1.19.3–1.20.4 и NeoForge 1.20.1–1.20.4. На странице Files удобно отфильтровать нужную версию игры и лоадер; если порта под ваш релиз нет, обычно просят завести issue или написать в Discord-сервер проекта.
Вывод
Icterine — практичный серверный мод для тех, кто упирается в стоимость advancements на больших модпаках: меньше лишних триггеров, дешевле сопоставление предикатов, наглядные профиты в Spark и при этом настраиваемость через конфиг. Если у вас сотни достижений, активные игроки и чувствительный к тикам мир, такой апгрейд механики инвентаря часто окупается стабильнее, чем очередной «магический» оптимизатор без понятной причины нагрузки.