Commit Graph

584 Commits

Author SHA1 Message Date
Ludovic Marie a480d10157 docs/server.md: what remote players get right on a dedicated server now (#484)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:12:42 +02:00
Ludovic Marie 6af77dfbe4 Merge remote-tracking branch 'origin/main' into feat/server-bench-paper-fabric
# Conflicts:
#	docs/server.md
2026-10-19 08:33:52 +02:00
Ludovic Marie 56fcc91e4b Merge pull request #967 from ludovic111/feat/site-host-a-server
🤖 Agent: merged after verify passed. The site's nav links Host a server; README gains a hosting paragraph; tools/server.py and docs/server-quickstart.txt retired.
2026-10-19 08:33:15 +02:00
Ludovic Marie aac0dc7f60 Merge pull request #966 from ludovic111/feat/server-update
🤖 Agent: merged after verify and CI parity passed. horizon-server update (SHA-256 check, world backup, switch, health wait, automatic rollback) and rollback; 6-hourly update notice in log, status and panel. Proven end to end on the Mac mini and the ThinkPad (healthy update, crash rollback, timeout rollback, manual rollback, real GitHub download); 37 unit tests.
2026-10-19 08:33:03 +02:00
Ludovic Marie aec5c20698 hosting.md: rewrap the tick bullet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:25:15 +02:00
Ludovic Marie a64877f1a1 Server benchmark: Horizon against vanilla, Paper and Fabric + Lithium, equal work (2026-10-19)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:25:07 +02:00
Ludovic Marie 0af3dd3900 Merge pull request #959 from ludovic111/feat/carry-yung-modifiers
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:10:05 +02:00
Ludovic Marie 0def8931cb Merge pull request #956 from ludovic111/feat/carry-terrain-adaptation
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:09:53 +02:00
Ludovic Marie 39b74fb468 Merge pull request #955 from ludovic111/feat/enhanced-terrain-adaptation
🤖 Agent: merged after verify and CI parity passed, and a combined check with rdbt's #796 on current main (fmt, clippy, 359 tests, 14 world-gen harnesses). YUNG/Moog terrain adaptation around structures (Better Fortresses netherrack inside bridges 39–41 % → 2.5–7 %), its carry, and YUNG modifiers.
2026-10-19 08:09:41 +02:00
Ludovic Marie 99b07dc810 Merge remote-tracking branch 'origin/main' into pr/796
# Conflicts:
#	crates/horizon-core/src/density/tests.rs
2026-10-19 07:58:32 +02:00
Ludovic Marie d2e8e5fe28 Merge pull request #771 from Online5277/feat/terrain-lod
🤖 Agent: merged, thanks Online5277! Terrain LOD lands off by default. With LODs off it matches main (0 differing pixels in 6 RD16 views, same FPS/GPU ms on the HD 620, same time to full render distance); CI verify and parity pass. We merged main in three times and adapted it to #905/#939 and the packed texture coordinates. The follow-ups from the review (edge band, integrated-GPU cost, lighter far meshes) we're taking on ourselves.
2026-10-19 07:49:12 +02:00
Ludovic Marie 0bc6c689da Site: link the host-a-server page from the nav and the README; retire the Fabric server starter
tools/server.py and docs/server-quickstart.txt are gone (horizon-server replaces them);
build_release.py builds only the client starter, and the docs point to docs/hosting.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 05:34:34 +02:00
Ludovic Marie bf2c5e7946 horizon-server update: wait for the old game after a rollback; document updates
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 05:30:21 +02:00
Ludovic Marie 4b28390f72 docs/modpacks.md: Lithostitched's processors carried, and what they change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 04:42:29 +02:00
Ludovic Marie a19a6b5bcc docs/modpacks.md: YUNG's modifiers and dead-end pools, Towns and Towers' namespaces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 04:06:59 +02:00
Ludovic Marie 9a836c50a8 Docs: carried terrain kernels and what they change in seed 1234
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 04:06:59 +02:00
Ludovic Marie a906bb50ba Structures: YUNG's and Moog's enhanced terrain adaptation, as terrain kernels
YUNG's API and MoogsStructureLib add their own kernel to the Beardifier:
a size and falloff of its own, carving or burying above and below a piece's
floor, around rigid pieces and junctions. Better Strongholds buries its
stronghold, Better Fortresses carves the netherrack over its bridges and
Moog's mega fortress carves a band around its corridors. A structure or a
pool element holding `horizon:enhanced_terrain_adaptation` now gets that
kernel (horizon_core's TerrainKernel), summed after vanilla's density as
the libraries' mixins do; YUNG's also grows the start's box by its radius.
Vanilla data never has the key, so vanilla worlds are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 04:06:59 +02:00
Ludovic Marie c74948d24c Uploads: main's path again when no upload budget is set
The soft 4 ms yield per frame (also with Unlimited budgets) made a saved
RD32 world reach full render distance about 1 s later on the Mac mini
(streaming time after launch, 4 alternating pairs: main 1.9 s mean, yield
2.8 s; t100 from a first batch of 3 pairs: 6.1 s vs 7.1 s) without better
loading frame times (max 133-210 ms vs 31-150 ms). Without a budget every
finished mesh uploads at once again, as on main. The budgeted path keeps
this branch's fixes: only loaded chunks' sections wait, and sizes count the
24-byte terrain vertex.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 01:45:38 +02:00
Ludovic Marie a3f38b76aa Merge origin/main into feat/terrain-lod
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 01:19:15 +02:00
Ludovic Marie bc549713bb Merge feat/yung-chest-cap (with main) into feat/lithostitched-block-swap
processors.rs tests: keep both sides' tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 00:57:59 +02:00
Ludovic Marie 63044f339c Merge feat/yung-placeholder-blocks (with main) into feat/yung-chest-cap
processors.rs tests: keep both sides' tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 00:57:52 +02:00
Ludovic Marie c3595f1a9c Merge feat/carry-trial-spawners-vaults (with main) into feat/yung-placeholder-blocks
processors.rs tests: keep #929's desert temple test and #920's rule-test test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 00:57:45 +02:00
Ludovic Marie 03c423daac Merge origin/main into feat/carry-trial-spawners-vaults
processors.rs tests: keep both #926's trial spawner and vault tests and
#920's Repurposed rule-test test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 00:57:14 +02:00
Ludovic Marie 3d0b76400b Merge origin/main into feat/terrain-lod
Keeps #905's single command buffer and #939's occlusion culling: distant
tiles draw in phase 1, so phase 2 stays exactly the deferred sections the
culling test reads back, and the flat path's origins include the tiles in
main's relocated upload block.

Adapts to main's APIs: block sprites and models now live in RenderAssets
(WorkerContext::render), BlockFacts behind Resources::facts(), and
terrain vertices hold the UV as 16-bit fixed point (#df58a474). Merged
distant faces repeat their sprite once per block, which the [0, 2) section
UVs cannot hold, so tile vertices now store UVs from the face's corner in
1/32-block steps (TerrainVertex::tiled, faces split at 1024 blocks) and the
instance's origin.w carries the UV step: 1/32768 for sections (decodes
exactly as before), 1/32 for tiles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 00:52:42 +02:00
Ludovic Marie 5f0fea0bd6 Merge pull request #920 from ludovic111/feat/carry-rule-tests
🤖 Agent: reviewed; verify passes. Parity: all 269 game-side harnesses on modpacks-8's integration commit (main 573f3a64 + the six game-side PRs), vanilla structure-start oracle 35/35. Merged in order #919 → #920 → #922 → #923 → #924, then the stack #926 → #929 → #930 → #932.
2026-10-19 00:51:52 +02:00
Ludovic Marie 25f2e2396d Merge pull request #916 from ludovic111/feat/server-headless-build
🤖 Agent: reviewed; verify passes. Release dry run on this branch (run 39167763008): linux, macos, windows builds and publish all succeed; horizon-server-linux-x86_64.tar.gz (28 MB) built and import-checked (no libasound/libudev). Agent's proof: 880/879 client tests in both builds, dedicated_server/server_entities/lan on the server build, install → init → start → bot join on the ThinkPad without the libraries.
2026-10-18 23:42:28 +02:00
Ludovic Marie 204a887ca2 Merge pull request #936 from ludovic111/feat/server-bench-equal-work
🤖 Agent: reviewed; verify passes. Equal-work server benchmark: fixed exploring speed, 300 s warm-up, chunk-work comparison per run. Horizon 1.8/4.7/11.7/23.8 ms per tick at 1/10/25/50 bots vs vanilla 11.3/34.3/50.5/stopped by its watchdog; single runs on the ThinkPad, caveats in the README.
2026-10-18 23:27:56 +02:00
Ludovic Marie 32a37e8937 Benchmark: Horizon's server against vanilla 26.3 with mixed bots, equal work
Explore bots paced at 0.8 blocks a second and a 300-second warm-up, so both servers serve the same
paths; the work table shows it. Horizon ran as horizon-engine (the server build, from its archive).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 23:22:07 +02:00
Ludovic Marie a9ad185287 Lithostitched's block swaps, with the properties both blocks have
ChoiceTheorem's Overhauled Village swaps blocks in its templates through
Lithostitched's block_swap processor (137 lists): a map of block to
block, the new one taking Block.withPropertiesOf the old state, and the
block left alone when the new one is not registered. Carry dropped it.

- Game: horizon:block_swap, the same map; the new block's default state
  with each property of the old one it has too (by name, when the value
  is one of its own).
- Carry: lithostitched:block_swap becomes it.

ATM10: processors carried 136 -> 273 of 1,427 (dropped 1,291 -> 1,154).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 22:45:28 +02:00
Ludovic Marie 50215b484a Better Dungeons' small dungeons: one or two chests, as the mod caps them
Better Dungeons' small dungeon templates hold several chests; its Java
chest processor keeps the first, then each other one on nextFloat <= 0.2
until two have stayed, and turns the rest into cave air. Carry dropped it,
so every chest stayed.

- Game: horizon:count_cap. Of `blocks`, the first `min` a placement meets
  stay, then each stays on settings.getRandom(pos).nextFloat() <= chance
  until `max` have; the others become `replacement`. Counted per
  placement (PlaceSettings, reset in process_infos), like the mod's
  DungeonContext, set up per StructureTemplate.placeInWorld.
- Carry: betterdungeons:small_dungeon_chest_processor becomes it with the
  mod's config defaults (1, 2, 0.2; chest and trapped chest).

Seed 1234, five small dungeons decorated: 12 chests -> 6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 22:39:03 +02:00
Ludovic Marie c7985974e7 Better Desert Temples' placeholder blocks: suspicious sand, sherds, swaps
Better Desert Temples builds its temples with placeholder blocks (orange,
red and white glass, blue and yellow concrete, red wool, polished diorite,
blank pots) that its Java processors turn into suspicious sand, sand and
sandstone, upside-down stairs, cobwebs, terracotta, TNT and pots with
sherds. Carry dropped them, so the placeholders stayed in the world.

- Game: a horizon:pick processor. A block of `block` takes the first
  pick whose `below` is past one settings.getRandom(pos).nextFloat(),
  else `default`; an outcome is a state or one of several by nextInt
  (Util.getRandom), a new block entity or the block's own, and NBT lists
  of picked strings (one float each).
- Carry: the fixed swaps become vanilla's rule; the random ones
  horizon:pick with the mod's bounds (BlockStateRandomizer's sums as
  floats). The processors that read or change the world around (pillars,
  Diorite's waterlogging) stay dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 22:23:18 +02:00
Ludovic Marie 96822cd5f8 Moog's trial spawners and vaults: the saved state out, the configs in
Moog's trial spawner and vault randomizing processors keep the block and
change its block entity. The templates were saved with state that breaks
them in a new world: a vault's server_data holds
state_updating_resumes_at far in the future (it never opens) and a
spawner's spawn_data an empty entity (it spawns nothing of its own).

- Game: a horizon:edit block entity modifier takes `remove`'s keys out,
  then merges `data` in. append_static now merges as CompoundTag.merge
  does (compounds in both are merged), not a shallow replace.
- Carry: each processor becomes vanilla's rule processor, one rule per
  block state (12 trial spawner, 32 vault), with horizon:edit: the
  spawner's normal and ominous configs by id, the vault's loot table and
  key (the ominous ones on ominous vaults). trial_spawner/ files get their
  mobs' 1.21.1 ArmorItems/HandItems as 26.3's equipment.

ATM10: 6 more processors carried (125 of 1,427).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 22:12:37 +02:00
Ludovic Marie 4b18b79d15 vanilla_client.py on macOS: the real vanilla 26.3 client joins Horizon's server
The tool picks this machine's natives (macOS arm64 or Linux), adds -XstartOnFirstThread on macOS
and turns vsync off there: with it on, an unseen window (a locked session) blocks in
SDL_GL_SwapWindow before the client joins. docs/server.md records the join.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 21:46:09 +02:00
Ludovic Marie 5fcea03fb8 Carry: Repurposed's rule tests as the game's, and the chain as the iron chain
Two things kept Repurposed Structures' mineshaft processor lists from
loading in 26.3, and with them the mod's 5 Nether mineshaft pools:

- Its three rule tests written in Java. Carry renames them to the game's
  horizon:matter_phase, horizon:piece_origin_axis_aligned_linear_pos and
  horizon:y_value (213 in 75 lists), counted in the report's
  rule_tests_carried.
- 1.21.1's minecraft:chain, which 26.3 calls minecraft:iron_chain (its
  datafixers rename it in worlds). Carry renames it in recipes, loot
  tables and worldgen files: 112 files in 5 of ATM10's mods.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 20:49:23 +02:00
Ludovic Marie 519ec1217c Server build: the game without sound or controllers, so Linux servers need neither ALSA nor udev
horizon-client's cpal output and its controllers (gilrs, the DualSense's HID output) move behind the
audio and controllers features, on by default, so the game is unchanged. Built with
--no-default-features it links neither libasound.so.2 nor libudev.so.1. release.yml packages that
build as horizon-engine in horizon-server-linux-x86_64.tar.gz (xtask package-server, checked by
check_imports.py --server); install.sh installs it on Linux (and --archive installs a local one);
horizon-server already prefers horizon-engine. The Dockerfile uses it too, and CI lints it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 20:17:21 +02:00
Ludovic Marie 51c49e11f4 Merge pull request #911 from ludovic111/feat/carry-repurposed-jigsaw-types
🤖 Agent: reviewed; verify passes. Parity: 298/298 harnesses on the integration commit 234bd101 (main + #907/#908/#910); vanilla structure-start oracle 35/35 with all five modpacks-7 changes. Merged in the required order #907 → #908 → #909 → #910 → #911.
2026-10-18 20:08:30 +02:00
Ludovic Marie 36775db223 Merge pull request #909 from ludovic111/feat/carry-spawner-processors
🤖 Agent: reviewed; verify passes. Parity: 298/298 harnesses on the integration commit 234bd101 (main + #907/#908/#910); vanilla structure-start oracle 35/35 with all five modpacks-7 changes. Merged in the required order #907 → #908 → #909 → #910 → #911.
2026-10-18 20:07:39 +02:00
Ludovic Marie 2a9d67bd68 Merge pull request #902 from ludovic111/docs/server-benchmark-mixed
🤖 Agent: reviewed; verify passes.
2026-10-18 19:52:37 +02:00
Ludovic Marie e046036869 Merge pull request #898 from ludovic111/fix/server-linux-libraries
🤖 Agent: reviewed; verify passes (client --help exits 0 without loading the game, so the start check only catches a program the system can't load). Linux installs now name the missing ALSA/udev libraries; services run through the installer's current link.
2026-10-18 19:52:31 +02:00
Ludovic Marie 40972de77a Benchmark: Horizon's server against vanilla 26.3 with mixed bots, as installed
The first published benchmark for the working version (docs/server.md
section 10, item 4). It ran the v2026.10.18.15 release, as install.sh
installs it, against vanilla 26.3 with 1, 10, 25 and 50 mixed bots. The
servers ran on the ThinkPad (quiet, under nice 19) and the bots on the
Mac mini over the tailnet. Vanilla's default game rules applied on both;
Horizon's server runs the locator bar now.

Both servers kept 20 TPS throughout. Horizon used 3.7 to 5.2 times less
memory. Its average tick was shorter with 1, 10 and 25 bots and 18 %
longer with 50, while it generated about twice the new terrain a second
(the exploring bots fly as fast as each server sends chunks). Its P99
was lower at every count.

benchmarks/server-mixed-2026-10-18/ holds the README, the report and the
machine's load; docs/server.md links it from sections 9 and 10.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:26:26 +02:00
Ludovic Marie 4ea2243e4d horizon-server on Linux: say which libraries the game needs, and follow updates
On a Linux without ALSA's library (most minimal server images), the
game exits at once with the loader's "error while loading shared
libraries: libasound.so.2". The supervisor took that for a crash and
restarted it five times over two and a half minutes before giving up
with "see logs/latest.log", which holds nothing about it.

Now:
- `run` starts the game with --help first (it loads no game files) and,
  if the system can't load it, stops at once with the loader's line and
  the packages to install on Debian/Ubuntu, Fedora, Arch and NixOS;
- `init` prints the same as a warning after "Game:";
- install.sh lists the libraries `ldd` can't find, with the same advice;
- docs/server.md says so in the install section.

Also, a service installed without the installer's launcher on the PATH
ran `<dir>/releases/<tag>/horizon-server`: Linux reports the running
program with links resolved, so the unit pinned that release and an
update never reached it. The fallback now goes through `<dir>/current`
while it points at that release.

Found by the end-to-end install check on the ThinkPad (NixOS, no
nix-ld libraries) with v2026.10.18.15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:16:14 +02:00
rdbtCVS c296578a17 Remove startup verification screenshots 2026-10-18 15:38:01 +01:00
Ludovic Marie 7b5a57be7c Carry: Repurposed's Nether city, Nether shipwreck and End stronghold
They are Repurposed's generic jigsaw with a start check of their own:
carried as minecraft:jigsaw with the piece-limited layout and the
check named in horizon:start_checks.repurposed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:37:24 +02:00
Ludovic Marie db13bd7df5 Carry: the structure mods' spawner processors, as data the game runs
Carry used to take every processor written in Java out of its list (#822),
so spawners kept what the template has: an empty spawner in Moog's
templates, a placeholder pig in Better Dungeons'. The new processors module
rewrites the ones with a data form before that:

- Moog's Structure Lib's and Repurposed Structures' spawner randomizing
  processors become horizon:spawner_mobs, with Repurposed's rs_spawners list
  written in (weight-0 entries left out, as its loader does);
- YUNG's Better Dungeons and Better Desert Temples spawner processors (a
  spawner or a placeholder block becomes a spawner of a fixed mob) become
  vanilla's rule processor with an append_static block entity, the entity in
  26.3's shape (equipment, drop_chances);
- Moog's vanilla loot swap is a no-op while its "replace vanilla" preset is
  off, as they ship, and is taken out.

Each is counted in carry-report.json's processors_carried. The game's own
horizon: types stay in the lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:36:52 +02:00
rdbtCVS 70c4b205ba Merge main and adapt progressive startup to current client APIs 2026-10-18 15:28:40 +01:00
rdbtCVS 409a014ff0 Report the progressive title RSS comparison and its limits 2026-10-18 15:20:09 +01:00
rdbtCVS 55cd4e90f4 Record startup phase, early-entry and memory verification 2026-10-18 15:20:09 +01:00
Ludovic Marie 831cd657de Merge remote-tracking branch 'origin/docs/modpacks-structure-libraries' into integ/mp6 2026-10-18 13:23:07 +02:00
Ludovic Marie 2efa0d65b5 Merge remote-tracking branch 'origin/feat/mod-structure-set-additions' into integ/mp6 2026-10-18 13:23:05 +02:00
Ludovic Marie 1b6a3cf535 Docs: modpacks, the structure libraries Horizon now runs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 11:41:27 +02:00