Если ваш краш-лог содержит одну из этих строк — вы на верной странице:
java.lang.NullPointerException: Cannot invoke
"dev.simulated_team.simulated.content.blocks.rope.strand.server.ServerRopeStrand.getAttachment(...)"
because "this.ownedServerStrand" is null
at dev.simulated_team.simulated.content.blocks.rope.RopeStrandHolderBehavior.makeUpdatePacket(RopeStrandHolderBehavior.java:167)
at dev.simulated_team.simulated.content.blocks.rope.strand.server.ServerRopeTrackingSystem.sendTrackingData(ServerRopeTrackingSystem.java:78)
mods/
Каждый тик ServerRopeTrackingSystem.sendTrackingData(int) проходит по активным
верёвкам (ServerRopeStrand), которым нужна синхронизация, находит
RopeStrandHolderBehavior в точке крепления и, если он найден, сразу собирает и
отправляет пакет обновления через makeUpdatePacket().
makeUpdatePacket() четыре раза читает значения прямо с
this.ownedServerStrand (getAttachment() дважды, getUUID(),
getPoints()) без проверки на null. При рассинхроне жизненного цикла —
верёвка всё ещё активна и зарегистрирована в менеджере уровня, но найденный
RopeStrandHolderBehavior уже не считает себя её владельцем (похоже на гонку между
выгрузкой чанка и разрывом крепления) — ownedServerStrand оказывается null,
хотя сам behavior найден. Сервер падает с NullPointerException.
В коде уже есть готовый паттерн: если RopeStrandHolderBehavior в точке крепления не
найден вовсе — итерация просто пропускается (continue). Фикс через Mixin
@ModifyVariable перехватывает эту же переменную сразу после присвоения и принудительно
делает её null, если holder.getOwnedStrand() == null — то есть
поведение найдено, но сейчас ничего не отслеживает. Дальше отрабатывает уже существующая, проверенная
ветка «пропустить эту нить в этом тике» — код отправки пакетов вообще не тронут.
| Мод | Create: Simulated (входит в Create Aeronautics) 1.3.0 (только эта версия) |
|---|---|
| Minecraft | 1.21.1 |
| Загрузчик | NeoForge 21.1.228+ |
| Куда ставить | Клиент и сервер (краш — на стороне сервера) |
Требуется Create: Simulated 1.3.0 (модуль внутри Create Aeronautics / Offroad и других аддонов на его основе). Ставить на клиент и сервер — краш серверный, но при интегрированном (одиночном) сервере тот же код исполняется и на клиенте.
Runes & Rails открыто делится этим и другими фиксами с сообществом Create: Simulated (входит в Create Aeronautics) и Minecraft в целом — исходники и релиз доступны бесплатно, под MIT-лицензией. Ставьте на свой сервер, форкайте, дорабатывайте: репозиторий на GitHub. Все фиксы — на странице «Фиксы крашей».