Сборка сервера
Create 6.0.10

Create 6.0.10 — NPE в ContinuousOBBCollider (крах при коллизии с контраптионом)

Minecraft 1.21.1 NeoForge 21.1.228+ Клиент и сервер Обновлено 10.07.2026

Если ваш краш-лог содержит одну из этих строк — вы на верной странице:

Вариант 1 — поле axis
java.lang.NullPointerException: Cannot read field "x" because "mf.axis" is null
	at com.simibubi.create.foundation.collision.ContinuousOBBCollider.collideMany(ContinuousOBBCollider.java:...)
Вариант 2 — поле normalAxis
java.lang.NullPointerException: Cannot read field "x" because "mf.normalAxis" is null
	at com.simibubi.create.foundation.collision.ContinuousOBBCollider.collideMany(ContinuousOBBCollider.java:162)
Часто следом — побочный краш вотчдога
java.lang.Error: ServerHangWatchdog detected that a single server tick took 60000004.00 seconds (should be max 0.05)
	at net.minecraft.server.dedicated.ServerWatchdog.run(ServerWatchdog.java:52)
Скачать фикс Готовый .jar из GitHub Releases — положить в mods/
Скачать последний релиз Исходный код

Причина краша

Внутри ContinuousOBBCollider.ContinuousSeparationManifold метод reset() обнуляет сразу два поля — this.axis и this.normalAxis. Метод separate(...) присваивает их заново только тогда, когда находит ненулевое расстояние разделения по соответствующей оси.

Когда центр хитбокса сущности совпадает с центром блока контраптиона по всем осям теоремы разделяющей оси (вырожденный случай — например, игрок стоит ровно по центру блока), одно или оба поля так и остаются null после reset(). collideMany() читает mf.axis.x / mf.normalAxis.x без проверки на null — сервер падает с NullPointerException.

Краш вотчдога («single server tick took 60000004.00 seconds») в логе почти всегда идёт следом — это не отдельный баг, а следствие того, что серверный поток уже умер от необработанного исключения, а поток вотчдога продолжает считать «время с последнего тика» и в итоге падает сам с бессмысленно огромным числом.

Как работает фикс

Мод-миксин перехватывает каждое чтение полей axis и normalAxis внутри collideMany() через @Redirect. Если поле оказывается null — возвращается Vec3.ZERO вместо падения с NPE. Нулевой вектор означает нулевой вклад этого manifold-а в коллизионный отклик, что физически корректно для вырожденного случая нулевого разделения — эквивалентно защитному фиксу из Create PR #10301.

Поскольку целевой класс — приватный вложенный класс Create, доступ к полю сделан через Mixin-accessor интерфейс, вплетаемый прямо в целевой класс, без модификации пакета Create (чтобы не словить конфликт Java-модулей между jar-ом фикса и самим Create).

Совместимость и установка

МодCreate 6.0.10 (только эта версия)
Minecraft1.21.1
ЗагрузчикNeoForge 21.1.228+
Куда ставитьКлиент и сервер

Требуется Create 6.0.10 — мод не загрузится с другими версиями Create (в neoforge.mods.toml прописан строгий диапазон). Как только выйдет версия Create с официальным фиксом — этот мод можно удалить.

Ставить нужно и на клиент, и на сервер: код коллизии контраптионов крутится на обеих логических сторонах (клиент считает её локально для сглаживания движения), так что краш возможен и там, и там.

Runes & Rails открыто делится этим и другими фиксами с сообществом Create и Minecraft в целом — исходники и релиз доступны бесплатно, под MIT-лицензией. Ставьте на свой сервер, форкайте, дорабатывайте: репозиторий на GitHub. Все фиксы — на странице «Фиксы крашей».

Ко всем фиксам