Repository navigation
Failed to load saved sub-level: Plot already exists at 0, 36 #1626
Description
Context
I'm getting a persistent warning from Sable when loading my Minecraft 1.21.1 world. The world loads successfully, and my moving structures appear to work normally, but Sable reports that one saved sub-level could not be loaded.
The affected sub-level is my tank, which uses Create Tracks+. I added Create Tracks+ after the world was originally created.
The relevant error in latest.log is:
[Server thread/ERROR] [dev.ryanhcode.sable.Sable/]: Failed to load sub-level HalfLoadedSublevel
java.lang.IllegalArgumentException: Plot already exists at 0, 36
Sable then reports that it failed to load the holding sub-level and skips it.
Sub-level UUID: d3972b5e-5fdb-432c-ab25-4e4ddc6e69e9
Position: 1650.894, 84.967, 6556.689
Environment
Minecraft 1.21.1
NeoForge 21.1.251
Sable 2.0.6
Create 6.0.10
Create Aeronautics 1.3.2
Create Tracks+ 1.0.5
Distant Horizons 3.3.3
Chunky 1.4.23
Disabling Chunky resolved a separate crash during world loading, but the Sable warning persisted. The tank and my other moving structures still appear to work normally despite the warning.
Could this be a duplicate plot allocation or a problem with loading saved sub-level data? Could adding Create Tracks+ after world creation be related?
I have kept a backup of the world and have not manually modified or deleted any Sable storage files.
Crash Report
[12okt.2026 21:44:50.129] [Server thread/ERROR] [dev.ryanhcode.sable.Sable/]: Failed to load sub-level HalfLoadedSublevel[uuid=d3972b5e-5fdb-432c-ab25-4e4ddc6e69e9, bounds=dev.ryanhcode.sable.companion.math.BoundingBox3d@4b03b4db, pose=Pose3d{position=(1 650,894 84,967 6 556,689), orientation=(−0,015 0,16 0,03 0,987), rotationPoint=(20 481 034,25 224,671 20 554 760,549), scale=(1 1 1)}, relations=[]], skipping java.lang.IllegalArgumentException: Plot already exists at 0, 36 at TRANSFORMER/sable@2.0.6/dev.ryanhcode.sable.api.sublevel.SubLevelContainer.allocateSubLevel(SubLevelContainer.java:249) ~[sable-neoforge-1.21.1-2.0.6.jar%23251!/:2.0.6] at TRANSFORMER/sable@2.0.6/dev.ryanhcode.sable.sublevel.storage.serialization.SubLevelSerializer.fullyLoad(SubLevelSerializer.java:157) ~[sable-neoforge-1.21.1-2.0.6.jar%23251!/:2.0.6] at TRANSFORMER/sable@2.0.6/dev.ryanhcode.sable.sublevel.storage.holding.SubLevelHoldingChunkMap.loadHoldingSubLevel(SubLevelHoldingChunkMap.java:565) ~[sable-neoforge-1.21.1-2.0.6.jar%23251!/:2.0.6] at TRANSFORMER/sable@2.0.6/dev.ryanhcode.sable.sublevel.storage.holding.SubLevelHoldingChunkMap.processChanges(SubLevelHoldingChunkMap.java:559) ~[sable-neoforge-1.21.1-2.0.6.jar%23251!/:2.0.6] [12okt.2026 21:44:50.133] [Server thread/INFO] [dev.ryanhcode.sable.Sable/]: Failed to load holding sub-level HoldingSubLevel[data=HalfLoadedSublevel[uuid=d3972b5e-5fdb-432c-ab25-4e4ddc6e69e9, bounds=dev.ryanhcode.sable.companion.math.BoundingBox3d@4b03b4db, pose=Pose3d{position=(1 650,894 84,967 6 556,689), orientation=(−0,015 0,16 0,03 0,987), rotationPoint=(20 481 034,25 224,671 20 554 760,549), scale=(1 1 1)}, relations=[]], pointer=global->[chunkPos=[105, 400], storageIndex=0, subLevelIndex=3]] with pointer global->[chunkPos=[105, 400], storageIndex=0, subLevelIndex=3]. This is a problem.
Activity
anenigmabeyondwords commentedon Oct 13, 2026
We hit the same
Plot already existson Sable 2.0.6 (NeoForge 21.1.248, MC 1.21.1, Create Aeronautics 1.3.2) and traced one cause that produces it. (We run one local bytecode patch, the #1627 split fix inSubLevelHeatMapManager; every storage and plot class is stock.)What we see
Recoverable errors when loading plot section ... Unknown registry key ... using default, thenFailed to load sub-level, invalid plot bounds: EMPTYfor those records.IllegalArgumentException: Plot already exists at x, zfollows whenever two of the other claimants load together, and one of them never loads.Cause
fullyLoadcallsremoveSubLevel(subLevel, REMOVED)(sable/common/src/main/java/dev/ryanhcode/sable/sublevel/storage/serialization/SubLevelSerializer.java
Lines 166 to 170 in ad8b4d3
REMOVEDclears the plot's occupancy bit and marks it dirty (sable/common/src/main/java/dev/ryanhcode/sable/api/sublevel/SubLevelContainer.java
Lines 495 to 497 in ad8b4d3
lastSerializationPointeris still null at that point (it is only set afterfullyLoadsucceeds,sable/common/src/main/java/dev/ryanhcode/sable/sublevel/storage/holding/SubLevelHoldingChunkMap.java
Lines 564 to 578 in ad8b4d3
queueDeletiondoes nothing.allocateNewSubLevel(first free plot,sable/common/src/main/java/dev/ryanhcode/sable/api/sublevel/SubLevelContainer.java
Lines 180 to 189 in ad8b4d3
allocateSubLevelonly rejects a plot that has a loaded sub-level in it and never checks occupancy (sable/common/src/main/java/dev/ryanhcode/sable/api/sublevel/SubLevelContainer.java
Lines 247 to 250 in ad8b4d3
Repro
invalid plot bounds: EMPTY.Plot already exists.Possible fix
Unchanged on main as of d501fb3. For the original report: it may be worth checking the log for
invalid plot bounds: EMPTYearlier in the same boot.