Phase 4: regenerating ore veins, each tier in one zone
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>
This commit is contained in:
1 parent
82f540aa51
commit
5d275e4e14
19 files changed
+10843
-37
No files matched your search
+30
-3
@@ -7,9 +7,11 @@
|
||||
type and gamerules, and pregenerate a circle of `pregen_radius` around
|
||||
0,0 (the island plus a strip of sea; the sea corners inside the square
|
||||
border generate when someone gets there).
|
||||
3. In the same session: save, measure where the land ends
|
||||
(tools/world_report.py) and set a square world border `border_margin`
|
||||
blocks outside the outermost coast.
|
||||
3. In the same session: place the showcase ore veins (world/zones.json →
|
||||
"ores", tiers with "showcase": one vein sticking out of the ground near
|
||||
its zone's sample point, so players see what a regenerating vein looks
|
||||
like), save, measure where the land ends (tools/world_report.py) and set
|
||||
a square world border `border_margin` blocks outside the outermost coast.
|
||||
4. Copy the world to build/world-template without player data, then run
|
||||
the world checks and render the map (build/island-map.png).
|
||||
|
||||
@@ -29,10 +31,34 @@ from pathlib import Path
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
from mcserver import BUILD, ROOT, SERVER, Server, chunky, eula_accepted, prepare, scan_log # noqa: E402
|
||||
import world_report # noqa: E402
|
||||
import zone_grid # noqa: E402
|
||||
from numpy import hypot as np_hypot # noqa: E402
|
||||
|
||||
TEMPLATE = BUILD / "world-template"
|
||||
SKIP = shutil.ignore_patterns("playerdata", "advancements", "stats", "session.lock")
|
||||
# A showcase sits this far from its zone's sample point (where guardians and the self-tests stand), first offset
|
||||
# that is still inside the zone wins.
|
||||
SHOWCASE_OFFSETS = [(16, 0), (0, 16), (-16, 0), (0, -16), (24, 24), (-24, -24)]
|
||||
|
||||
|
||||
def place_showcases(server):
|
||||
"""One hand-placed vein per showcase tier, half sunk into the ground near the zone's sample point."""
|
||||
plan = json.loads((ROOT / "world/zones.json").read_text())
|
||||
grid = zone_grid.load()
|
||||
samples = json.loads(zone_grid.ISLAND.read_text())["samples"]
|
||||
for tier, spec in plan["ores"].items():
|
||||
if not spec.get("showcase"):
|
||||
continue
|
||||
sx, _, sz = samples[spec["zone"]]
|
||||
spot = next(((sx + dx, sz + dz) for dx, dz in SHOWCASE_OFFSETS if grid.zone_at(sx + dx, sz + dz) == spec["zone"]), None)
|
||||
if spot is None:
|
||||
raise RuntimeError(f"no showcase spot inside {spec['zone']} near its sample point {sx},{sz}")
|
||||
x, z = spot
|
||||
server.command(f"forceload add {x} {z}")
|
||||
reply = server.command(f"execute in minecraft:overworld positioned {x} 0 {z} positioned over world_surface "
|
||||
f"positioned ~ ~-1 ~ run regenerating_ore_veins place {tier}").strip()
|
||||
server.command(f"forceload remove {x} {z}")
|
||||
print(f" showcase {tier} at {x},{z}: {reply[:100]}")
|
||||
|
||||
|
||||
def border_for(world, recipe):
|
||||
@@ -75,6 +101,7 @@ def main():
|
||||
print(f" {server.command(f'gamerule {rule} {str(value).lower()}').strip()}")
|
||||
seconds = server.pregenerate(0, 0, recipe["pregen_radius"], shape="circle")
|
||||
print(f"pregeneration finished in {seconds:.0f}s")
|
||||
place_showcases(server)
|
||||
server.command("save-all flush")
|
||||
cx, cz, size = border_for(world, recipe)
|
||||
print(f" {server.command(f'worldborder center {cx} {cz}').strip()}")
|
||||
|
||||
Reference in new issue
Block a user