Files
livingWorld/README.md
T
George fde7264815 Add water physics, river currents, volcanic system with lava & new land
Groundwater aquifer (valley springs):
- Per-region subsurface water table recharges from rainfall + lateral seepage
  from uphill neighbours; valley floors (≥2 higher neighbours) develop springs
- GROUND_SPRING_EMERGES places a permanent water source block at the lowest
  natural terrain point; vanilla fluid physics carries it downhill from there
- Active springs feed riverFlowIntensity for erosion even without rain

River current physics (real player forces):
- Every 4 ticks, players in flowing water receive a velocity push via
  FluidState.getFlow() — the exact direction Minecraft's own rendering uses
- Force scales with fluid level: level 7 (near source) = strong; level 1 = gentle

Hydraulic erosion:
- HYDRAULIC_EROSION fires whenever flow intensity is significant, rain-independent
- Flowing water adjacent to stone/gravel/sand/dirt progressively softens it:
  stone→gravel→sand→air; river valleys widen over time

Volcano lifecycle (DORMANT→BUILDING→ERUPTING→COOLING→FERTILE→DORMANT):
- High-elevation regions (avg surface Y ≥ 85) registered as potentially volcanic
- LAVA_FLOW places source blocks at summit; vanilla physics flows them downhill
- ASH_DEPOSIT covers surrounding terrain with tuff/gravel; kills surface plants;
  ash clouds spread to adjacent regions with air pollution spike
- COBBLESTONE_FORMS solidifies lava: lava+water→cobblestone, lava+air→basalt
  — creates permanent new terrain that did not exist before the eruption
- FERTILE phase: soil fertility +30, contamination −20, rapid pollution decay
- Volcanic ambience: fire crackling during eruption, deep rumble while building

New commands: /lw events (active climate events), /lw volcanoes (lifecycle states)
New ClimateEventType: VOLCANIC_ERUPTION
New WorldEffectTypes: GROUND_SPRING_EMERGES, HYDRAULIC_EROSION, LAVA_FLOW,
  ASH_DEPOSIT, COBBLESTONE_FORMS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 21:23:13 +01:00

19 KiB
Raw Blame History

Living World

A NeoForge 1.21.1 ecosystem simulation mod that turns every region of your world into a living, breathing environment. Pollution, soil quality, water cycles, vegetation succession, climate events, tidal systems, and river erosion interact in a fully simulated pipeline — all visible as real block changes and player effects in-game.


Overview

The world is divided into regions (configurable chunk-grid cells, default 16×16 chunks). Each region is independently simulated through a 9-stage pipeline every tick cycle. Everything from a single furnace firing to a multi-region wildfire can alter the ecological trajectory of the land you stand on.


Simulation Pipeline

Modules run in this fixed order each cycle so each stage reads fully updated data from the stage before it:

# Module Role
1 Pollution Decays air/ground/water pollution; leaches ground → water
2 Soil Updates fertility, moisture, contamination, compaction, erosion
3 Water Tracks availability, purification, drought/flood risk
4 Vegetation Succession: grass → flowers → shrubs → trees; die-off under stress
5 Resource Depletion Tracks mining, logging, farming pressure
6 Recovery Manages ecological succession stage (BARREN → MATURE_FOREST)
7 Ecosystem Synthesises overall health, stress, resilience
8 World Effects Translates simulation state into visible block changes
9 Atmosphere Per-region weather (rain/thunder/acid rain) driven by health

Feature Status

Core Ecosystem — Complete

  • Pollution system — air, ground, and water pollution tracked independently; natural decay rates; tree canopy scrubs air pollution; ground leaches into water
  • Soil dynamics — fertility, moisture, contamination, compaction, erosion; spring snowmelt and autumn leaf decomposition cycle
  • Water simulation — availability, drought risk, flood risk, purification capacity; runoff flows downhill between regions carrying pollution downstream
  • Vegetation succession — grass → flowers → shrubs → trees; each tier requires the tier below; severe stress kills trees before shrubs before grass
  • Recovery & succession — six ecological stages (BARREN → SPARSE_GRASS → GRASSLAND → SCRUBLAND → YOUNG_WOODLAND → MATURE_FOREST); progress/damage system; biome-derived succession ceiling
  • Resource depletion — logging, mining, farming each drain their respective region metrics
  • Ecosystem health — synthesised score (0100) based on all module outputs; feeds spawn suppression, player effects, ambient sounds

Visible World Effects — Complete

All effects are real block changes players can see:

Effect Trigger What You See
Grass degrades to dirt Pollution > 15, soil < 75 Grass → dirt → coarse dirt
Vegetation spreads Veg pressure > 60, soil > 50 Dirt → grass, flowers, short grass
Vegetation dies Soil < 20 OR pollution > 30 Leaves and upper trunks removed; stumps left
Saplings boosted Stage ≥ YOUNG_WOODLAND Oak/birch/spruce/dark-oak/cherry saplings placed
Wildfire Drought > 70, thunder > 0.5 Fire placed on surface vegetation
Water pools form Rain + barren/sparse terrain Water source blocks in surface depressions
River carve High accumulated water runoff Water channels carved through natural terrain; gradually deepens
Ground spring Saturated aquifer in valley floor Permanent water source placed; river flows downhill naturally
Hydraulic erosion Flowing water adjacent to rock Stone → gravel → sand → air; valley walls slowly widen
Lava flow Volcanic eruption Lava source blocks placed at summit; flows and reshapes terrain
Ash deposit Active eruption or nearby blast Grass → tuff, soil → gravel; surface plants killed over wide area
Cobblestone forms Lava cooling Lava + water → cobblestone; lava in air → basalt; new permanent land
Pollution particles Pollution > 10 Smoke particles in degraded regions

Player Feedback — Complete

  • Compass HUD — hold a compass (or /lw hud) to see the action-bar HUD: [LW] (0,0)↑ Eco:72 Poll:3.2 Soil:61 Wat:58 Rain:42% Seeds:1.8
    • Trend arrow (↑↓→) shows whether the region is recovering or declining
    • Seed rain displayed when active
    • Colour-coded (green/yellow/red) for each metric
  • Pollution effects — nausea > 40, slowness > 60, weakness > 80 pollution; smoke fog particles
  • Mob spawn feedback — passive mobs suppressed in regions below 30 health; hostile mobs suppressed above 60 health
  • Regional weather — per-player rain/thunder packets matching region atmosphere; storm sends lightning visuals
  • Ambient sounds — forest: rustling azalea leaves; barren: shifting sand; heavy pollution: basalt deltas mood
  • Climate event broadcasts — drought, wildfire, flood events announced to all players

Seasons — Complete

32-day year (8 days per season). Seasons affect all simulation layers:

Season Soil Water Vegetation Drought
Spring Fertility +, moisture ++ Availability ++ Grass/flower surge Eases
Summer Moisture — Availability — (evaporation) Mild growth (if moist) Worsens
Autumn Fertility + (decomposition) Senescence, dead litter Neutral
Winter Moisture — (frost) Availability — (freeze) Die-back, shrubs retreat Creeps up

Ecological Corridors & Seed Dispersal — Complete

  • Healthy regions (YOUNG_WOODLAND+) emit seed rain each cycle to adjacent regions
  • Corridor boost: ≥2 healthy neighbours → 3.5× seed effectiveness
  • Pollution in target region blocks germination (proportional)
  • Sufficient accumulated seed rain pioneers the succession cap one stage ahead of physical conditions
  • Seed rain accumulation visible in HUD and /lw atmosphere

Pollution Spreading — Complete

  • Air pollution spreads to adjacent regions each cycle based on wind direction
  • Wind drifts realistically (±0.05 rad per cycle); /lw wind shows direction and spread rate
  • Downwind spread is boosted; upwind transfer is reduced
  • Water runoff also carries ground pollution downstream (15% of runoff × ground pollution)

Climate Events — Complete (multi-region)

Automatically triggered when regional conditions reach critical thresholds. All have visible in-world effects.

Drought

  • Trigger: water availability < 20, drought risk > 65, with 2+ dry neighbours
  • Effect: further drains water availability and raises drought risk across affected regions; spreads to adjacent dry regions every 5 cycles
  • Resolution: epicentre water availability recovers above 45

Wildfire

  • Trigger: YOUNG_WOODLAND+ region, drought risk > 65, no rain, air pollution > 25 (stochastic)
  • Effect: VEGETATION_DIES and WILDFIRE block effects (actual fire!) on affected regions; air pollution spike; spreads to adjacent drought-stressed forest
  • Resolution: rain level > 0.4 in epicentre

Flood

  • Trigger: water availability > 92, rain > 0.72, with a lower-elevation downstream neighbour
  • Effect: WATER_POOL_FORMS in downstream regions; soil contamination from silt
  • Resolution: water availability drops below 70 or rain eases

Desertification Permanence — Complete

  • Regions with sustained heavy damage (damage accumulation > 65, health < 20) have their succession cap lowered by one stage
  • This means a desertified region can no longer recover to forest on its own — player intervention (removing pollution, adding water, bone meal, replanting) is required
  • Players are notified via chat when desertification lowers a cap

Region Trend Tracking — Complete

  • Last 5 health samples per region stored each post-sim cycle
  • Trend arrow (↑↓→) computed from recent vs older average
  • Visible in the compass HUD next to the region coordinates
  • Full trend detail in /lw atmosphere

Groundwater & Springs — Complete

  • Every region tracks a subsurface aquifer level that recharges slowly from rainfall
  • Underground seepage: high-elevation neighbours drain laterally into the aquifer of lower regions (water flows underground even between sim cycles)
  • When the aquifer is saturated in a valley floor (≥2 higher neighbours), a GROUND_SPRING_EMERGES effect fires — a water source block is placed at the lowest natural terrain point
  • The spring flows downhill under Minecraft's own fluid physics, forming a permanent river without further simulation involvement
  • Active springs contribute to river erosion intensity even without rain

River Erosion & Hydraulic Erosion — Complete

  • Accumulated water runoff intensity tracked per region (flow from higher → lower elevation)
  • When flow intensity crosses the threshold (80 units), a RIVER_CARVE world effect fires
  • Block effect: water source placed on natural terrain; at high intensity the block below is removed (deepening channel)
  • Hydraulic erosion fires independently of rainfall whenever significant flow intensity is present: flowing water (level 17) adjacent to soft rock softens it — stone → gravel → sand → air — progressively widening river valleys
  • Rivers form gradually over many sim cycles — permanent terrain changes

River Current Physics — Complete (real player forces)

  • Every 4 ticks, all players standing in flowing water (level 17) receive a directional velocity push
  • Force direction: FluidState.getFlow() — the exact vector Minecraft already computes for its own flow rendering; currents always point the same way the water visually flows
  • Force magnitude: scales with flow level — level 7 (one block from a spring, fastest) pushes hard; level 1 (distant, slow lowland river) barely nudges
  • Mountain rivers are genuinely dangerous to wade against; lowland rivers are gentle enough to cross
  • Boats are naturally carried by vanilla water physics; swimming players and mobs now feel the additional push

Volcanic System — Complete (new land formation)

Four-phase lifecycle per high-elevation region (average surface Y ≥ 85):

Phase What Happens
DORMANT Normal state; rare stochastic chance to awaken (~0.2% per check)
BUILDING Seismic venting — mild pollution spike; player broadcast warns of imminent eruption
ERUPTING LAVA_FLOW places source blocks at the summit; ASH_DEPOSIT covers surrounding terrain; ash clouds spread to adjacent regions; vegetation dies in the eruption zone; air pollution spikes; lasts ~40 sim cycles
COOLING COBBLESTONE_FORMS converts lava adjacent to water → cobblestone; lava in air → basalt; permanent new terrain created where none existed before
FERTILE Volcanic minerals boost soil fertility +30, contamination 20; pollution decays rapidly; succession cap can rise; then returns DORMANT

Visible effects:

  • Lava flows downhill under vanilla physics, permanently reshaping terrain
  • Ash converts grass → tuff, loose soil → gravel; kills surface plants across a wide area
  • New cobblestone and basalt islands form where lava met water
  • Players in active eruption zones hear fire crackle ambience; building-phase rumble in BUILDING regions

Tidal Simulation — Complete (physical blocks)

  • Two tidal cycles per Minecraft day (24 000 ticks) using a sine wave
  • Every 1 200 ticks (~1 real minute):
    • Coastal regions (elevation ≤ sea level + 6) receive water-availability adjustments
    • Physical block changes: on rising tide, water sources are placed on natural shoreline blocks (sand/gravel/stone) at sea level; on falling tide, those sources are removed
  • Result: visible waterline that rises and falls on beaches and ocean shores

Biome-Aware Initialisation — Complete

  • When a player first enters a region, the biome temperature and downfall (wetness) are read
  • Soil fertility, soil moisture, water availability, and drought risk are initialised to biome-appropriate starting values
  • Deserts start arid and nutrient-poor; jungles/swamps start moist and fertile; mountains start cool and dry
  • Biome-derived succession ceiling set simultaneously (desert = SPARSE_GRASS cap; forest = MATURE_FOREST cap)

Config File — Complete

Server-side TOML: world/serverconfig/livingworld-server.toml

Tunable at runtime without recompiling:

[pollution]
  decay_rate = 0.002
  ground_to_water_leach = 0.0005
  spread_rate = 0.02
  wind_boost = 0.5

[vegetation]
  grass_growth_rate = 0.06
  flower_growth_rate = 0.04
  shrub_growth_rate = 0.03
  tree_growth_rate = 0.02
  # ... dieoff rates

[recovery]
  base_progress_per_tick = 2.0
  damage_per_bad_tick = 1.5
  damage_decay_rate = 0.05

[seed_dispersal]
  seed_emission_rate = 0.01
  corridor_boost_multiplier = 3.5
  seed_pollution_block = 0.015

Persistence — Complete

All 8 data-bearing modules use a Properties-based codec system. Region data survives server restart correctly. Global climate tracker (carbon ppm, warming level, biodiversity index) saved separately to living_world/global_climate.dat.

Region Border Visualiser — Complete

/lw region borders — sends cyan dust particles along all 4 edges of the region at surface height. Optional [regionX regionZ] args to visualise a specific region.


Commands

All commands require permission level 2.

Command Description
/lw status Show active regions, enabled modules, simulation tick
/lw region info [x z] Full diagnostics for current or specified region
/lw region borders [rx rz] Visualise region boundary with particles
/lw region force-update Force an immediate simulation cycle on current region
/lw region set <stat> <value> Manually override a region metric (debug)
/lw map [radius] ASCII coloured region map (17 radius, default 3)
/lw atmosphere Region atmosphere: season, rain, storm, succession, trend, seeds
/lw climate Global climate: CO₂ ppm, warming °C, biodiversity, rain penalty
/lw wind Wind direction, angle, spread rate, speed multiplier
/lw hud Toggle persistent HUD without holding compass
/lw speed <1100> Accelerate simulation (100x = very fast testing)
/lw speed reset Return to real-time speed (1x)
/lw simulate <ticks> Force N simulation cycles on all active regions
/lw stats Simulation profiler statistics
/lw modules list List all registered modules and their enabled state
/lw events List all active climate events (drought/wildfire/flood/eruption) with epicentre, severity, affected regions
/lw volcanoes List all tracked volcanic regions and their current lifecycle phase
/lw demo degrade One-command demo: degrade current region to barren
/lw demo recover One-command demo: restore current region to mature forest

/lw map Output Example

[LW] Map 7×7 around (0,0) | [X]=you, ↑N ↓S ←W →E
 F  F  W  W  s  ·  ·
 F  F  W  s  G  G  ·
 F  W [X] G  G  g  ·
 W  G  G  G  g  B  ·
 s  G  g  B  B  ·  ·
 ·  ·  ·  ·  ·  ·  ·
 ·  ·  ·  ·  ·  ·  ·
F=Forest W=Woodland s=Scrub G=Grass g=Sparse B=Barren ·=Unknown

Compass HUD Reference

Hold a compass (or /lw hud) to see the action-bar HUD:

[LW] (0,0)↑ Eco:72 Poll:3.2 Soil:61 Wat:58 Rain:42% Storm:8% Seeds:1.8
Field Meaning
(0,0) Region coordinates
↑↓→ Ecosystem health trend (recovering / declining / stable)
Eco Ecosystem health 0100 (green >60, yellow >30, red ≤30)
Poll Pollution score 0100 (green <15, yellow <40, red ≥40)
Soil Soil quality 0100
Wat Water quality 0100
Rain Regional rain level %
Storm Thunder/storm level % (shown only when >15%)
Seeds Accumulated seed rain (shown only when active)

Succession Stages

Stage Symbol Conditions Required
BARREN B
SPARSE_GRASS g Soil ≥ 10, pollution ≤ 80, veg ≥ 10
GRASSLAND G Soil ≥ 25, pollution ≤ 70, veg ≥ 20
SCRUBLAND s Soil ≥ 40, pollution ≤ 60, veg ≥ 35
YOUNG_WOODLAND W Soil ≥ 50, pollution ≤ 50, veg ≥ 45
MATURE_FOREST F Soil ≥ 60, pollution ≤ 40, veg ≥ 55

Biome caps prevent a desert from reaching MATURE_FOREST naturally. Sustained damage (damage accumulation > 65, health < 20) can lower the cap permanently — desertification. Player intervention is required to restore the potential.


Player Effects from Pollution

Pollution Level Effect
> 40 Nausea (Confusion) + smoke fog particles
> 60 Slowness
> 80 Weakness

Architecture

LivingWorldMod (NeoForge event wiring)
  └─ LivingWorldBootstrap (lifecycle, post-sim hooks)
       ├─ SimulationManager → SimulationScheduler → RegionUpdateJob
       ├─ RegionManager → RegionStorage → FileRegionPersistenceService
       ├─ ModuleRegistry (9 modules, pipeline order)
       ├─ GlobalClimateTracker (CO₂, warming, biodiversity)
       ├─ EcosystemTuning (config-loaded tuning constants)
       └─ Post-sim hooks:
            spreadPollutionAcrossRegions()  [wind-driven]
            applySeasonalEffects()          [soil/water/veg seasonal]
            applyClimateWarmingEffects()    [drought pressure from CO₂]
            applyWaterRunoff()              [elevation-based; river erosion]
            applyGroundwaterAndSprings()    [aquifer recharge; valley springs]
            applyDynamicCapUpdate()         [raise/lower succession ceiling]
            applySeedDispersal()            [corridor-boosted recolonisation]
            recordHealthTrend()             [↑↓→ trend tracking]
            applyClimateEvents()            [drought/wildfire/flood events]
            applyVolcanicActivity()         [volcano lifecycle; lava/ash/new land]

LivingWorldMod platform hooks:
    updateTidalEffects()                    [block-level tidal simulation]
    applyRiverCurrents()                    [player/entity velocity in flowing water]
    initializeRegionFromBiome()             [biome-aware starting values]
    checkPlayerRegions()                    [HUD, effects, ambient sounds]
    scanAndRecordFurnaceActivity()          [pollution from lit furnaces]

Building

./gradlew build

Output: build/libs/living_world-*.jar

Requires NeoForge 21.1.172 / Minecraft 1.21.1.


Planned / In Progress

  • Full worldgen integration (custom biome distribution, terrain shaping beyond post-load modification)
  • Persistence for river flow intensity, groundwater level, and volcanic state across restarts
  • Multiplayer region ownership / notification system
  • More succession stages (wetland, alpine, volcanic basalt plain)
  • Snowmelt rivers: winter snow accumulation releases as meltwater in spring
  • Player damage in active eruption zones (lava proximity heat)