-
Notifications
You must be signed in to change notification settings - Fork 1
Configuring CityWorld
Every setting, how to set them, and worked recipes. Source:
CURSEFORGE-CONFIGURATION.md.
CityWorld has around 100 tunable settings — which features generate, spawn/treasure odds, terrain toggles, city radius, decay intensity, even the villager-name and mob lists. Settings are per-world (not a global instance config), delivered as a datapack, so different worlds — and different dimensions on the same server — can each have their own city.
1. Just play — the defaults are tuned already. Pick a world type (cityworld:city, or one of the
style presets like cityworld:apocalypse) and go. Nothing below is required.
2. The Customize screen (single-player, easiest). On the create-world screen, choose CityWorld as the world type and hit Customize. Every setting is there with a widget, grouped the same way as below. Locked settings for your chosen style (e.g. APOCALYPSE forcing decay on) grey out with a tooltip explaining why, so it's always clear what you can and can't change.
3. Hand-edit a datapack (servers, or version-controlled configs). On first run, a full example is written to:
config/cityworld/settings-example/
├── pack.mcmeta
├── data/cityworld/cityworld/world_settings/default.json
└── settings-reference.txt ← everything below, as plain text
Copy that whole folder into <world>/datapacks/, edit default.json, and start (or /reload) the
world. Every field is optional — list only what you want to change; anything you omit keeps its
default. A file of just {} is a stock world.
Tip: the fastest workflow is to shape a world you like in single-player via Customize, then run
/cityexport <name>to bottle its exact settings into a datapack you can hand to a server.
Settings are read when the world loads, and only affect new chunks — existing chunks never regenerate. Spawn odds, names, treasure odds and decay bite as you explore into fresh land; terrain-shaping knobs (seas, mountains, caves, radius) want a brand-new world to be seen properly.
default.json overrides the built-in cityworld:default, which every CityWorld world preset and the
/cityworld dimension reference — so editing it changes that world. To keep several named profiles
instead, rename the file (e.g. ruined.json) and point a dimension's generator at it with
"settings": "cityworld:ruined".
A few common asks, as complete default.json files.
A gentler apocalypse — ruined buildings and roads, but no fire, on a normal green world:
{
"terrain": {
"includeDecayedRoads": true,
"includeDecayedBuildings": true,
"includeDecayedNature": false
},
"decay": {
"buildingIntensity": 0.5,
"roadIntensity": 0.4,
"oddsOfDecayFire": 0.0,
"oddsOfPristineRoad": 0.3
}
}Cities far apart, tiled on a grid (SPARSE-style), in a normal-style world:
{
"radius": {
"minInbetweenChunkDistanceOfCities": 100
}
}Your own villager names, sprinkled in among the built-in hundreds:
{
"naming": {
"append": true,
"villagerGivenNames": ["Sablednah", "Darren"]
}
}A tougher, more hostile sewer system:
{
"mobs": {
"sewers": ["minecraft:zombie", "minecraft:zombie", "minecraft:drowned", "minecraft:cave_spider"]
}
}Skyscraper city — taller buildings than the MODERN default:
{
"world": {
"maxBuildingFloors": 60
}
}Turn off caves' winding tunnels (back to the classic noise-blob caves) on a MODERN world:
{
"terrain": {
"windingCaves": false
}
}Villages — and any other vanilla structure:
CityWorld builds its own cities, so it suppresses vanilla structures unless a tag lets them through.
This is not a setting in default.json; it is a small datapack. Two files, in the world's own
datapack folder:
<world>/datapacks/cityworld-villages/
├── pack.mcmeta
└── data/cityworld/tags/worldgen/structure_set/allowed.json
allowed.json — one set covers all five village variants (plains, desert, savanna, snowy, taiga):
{
"replace": false,
"values": [ "minecraft:villages" ]
}pack.mcmeta — pack_format must match your Minecraft version (15 on 1.20.1; use your version's
data-pack format otherwise):
{ "pack": { "description": "Villages in CityWorld", "pack_format": 15 } }Then /reload, or just start the world with it in place.
"replace": false is the one thing not to get wrong. With true your file replaces CityWorld's
list instead of adding to it, which drops minecraft:strongholds — and no stronghold means no End
portal and nothing for an eye of ender to find.
The other sets you can name the same way: minecraft:pillager_outposts, minecraft:woodland_mansions,
minecraft:mineshafts, minecraft:ocean_monuments, minecraft:desert_pyramids,
minecraft:swamp_huts, minecraft:igloos, minecraft:jungle_temples, minecraft:shipwrecks,
minecraft:ocean_ruins, minecraft:buried_treasures, minecraft:ruined_portals,
minecraft:trail_ruins, minecraft:nether_fossils.
What to expect. An allowed structure is not simply dropped on top of the city. CityWorld reserves ground around it so streets and buildings plan around it, and bends the terrain under each piece so it sits in the land — measured on a fixed seed at 745 of 745 columns resting exactly on the block their piece asks for, none buried, with the ground easing back to natural terrain a chunk past the structure's footprint.
Telling whether it worked: /cwlocate structure minecraft:village_plains (add tp to teleport
there). In a CityWorld world that command only finds what #cityworld:allowed permits, so "not found"
means the tag has not taken — which distinguishes a datapack problem from an unlucky seed. See
caves below for the three
look-alike outcomes and the two silent failures, and remember nothing retro-fits into chunks that
already exist — test in a new world or in land you have never visited.
| Setting | Default | What it does |
|---|---|---|
includeRoads |
true |
Road network. Off = no streets (and no sewers). |
includeRoundabouts |
true |
Roundabouts at some intersections. |
includeSewers |
true |
Sewers beneath the roads. |
includeCisterns |
true |
Water cisterns under some buildings. |
includeBasements |
true |
Building basements. |
includeMines |
true |
Abandoned mine networks underground. |
includeBunkers |
true |
Buried bunkers under midlands/highlands and factories. |
includeBuildings |
true |
Buildings at all. Off = roads/nature only. |
includeHouses |
true |
Houses in neighborhoods (a subset of buildings). |
includeFarms |
true |
Farm districts. |
includeMunicipalities |
true |
Civic district (town halls, libraries, museums, ...). |
includeIndustrialSectors |
true |
Factories, warehouses, storage yards. |
includeAirborneStructures |
true |
Balloons/blimps over the fields. |
includeBuildingInteriors |
true |
Furnish building interiors. Off = empty shells (faster). |
includeSchematics |
false |
Drop the bundled classic building schematics into cities. |
includeNamedRoads |
true |
Street-name signs. |
| Setting | Default | What it does |
|---|---|---|
includeCaves |
true |
Carve caves. |
windingCaves |
false* |
Winding "noodle" cave tunnels that wander and branch (vanilla-like) instead of the classic noise blobs. *On by default for MODERN/APOCALYPSE; a free toggle for any style. Needs includeCaves. Never style-locked. |
includeLavaFields |
true |
Underground lava fields (basalt-lined pools in MODERN/APOCALYPSE). |
includeSeas |
true |
Oceans/lakes. Off = a dry, land-only world. |
includeMountains |
true |
Mountainous terrain. Off = flatter. |
includeOres |
true |
Ore deposits in the strata. |
includeBones |
true |
Fossils/bone deposits. |
includeFires |
true |
Lit campfires/fire pits, and burning demolition debris. |
includeAbovegroundFluids |
true |
Surface water/lava placement. |
includeUndergroundFluids |
true |
Underground water/lava placement. |
includeWorkingLights |
true |
Lit lamps/lights in builds. Off = a darker world. |
includeDecayedRoads |
false |
Break roads up with rubble. |
includeDecayedBuildings |
false |
Chew ruin-holes into buildings — the "apocalypse" switch. |
includeDecayedNature |
false |
Drain the seas + desert the world (whole-world ruin mood). Leave false for ruins on a normal wet, green world. |
oddsOfPristineBuilding |
0.0001 |
When decay is on, the chance a building/schematic is spared and stays intact. A schematic's .yml can override this per-building with PristineChance: <0..1> (Decayable: false = never decays). |
| Setting | Default | What it does |
|---|---|---|
enabled |
false |
Drape buildings/roads in moss, vines, leaf litter, azalea and small reclaim trees, plus dripstone in mines and basements. Works with or without decay. |
intensity |
1.0 |
Density multiplier: 1.0 = default, 2–3 = heavy (more/denser vines and plants). |
capVines |
false |
Finish each outer wall-vine string with a glow lichen tip, so live vine growth can't lengthen it over time. |
| Setting | Default | What it does |
|---|---|---|
buildingIntensity |
1.0 |
How ruined a decayed building is — scales both the number and size of collapse holes. Below 1 = light weathering, above 1 = heavy rubble (much above ~1.3 shreds buildings past recognition). APOCALYPSE uses 0.5, DESTROYED 1.1. |
roadIntensity |
1.0 |
The same, for decayed roads. APOCALYPSE 0.4, DESTROYED 1.1. |
oddsOfDecayFire |
0.20 |
Fraction of collapse rubble that catches fire. Only bites when includeFires and includeDecayedFires are both on. DESTROYED uses 0.07 — even 0.2+ reads as a carpet of flame. |
oddsOfPristineRoad |
0.0 |
Chance a road chunk is spared and stays intact, so a ruined grid keeps walkable stretches. APOCALYPSE uses 0.3. |
Two things here are datapack tags, not settings, because they are lists of ids rather than numbers:
| Tag | What it decides |
|---|---|
#cityworld:allowed (structure sets) |
Which vanilla structures generate. Ships as strongholds, trial chambers and ancient cities. Add another mod's structure set here and it will generate; an absent or empty tag means none, so a stripped datapack falls back to CityWorld-only worldgen rather than letting villages loose. |
#cityworld:cave_pool (biomes) |
Which cave biomes the underground draws from. Ships as deep dark, lush, dripstone, and sulfur caves (Minecraft 26.2+, marked optional so it is simply absent on older versions). Add a modded cave biome here and it will appear. |
Adding another mod's structures — and telling whether it worked.
Put
data/cityworld/tags/worldgen/structure_set/allowed.jsoneither in a world datapack (<world>/datapacks/<name>/, that world only) or in a data-only mod jar inmods/(every world). Keep"replace": false, and write each entry as{ "id": "themod:their_set", "required": false }— one unknown required entry discards the entire tag, which silently removes strongholds and with them the End portal. List the mod's structure sets (worldgen/structure_set/), not its structures.Three different things look alike here, and confusing them costs an afternoon:
What you see What it actually proves /locate structure <id>offers the name in autocompleteOnly that the mod is installed — that list comes from the structure registry, which the mod fills on its own. It looks identical whether or not your tag took. The pack appears in the Mods list (or /datapack list)Your file loaded. Still not that the tag merged. /locate structure <id>returns a positionPlacement works — the tag took. This is the only one that answers the question. Two silent failures worth knowing. A structure whose biomes CityWorld's biome source cannot produce is dropped even when allowed (the game discards any structure set it cannot host), so check the mod's
tags/worldgen/biome/has_structure/against what CityWorld actually generates. And nothing retro-fits into existing chunks — test in a new world, or at least in terrain that has never been generated.
The caves settings group is the numbers those tags cannot express:
| Setting | Default | What it does |
|---|---|---|
structureCarveHalo |
10 |
How far, horizontally, terrain is cleared past the pieces of a structure that expects a cavern around it — an ancient city, in practice. Too small and the city reads as a row of boxes instead of one hall; larger gives a roomier, emptier space. |
structureCarveHaloUp |
6 |
The same, upward — headroom, not a chimney. Nothing is ever carved below a structure, because the game piles material there to hold it up. |
surfaceMargin |
8 |
How far below the ground a cave patch begins, so a patch can't bleed into surface grass and foliage colour on a hillside. |
patches |
[] |
Per-biome patch shaping. Empty means the shipped defaults; listing any entry replaces the lot. |
Each patches entry takes biome (required), plus cell, percent, minY and maxY. cell is the
patch grid size in blocks (bigger = bigger, further-apart patches), percent roughly what share of
cells are that type, and minY/maxY the depth band it applies in.
Order matters. The first entry whose cell matches owns the whole column — one cave type per column,
never stacked — so list the rarest and deepest first. A biome must still be in #cityworld:cave_pool to
appear at all; patches only shapes it. That is also how you give a modded cave biome proper
geometry instead of the generic fallback it gets from the tag alone.
The shipped defaults, if you want to start from them:
"caves": {
"patches": [
{ "biome": "minecraft:deep_dark", "cell": 176, "percent": 4, "minY": -64, "maxY": -24 },
{ "biome": "minecraft:sulfur_caves", "cell": 112, "percent": 5, "minY": -64, "maxY": -8 },
{ "biome": "minecraft:lush_caves", "cell": 80, "percent": 5, "minY": -40, "maxY": 40 },
{ "biome": "minecraft:dripstone_caves", "cell": 96, "percent": 6, "minY": -60, "maxY": 20 }
]
}Careful with
deep_dark'smaxY. It stops at-24because that is where ancient cities generate. Raise it and you advertise the biome above the depth anything can use it — and you start eating the clearance that keeps ancient cities from opening into your sewers and cisterns.
Cave biomes bring their own mobs. The deep dark carries none at all, plus wardens.
| Setting | Default | What it does |
|---|---|---|
enabled |
false |
Villager job-site blocks so a store/farm reads as its trade (cartography table = map seller, fletching table = fletcher, smoker = butcher, ...), a composter at farm edges, and a rare fish-pond farm. The shop classification itself is always computed for /cityinfo; this only governs block placement. |
| Setting | Default | What it does |
|---|---|---|
spawnBeings |
0.5 |
Villagers/witches appearing in populated spots. |
spawnBaddies |
0.0476 |
Hostile mobs at the surface. Raise for a rougher world. |
spawnAnimals |
0.667 |
Farm/wild animals. |
spawnVagrants |
0.2 |
Stray animals/people wandering the streets. |
nameVillagers |
true |
Give villagers generated names (see naming). |
showVillagersNames |
true |
Show those names as floating nametags. |
| Setting | Default | What it does |
|---|---|---|
treasuresInMines / spawnersInMines
|
true |
Loot chests / mob spawners in mines. |
treasuresInBunkers / spawnersInBunkers
|
true |
Loot chests / mob spawners in bunkers. |
treasuresInSewers / spawnersInSewers
|
true |
Loot chests / mob spawners in sewers. |
treasuresInBuildings |
true |
Loot chests in buildings. |
oddsOfTreasureInMines/Bunkers/Sewers/Buildings |
0.5 |
Chance a given spot gets a chest. |
oddsOfAlcoveInMines |
0.5 |
Chance a mine tunnel opens into a side alcove. |
| Setting | Default | What it does |
|---|---|---|
treeStyle |
"NORMAL" |
Tree family: NORMAL, SPOOKY, CRYSTAL. |
spawnTrees |
0.5 |
How densely trees grow. |
subSurfaceStyle |
"LAND" |
What fills space under a FLOATING world's land: NONE, LAND, CLOUD, LAVA. Only the FLOATING style reads this. |
ruralnessLevel |
0.0 |
Skews the world more rural (more nature, fewer cities) — up toward 1.0. |
maxBuildingFloors |
20 |
Tallest a building may rise, in floors (4 blocks each) above street level. 20 = the classic 1.8 look; MODERN ships taller. Sensible range 8–60. Also on the Customize screen. |
broadcastSpecialPlaces |
false |
Announce landmarks in chat as they generate ("Vault 42 generated near 1520, -340"), to the players in the world it happened in. Off by default — chunks generate wherever anyone explores. The same events always go to the debug log regardless. Schematics join in only if their .yml also sets BroadcastLocation: true. |
announcedLandmarks |
the rares | Which landmark kinds may chat-announce (with the toggle above on). Default ["airship","saucer","vault","zoo","biodome","hospital","schematic"]; a server can add castle, oilplatform, radiotower, bunker, museum, mineentrance, campground, shack, balloon, fishpond — or trim the list down. With JourneyMap installed this list also decides which landmarks get a map waypoint, and that happens whether or not chat announces are on. |
| Setting | Default | What it does |
|---|---|---|
wildDecoration |
BOTH |
Who decorates wild (nature) land in MODERN/APOCALYPSE. BOTH runs CityWorld's cover and vanilla's biome features — the default, and the densest. CITYWORLD skips vanilla's, leaving CityWorld's own cover alone. VANILLA skips CityWorld's entirely, so vanilla — and any biome mod you have installed — is the sole decorator; note that also drops CityWorld's cactus and its MODERN blue-ice peaks, which get vanilla's snow instead. City, road and structure land is always CityWorld's alone, whatever this is set to. |
climateWarmth |
0.25 |
Leans the temperature field warm. 0.0 is the raw field; higher values shift the average up without narrowing the range (0 stays 0, 1 stays 1), so you keep frozen peaks and deserts but see more warm ground between them. The default lifts the mean by about 17%, which is there because worlds read persistently cold. |
useModdedBiomes |
true |
Let installed biome mods (Biomes O' Plenty and anything else built on TerraBlender) contribute biomes to the world. On by default, because installing a biome mod is itself the request — set it false to keep CityWorld's own biome selection. Does nothing at all if you have no such mod. Oceans, shores and peaks always stay CityWorld's, since those follow the terrain exactly. |
moddedBiomeShare |
0.35 |
How much contested ground a biome mod may own outright. A modded biome is normally picked only where it beats every vanilla biome in the climate lookup, and many mod biomes overlap CityWorld's climate on every axis yet never quite win — measured with Biomes O' Plenty, 25 of them. On this share of the map the lookup runs with vanilla's biomes removed, so those compete only with each other. The share is regional, not scattered, so a mod gets areas you can walk across. 0.0 means "only where they outright win"; 1.0 hands every contested column to the mod. Needs useModdedBiomes. |
biomeScale |
1.5 |
How large biome regions are, as a multiplier — it divides the frequency of the temperature, humidity, erosion and weirdness fields together, and widens the continentalness smoothing to match. 1.0 is the older, tighter default; 3.0 gives continent-sized regions. Scaling all the axes together changes how big regions are rather than which biome you get. |
Leave these at their defaults for "cities everywhere" — the SPARSE style uses them to confine cities to a region.
| Setting | Default | What it does |
|---|---|---|
centerPointOfChunkRadiusX/Z |
0 |
Centre the radius here. |
constructChunkRadius |
1875000 (no limit) |
Max distance for quarries/gravel constructs. |
roadChunkRadius |
1875000 |
Max distance for the road network. |
cityChunkRadius |
1875000 |
Max distance for cities/buildings/farms. |
buildOutsideRadius |
false |
true = build the ring outside the radius instead of the disc inside it. |
minInbetweenChunkDistanceOfCities |
0 |
>0 tiles cities on a grid this many chunks apart (SPARSE uses 100). |
Each list is empty by default (= keep the built-in hundreds). List your own to replace a list, or
add "append": true to add to it instead:
{
"naming": {
"villagerGivenNames": ["Ada", "Bob", "Cleo"],
"villagerSurnames": ["Vance", "Okafor"]
}
}| List | What it's for |
|---|---|
villagerGivenNames / villagerSurnames
|
Villager names. |
streetTerms |
Cardinal/central words (declaration, N, Main, S, W, Central, E). |
streetPrefixes |
Optional street prefixes (Old, New, Fort, ...). |
streetStarts / streetEnds
|
Invented street name syllables (Elm + wood, Oak + ville, ...). |
streetSuffixes |
Road types (Street, Avenue, Boulevard, ...). |
fossilPrefixes / fossilSuffixes
|
Museum fossil names (Tyranno + saurus, ...). |
professionNames |
Occupational surnames for employed shop/farm workers, as "profession:Surname" (e.g. "fisherman:Angler"). A worker becomes "given name surname for its trade". Profession ids: farmer, fisherman, fletcher, cartographer, mason, armorer, weaponsmith, toolsmith, butcher, leatherworker, cleric, shepherd, librarian. |
Each list is empty by default (= keep the built-in bag). List entity ids to replace a bag, or add
"append": true to add to it. Repetition is weight — listing minecraft:chicken six times and
minecraft:wolf once means "mostly chickens". Unknown ids are logged and skipped, not guessed.
| List | What it's for |
|---|---|
goodies |
Friendly beings in populated spots (villagers, ...). |
baddies |
Surface hostiles. |
animals |
Farm/wild animals. |
seaAnimals |
Fish and sea life. |
vagrants |
Wandering strays in the streets. |
sewers / mine / bunker
|
What lurks in each. |
waterPit / lavaPit
|
What's dropped in water pits/cisterns, and lava pits. |
This page mirrors settings-reference.txt, generated alongside the example datapack on first run —
if the two ever disagree, the file in your config/ folder is the authority for the version you're
running.