Create Train Crash Fix
Fixes the issue where trains by the Create mod might crash the server due to infinite positions.
About this Mod
Create Train Crash Fix
Fixes the crash that may occur when a train has infinite positions (even if the train data file doesn't show an infinite)
a very simple mod
Info for nerds (how it was fixed)
First we've got to take a look at the issue: the train does not have an invalid position in the train data file. That means it has to be somewhere in the serialisation.Creation of issue #6795
August 7th, 2024
I added two mixin injections. One at createEntity (from create) and readNbt (from minecraft).
@Mixin(Carriage.DimensionalCarriageEntity.class)
public abstract class DimensionalCarriageMixin {
@Shadow public Vec3d positionAnchor;
@Inject(at = @At("HEAD"), method = "createEntity")
private void sendEntityInfo(World level, boolean loadPassengers, CallbackInfo ci) {
CreateTrainFix.LOGGER.info(positionAnchor.toString());
if (!Double.isFinite(positionAnchor.getX()) || !Double.isFinite(positionAnchor.getY()) || !Double.isFinite(positionAnchor.getZ())) {
CreateTrainFix.LOGGER.info("Train failed to be created, because of infinity checks.");
}
}
}
@Mixin(Entity.class)
public abstract class EntityMixin {
@Shadow public abstract double getX();
@Shadow public abstract double getY();
@Shadow public abstract double getZ();
@Shadow public abstract Vec3d getPos();
@Inject(method = "readNbt", at = @At(value = "INVOKE", target = "Ljava/lang/Double;isFinite(D)Z"))
private void checkFiniteDebug(NbtCompound nbt, CallbackInfo ci) {
if (!Double.isFinite(getX()) || !Double.isFinite(getY()) || !Double.isFinite(getZ())) {
CreateTrainFix.LOGGER.info("INFINITE location " + getPos());
}
}
}
This is what's being logged, after which it inevitably crashes. The coordinates are somehow invalid, while still being normal in the createEntity method.
[18:18:15] [Server thread/INFO]: (225.5, 58.0, -165.8600004762411)
[18:18:15] [Server thread/INFO]: INFINITE location (NaN, NaN, NaN)
After more thorough checking the NBT already comes as NaN, while the create_tracks.dat file doesn't contain anything like that. create_tracks.dat check see line 123 (heh, funny number)
~2.5 months later
IThundxr proposes the idea of adding something similar to the following into the code:
serialisedEntity.remove("Pos");
serialisedEntity.put("Pos", newDoubleList(positionAnchor.x(), positionAnchor.y(), positionAnchor.z()));
This is the final concept and it works!
This is the final version of what has been added
@Inject(at = @At("HEAD"), method = "createEntity")
private void createTrainFix$fixEntity(World level, boolean loadPassengers, CallbackInfo ci) {
try {
// RefUtil is a class with a few methods to access private fields from the superclass.
NbtCompound serialisedEntity = (NbtCompound) RefUtil.getPrivateFieldValue(this$0, "serialisedEntity");
serialisedEntity.remove("Pos");
serialisedEntity.put("Pos", newDoubleList(positionAnchor.x, positionAnchor.y, positionAnchor.z));
// Set the value again
RefUtil.setFieldValue(this$0, "serialisedEntity", serialisedEntity);
} catch (NoSuchFieldException | IllegalAccessException e) {
// If this all didn't work, throw an error
CreateTrainFix.LOGGER.error("(CreateTrainFix) Failed to fix train position");
throw new RuntimeException(e);
}
// Final check
if (!Double.isFinite(positionAnchor.getX()) || !Double.isFinite(positionAnchor.getY()) || !Double.isFinite(positionAnchor.getZ())) {
CreateTrainFix.LOGGER.info("Train failed to be created, because of infinity checks.");
}
}
Available Versions
How to Install Create Train Crash Fix on Your Server
Order Server
Order a Minecraft Java server with at least 4 GB RAM (6 GB recommended).
Set fabric Loader
In the panel under "Egg", select the fabric loader and matching Minecraft version (1.20.1).
Install Mod
Open the mod browser in the dashboard and search for "Create Train Crash Fix". Click "Install" – done! Alternatively, upload the .jar via SFTP to the /mods folder.
Compatibility
Mod Loaders
Minecraft Versions
1.20.1
Server-side
✓ RequiredRecommended RAM
6 GB(min. 4 GB)Frequently Asked Questions
Create Train Crash Fix server crashes on startup – what to do?
Most common cause: wrong fabric version or insufficient RAM. Check the server log (latest.log) for "OutOfMemoryError" or "Mixin" errors. With Mado Hosting: ensure at least 4 GB RAM is allocated and the loader matches the mod version (1.20.1). You can switch loaders with one click in the panel.
Is Create Train Crash Fix compatible with fabric and quilt?
Create Train Crash Fix officially supports fabric, quilt for Minecraft 1.20.1. The Mado dashboard automatically detects incompatible loader combinations.
Server lagging with Create Train Crash Fix – how to optimize performance?
Recommended RAM: 6 GB (per 5 players). Use /spark profiler to check if Create Train Crash Fix consumes the most tick time. Common fixes: reduce server view-distance to 8-10, install "performant" or "starlight" as supplementary mods on Forge. With Mado Hosting, your server runs on NVMe SSDs with dedicated CPU cores for minimal latency.
Similar Mods
Rent Modded Server
Install Create Train Crash Fix with just one click on your server.