Модификация оптимизирует срабатывание прогрессий, связанных с изменением инвентаря (InventoryChangeTrigger), снижая нагрузку на сервер.
Возможности и особенности
- Ускоряет срабатывание достижений при получении предметов;
- Может незначительно отличаться от ванильного поведения, но не влияет на исходные достижения Minecraft и большинство модов или датапаков;
- Даже при изменениях достижение должно оставаться доступным путём простого бросания и подбора нужного предмета;
- Пока не выявлено известных конфликтов или проблем;
- Вся модификация работает на стороне сервера и все изменения можно отключить через конфигурационный файл.
Результаты тестирования
Тест проходил на выделенном сервере с 3 игроками, использующем сборку с более чем 200 модами и паком достижений BlazeandCave (свыше 950 достижений). Статистика собиралась с помощью Spark в течение часа.
С модом InventoryChangeTrigger выполняется примерно в 2.5 раза быстрее (около 7.5% от времени тика вместо 20%). Для версии 1.0.0 ускорение было около 2 раз.

Принцип работы ванильного InventoryChangeTrigger
- При изменении стека в инвентаре игрока вызывается триггер. Это учитывает подбор предметов, выбрасывание, перемещение внутри инвентаря.
- При открытии контейнера игра считает, что все слоты изменились, и вызывает триггер для каждого, даже пустых.
- Триггер подсчитывает количество пустых, заполненных и полностью заполненных слотов, что могло бы использоваться для достижений, но ваниль не применяет эти данные.
- Проверяются критерии достижений: если они не соответствуют подсчетам слотов или не имеют требований по предметам, критерий пропускается.
- Если критерий содержит одно требование по предмету, проверяется изменённый стек.
- Если несколько требований (например, полный сет брони), проверяется каждый стек в инвентаре со всеми требованиями, при выполнении требований они исключаются из проверки.
- Сопоставление предметов, особенно с тегами, ресурсоёмкое. Сначала проверяется тип предмета, затем другие параметры (количество, зачарования, NBT).
Оптимизации в Icterine
- Не вызывается InventoryChangeTrigger при выбрасывании или перемещении стека из инвентаря (например, в сундук), если включен параметр
ignore_triggers_for_emptied_stacks. - Не вызывается при уменьшении размера стека, если он не опустошается полностью (
ignore_triggers_for_decreased_stacks). - Не вызывается при увеличении стека, если увеличение не достигает порога для какого-либо достижения (
optimize_triggers_for_increased_stacks). - При открытии контейнера изменён способ проверки изменённых предметов, чтобы не считать все слоты изменившимися сразу (
initialize_inventory_last_slots). - При проверке нескольких требований сначала проверяется изменённый слот, и только потом остальные стеки (
optimize_multiple_predicate_trigger). - Сравнение количества предметов перед сравнением тегов для уменьшения лишних проверок, а также использование предыдущего количества для оптимизации (
check_count_before_item_predicate_match).
Поддерживаемые версии
- Версия 1.2.0 совместима с Fabric/Quilt 1.18.2–1.19.4 и Forge 1.18.2–1.19.2.
- Версия 1.3.0 поддерживает Fabric/Quilt 1.20–1.20.4, Forge 1.19.3–1.20.4 и NeoForge 1.20.1–1.20.4.
- Выбор нужной версии осуществляется через фильтр на странице файлов мода.
Настройка модификации
- Все оптимизации можно отключить или включить через параметры конфигурационного файла.
- Основные управляющие параметры:
ignore_triggers_for_emptied_stacks,ignore_triggers_for_decreased_stacks,optimize_triggers_for_increased_stacks,initialize_inventory_last_slots,optimize_multiple_predicate_trigger,check_count_before_item_predicate_match.






