Files
cobblemon-survival-pack/world
claudeandClaude Opus 5.5 398301f0be Cobblemon Survival Pack: phases 0-2 and Phase 3 zones and hazards
Free NeoForge 1.21.1 modpack on Cobblemon 1.8.4 built with packwiz, plus
the Kotlin companion mod (cobblesurvival) and its built-in data pack.

- Phase 0: packwiz pack with Modrinth/CurseForge cross-links, build and
  export tooling, Prism instance sync, test server with smoke checks.
- Phase 1: Poke Ball shaped island (WorldGen Editor preset, seed isle-26),
  Adrian's biome list, no natural ore, structures without ore or vanilla
  mobs, no Nether portals, world template builder and world report.
- Phase 2: permadeath (CobbleHardcoreMon plus the companion mod's gap
  fixes), Revival Charm, expensive Healing Machine, Lootr refreshing
  loot, in-game self-tests on Minecraft's GameTest framework.
- Phase 3 so far: 14 zones with their own spawn pools and level bands
  (tools/zone_layout.py, tools/zone_spawns.py, "zone" spawn condition),
  Cold Sweat heat and cold as gates with boss-drop insulation recipes,
  spawn survey and hazard self-tests in tools/quick_check.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 19:01:21 +01:00
..

World template

The island world is generated, not hand-built. This folder holds the recipe. The world itself is a build output (several hundred MB of region files), so it stays out of git.

File What it sets
world.json Seed, world type, pregeneration radius, border margin, pinned Chunky download
biomes.json The biome list and how every vanilla biome maps onto it, plus extra entries (basalt deltas as a cave biome)
../pack/config/worldgen_editor/presets/cobblesurvival_island.json The island's outline: a Poké Ball (round island, channel across the middle, ring channel around the centre island). Generated by tools/pokeball_preset.py
../datapacks/core/data/cobblesurvival/worldgen/world_preset/island.json The world type cobblesurvival:island: overworld (island shape + remapped biome table) and the End, no Nether. Generated by tools/biome_layout.py from biomes.json; don't edit by hand

Building it

python3 tools/biome_layout.py     # only after changing biomes.json
python3 tools/seed_search.py      # only to pick a new seed (add --apply to write it to world.json)
python3 tools/build.py && python3 tools/make_world.py

seed_search.py previews many seeds without generating chunks (op-only dev command /cobblesurvival biomepreview) and ranks them on biome coverage, patch size, a gentle start area and cave biomes. It writes build/seed-search/candidates.png and report.json.

make_world.py uses the local test server (its eula.txt must already accept the EULA). In one server session it creates the world, pregenerates a circle of pregen_radius with Chunky (the island and a strip of sea; the sea corners inside the square border generate when someone gets there), and puts a square world border border_margin blocks outside the outermost coast. It takes about 6 minutes and writes:

  • build/world-template/: the world, without player data
  • build/island-map.png: top-down biome map with zone outlines, border and spawn
  • build/island-report.json: ore scan, land bounds, border gaps, biome shares

For checking a change without rebuilding the island, tools/quick_check.py samples a fresh world instead (about 1–2 minutes; structures to sample are listed under quick_check in world.json).

python3 tools/prism_instance.py installs the template into the Prism instance as the save Cobblemon Survival Island. tools/smoke_test.py boots the test server on it.

Same seed, preset and mod versions give the same island. After changing any of them, rebuild the template; existing chunks never change on their own.

Editing the island

Change the outline: python3 tools/pokeball_preset.py --radius 1500 --band 160 --button 280 --ring 120 (all in blocks), then search seeds again and rebuild the template. For other shapes, edit the preset JSON by hand (field reference: the WorldGen Editor wiki; the previewer shows outlines before generating). Keep temperature at standard and don't use exclude_biomes: both make WorldGen Editor swap cave biomes for surface fallbacks and let unlisted biomes in. If the ball gets bigger, raise pregen_radius in world.json too.

Change which biomes exist, or what replaces what: edit biomes.json, run tools/biome_layout.py, then search seeds again. Where a biome lands depends on the seed's climate noise, not on the lobes.

Hand edits on the finished world (paths, landmarks, a reshaped coast):

  • WorldPainter (desktop): import build/world-template (File → Import → Existing Minecraft map), edit, and export it back to a folder. Keep a copy first. WorldPainter rewrites chunks and may drop Cobblemon data in those chunks, so edit before anyone plays on the world.
  • In-game, in creative on the Prism save: build normally, or use a world-edit mod for larger changes. Then copy the save back over build/world-template and run python3 tools/world_report.py to re-check ore and border.

Hand edits are lost when the template is regenerated, so keep them few, or export them as structures.

Ore

There is no natural ore. NeoForge's remove_features biome modifier (datapacks/core/.../biome_modifier/no_natural_ores.json) removes vanilla ore features. Cobblemon's evolution-stone ores are added from code, so they are switched off by overriding their placed features with zero placements (tools/cobblemon_ore_overrides.py; re-run it after a Cobblemon update). The large copper/iron ore veins are turned off in the overridden WorldGen Editor noise settings (ore_veins_enabled: false). Structures and fossils that have ore built in (Cobblemon habitats and ruins, vanilla fossils) keep their shape, but tools/clean_structures.py makes their processors turn ore into stone (re-run it after a mod update). Nether fortresses and Nether ruined portals can't appear in the basalt-delta caves (their biome tags leave basalt deltas out). tools/world_report.py scans every block of every chunk for anything ending in _ore, ancient debris and raw ore blocks.

Mobs

Only Pokémon. The companion mod (mod/.../world/OnlyPokemon.kt) never lets a vanilla mob join a world unless it is loaded from a save (exceptions: entity type tag cobblesurvival:allowed_vanilla_mobs, for now the Ender Dragon). That covers mobs that structures place during generation, so all structures stay. When a chunk has just been generated it also removes spawners and trial spawners (block tag cobblesurvival:removed_on_generation), stops sculk shriekers from summoning the Warden, and turns infested blocks back into normal ones. Underneath, vanilla spawn lists are emptied (no_vanilla_spawns.json), infested stone doesn't generate (no_infested_stone.json) and the template has doMobSpawning false. tools/world_report.py fails if the world stores any vanilla mob or mob source.