Если ваш краш-лог содержит одну из этих строк — вы на верной странице:
java.lang.NullPointerException: Cannot read field "x" because "mf.axis" is null
at com.simibubi.create.foundation.collision.ContinuousOBBCollider.collideMany(ContinuousOBBCollider.java:...)
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)
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 (только эта версия) |
|---|---|
| Minecraft | 1.21.1 |
| Загрузчик | NeoForge 21.1.228+ |
| Куда ставить | Клиент и сервер |
Требуется Create 6.0.10 — мод не загрузится с другими версиями Create (в
neoforge.mods.toml прописан строгий диапазон). Как только выйдет версия Create с
официальным фиксом — этот мод можно удалить.
Ставить нужно и на клиент, и на сервер: код коллизии контраптионов крутится на обеих логических сторонах (клиент считает её локально для сглаживания движения), так что краш возможен и там, и там.
Runes & Rails открыто делится этим и другими фиксами с сообществом Create и Minecraft в целом — исходники и релиз доступны бесплатно, под MIT-лицензией. Ставьте на свой сервер, форкайте, дорабатывайте: репозиторий на GitHub. Все фиксы — на странице «Фиксы крашей».