The NeoForge line¶
Minecraft 1.21 and later require NeoForge. There is no Forge build of the mod for those versions and no way to load one. The switch happens at mod version 8.0. code review
| Mod versions | Loader |
|---|---|
| 1.0.1 through 7.5.1 | Forge |
| 8.2.2 and later | NeoForge |
| code review |
This page covers what a reader on 1.21 or later needs that the rest of the wiki does not say.
What 'unchanged' covers, and what it does not
The comparison below is of the configuration and datapack surface: profile key names, types, defaults, minimums and maximums, and datapack codec keys with their required or optional status. Those are machine-compared and identical. code review
Runtime behaviour on the NeoForge line has now been run on all four versions: 8.2.2 and 8.4.1 on Minecraft 1.21, 9.5.1 on Minecraft 1.21.11, and 10.0.1 on Minecraft 26.1.2. Nothing on this page is inferred from a key set any more. 8.4.1, 9.5.1 and 10.0.1 match the Forge line at the same feature level with the counts identical. 8.2.2 matches 7.4.12 rather than 7.5.1. game test game test game test
The versions¶
| Version code review | Label | Loader requirement | Has hierarchical roads |
|---|---|---|---|
| 8.2.2 | 1.21 | NeoForge [21.0,) |
No |
| 8.4.1 | 1.21 | NeoForge [21.0,) |
Yes |
| 9.5.1 | 1.21.11 | NeoForge [21.11,) |
Yes |
| 10.0.1 | 26.1.2 | NeoForge [26.1.2.0-beta,) |
Yes |
8.4.1 and later match 7.5.1 exactly¶
On 8.4.1, 9.5.1 or 10.0.1 the mod's configuration surface is identical to 7.5.1 on Minecraft 1.20.1. code review
Compared by extracting every key from each jar and diffing the complete sets. The
extraction is docs/examples/mod-keys.json and the comparison runs on every build,
so this claim fails the CI gate if it stops being true. code review
| Surface | Result |
|---|---|
| Profile keys | The same 160 names, with identical types, defaults, minimums and maximums. Zero differences across 7.5.1, 8.4.1, 9.5.1 and 10.0.1 |
| Datapack keys | The same 268 keys, each required or optional in the same way |
| code review |
Read this wiki, then What changed in 7.5, and the picture is complete. The hierarchical road system and its 29 profile keys are declared the same way here. code review game test
The one internal rename¶
In 9.5.1 the class ResourceLocationMatcher became IdentifierMatcher. That is a
Java class name. The JSON keys it carries, if_any and excluding, did not change,
so no file needs editing. code review
8.2.2 is behind 7.4.12, not ahead of it¶
The version number is higher and the feature set is smaller. code review
8.2.2 is missing 23 datapack keys and 19 profile keys that 7.4.12 has, and
adds none. It also still carries libraryChance and dataCenterChance, two profile
keys 7.4.12 had already dropped. code review
Running it settled the shape of that: 8.2.2 is 7.4-era code ported to Minecraft
1.21, not 7.5 code carried across. It resolves a building's refpalette lazily as
7.4.12 does, fails the same two chunks on the same pack, and keeps 7.4.12's single
catch around chunk generation. See
Traps specific to one version. game test code review
Its predefined city folder is spelled differently
8.2.2 reads data/<namespace>/lostcities/predefinedcites/, without the second
i. A folder named predefinedcities, which every 7.x version wants, is never
scanned there, so a pinned city looks like it generated nothing. Renaming that
one folder took the wiki's namespace pack from 0 blocks to 768 gold and 768
diamond. game test code review
overrideFloors does not exist here, and the building gets taller
The same control building generates 512 gold blocks on 7.4.12 and 768 on 8.2.2, because the key that pins its floor count is not declared and is therefore ignored. Nothing is logged. game test
What all four packs did on 8.2.2¶
The wiki's four claim-test packs run there unchanged, apart from the folder rename above. Three of the four differences from 7.4.12 are one missing key each. game test
| Pack game test | 7.4.12 | 8.2.2 | What moved |
|---|---|---|---|
| Namespaces | 4 of 4 | 3 of 4 | Both buildings 768 rather than 512. Failed chunks identical, 41 and 2 |
| Fronts and stuff | 7 of 7 | 6 of 7 | One of four fronts absent, and the building is 1548 rather than 1036. The stuff object is identical |
| Scattered | 3 of 3 | 0 of 3 | Nothing placed anywhere in 49 chunks |
| Predefined sphere | 13 of 13 | 13 of 13 | Every glass count identical, 1093 gray stained in the same chunk. The control building is 1536 rather than 1024 |
The two count changes each trace to one key 8.2.2 does not declare, overrideFloors
and frontchance. Both are ignored rather than rejected, so the pack loads and
quietly does something else. game test
Scattered buildings are a different matter: every key the pack uses is declared on
8.2.2, and it still places nothing. 8.2.2 generates them from
LostCityTerrainFeature rather than the dedicated generator 7.4.12 introduced. See
Scattered Building. game test code review
Predefined spheres are unaffected, and match 7.4.12, 9.5.1 and 10.0.1 exactly. game test
Every building in these packs that pins its floor count with overrideFloors comes
out one floor taller on 8.2.2, and nothing that does not carry the key moves at all. game test
| Pack | Building | 7.4.12 | 8.2.2 game test game test |
|---|---|---|---|
| Namespaces | full |
512 | 768 |
| Fronts and stuff | tf_main |
1036 | 1548 |
| Predefined sphere | sp_tower |
1024 | 1536 |
8.4.1 is where the 7.5 changes arrive¶
All four packs run on 8.4.1 unchanged, with no folder rename, and it behaves as 7.5.1 does rather than as 8.2.2 does. game test
| Pack game test | 8.2.2 | 8.4.1 | 7.4.12 |
|---|---|---|---|
| Namespaces | 3 of 4 | 3 of 4, for the opposite reason | 4 of 4 |
| Fronts and stuff | 6 of 7 | 7 of 7 | 7 of 7 |
| Scattered | 0 of 3 | 3 of 3 | 3 of 3 |
| Predefined sphere | 13 of 13 | 13 of 13 | 13 of 13 |
Both score 3 of 4 on the namespace pack and the reason is reversed. 8.2.2 builds the
building whose refpalette does not resolve and gets its size wrong. 8.4.1 refuses
it, which is what 7.5 changed: full returns to 512, barepalette to 0,
and the chunks failing on that palette go from 2 to 8. Those are 7.5.1's numbers. game test
overrideFloors, frontchance and scattered placement are all back, so the three
things 8.2.2 got wrong are right again. game test
Upgrading 8.2.2 to 8.4.1 in place crashes the server before the world exists
8.2.2 writes selectedProfile = "<CHECK>" into config/lostcities-server.toml.
That value is a sentinel meaning "ask the client", and 8.4.1 no longer recognises
it, so it reads it as a profile name, finds nothing, and throws
NullPointerException: Cannot read field "GENERATE_NETHER" while setting the
world spawn. Every boot dies there. game test code review
Set it to "", or delete the file and let 8.4.1 write its own, which uses "".
A fresh install never hits this. An in-place upgrade always does. game test
One count differs between the Forge and NeoForge lines rather than between feature levels: the building front is 186 to 189 blocks on both 8.2.2 and 8.4.1 against 7.4.12's 124 to 126, from the same pack and the same building. The behaviour being documented, one front per adjacent street chunk and none in the building's own, holds on all of them. game test
A datapack written against this wiki loads on 8.2.2 and does less
23 of the keys this wiki documents do not exist there. They are ignored rather than rejected, so the pack loads, no message appears, and the behaviour those keys asked for never happens. Move to 8.4.1 or later, or check each key against the list below. game test code review
Datapack keys present in 7.4.12 and absent in 8.2.2:
| Asset code review | Keys |
|---|---|
| Building | overrideFloors |
| Part reference | belowpart |
| Condition part | belowpart |
| World style | settings |
| World settings | railpartheight6, railwayavoidance, vinenorth, vinesouth, vineeast, vinewest |
| Park settings | parkchance, parkborder, parkelevation, parkstreetthreshold, avoidfoliage |
| Street settings | frontchance, fountainchance |
| Corridor settings | corridorchance |
| Object selector | feather, minSpawnDistance, maxSpawnDistance |
| Scattered building | rotatable |
| Scattered reference | nearhighway |
Profile keys present in 7.4.12 and absent in 8.2.2: code review
cityLevel4Height, cityLevel5Height, cityLevel6Height, cityLevel7Height,
citySpawnDistance1, citySpawnDistance2, citySpawnMultiplier1,
citySpawnMultiplier2, forceSpawnBuildings, forceSpawnParts, grid32,
multiUseCorner, parkStreetThreshold, railwaySurfaceStationsEnabled,
scatteredChanceMultiplier, spawnCheckAttempts, spawnCheckRadius,
spawnRadiusIncrease, useAvgHeightmap. code review
The loot table directory was renamed¶
Minecraft renamed its registry folder from loot_tables to loot_table, and the
mod follows, so the path depends on the version. code review
| Versions code review | Path inside a datapack |
|---|---|
| Up to and including 8.2.2 | data/<namespace>/loot_tables/chests/<name>.json |
| 8.4.1, 9.5.1, 10.0.1 | data/<namespace>/loot_table/chests/<name>.json |
This affects any loot table you write, including one a building part points at. The wrong folder means Minecraft never registers the table, and the mod then fails to find it by name. code review
The two jars labelled 1.21 do not target the same Minecraft release
8.2.2 and 8.4.1 carry the same 1.21 label and the same NeoForge requirement,
[21.0,). They disagree about this folder: 8.2.2 uses the plural form and 8.4.1
the singular. Minecraft adopted the singular in a later 1.21 release, so 8.4.1
targets that release or newer whatever its label says. Check the CurseForge
listing before assuming either runs on your exact version. code review
The path to the mod's own assets is unaffected and stays
data/<namespace>/lostcities/<type>/<name>.json on every version in the datapack
era. code review
Blocks, not keys, are the real upgrade risk¶
The asset format stopped changing after 7.5.1. Minecraft did not. A palette naming a block that was renamed or removed between Minecraft 1.20.1 and Minecraft 26.1 fails on the newer version even though the file is structurally valid. code review
That failure is not gentle. A block name the game cannot resolve takes the whole
palette down, not the one entry, which is the same mechanism as the @meta
suffix bug. Check palettes against the target Minecraft version before assuming a
datapack carries over. game test