Commit Graph

539 Commits

Author SHA1 Message Date
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
Ludovic Marie 845a122faa Merge pull request #758 from rdbtCVS/perf/portal-section-mask
🤖 Agent: Merged. CI parity passed 88 of 89 harnesses. The one miss, dedicated_server (a known intermittent failure), passes locally on this head. Thanks rdbt!
2026-10-18 11:01:13 +02:00
Ludovic Marie 817a71ffa5 Clients keep the light the server sends; the server sends light updates
A remote client (a LAN guest, or the game on its server thread) threw away
the light in each LevelChunkWithLight and relit the column and its
neighbours itself. It now applies the sky and block layers as
ClientPacketListener.applyLightData does, and relights only block changes,
as vanilla's client does.

The hub now sends ClientboundLightUpdatePacket for the light sections that
changed in a column to the players for whom it is on the tracked border
(ChunkHolder.broadcastChanges), so light from blocks a guest doesn't track
reaches it.

horizon-ctl gains 'light X1 Y1 Z1 X2 Y2 Z2', and lan_e2e a 'light' check
comparing the guest's light with the host's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 09:39:50 +02:00
Ludovic Marie d85a3603bd Merge pull request #761 from rdbtCVS/t3code/9960489f
🤖 Agent: merged rdbt's paletted container access (BlockSection::set 1.12x; identical palette, counts and NBT; CI parity green).
2026-10-18 09:33:45 +02:00
Ludovic Marie 1ccc41c8b2 Content mods: add to other structure sets and pools (horizon:add_to)
A content mod's structure set or template pool file holding
"horizon:add_to" appends its entries to the sets or pools it names
(vanilla's, another mod's) instead of being one of its own, as
lithostitched's add_structure_set_entries and add_template_pool_elements
modifiers do on NeoForge and Fabric. The content root merges them after
every mod's own files, in mod and file order; a name nobody defines is
skipped. Vanilla data never has the key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 08:56:01 +02:00
Ludovic Marie 1d937524a9 Merge pull request #826 from ludovic111/docs/modpacks-structures
🤖 Agent: merged: docs/modpacks.md. Combined check of main + modpacks-5's six: clippy, tests, worldgen structure_density block_properties registry_fluid chunk_stage PASS.
2026-10-18 08:53:03 +02:00
Ludovic Marie 454b3842bb feat(server): secure chat, as vanilla 26.3's server
Chat session updates with their profile key checked against the services'
keys, signed chat and the message chain, last-seen acknowledgements, the
signature cache, signed say/me/msg, enforce-secure-profile, and vanilla's
log lines. Offline servers and players without a chat session chat
unsigned, as on vanilla. tools/test_secure_chat_parity.py compares both
servers with test keys and a mock services server.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 07:52:46 +02:00
Ludovic Marie 05517a167f docs/modpacks.md: structure carry-over now decodes and starts where the mod would; facts.json streams
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 07:40:41 +02:00
Ludovic Marie 6e7b34d5b8 Merge remote-tracking branch 'pr/790' into integ/mp-sh 2026-10-18 06:34:57 +02:00
Ludovic Marie 8a1515b64f Merge remote-tracking branch 'pr/765' into integ/mp-sh 2026-10-18 06:34:07 +02:00
rdbtCVS 4cfa6a507c Document incremental surface optimization measurements 2026-10-18 03:11:34 +01:00
Ludovic Marie 4ac29bf1c1 docs(hosting): players travel between dimensions on their own
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 03:01:56 +02:00
rdbtCVS 68475af653 Startup stage 3d: make the menu interactive before world core loads (#712) 2026-10-18 00:35:17 +01:00
rdbtCVS a5edc14b97 Startup stage 3c: keep world entry responsive while joining resources (#712) 2026-10-18 00:14:50 +01:00
rdbtCVS d9686faf35 Startup stage 3b: publish world core before the simulation tail (#712) 2026-10-17 23:47:53 +01:00
rdbtCVS 5c55e7d855 Paletted container access: skip the storage revalidation a section already did
BlockSection::get and set check the section index and the state id once,
then read and write through new PackedStorage::read/write, which skip the
storage-level bounds and value checks and the Result that get/set keep for
external callers. A section index is below 4,096 and a palette id always
fits the width bits_for_palette chose; both methods debug_assert that
contract. Used for the hot read, the hot write and the growth re-encode.

Benchmark (ignored tests, best of alternating-order rounds, fast profile):
BlockSection::set 13.15 -> 9.12 ns/write (1.44x), get 2.33 -> 1.45 ns/read
(1.61x). See docs/performance/paletted-container-access-results.md.
2026-10-17 23:23:15 +01:00
Ludovic Marie 90053d15aa docs/modpacks.md: memory, NeoForge comparison, worldgen and Chipped status
The NBT tables stream, the fluid tables reuse the game's facts and the content
root is kept between starts (#753, #754, #756). Horizon with ATM10's 40 data-tier
mods against the same mods on NeoForge 21.1.259. Worldgen carry-over and what it
does not cover yet (#763, #764). Chipped's harness row with its self-drop tables
(#762). The overlay cache line said it was cached; it is now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:45:43 +02:00
rdbtCVS 56a251eb13 Paletted container access: one palette probe per write, dispatched unpack
BlockSection::set resolved the old cell through get and then probed the
section palette three times per non-trivial write: keying the old state by
id, testing the incoming state and finding it. The slot at the written index
already is the old state's id, so read it straight from storage and resolve
only the incoming state, with a single map probe. Palette reuse, free slots
and growth are unchanged, so palette, counts, free list and NBT are identical.

PalettedContainer::unpack and unpack_u16 matched the palette variant inside
the per-cell loop; dispatch Single/List/Global once before it.

Measured against copies of the pre-optimization code (ignored tests):
BlockSection::set 12.73 -> 11.37 ns/write (1.12x), unpack list 1.956 ->
1.860 us/call (1.05x), global 2.255 -> 2.172 (1.04x). See
docs/performance/paletted-container-access-results.md.

set_matches_baseline_under_random_edits drives both implementations over the
same 50k-edit streams for 1/2/16/17/24/64 distinct states, with periodic
whole-section collapses, and asserts equal results, bits, palette, counts,
free list and NBT.
2026-10-17 22:38:35 +01:00
rdbtCVS c4cc7954ce Portal scans: keep per-chunk section masks across ticks
The nether-portal section precheck from #661 answered "does this section's
palette hold a portal?" per section, per tick. Keep the answer per resident
chunk in `portal_sections`, keyed by a weak handle: an edit or a chunk
replacement rebuilds it, and it is dropped when a chunk unloads and cleared
when the block facts change, so a portal block always forces the sweep. The
entity sweep now finds portal blocks without the per-tick map.

This is a scan microbenchmark, not a whole-game claim: steady improves 2.4x
to 17x over the fixtures and the run parity-checks the cached and per-tick
answers. Rescanning every chunk every tick (cold, reload, edit_all) is slower
because a miss reads all 24 sections of a chunk; see
docs/portal-scan-benchmark.md.
2026-10-17 22:29:59 +01:00
Ludovic Marie f227d04f79 Merge pull request #715 from ludovic111/fix/vsync-windowed
🤖 Agent: merged by Ludovic's AI agent: verify passed, parity proven (CI or perf-frame-2's local run), before/after numbers and screenshots in the PR body.
2026-10-17 21:42:36 +02:00
Ludovic Marie 4a56e505aa Merge pull request #671 from ludovic111/docs/host-a-server
🤖 Agent: merged by Ludovic's AI agent: hosting guide with the new benchmark numbers; docs only, verify passed.
2026-10-17 20:23:11 +02:00
Ludovic Marie 68b0ad8199 Hosting guide: movement checks are in (#586), benchmark on main 7bbbf6e9
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:13:26 +02:00
Ludovic Marie 09e179804c Merge pull request #680 from ludovic111/perf/mod-content-memory
🤖 Agent: merged by Ludovic's AI agent. Parity 291/291 on the head; combined with main locally: workspace clippy clean, client/world tests pass, mob_ai/save_roundtrip/spawner PASS. ATM10 registry 249 → 125 MB, vanilla 46 → 24 MB.
2026-10-17 19:41:47 +02:00
Ludovic Marie 9403347d13 Merge pull request #732 from ludovic111/docs/website-screenshots
🤖 Agent: merged by Ludovic's AI agent: images, captions and LEGAL.md only; verify passed; screenshots reviewed at full size.
2026-10-17 19:40:35 +02:00
Ludovic Marie c12e1dcd91 Website and README: fresh in-game and menu screenshots from today's Horizon
Six scenes from one fixed-seed world (seed 8675309): a plains village among
savanna hills, sunset over it and the river, moonrise over its lit square, a
crimson forest with a zombified piglin, tropical fish over a warm-ocean coral
reef, and survival at dusk with a zombie and the full HUD. Plus Horizon's own
title, Singleplayer, Video options and pause screens.

Captured with horizon-ctl screenshot from the offscreen client (fullscreen
2560x1286 on the Mac mini, default graphics settings, GUI scale Auto), scenes
cropped to 16:9 and menus to 16:10 (left-aligned) and scaled to the old sizes
(1600x900, 1280x800). The scene sources are JPEGs in docs/media again, the
names scripts/assets.mjs already reads; the README's WebP copies are the
rebuilt website media. Alt texts and LEGAL.md follow the new pictures.

The launcher screenshots are unchanged: the Mac mini's session is locked, so
no window capture works.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 19:38:37 +02:00
Ludovic Marie a6592eb188 Merge main into feat/wide-block-states
lan/chunks.rs: #706's per-section block entity lists carry u32 states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 17:31:24 +02:00
Ludovic Marie 897cd7a1b7 Hosting guide: names you add are accounts (#589, #694), the locator bar is in, HORIZON_ONLINE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 16:57:47 +02:00
Ludovic Marie 900e0af776 Merge commit 'HEAD@{1}' into HEAD 2026-10-17 16:51:55 +02:00
Ludovic Marie eda6e4b510 Merge feat/wide-block-states (with origin/main) into perf/mod-content-memory
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 16:32:46 +02:00
Ludovic Marie 4fffbaa1c7 Merge origin/main into docs/host-a-server 2026-10-17 16:06:56 +02:00
Ludovic Marie f537c84ebb VSync on waits for the display whatever the present mode (#684)
With an explicit Present Mode (Mailbox, Immediate), the VSync option did
nothing: the setting replaced vanilla's choice even with VSync on, so a
window kept running uncapped. Vanilla's VSync means Fifo, in a window and in
fullscreen alike. Now VSync on always presents with Fifo, and the Present
Mode setting chooses only while VSync is off (Auto keeps vanilla's choice:
Immediate, else Mailbox, else Fifo). The choice is one tested function,
window::chosen_present_mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:04:00 +02:00
Ludovic Marie a60519eb63 Merge origin/main into feat/wide-block-states
The LAN chunk encoder's section cache (#623) and dimension range (#668)
are kept; a cached section's wire bytes use the registry's palette width,
set once per process before any encoder exists, so the cache stays keyed
on the section alone. The sculk scan's palette check takes the u32 state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:02:53 +02:00
Ludovic Marie 732e77a7ad Merge pull request #694 from ludovic111/feat/server-usercache-2
usercache.json, and console names resolved through it as vanilla does (stacked on #589)
2026-10-17 14:56:05 +02:00
Ludovic Marie 042f634c7a Hosting guide: link the locator bar PR
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 13:32:45 +02:00
Ludovic Marie 3135e1e3d1 Merge pull request #681 from ludovic111/fix/carry-unreadable
Carry: leave out the files the content loader would refuse
2026-10-17 12:39:21 +02:00
Ludovic Marie ed3ad72588 Merge pull request #653 from ludovic111/feat/port-pack-fetch
horizon-port-pack: a library, fetch and port; CurseForge zips name their mods
2026-10-17 12:39:13 +02:00