No Null Processors: как победить таинственный вылет при предгенерации мира
Вы когда-нибудь запускали предгенератор чанков на сервере или в одиночной игре, чтобы заранее прогреть мир, и внезапно получали краш с загадочной ошибкой NullPointerException? Если да, то вы столкнулись с одним из самых неуловимых багов Minecraft версий 1.17–1.18.1. Мод No Null Processors создан именно для того, чтобы навсегда закрыть эту проблему и сделать предгенерацию стабильной.
Как выглядит ошибка и почему она возникает
Типичный стектрейс, который преследует игроков и администраторов, содержит строки вроде:
java.lang.NullPointerException: Cannot invoke "net.minecraft.structure.processor.StructureProcessorList.getList()" because the return value of "java.util.function.Supplier.get()" is null- Упоминание
SinglePoolElement.createPlacementDataиSinglePoolElement.generate
Ошибка возникает при загрузке большого количества чанков, особенно когда в мире используются структуры с процессорными листами, заданными через датапаки или моды. Суть бага кроется в том, как Minecraft регистрирует и перезаписывает процессоры во время генерации мира.
В нормальной логике игры реестр процессорных листов заполняется один раз при старте мира. Однако при чтении структуры из чанка (когда чанк уже сгенерирован и сохраняет информацию о выбранных элементах пула) код ошибочно пытается заново зарегистрировать тот же процессорный лист в реестре. Эта операция замены «самого себя на самого себя» не потокобезопасна. Поскольку Minecraft генерирует чанки в несколько потоков, возникает редкая коллизия: два потока одновременно читают и пишут в одну и ту же ячейку реестра. В результате один из потоков может получить null вместо ожидаемого процессора, что и приводит к крашу.
Почему баг так сложно отловить
Проблема проявляется только при стечении трёх обстоятельств:
- Наличие модов или датапаков, добавляющих структуры с кастомными процессорами.
- Использование инструментов массовой предгенерации чанков (Chunk Pregenerator, Chunky и аналоги).
- Загрузка большого объёма территории, при которой многопоточная генерация начинает активно конкурировать за реестр.
В обычной игре, когда чанки подгружаются постепенно по мере перемещения игрока, шанс столкнуться с этой гонкой потоков минимален. Но стоит запустить предгенератор — и краш становится почти гарантированным на крупных картах. Интересно, что в версии 1.16.5 подобного поведения не наблюдалось, баг появился именно в 1.17 и дожил до 1.18.1 включительно. Разработчики Mojang исправили его только в 1.18.2, поэтому для всех, кто остаётся на более ранних сборках, No Null Processors остаётся критически важным дополнением.
Как мод решает проблему
Автор мода применил элегантный подход: кеширование RegistryOps для каждого процессорного листа. Вместо того чтобы позволять игре каждый раз заново обращаться к реестру и потенциально вызывать перезапись, мод сохраняет уже полученный экземпляр и повторно использует его. Таким образом, операция записи в реестр выполняется ровно один раз, и многопоточные коллизии становятся невозможны. По сути, это обходной путь, который не меняет механику игры, а лишь исправляет опасную гонку данных.
Когда я впервые настраивал сервер для друзей и столкнулся с этой ошибкой, то потратил несколько часов на поиск причины. Оказалось, что многие моды, добавляющие данжи и деревни, неявно провоцируют этот баг. Установить No Null Processors можно вручную, скопировав jar-файл в папку mods, но гораздо удобнее воспользоваться лаунчером foxygame.net — удобным, гибким и современным лаунчером для Minecraft, где можно скачать моды прямо из меню. Это экономит время и исключает путаницу с версиями, особенно если вы часто переключаетесь между Fabric и Forge.
Совместимость и особенности
- Поддерживаются версии Minecraft 1.17.0, 1.17.1, 1.18.0 и 1.18.1.
- Для 1.18.2 и новее мод не требуется — разработчики исправили баг на уровне ванильного кода.
- Работает как на Forge, так и на Fabric (ссылки на скачивание обычно лежат в описании мода).
- Не конфликтует с другими оптимизационными модами вроде Lithium, Starlight или FerriteCore.
- Не добавляет новых блоков или предметов — это чисто технический патч.
Когда стоит обязательно установить No Null Processors
Если вы планируете использовать предгенерацию мира на сервере с модами, добавляющими структуры (например, Repurposed Structures, YUNG’s Better Strongholds, Dungeon Crawl), этот мод должен быть в списке обязательных. Даже если вы не применяете предгенератор, но замечали случайные краши при исследовании новых территорий в версиях 1.17–1.18.1, установка патча может полностью решить проблему. Отзывы сообщества подтверждают, что после добавления No Null Processors генерация мира проходит без единого вылета.
Заключение
No Null Processors — это маленький, но невероятно полезный инструмент для всех, кто застрял на версиях Minecraft между 1.17 и 1.18.1 и ценит стабильность. Он устраняет редкий, но крайне неприятный баг, связанный с гонкой потоков в реестре процессорных листов. Благодаря простому механизму кеширования мод делает предгенерацию чанков безопасной, позволяя наслаждаться огромными мирами без внезапных крашей. Если вы активно пользуетесь модами на структуры и предгенераторами, обязательно добавьте этот патч в свою сборку — и забудьте о NullPointerException навсегда.