Skip to content

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