Commit Graph

2740 Commits

Author SHA1 Message Date
Ludovic Marie a8a00aac94 launcher: Friends over the internet: Tailscale status, invitations and a safe access rule
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:16:53 +02:00
Ludovic Marie 4768d3f65b launcher: a Servers page that creates, runs and manages horizon-server servers (WIP)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:09:09 +02:00
Ludovic Marie 627837e8c3 Launcher: servers hosted through horizon-server (backend and CLI)
horizon_launcher::servers keeps the list of servers and drives horizon-server
for them: create (init, then config set), start, stop, backups, settings, the
service, and the running supervisor's control API for the live status, the log
and console commands. The programs come from an installed, prepared version,
laid out as install.sh does (server-runtime/releases, current, game-files), so
horizon-server update and its rollback work on them unchanged; the game files
are a copy of the player's own prepared files.

Problems come back in plain words with the fix to offer (a busy port with a
free one, missing game files with Prepare, the EULA).

horizon-launcher servers list|create|set-up|run|forget does the same from a
terminal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:48:12 +02:00
Ludovic Marie ddc5aaed0e Merge pull request #1008 from ludovic111/fix/java-pack-fullscreen-inputs
🤖 Agent: merged after verify passed; cloud_render, environment_render, weather_render and 923 client tests pass, with before/after screenshots of Complementary Unbound. Java shader packs get real eye brightness, custom uniforms, Iris's sun path and tilt, and clouds=off/sun/moon flags. Part of #944 (reported by brabus_); shadows and gbuffers still to come.
2026-10-19 13:24:02 +02:00
Ludovic Marie 79f0ddee2c Merge pull request #990 from ludovic111/feat/server-prune-releases
🤖 Agent: merged after the verify rerun passed (the first run's failure was a flake; horizon-server tests pass 39/39 locally) and CI parity passed. Old releases are pruned automatically after an update.
2026-10-19 13:20:54 +02:00
Ludovic Marie adb1476582 Merge pull request #989 from ludovic111/feat/carry-formations
🤖 Agent: merged after verify and CI parity passed (modpacks-10, reviewed with local harness proof in the agent's report). Carries Formations' structures.
2026-10-19 13:20:30 +02:00
Ludovic Marie f910be28c8 Merge pull request #982 from ludovic111/feat/carry-pillar-processors
🤖 Agent: merged after verify and CI parity passed (modpacks-10, reviewed with local harness proof in the agent's report). Carries the mods' pillar and fluid-fix processors in ported packs.
2026-10-19 13:20:14 +02:00
Ludovic Marie 36c4ceb723 Merge pull request #981 from ludovic111/feat/pillar-processors
🤖 Agent: merged after verify and CI parity passed (modpacks-10, reviewed with local harness proof in the agent's report). Structure pillars and fluid fixes placed outside the template, like the mods do.
2026-10-19 13:19:58 +02:00
Ludovic Marie 0231d2890c Merge pull request #1003 from ludovic111/fix/sidebar-legacy-codes
🤖 Agent: merged after verify passed and the HUD harness with new §-coded cases (34/220 on main → all pass). The sidebar applies § formatting codes like vanilla. Fixes #937.
2026-10-19 13:17:46 +02:00
Ludovic Marie 494afc8dc3 Merge pull request #1002 from ludovic111/fix/player-equip-sound
🤖 Agent: merged after verify passed and local proof (menu_click fails on main 7978/8000, passes with the fix; place_recipe passes). The player's armour equip sound and event follow every vanilla path. Fixes #986 (reported by famescare).
2026-10-19 13:17:32 +02:00
Ludovic Marie 0431f12a6f Give Java packs' full-screen passes Iris's sky, eye light and custom uniforms
Complementary Unbound drew clouds and light shafts inside terrain and a
second sun because the full-screen passes got wrong inputs:

- eyeBrightness was a constant (0, 240), so packs saw open sky
  underground. It is now the block and sky light of the camera entity's
  eye block (CommonUniforms.getEyeBrightness), and eyeBrightnessSmooth
  follows it with the pack's eyeBrightnessHalflife (SmoothedFloat).
- Custom uniforms (uniform.* / variable.* in shaders.properties) were all
  0: Complementary's eyeBrightnessM, isEyeInCave, starter, framemod8 and
  the rest. horizon-shaderpack's uniforms.rs parses and evaluates them
  each frame like Iris (stareval priorities, IrisFunctions, SmoothFloat).
- sunPosition, moonPosition, shadowLightPosition, sunAngle and
  shadowAngle now follow CelestialUniforms: the sky's sun and moon angles
  turned by Y -90, the pack's sunPathRotation about Z, then the angle. The
  old sun vector pointed north-south instead of east-west.
- While a Java pack runs, sunPathRotation tilts Horizon's sun, moon and
  stars as Iris tilts vanilla's, and clouds = off | fast | fancy, sun and
  moon = false apply. Complementary and Sildur's set clouds = off; the
  vanilla clouds Horizon drew anyway wrote depth the packs' light shafts
  and fog took for terrain.

Fixes #944

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:14:48 +02:00
Ludovic Marie 572addb2ff Merge pull request #578 from Online5277/fix/classic-menu-default
🤖 Agent: merged, thanks Online5277! Ludovic decided: Classic menus by default for fresh profiles (saved choices and HORIZON_MENU_STYLE still win). We merged current main in; fmt, clippy -D warnings and 1,022 client tests pass, and verify passes. Fixes #548.
2026-10-19 13:09:39 +02:00
Ludovic Marie 7c06feec74 Keep the equip list out of the place_recipe oracle's state line
VanillaPlaceRecipeOracle prints VanillaMenuOracle.state, so the equips
field the menu_click harness compares broke its lines. Only the
menu_click oracle's own lines carry it now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:48:49 +02:00
Ludovic Marie 451318860e Merge remote-tracking branch 'origin/main' into pr578 2026-10-19 12:48:48 +02:00
Ludovic Marie 7426aed33c Play the equip sound when the player puts on armour
LivingEntity.onEquipItem now runs for the player wherever vanilla calls
it: the inventory menu's ArmorSlot and off-hand slot (setByPlayer, in the
menu engine, so clicks, shift-clicks, number keys, drags and LAN guests'
clicks), right-click equipping (Equippable.swapWithEquipmentSlot), the
creative screen (every changed slot, as handleSetCreativeModeSlot sets it),
the swap-hands key, dispensers (now also a shield into the off hand) and
/item and /loot on armour slots. It plays Equippable.equipSound (the
generic armour sound by default) on PLAYERS when the item lands in its own
slot, and emits equip/unequip game events for armour; nothing for
spectators, on a client, or when the item is unchanged.

The menu click harness's oracle now records vanilla's onEquipItem calls.

Fixes #986

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:43:01 +02:00
Ludovic Marie 24abdb664d Apply legacy formatting codes in the scoreboard sidebar
Vanilla's Font draws every literal through StringDecomposer.iterateFormatted:
a § code styles what follows and is not drawn, a lone trailing § is
dropped. The sidebar drew owner names, team affixes, scores and the title
raw, so servers' sidebars showed § and the code letters. They now go
through Text::resolve_legacy, as the tab list already does.

The HUD harness's sidebar cases gain legacy-coded owners, affixes, titles
and fixed score formats.

Fixes #937

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:24:00 +02:00
Ludovic Marie 5c88c46c51 Merge pull request #1001 from ludovic111/fix/guest-projectile-owner
🤖 Agent: merged after verify passed. Remote players' projectiles record their owner: ender pearls teleport and hurt the thrower, mobs target the shooter; docs/server.md row updated; part of #484.
2026-10-19 11:52:38 +02:00
Ludovic Marie f7d2a0b311 Merge pull request #1000 from ludovic111/fix/pvp-friendly-fire
🤖 Agent: merged after verify passed. Teammates with friendly fire off no longer hurt each other on a server (lan_e2e pvp); part of #484.
2026-10-19 11:52:26 +02:00
Ludovic Marie 97993634c0 Merge pull request #999 from ludovic111/fix/guest-use-item-on
🤖 Agent: merged after verify passed. A remote player's item used on a block is used once (a snowball thrown at the ground flew 2× main hand / 3× off hand); part of #484.
2026-10-19 11:50:11 +02:00
Ludovic Marie 75573c292a Merge pull request #998 from ludovic111/fix/dead-guest-commands
🤖 Agent: merged after verify passed. Chat commands from a dead player run, as in vanilla's handleChatCommand (fixes #973); dedicated_server transcript 604/604 lines identical.
2026-10-19 11:49:58 +02:00
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 092bf87012 Server: a guest's projectiles are theirs (ender pearls take them)
A projectile a guest shot was recorded as the local player's (Who::Player), which on a
server means the host, or nobody on a dedicated server. So a guest's ender pearl
teleported the host on a LAN world and did nothing on a dedicated server, what it hit
answered to the host, and clients were told the projectile had no owner.

Projectiles now remember the guest who shot them (Projectile.guest, set when the
guest's turn ends). Clients get the guest as the owner (Projectile.getAddEntityPacket),
and the hit runs as that guest: their pearl teleports and hurts them, and the mob hit
answers to them. ThrownEnderpearl's endermite also needs monsters to spawn, and comes
where the player was.

The dedicated-server harness checks that the snowballs' owner is the player and throws
an ender pearl at the player's feet: vanilla teleports it and takes 5 health, main did
neither.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:11:44 +02:00
Ludovic Marie ca1e3a17c8 Server: a right click with an item on a block uses it once
A vanilla client sends a right click as one packet per hand and part
(Minecraft.startUseItem): UseItemOn for the block's part and ItemStack.useOn, then
UseItem for Item.use when that passed, the main hand first. The server ran the whole
click, both hands, for UseItemOn, then the item again for UseItem: a snowball thrown
at the ground flew twice, three times from the off hand.

Each packet now does its own part with its own hand
(ServerGamePacketListenerImpl.handleUseItemOn / handleUseItem): UseItemOn stops at
useOn (no throwing, drinking, eating, raising, equipping, buckets or an ender eye off a
frame), and neither touches entities (Interact does). Horizon's own client, which
counted on the server trying the off hand, now sends the off hand's packets when the
main hand's use passes, as vanilla's does. UseItem's rotation is the player's now
(absSnapRotationTo) without sending the client a teleport back.

The dedicated-server harness right-clicks the ground with a snowball in the main hand,
then in the off hand, and counts the snowballs against vanilla's (2 and 3 on main,
1 and 1 now).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:11:19 +02:00
Ludovic Marie b0c8f964b2 Server: players on one team without friendly fire don't hurt each other
Player attacks between the host and guests, or two guests, only checked the pvp game
rule. ServerPlayer.canHarmPlayer also asks the victim's team (Player.canHarmPlayer):
an ally on a team with friendlyFire false takes no damage, and the attacker hears the
no-damage sound.

lan_e2e's pvp check puts both players on such a team and checks that neither hurts
the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:34:03 +02:00
Ludovic Marie 4953305c7b Server: run a dead player's chat commands, as vanilla does (#973)
A dead guest's packets were all dropped but the respawn request, so a command typed on
the death screen never ran. ServerGamePacketListenerImpl.handleChatCommand and
handleSignedChatCommand don't look at the player's health: the commands now run.

The dedicated-server harness sends `/trigger nope` from the death screen and compares
the reply with vanilla's before respawning.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:34:02 +02:00
Ludovic Marie ee3e874eb8 horizon-server: delete old releases after an update
An install kept every release it ever unpacked in releases/. Once the game is up on the
new release (or a stopped server is switched), the update now deletes the old ones,
keeping the release in use, the one `previous` names (rollback's target), the one the
running horizon-server came from, and the `updates.keep` newest of the others (1 by
default, a new server.toml setting). A release that can't be deleted is reported and
left for the next update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:50:27 +02:00
Ludovic Marie ee59df13a9 Merge pull request #980 from ludovic111/feat/launcher-dx12-after-renderer-crash
🤖 Agent: merged after verify passed. If the game crashes natively after its Vulkan adapter line and before its first frame, the launcher switches the Graphics API setting from Auto to DX12 and tells the player; it doesn't relaunch by itself.
2026-10-19 09:46:01 +02:00
Ludovic Marie 5229857dab Merge pull request #979 from ludovic111/feat/dx12-fallback
🤖 Agent: merged after verify passed. DirectX 12 for Windows: Auto tries Vulkan first and falls back to DX12 when Vulkan has no adapter or its device request fails; Video Settings > Graphics API (Windows only) and HORIZON_GRAPHICS_API override it. We merged main in (kept #771's LOD row and lodDistance next to graphicsApi); clippy -D warnings and 1,021 client tests pass, including the WGSL→HLSL translation of every shader. Not yet run on real Windows hardware.
2026-10-19 09:45:49 +02:00
Ludovic Marie 272414cc05 Merge remote-tracking branch 'origin/main' into feat/dx12-fallback
# Conflicts:
#	crates/horizon-client/src/graphics.rs
#	crates/horizon-client/src/graphics_ui.rs
2026-10-19 09:31:58 +02:00
Ludovic Marie dbfaf2e003 Merge pull request #976 from ludovic111/fix/wgpu-hal-empty-descriptor-pool
🤖 Agent: merged after verify passed and CI parity passed 322/323; the one failure, dedicated_server (two extra block updates at respawn, a server-only path this GPU change can't reach), passed 2/2 locally on main + this PR and 2/2 on main. Vendors wgpu-hal 30.0.1 with the upstream fix for gfx-rs/wgpu#9845; should fix #746 on HD 520/530, to be confirmed by the reporters on the release.
2026-10-19 09:29:37 +02:00
Ludovic Marie 1612c86c15 Merge pull request #985 from ludovic111/feat/server-bench-paper-fabric
🤖 Agent: merged after verify passed (benchmark data and docs only). Four-way equal-work benchmark: Horizon uses 3.8–4.8× less RAM and starts in ~8 s; Paper's average tick is shorter at every count, which is now perf work.
2026-10-19 08:41:06 +02:00
Ludovic Marie 8beeea55ff Carry Formations' structures
Its formations:simple becomes the game's horizon:formations (its pool and
placement), and its single pool element vanilla's with its ground_level
under horizon:ground_level. Its pieced structure (one) stays out; its
processors are still dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:35:08 +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 fcb37f05e9 Merge pull request #965 from ludovic111/fix/server-relative-dir
🤖 Agent: merged after verify and CI parity passed. horizon-server run --dir <relative> no longer crash-loops the game; new test fails without the fix.
2026-10-19 08:32:51 +02:00
Ludovic Marie d983b47db6 Carry the mods' pillar and fluid fix processors
Repurposed Structures' and Moog's pillar_processor, Repurposed's
bottom_pillar_processor and close_off_fluid_sources_processor, YUNG's
pillar_processor (Better Fortresses, Better Jungle Temples) and Better
Fortresses' stair_pillar_processor become the game's horizon:pillar,
horizon:bottom_pillar, horizon:close_off_fluid_sources,
horizon:yung_pillar and horizon:stair_pillar. A pillar's own processor
list is written in, with the Java processors in it dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:29:09 +02:00
Ludovic Marie ffa46a50af Place pillars and fluid fixes that reach outside the template
Adds the game's side of the mods' Java processors that write blocks around
a structure while its template is processed:

- horizon:pillar and horizon:bottom_pillar: Repurposed Structures' and
  Moog's PillarProcessor and BottomPillarProcessor, a column from a trigger
  block (or the bottom layer) down to the ground, with their nested lists
  and Moog's height randomizer;
- horizon:close_off_fluid_sources: their fluid fix, which walls off source
  blocks next to the structure's open blocks;
- horizon:yung_pillar and horizon:stair_pillar: YUNG's PillarProcessor
  (Better Fortresses, Better Jungle Temples) and Better Fortresses' stair
  supports.

They write through PlacementContext::set_chunk_block, the
ProtoChunk.setBlockState the mods call (heightmaps kept), and only inside
the chunk being generated, as the mods check WorldGenRegion's centre.
Processor lists nested in pillars are capped at 16 levels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:28:42 +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 731b4256db server_bench: turn Paper's connection throttle off (the bots share one address)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:23:27 +02:00
Ludovic Marie 0001363aa0 server_bench: one tested pattern for every server's Done line
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:23:27 +02:00
Ludovic Marie 86cf1542d1 server_bench: Paper and Fabric + Lithium, dev-only downloads checked against their hashes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:23:27 +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 b464f977f1 Merge pull request #796 from rdbtCVS/t3/optimize-noise-aquifers
🤖 Agent: merged, thanks rdbt! Bulk density arithmetic, the shared Beardifier kernel and Perlin column reuse: 12.685 → 10.069 ms/chunk Overworld terrain (−20.6 %, one worker). We merged current main in (density/tests.rs: kept both test sets) and checked it together with #955/#956/#959: fmt, clippy -D warnings, 359 core/world/port-pack tests, and 14 world-gen harnesses (density, noise, structure_density, server_world_gen, world_spawn, decorated_region, …) all pass.
2026-10-19 08:09:26 +02:00
Ludovic Marie c5656493cd Merge pull request #977 from ludovic111/feat/renderer-startup-steps
🤖 Agent: merged after verify passed. The renderer logs each start-up step once per device (driver, requested features and limits, surface, pipelines, first acquire/submit/present), so a native crash's last log line names the step.
2026-10-19 08:02:21 +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