Regenerating Ore Veins 1.4.0 (CurseForge only, MIT). tools/zone_ores.py writes its config from world/zones.json: surface zones as boxes from the zone grid, cave tiers by cave biome, 21 tiers including Cobblemon's evolution stones (their natural ores are off). The world report now allows ore only in tracked veins inside their tier's zone. Self-tests: a mined vein regrows after its chunk unloads and after a restart (new after_restart pass in selftest.py and quick_check.py). make_world places showcase veins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
"""The zone grid as the companion mod sees it (datapacks/core/data/cobblesurvival/zones/island.json).
|
|
|
|
zone_at() answers like zone/Zones.kt: a cave biome is its cave zone; otherwise the grid cell's zone.
|
|
"""
|
|
import json
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
ISLAND = ROOT / "datapacks/core/data/cobblesurvival/zones/island.json"
|
|
|
|
|
|
class Grid:
|
|
def __init__(self, data):
|
|
self.radius, self.step, self.size = data["radius"], data["step"], data["size"]
|
|
self.ids = [z["id"] for z in data["zones"]]
|
|
self.caves = {c["biome"]: c["id"] for c in data["caves"]}
|
|
self.cells = [value for value, count in data["grid_rle"] for _ in range(count)]
|
|
if len(self.cells) != self.size * self.size:
|
|
raise ValueError(f"zone grid has {len(self.cells)} cells, expected {self.size ** 2}")
|
|
|
|
def zone_at(self, x, z, biome=None):
|
|
if biome in self.caves:
|
|
return self.caves[biome]
|
|
col = (x + self.radius + self.step // 2) // self.step
|
|
row = (z + self.radius + self.step // 2) // self.step
|
|
if not (0 <= col < self.size and 0 <= row < self.size):
|
|
return None
|
|
index = self.cells[row * self.size + col]
|
|
return self.ids[index] if 0 <= index < len(self.ids) else None
|
|
|
|
|
|
def load(path=ISLAND):
|
|
return Grid(json.loads(Path(path).read_text()))
|