Skip to content

Climate Zones

A biome with a biome profile uses its profile. Every vanilla biome has one. Zones are for the other biomes, such as those from biome mods. A climate zone sets the shape of a place’s climate: how far the year swings, how late the warmest day comes, how far day and night differ, and how humid the air is. Townstead takes the yearly mean from the biome and the swing around it from the zone.

Put one file for each zone in data/<namespace>/climate/zone/<id>.json. The file path sets the zone id: data/examplepack/climate/zone/highland.json is the zone examplepack:highland.

{
"schema": "townstead:climate_zone/v1",
"season_kind": "four_seasons",
"seasonal_swing_c": 12.0,
"peak_lag": 0.083,
"diurnal_range_c": 8.0,
"humidity": 0.5,
"mean_offset_c": -2.0
}
FieldDefaultDescription
schematownstead:climate_zone/v1.
season_kind"four_seasons"four_seasons, wet_dry or none. A none zone has no seasonal swing.
seasonal_swing_c0Half the yearly range in °C. A swing of 10 makes summer 10 °C above the mean and winter 10 °C below it.
peak_lag0.083How long after the summer solstice the warmest day comes, as a fraction of the year. 0.083 is about one month.
diurnal_range_c0Half the day and night range in °C on a clear day. The coolest point is just before sunrise. The warmest point is mid-afternoon.
humidity0.5From 0 to 1. Pheno can read it with pheno:climate.
mean_offset_c0Added to the yearly mean of every biome in the zone.
no_season_swing_fractionthe need/temperature.json value (0.65)With no season mod, the share of the swing added above the yearly mean. Use 0 for zones that must stay cold. See Seasons & Calendars.
wet_drydry_offset_c and wet_offset_c, for wet_dry zones. Townstead adds dry_offset_c at the driest point of the year and wet_offset_c at the wettest point, on top of the swing. See Wet and Dry Seasons. When the season mod does not report wet and dry seasons, a wet_dry zone has no seasonal change, like a none zone.
ZoneKindSwingDay/nightHumidityVanilla biomes
townstead:polarfour_seasons±15±40.5snowy plains, ice spikes, snowy beach, frozen river and oceans
townstead:subarcticfour_seasons±17±60.5taiga, snowy taiga, old growth taigas
townstead:continentalfour_seasons±15±70.5windswept hills, windswept forest
townstead:temperatefour_seasons±10±60.6plains, forests, dark forest, meadow
townstead:maritimefour_seasons±5±40.8oceans, beach, river, stony shore, swamp, mushroom fields
townstead:mediterraneanfour_seasons±9±80.4cherry grove, sunflower plains
townstead:aridnone±140.1desert, badlands
townstead:semi_aridwet_dry±5±110.3savannas
townstead:tropical_humidwet_dry±2±50.9jungles, mangrove swamp, warm ocean
townstead:alpinefour_seasons±12±80.4grove, snowy slopes, peaks
townstead:subterraneannone0.9dripstone caves, lush caves, deep dark

The mediterranean zone also has mean_offset_c: 4, so its biomes are warmer than their vanilla temperature suggests.

To change a shipped zone, put a file with the same id in your pack: data/townstead/climate/zone/temperate.json.

Add the biome to the zone’s biome tag. The tag id is the zone id with climate/ before its path:

ZoneTag file
townstead:temperatedata/townstead/tags/worldgen/biome/climate/temperate.json
examplepack:highlanddata/examplepack/tags/worldgen/biome/climate/highland.json
{
"replace": false,
"values": ["examplepack:windy_moor", "examplepack:heather_hills"]
}

Every vanilla biome is in a shipped zone tag. When a biome is in more than one zone tag, Townstead uses the zone that comes first by id.

Many biome mods add biomes that no zone tag lists. Townstead gives them a zone in these steps. Townstead stops at the first match:

  1. Season mod tags. Ecliptic Seasons’ climate tags (such as eclipticseasons:rain/monsoonal) and Serene Seasons’ tropical_biomes tag.
  2. Conventional tags. c: tags on NeoForge and forge: tags on Forge, such as c:is_desert or forge:is_snowy, and vanilla tags such as minecraft:is_jungle.
  3. Name keywords. A word in the biome id, such as mediterranean, tundra or rainforest. A biome mod’s examplemod:mediterranean_coast joins the Mediterranean zone with no tag.
  4. Climate. The biome’s vanilla temperature and downfall. For example, a temperature below 0.15 gives polar.
  5. Fallback. townstead:temperate.

Townstead maps Ecliptic Seasons’ rain tags to these zones. The first match is used:

Ecliptic tagZone
rain/monsoonalsemi_arid
rain/arid, rain/rainless, rain/droughtyarid
rain/rainytropical_humid
rain/softmaritime
rain/seasonal/cold with c:is_icypolar
rain/seasonal/coldsubarctic
rain/seasonal/hotsemi_arid
rain/seasonaltemperate

Nether and End biomes get no zone. Their dimension sets their climate. See Dimensions.

Use /townstead climate biome <biome> to see a biome’s zone and the step that chose it.

Townstead’s steps are in data/townstead/climate/derivation.json. A pack can add its own data/<namespace>/climate/derivation.json. Townstead checks a pack’s rules before its own.

{
"schema": "townstead:climate_derivation/v1",
"rules": [
{ "step": "keyword", "keyword": "moor", "zone": "examplepack:highland" },
{ "step": "conventional", "any_tags": ["c:is_hill"], "zone": "examplepack:highland" },
{ "step": "climate", "max_temperature": 0.3, "min_downfall": 0.6, "zone": "townstead:subarctic" }
]
}
FieldDescription
rulesThe rules, in order. Inside one step, Townstead uses the first rule that matches.
stepprovider, conventional, keyword or climate. Townstead checks all provider rules first, then conventional, then keyword, then climate.
any_tagsThe biome has at least one of these tags.
all_tagsThe biome has all of these tags.
keywordThe biome id’s path contains this word.
min_temperature, max_temperatureBounds on the vanilla biome temperature. The minimum is included and the maximum is not.
min_downfall, max_downfallBounds on the vanilla biome downfall.
zoneThe zone to give. "none" gives no zone.
fallbackThe zone for a biome that no rule matches.
replacetrue removes Townstead’s rules and the rules of packs loaded before yours.

A rule that names a zone that does not exist is skipped.