98 Commits
Author SHA1 Message Date
Ludovic Marie f4858e8a25 Merge pull request #11186 from flexeykinDev/install-ps1-signature
🤖 Agent: install.ps1 now verifies the release signature with the release-keys.txt key, the same check install.sh already does.
2026-11-07 10:12:13 +01:00
Ludovic Marie 00f6358e7a Merge pull request #11081 from horizon-rust/platforms/docs-intel-arm64
🤖 Agent: one line in docs/hosting.md (Intel Macs have had server builds since the 10-31 Nightly; install.sh already maps Darwin-x86_64); the README half is already on main via bf4657da26.
2026-11-07 02:10:26 +01:00
rdbtCVSandClaude Opus 5.5 c25f5a1f49 Merge origin/main into PR #11081
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 20:05:45 +00:00
flexeykinDevandClaude Opus 5.5 4ac75c281a install.ps1: verify the release signature when OpenSSL 3 is found
The first install on Windows now checks SHA256SUMS.sig (a Nightly's
SHA256SUMS.v2.sig, for the version its title names) against the release
key, then the archive against SHA256SUMS, as install.sh does. OpenSSL is
looked for on the PATH and in Git for Windows. Without OpenSSL 3 it says
so and keeps the GitHub SHA-256 check.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 15:53:25 +01:00
Horizon agentandClaude Opus 5.5 594552fec4 Hosting: an AMP template for horizon-server, beside the Pterodactyl egg
packaging/server/amp/ holds a template for CubeCoders AMP's generic module.
Its update stage runs the egg's own install script (the release asset checked
against its SHA-256), the start runs the same horizon-start.sh, and its
settings are the egg's variables with the same defaults. Tests keep both in
step and check the console patterns against the lines the server logs.

Fixes #8238

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 13:13:17 +01:00
Horizon agentandClaude Opus 5.5 33c431e3ae Docs: Intel Macs and Windows ARM64 have builds now
The README and the hosting guide still said Intel Macs come "from the next
Nightly" and listed no Windows ARM64 launcher; both ship in every Nightly and
launcher release.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 13:02:53 +01:00
Detimes 03ded99473 Merge remote-tracking branch 'upstream/main' into feat-10404-older-clients-1b 2026-11-06 09:31:26 +00:00
Ludovic Marie 296ac7fbf6 Merge pull request #10379 from voidsipp/fix/10102-prune-region-transactions
🤖 Agent: a failed region already restores its originals, so blocking the server start on any prune error took a server down for one corrupt chunk record. I pushed a change that starts it when no journal is left, with a supervisor test for it. Note that delete mode now writes regions one at a time with fsync, so a large prune takes longer than the old parallel rewrite. 169 horizon-server tests pass on Linux.
2026-11-06 10:29:53 +01:00
Kacper 81aeeacf55 Merge pull request #10522 from kacpherek/perf/smp-server
Server: boats and minecarts stop walking every mob, and a Perfetto trace of every thread
2026-11-06 08:54:22 +01:00
Detimes 7c411b3a58 Renumber registry ids for a 26.2 client, with stand-ins for what 26.2 lacks
What a Horizon server sends a 26.2 client (accept_older_clients) now carries 26.2's
registry ids: tags, block states, entity, block entity, block, attribute, sound and
particle ids, and items and components through the existing Way::Down writers, which
now leave out components the client lacks. A creative slot or container click from the
client is read with its ids up.

generate_registry_id_adapter.py --substitutes writes, from both versions' data
reports, a stand-in for each 26.3 entry 26.2 lacks (poplar as birch, wool and concrete
slabs and stairs as stone ones of the same shape, ...); what has none (the cushion
entity) isn't sent. v26_2_ids.rs is regenerated with it.

Part of #10404.
2026-11-06 07:29:28 +00:00
Kacpherek c7183d6232 Trace: every thread's spans as a timeline Perfetto opens
HORIZON_TRACE=FILE, horizon-ctl trace FILE [SECONDS] and horizon-trace on a
dedicated server's console write each span of every thread as a Chrome trace
event, so what ran beside what, and what a thread waited for, can be read off
in ui.perfetto.dev. A thread that records spans but is never taken from (a far
terrain or lighting worker while spans are on) now drops them past 16k instead
of growing for as long as spans stay on.
2026-11-06 08:10:30 +01:00
Horizon agentandClaude Opus 5.5 bebf670623 Turn a 26.2 client away before untranslated registry data
Only packet ids are translated for an older client so far (#10404): the
registry data, tags (registry ids) and play packets (chunks, light, login,
player_action numbering...) would reach a real 26.2 client in 26.3 ids and
layouts. With accept_older_clients on, such a client now logs in and is
told so in configuration, right after the known packs and before any of
them. NetConfig::older_clients_play (tests only, not in server.toml) keeps
the play path reachable for the id renumbering test until the later parts
translate the contents.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 07:51:40 +01:00
Detimes d503874bff Let 26.2 clients join a Horizon server, off by default: handshake and packet ids
A server.toml option, [server] accept_older_clients (horizon-accept-older-clients), off
by default. On, a login handshake stating 776 opens an adapter::ClientSession on the
connection instead of being refused, and a 26.2 status ping is told its own protocol.
The session follows the connection's states as Session does, mirrored, and renumbers
packet ids both ways with the inverse of the generated 26.2 tables, in the blocking
login path and in the io_pool play path. Off, nothing changes.

Part of #10404.
2026-11-06 05:22:16 +00:00
voidsip 8a65d28c0d fix(server): recover interrupted region pruning before startup 2026-11-05 19:47:51 -06:00
Horizon agentandClaude Opus 5.5 4d4c3ff32f Server: [combat] legacy = true in server.toml for 1.8 combat rules
horizon-server accepts and keeps a [combat] section (off by default, left out
of the file while off); the dedicated game reads it itself, like
[anticheat], and turns on the legacy rules a hosted world's PvP page switch
gives. A wrong section is logged and fights keep 26.3's rules.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 00:01:54 +01:00
Horizon agentandClaude Opus 5.5 ab9929b5ab horizon-report: per-mob-type cost, level spans, chunk workers, network, overhead, stop/status
The official SMP is mob-bound (5,400 mobs, 73 ms a tick at 60 players) but the report
only said tick_creature_entities took the time, not which mobs. Format 2 adds, without
a restart and at a measured cost:
- mob_costs: one tick in four times every mob's tick and sums it by dimension and type
  (ms a tick, mobs ticked, us a mob);
- level_* spans: each dimension's share of the server tick;
- chunk_workers: streaming::job_stats while recording (load/generate/decorate/light...);
- network: wire bytes in/out per player and in all (connection counters, no new
  per-packet cost);
- overhead: spans and mob samples a tick at their price measured on the machine;
- horizon-report stop / status.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 19:47:54 +01:00
Horizon agentandClaude Opus 5.5 5d9bd56ec8 horizon-server: prune barely visited chunks ([prune_chunks], #9949)
A one-shot step before the game starts, switched on in server.toml: chunks
with InhabitedTime under min_inhabited_ticks (1200) are deleted from region/,
entities/ and poi/, files rewritten compacted and emptied ones deleted.
Chunks near the spawn, named by keep_files (SMP claims and homes), that can't
be read, and a ring around every kept chunk stay. mode = "dry-run" only
writes the report while the game runs; either mode turns itself off.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 15:32:19 +01:00
TiggerTakkyTTTandCodex 6388756c60 Server-admin: edit bans while stopped
Route CLI moderation through file-backed lists when no game is running, pin vanilla-style replies, and document the stopped-server behavior.

Fixes #9753

Co-Authored-By: Codex (GPT-5.6) <[email protected]>
2026-11-05 16:09:44 +07:00
Ludovic MarieandClaude Opus 5.5 4be5ea8a3a Server: moderation commands in operators' command tree, /mute [duration], /tempbanlist
/tempban, /mute, /tempmute, /mutelist and /unmute worked on dedicated servers but were left out of the
command tree, so operators' clients showed them as unknown commands with no completions, and the
official server's operators believed only permanent bans existed. They now reach the trees of
operators of level 3 (as a native mod's commands do), where the game runs them: the mute commands
when the server filters chat, the ban ones on a dedicated server.

/mute <player> [duration] [reason] takes a duration after the name (/tempmute stays), and
/tempbanlist lists the bans that end by themselves, soonest first, with who banned, the time left,
the end and the reason.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 20:46:19 +01:00
Ludovic MarieandClaude Opus 5.5 a82ff8ba68 Merge origin/main into feat/windows-arm64-support
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 17:18:28 +01:00
Ludovic MarieandClaude Opus 5.5 8a442b616b hosting: keep the command descriptions, point import-resources at step 2
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 04:41:01 +01:00
Ludovic Marie a47ed5699e Merge remote-tracking branch 'origin/main' into rv8-8805 2026-11-04 04:40:16 +01:00
MegaBytesMe bc97e77d55 Merge remote-tracking branch 'upstream/main' into feat/windows-arm64-support
# Conflicts:
#	launcher/Cargo.toml
2026-11-04 01:29:10 +00:00
gorkandClaude Code b49b1f8f15 docs: refresh hosting command and option reference
Co-Authored-By: Claude Code <[email protected]>
2026-11-04 00:35:24 +01:00
Ludovic MarieandClaude Opus 5.5 fd3e17c2bc Merge main into whitelist-bypass
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 22:21:46 +01:00
Kacper dbd56824f4 Merge pull request #8481 from dontstopgorkingit/docs/user-server
docs: improve server/user documentation links and structure
2026-11-03 21:25:12 +01:00
Kacper b88fafd2d7 Merge pull request #8207 from Akirabane/feat/8206-config-set-live-motd-max-players
Server: `config set server.motd` and `server.max_players` apply live
2026-11-03 21:24:25 +01:00
MegaBytesMe 4f1704263f feat(windows): add native ARM64 build support (#8247) 2026-11-03 19:02:08 +00:00
Ludovic Marie dba9f2d336 Merge pull request #8252 from HrafnaValkyrja/feat/pterodactyl-egg
🤖 Agent: roadmap item server-panels. I fixed the online-mode setting's text: it said Horizon's client joins offline servers only, out of date since Microsoft sign-in. The egg is not tested on a live panel.
2026-11-03 19:53:18 +01:00
Ludovic Marie 04fc448cf0 Merge pull request #8282 from HrafnaValkyrja/feat/server-import-resources
🤖 Agent: I made the destination follow the server's lookup order ([engine] resources, then an existing resources/, then the installer's game-files), else an import could land where the next start never looks; version from VERSION_ID.
2026-11-03 19:53:09 +01:00
gorkandClaude Code 8a6441c63d docs: improve user-server docs readability and references
Co-Authored-By: Claude Code <[email protected]>
2026-11-03 18:28:46 +01:00
HrafnaValkyrjaandClaude Sonnet 5.5 b59777f00b Hosting: a Pterodactyl egg for horizon-server
Adds packaging/server/pterodactyl-egg.json and panel-start.sh, a docs/hosting.md section,
and tests/test_server_panels.py. Part of #8238.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-03 09:23:32 -05:00
HrafnaValkyrjaandClaude Sonnet 5.5 732265ffad horizon-server: import-resources DIR copies prepared game files into place (#8240)
Checks the folder (version stamp, derived files and checksums, asset folders), copies it through a temp folder and an atomic rename, keeps the old copy on any failure, and prints the next step.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-03 09:07:58 -05:00
AkirabaneandClaude Sonnet 5.5 7bac913ec3 Server: config set server.motd and server.max_players apply live
On a running server, `horizon-server config set` and PATCH /api/v1/config sent
only console commands, so the message of the day and the player limit were
always reported as "restart required", although the game takes both live
through the management settings (`serversettings/motd/set` and
`serversettings/max_players/set`).

`live_line` now returns the control line to send: the same management
request for these two settings, `console ...` for the ones vanilla changes
through its console, and nothing for the supervisor's own settings. The
CLI talks to the game's control endpoint the way the API already did, and
a reply with an error leaves the setting for the next start.

Fixes #8206

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-03 13:51:06 +01:00
janibert1andClaude Sonnet 5.5 13e3636ff2 horizon-server: whitelist-bypass.txt lets UUID prefixes (Floodgate) pass the whitelist
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-03 12:36:55 +01:00
AkirabaneandClaude Sonnet 5.5 36eddf9710 docs: describe /tempban for server operators
Refs horizon-rust/horizon-mods#170

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-03 12:03:29 +01:00
AkirabaneandClaude Sonnet 5.5 f9d57d8bcf docs/hosting.md: console, mcp, players, kick, ban and pardon ship
The Coming paragraph said console, ban, pardon and mcp were still to come.
console and mcp are in main.rs (the commands list already shows them), and
players, kick, ban, pardon, ban-ip and pardon-ip are dispatched there too
(cli::players, cli::moderate). Drop the paragraph and list the moderation
commands with the others.

Refs #7232

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-02 14:31:51 +01:00
Ludovic Marie 1b2812427b Merge pull request #6580 from horizon-rust/perf/dedicated-slow-tick-log
🤖 Agent: slow-tick log for the dedicated server, tested on playhorizon
2026-11-02 03:45:05 +01:00
Ludovic Marie cbbd4151c8 Merge pull request #6518 from xFedeT/feat/native-server-announce
🤖 Agent: queued at b7e01926a.
2026-11-02 03:15:01 +01:00
Ludovic Marie 50f98ecb33 Merge pull request #6443 from Akirabane/feat/6393-rcon-source
🤖 Agent: queued: reviewed, union-tested green at this head.
2026-11-02 00:23:29 +01:00
Ludovic MarieandClaude Opus 5.5 f632e8c4af Merge main into #6462
The language tables keep main's and add this PR's ten new strings.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 23:55:10 +01:00
Federico TaglianiandClaude Sonnet 5.5 b7e01926a2 Native mods: native_server_event posts an announce event the Discord bridge relays
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-01 23:31:46 +01:00
Ludovic MarieandClaude Opus 5.5 c9d06599c7 Dedicated server: log slow ticks and vanilla's overload warning
A dedicated server now times its spans every tick and writes a tick slower
than 250 ms to the log with where its time went (HORIZON_SPIKES's line;
the variable still sets another threshold). A server more than two seconds
behind, which already skipped the ticks it missed, now says so as vanilla's
MinecraftServer.runServer does ("Can't keep up! Is the server overloaded?
Running Nms or N ticks behind"), at most every 15 seconds.

The official server shows 10-13 s freezes (bursts of 'moved too quickly'
from 15+ players at once) with nothing in its log to say where they went.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 23:12:40 +01:00
fcae565042 Add dedicated native-mod engine build and export
Reuse the launcher native build pipeline for a headless server target,
export an independent runtime, and document manual server selection.
Keep server cache entries outside playable versions and preserve export
permissions, resources, and post-build data.

Co-Authored-By: Codex gpt-6.1-sol <[email protected]>
Co-Authored-By: OpenCode GLM 5.3 <[email protected]>
Co-Authored-By: OpenCode Nemotron 3.5 Super VL <[email protected]>
2026-11-01 16:26:35 -05:00
AkirabaneandClaude Sonnet 5.5 be156ad9fc RCON: commands run from a source named Rcon, and broadcast-rcon-to-ops tells the operators
An RCON command used to run as the server console, so the operators saw nothing of it and its
`say` read `[Server]`. It now goes through its own control request (`rcon <line>`): the same
console at level 4, with the source named `Rcon` as RconConsoleSource.createCommandSourceStack
names it. Its feedback reaches the operators in game as `[Rcon: ...]` while
`broadcast-rcon-to-ops` is on (CommandSource.shouldInformAdmins), its `say` reads `[Rcon] ...`
and leaves the reply empty, and the console and an RCON client take success feedback whatever
`send_command_feedback` says (CommandSource.acceptsSuccess), as a player's source does not.

Fixes #6393

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-01 21:52:51 +01:00
o.alzahraniandClaude Opus 5.5 a0f851b33e docs(hosting): Horizon players join online-mode servers and sign their chat
"Before you start" still said Horizon's client can't sign in to a Microsoft
account, so Horizon players could join offline servers only, and that it has
no chat session. Both stopped being true: the launcher signs players in
(docs/microsoft-account.md), the game joins online-mode servers, and since
#4375, #4376 and #4377 (Nightly 2026-11-01) it signs its chat.

- Online mode: every player joins with their own account, vanilla and
  Horizon players alike.
- Offline servers: the same safety advice, and only players under an
  offline name are limited to them.
- Secure chat: Horizon's client signs its chat too.

Refs #3332 (the website half is horizon-rust/horizon-site#38)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 22:31:18 +03:00
AkirabaneandClaude Sonnet 5.5 bfb5b219ff horizon-server: GS4 query, vanilla's UDP status port (enable-query, query.port)
The supervisor serves vanilla's GS4 query as QueryThreadGs4 does: the handshake (type 9, a token
below 2^24 as text), then the basic and the full stat to a request that carries the token, each
byte for byte what a vanilla 26.3 server sends for the same settings (checked on the wire). The
players come from the game's server-status, read at most once a second; the full stat is kept
5 seconds as in vanilla. Off by default; an invalid port leaves it off with vanilla's warning.

Refs #6108

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-01 18:11:14 +01:00
Ludovic Marie a9e7b49f04 Merge #4946 (main merged) into #4947 2026-11-01 14:36:28 +01:00
Ludovic MarieandClaude Opus 5.5 8e692458eb horizon-server: [engine] low_memory turns transparent huge pages off
mimalloc backs the game's memory with transparent huge pages where Linux
allows them; many are only partly used. low_memory = true starts the game
with MIMALLOC_ALLOW_THP=0: 60 MB less idle and 190 MB less at 20 players,
for ~1.2 % more tick time (playhorizon, 20 bots, 5 rounds). Off by default.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 07:01:01 +01:00
rdbtCVSandClaude Opus 5.5 cf7b5ce636 Merge #4946 (main merged) into #4947
Conflicts: lod.rs (main's wanted-tile heap from #4747; a failed tile stays out of the heap until its RETRY passes, then the heap is rebuilt so it is asked again; main's MAX_LEVEL 22) and remote.rs (send_far_terrain and main's tick_chat_session both run before ClientTickEnd).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 21:08:25 +00:00