381 Commits
Author SHA1 Message Date
Horizon agentandClaude Opus 5.5 278ffc3b96 Merge #11238 (with main) into #11239
take_screenshot returns main's Option<PathBuf>; a running sequence still
refuses F2 (None).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 09:57:30 +01:00
Nikita Maximilian Grimm 1ade310792 Merge remote-tracking branch 'origin/main' into shader-api-02-serve
# Conflicts:
#	crates/horizon-client/src/game/native_shaders.rs
#	crates/horizon-client/src/game/shader_packs.rs
2026-11-06 22:29:20 +01:00
rdbt c90689fd74 Merge pull request #10168 from NikitaMGrimm/shader-pack-identity
Keep native shader selections and settings across updates
2026-11-06 21:27:07 +00:00
rdbt d4df5dbf59 Merge pull request #10572 from GIGABAIT93/feat/launch-api-content
Content API: --launch-api says what content a build loads, and docs/api/content.md (#10562)
2026-11-06 21:16:35 +00:00
Nikita Maximilian Grimm 1d1f36972c Merge remote-tracking branch 'origin/main' into shader-api-02-serve
# Conflicts:
#	docs/api/shaders.md
2026-11-06 22:14:42 +01:00
rdbt 8985543344 Merge pull request #10042 from NikitaMGrimm/hdr-note-serve-0-1-until-step-5
HDR design note: serve shader API 0.1 until 0.2 is on by default
2026-11-06 21:11:02 +00:00
Nikita Maximilian GrimmandClaude Opus 5.5 94a66c81d4 screenshot-sequence: STEP_MS in decimal milliseconds
16.666667 steps a 60 fps clock. STEP_MS is a finite number more than 0,
and the reply gives it back as given.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 16:33:15 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 0be2751890 horizon-ctl screenshot-sequence: a shader pack's first frames on a set clock
screenshot-sequence FRAMES STEP_MS PATH, under HORIZON_STILL with the world
frozen, makes the running pack start over and draws FRAMES frames on a
scripted clock: frame n is n frames and (n - 1) x STEP_MS milliseconds in,
STEP_MS after the frame before (0 on frame 1). The last is written as
screenshot PATH writes it, its -hdr.png too under HDR output, and the reply
names the pack and the last frame's clock. The same build, GPU and driver
write the same bytes every run, for shaders/ packs, Horizon's own and none.

Sequence frames are submitted inline and waited for on the GPU, so each
reads the centre depth the one before left, or the sequence fails; a frame
the surface refused is drawn again. It refuses to start with far terrain,
TAA, frame generation, chunk fade or the shadow cache on, refuses commands
that would change the scene while it runs, and ends with an error when the
camera, world, settings, pack or window size change. cancel stops it, quit
still quits. Documented in agent-control.md's STILL section, shaders.md and
api/shaders.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 16:33:15 +01:00
GIGABAIT93andClaude Opus 5.5 10ec872cc1 docs/api/content.md: where a launcher puts content and what it checks
The install side of the Launch API, experimental: what a build loads (the
new `content`), the folder and the on/off file of each kind under
--game-dir, when a change applies, native mods needing a rebuild, what to do
with a .hpack, and the checks before installing as mod-index.md specifies
them (where it comes from, size and SHA-256, the minisign key, revoked[] and
installed copies, the manifest). Listed in docs/api/README.md. Part of #10562.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 11:49:14 +02:00
GIGABAIT93andClaude Opus 5.5 2710305be4 --launch-api says what content this build loads
`content` in horizon-client's reply, from the constants the build checks
content against: content mods' manifest api lines (APIS without the removed
WebAssembly 0.1), native mods' hooks level and that they need a rebuild, the
shader schema and the line it draws, the resource and data pack formats, the
modpack format and the index schema. A launcher offers only what works. The
generated reference shows the hooks level as a placeholder, since it rises
with every hook. Part of #10562.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 11:44:04 +02:00
Nikita Maximilian GrimmandGPT 6.1 Sol 1295602deb fix(shaders): integrate the new settings screen
Merge main at 0873f24d2, retain its replacement shader screen, and route native selections and options through stable manifest IDs.

Co-Authored-By: GPT 6.1 Sol <[email protected]>
2026-11-06 10:40:49 +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
Ludovic Marie 7b36dd82a3 Merge pull request #8716 from Akirabane/feat/7484-held-player
🤖 Agent: with [transfer] off, no login is expected, so held stays false and watches() equals here(): every here→watches swap in hub.rs and the loading_chunks refactor are no-ops for ordinary servers. With it on, a held player is a viewer but not tracked, and gets list changes through broadcast_watching. Union-tested with main and the stack on the desktop, plus server_transfer_e2e (31/31).
2026-11-06 00:47:32 +01:00
Horizon agentandClaude Opus 5.5 50d9f3d7f7 launcher: warn before installing a native mod that doesn't build on your Horizon
The registry's daily check (horizon-mods native-compat.yml) marks the
versions horizon-mixins refuses on the newest Nightly with `broken_on`
({horizon, code}) in index.json. The browser's fit line now says
"Doesn't build on the Horizon you play (CODE): a build leaves it out until
its author updates it" when that Horizon is the one the mod would build on.

- horizon-mods index: `Version.broken_on` (empty and absent by default).
- native_fit: `Fit::Broken { code }` for a hook mod, or a mod pinned to the
  played commit, when an entry names that commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 21:19:51 +01:00
Nikita Maximilian GrimmandGPT 6.1 Sol 64297b8e8b fix(shaders): preserve native pack identity across updates
Part of #10123

Co-Authored-By: GPT 6.1 Sol <[email protected]>
2026-11-05 19:45:17 +01:00
Nikita Maximilian Grimm 02ba821bcf Merge remote-tracking branch 'origin/main' into hdr-note-serve-0-1-until-step-5
Co-Authored-By: GPT 6.1 Sol <[email protected]>

# Conflicts:
#	docs/api/shaders.md
2026-11-05 19:04:22 +01:00
Nikita Maximilian Grimm ceeb7841e2 Merge remote-tracking branch 'origin/main' into shader-api-02-serve 2026-11-05 18:59:42 +01:00
Ludovic Marie 169b0f55c9 Merge pull request #9934 from hildlabs/github-stars
🤖 Agent: The stars come from the registry index, so the launcher makes no new GitHub API call, and both strings go through button()'s tr() and trf(). Until horizon-mods#285 lands, every page shows "0 stars on GitHub". I ran a union on playhorizon at 8b149e665; this head only merges main and the PR diff is unchanged.
2026-11-05 18:48:06 +01:00
Ludovic Marie b2a67d7572 Merge pull request #9930 from NikitaMGrimm/shader-api-02
🤖 Agent: I pushed d4e13b4c0, which drops the "🤖 Agent:" markers from code comments and from the 0.2 prelude's COLOR_HELPERS text, since that text is composed into every 0.2 stage. Only 0.1's prelude digests are pinned, so they don't move. Added frame-identity now that #9900 is in. Union run on playhorizon (main a1e0c0db0 + this gate's 11 PRs): fmt, clippy, all touched crates' tests pass.
2026-11-05 18:47:58 +01:00
hildlabsandClaude Opus 5.5 c140315d79 Merge origin/main into github-stars
Brings the branch up to date; the parity job's last run failed in the
runner's preparer (.local/.horizon-prepare.lock missing), as it did for
every PR between 14:17 and 14:41 UTC.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 18:05:21 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 02b2f7b9c0 docs: HDR design note: serve shader API 0.1 until 0.2 is on by default
The note kept 0.1 at least until 0.2 leaves experimental, which would keep
today's HDR path (marks, the 16-bit unorm frame, Smooth Gradients) alive for
0.1 packs alone. The shader API is experimental, which stability.md lets
change in any release without notice. So step 5, which turns 0.2 on by
default, also stops serving 0.1: 0.1 packs are refused with stability.md's
message, the registry lists 0.2 packs, and Golden Hour's 0.2 port becomes the
example. Later experimental lines follow the same rule. The shader API page
tells pack authors.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:46:24 +01:00
Ludovic Marie b9913a1902 Merge pull request #9866 from Vaspyyy/native-fit-before-install
🤖 Agent: The fit line is worked out on the search thread, not the UI's. hooks_at reads raw.githubusercontent (no API quota) and is cached per commit. The four new strings go through tr/trf. One limit: it compares only the NATIVE_HOOKS_API number, so for a revision older than the hook catalog, a mod naming hook points can read 'Builds on the Horizon you play' and still be refused at build time. horizon-mods and launcher tests pass on the desktop with this head merged into main.
2026-11-05 16:25:02 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 2bc92b6348 Serve shader API 0.2 behind HORIZON_HDR_FRAME=float
With the switch, the game draws 0.2 packs ([frame] blend = "linear" is
still refused). A renderer made with a 0.2 pack picked draws a float frame
where the device can, else the 8-bit one; a pack picked or dropped later
runs on the frame there is, logged once. The renderer's material, sky,
weather, vertex and shadow entries decode a 0.2 stage's colours and encode
its results; scene_color, opaque_color and the water mirror are decoded
copies, shadow_color is float, and Frame's sky and fog colours are
decoded. The post chain ends in a window-size picture, and the pack's
[tonemap] (or Horizon's clip) draws it onto the frame, encoded at alpha 1.
With HDR on, HDR output lifts nothing of a 0.2 pack's world.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 15:37:14 +01:00
hildlabsandClaude Opus 5.5 8b149e6657 Launcher: a registry project's GitHub stars, and a Star on GitHub button
A registry project's page said "0 followers": followers are Modrinth's,
and the registry has none. Its creators collect stars on their GitHub
repository instead, so the index gets `projects[].stars` (the source
repository's stars, which horizon-mods' publish job reads every hour, as
it adds `downloads`; absent when 0, the schema unchanged) and the page
shows "{count} stars on GitHub" there, with a "Star on GitHub" button
beside "Sign in with GitHub to rate" that opens the repository, where
the player stars it. No sign-in or permission is added.

`browser::horizon::github_repo` reads the repository from `source` (a
folder of it, `.git`, a query or an anchor are the same repository;
another host or a name GitHub doesn't allow gets no button). A project's
details now go to the page as the `Arc` it keeps them in, so the larger
`Details` doesn't make `Loaded` a large enum. Both strings are in every
language's table.

Fixes #9929

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 15:11:58 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 36021e2559 Golden Hour's shader API 0.2 port, as a test pack of the SDK
The example pack written for 0.2: its sky and post passes in linear light,
with the 0.1 pack's gamma constants decoded, and a [tonemap] stage of its
own that eases colours above three quarters of the headroom toward it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 14:59:12 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 67382d8ed2 Shader API 0.2 reference: the lit colour may pass white, tonemap's picture size
Surface.color's "0..1" stays in the 0.1 reference only; the tonemap stage's
`previous` is the post chain's window-size picture, or the world's at the
world's size without a chain.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 14:58:52 +01:00
Nikita Maximilian GrimmandClaude Opus 5.5 bd186dc732 Shader API 0.2: linear light, the display fields, [tonemap] and [frame] blend
Step 2 of docs/design/hdr-linear-light.md in horizon-shader-api. The line is a
value (`Api`), and `check` and `horizon-shader` serve 0.1 and 0.2. Under 0.2
the preludes and entries decode colours at the stage boundary (a 2.2 power,
negatives and NaN made 0 first) and encode what the frame stores; `Frame`
gains hdr, headroom, paper_white, peak and black_level, padded to WGSL's size
in Rust only, and 0.1's prelude still declares only its 49 fields. A
`[tonemap]` stage and `[frame] blend` are 0.2-only manifest keys.

0.1 does not move: its preludes and entries are pinned by digest, and
shaders-reference.md is unchanged; 0.2 has shaders-reference-0.2.md. The game
refuses 0.2 packs and `blend = "linear"`, and the registry refuses 0.2, each
with a message saying why.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 14:48:24 +01:00
VaspyyyandClaude Opus 5.5 4caabfd21a Mod browser: say before install whether a native mod fits your Horizon
The registry's index now lists a native mod's hook points version
(`hooks`), and the browser and `mods search` compare it, or the mod's
pinned commit, with the Horizon the instance plays: builds there, needs
newer hook points, moves the game to its commit, or clashes with the
pins of mods turned on (Build anyway). Closes #9860.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 14:23:36 +01:00
Horizon agentandClaude Opus 5.5 8aeda11f56 Mod registry: a listed project needs a description, a category and its own icon
Registry v2, step 4 (docs/design/registry-v2.md): registry build refuses a
listed project with a description under 50 characters, no category, no
icon, or images that aren't kept in the registry (icons/, screenshots/).
The site and the launcher then load images only from the registry's host.
Lands once every entry on horizon-mods main is backfilled.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 14:12:39 +01:00
rdbtCVSandCodex gpt-6.1-sol 764795ae20 docs(server): regenerate held-player transfer setting reference
Co-Authored-By: Codex gpt-6.1-sol <[email protected]>
2026-11-05 13:45:17 +01:00
Horizon agentandClaude Opus 5.5 ed0de5149a Mod registry form: images uploaded into the registry, Edit project, no repository listings
Registry v2 (docs/design/registry-v2.md), the submission service:
- The form uploads the icon (square PNG) and up to 8 screenshots; the service
  checks them (horizon_mods::index::page) and writes them on the submission
  branch as icons/<id>.png and screenshots/<id>/<n>.<ext>, so the site and the
  launcher load them only from the registry. An icon address is refused.
- Categories and tags go into the entry; a new project needs a description of
  50 characters or more, a category and an icon. A shaderpack needs the
  submitter's statement that it is theirs to hand out.
- "Edit project" (`edit: true`, no file): an owner by GitHub ID changes the
  page without a new version; pull request edit/<id>-<time>, label owner-edit.
- The registry follows no repository any more (orchestrator decision): the
  form refuses a repository listing, and `registry review` refuses a new entry
  with `repo`. Every version is a submitted, pinned file.
- A retry takes up its own branch when every commit on it is the form's.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 13:41:32 +01:00
Horizon agentandClaude Opus 5.5 ddce4effe1 Mod registry: datapack and shaderpack kinds, optional categories, tags and screenshots
Step 1 of registry v2 (docs/design/registry-v2.md): the new entry and index
fields are optional, so nothing in horizon-mods changes until HORIZON_REV
moves. Values present are checked: categories from the kind's list (1-3),
plain lowercase tags (<= 10, nothing about gambling), a description under
10,000 characters, square PNG icons and bounded PNG/JPEG screenshots served
from the registry's site like icons. Data packs (pack.mcmeta + data/) and
shaders/-folder packs get their own checks; cargo horizon-mod check tells a
zip's kind by its content. The launcher offers shaderpacks as shader packs
and keeps data packs back until it installs them into a world.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 12:43:46 +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
yahya-nusseibehandClaude Opus 5.5 337cb194af Mod registry: owners and owner_ids must name the same accounts
Once an entry has owner_ids, only an ID in them makes an owner, so adding
a co-owner to `owners` alone, the obvious edit, would silently lock them
out, and the refusal would list their own login among the owners
(martipops's review of #9129).

- Entry::check_fields refuses an entry whose owner_ids is non-empty and
  not as long as owners, with how to find the missing ID, so the registry
  CI catches it when the change is made.
- docs/api/owner-update-v2.md: the registry repository has no
  owner-update workflow yet, so nothing merges on its own today; and the
  backfill script runs only once a maintainer has read it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01SJ3stK8iXVDXqoi7midcqd
2026-11-05 07:00:11 +02:00
yahya-nusseibeh 7aceb1cbf9 Mod registry: decide project ownership by numeric GitHub ID
Owners were GitHub logins, and a login can be claimed by someone else once
its owner renames or deletes the account. For a project without a key, a
reclaimed login could publish an owner update that merges on its own.

- Entry gains `owner_ids` (#[serde(default)], omitted when empty). The
  form records the lister's ID for new projects (file and repository
  listings). The registry review notes any change to it.
- ownership(): when an entry has owner_ids, only an ID in them is an
  owner, so a matching login on another account is refused. Without
  owner_ids (older entries) the login matches, but the update always waits
  for a reviewer and the pull request says so.
- The automatic owner update requires an ID match.
- update_trailer is v2: `owner-update-v2` message with the submitter's
  numeric ID, and `format: v2` / `submitter_id:` lines in the trailer.
- tools/registry_backfill_owner_ids.py: one-off, dry run by default,
  resolves owners' logins to IDs, cross-checks them against the IDs the
  form recorded in the entry's commits, and leaves alone (and prints)
  any entry it can't resolve completely.
- docs/api/owner-update-v2.md: what the registry repository's
  owner-update workflow must check, and the deployment order.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01SJ3stH5q6PgMAVUSmJqKDe
(cherry picked from commit 526bfcbbe1)
2026-11-05 06:59:35 +02:00
Horizon agent 10209ee6bb Merge remote-tracking branch 'origin/main' into cg42b/8700 2026-11-05 04:57:00 +01:00
Loïc PILLERandClaude Sonnet 5.5 c7ab3b851c docs(shaders): note scene_surface is texture_2d<u32> in the changelog
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-04 22:06:57 +01:00
Loïc PILLERandClaude Sonnet 5.5 4d90e9db43 fix(render): store native shader pack surface as Rgba32Uint
Rgba32Float is not a render attachment on wgpu's OpenGL backend without
EXT_color_buffer_float, so enabling a native shader pack crashed there
(#9472). The surface holds float bit patterns anyway; store them as
Rgba32Uint (always renderable), bitcast on write in the material stage and
on read in surface_at. Pack-facing API (set_surface, surface_at) is unchanged.
Adds a GPU test that a written surface reads back bit-exact through the post stage.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-04 22:02:13 +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 Marie ee06d18c39 Merge pull request #8557 from hildlabs/shadow-options
🤖 Agent: SHADOW_RESOLUTIONS and SHADOW_DISTANCES are ranges, so checking an int option's min and max covers every value the player can pick, and a 0 option drops the shadow pass, not just the map; main merged in (docs/api/shaders.md changelog next to #8512's).
2026-11-04 16:28:19 +01:00
Ludovic Marie 5ff12dfaf4 Merge pull request #8631 from HrafnaValkyrja/feat/admin-player-position
🤖 Agent: I pushed c2aa51c1: merged main and resolved the generated `server-reference.md` row (main's text plus `dimension`), so `the_routes_table_matches_the_code` agrees again. Nothing else found.
2026-11-04 16:14:17 +01:00
Ludovic Marie 8788891c88 Merge pull request #8859 from HrafnaValkyrja/feat/panel-bans-crashes
🤖 Agent: Crash reports are read only by a name the listing returns, so `../` and absolute paths can't reach outside `crash-reports/`. The test covers both, plus a non-`.txt` file. The panel refetches players and crash reports every 10 polls, a directory listing each time: cheap. Nothing else found.
2026-11-04 16:11:47 +01:00
Ludovic MarieandClaude Opus 5.5 5d06f30d10 Merge main into #8557
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 15:42:09 +01:00
Ludovic Marie c77c40b021 Merge pull request #8512 from hildlabs/shader-option-sliders
🤖 Agent: a drag saves the option and rebuilds the pack once, on release, not on every pointer move; the manifest already refuses min >= max and step <= 0, so slider_position and slider_value cannot divide by zero.
2026-11-04 15:22:54 +01:00
Ludovic Marie 48684a9b1b Merge pull request #8834 from TiggerTakkyTTT/test/server-api-lifecycle-goldens
🤖 Agent: Server API lifecycle goldens: test-only, type-checked replacement of the volatile fields. The union of this wave's 15 PRs on main acd184c1 passed fmt, clippy -D warnings, 3388 tests and the Python suite on the desktop. management_protocol (--fresh, on that union): every case of this PR matches vanilla; the only 3 differences were #8204's heartbeat cases, fixed there. Other harnesses PASS on the union: flat_generation, flat_place, chunk_generation, datapack_worldgen, command_exec, pick_block_data, powder_snow_collision, snow_freeze, boat_authority, vehicle_container. dedicated_server could not run locally (the vanilla oracle's world generation hit its watchdog under the desktop's memory pressure), so it and the rest of the selection run in CI run-parity.
2026-11-04 15:01:28 +01:00
Ludovic MarieandClaude Opus 5.5 c2aa51c15f Merge origin/main into feat/admin-player-position
Resolve the generated docs/api/server-reference.md row: main's text with
the new dimension field.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 14:55:35 +01:00
AkirabaneandClaude Opus 5.5 020dc51cfe transfer: an opt-in [transfer] module, a hand-over id, and the review's fixes
Kacper's review of #8700 and martipops's on #8700 and #8730.

The module is off by default. `server.toml` gets a `[transfer]` section
(enabled = false, expect_seconds = 10, max_expect_seconds = 60,
max_expected = 64, max_freeze_seconds = 30) in place of the constants in
lan/arrivals.rs. horizon-server passes it to the game as `--transfers`,
beside `--control-socket`, not as a server.properties key. While it is off
every player-* request is answered "transfers are off on this server",
the hub has no table and a tick does nothing for transfers. With it on,
the game refuses to start without Velocity forwarding, so a player can
only come in through the proxy. The section is kept apart from vanilla's
accepts-transfers.

Record version 1 gets a `handover` id. An export with `freeze` starts a
hand-over: a random id, and the record kept with the player. A repeat
export while it lasts answers with the same id and the same bytes and
does not restart the freeze, so a proxy that lost the reply can ask
again. An export without `freeze` is a read, with a null id. The record
also carries the player's statistics (`stats`), as the stats file has
them.

The export now closes the player's menu in the player's own level, as
the close of every guest does on leaving, and refuses when that level
cannot be opened. It copies the live mod attachments into the player
first, so the compound is what a save would write. A player who is
leaving cannot be exported.

An expectation is used up when the login starts, on the network thread,
once the bans, the whitelist and the player limit let it in. A login
still in configuration when the time runs out keeps it.

A frozen player is not kicked for floating, and its chat and signed
commands are dropped after the messages they say the client has seen are
applied, so its chat still validates after the freeze; chat
acknowledgements are kept.

docs/server.md gives the section, who can ask (the endpoint's limits,
the token being all or nothing) and how a server reads a record: another
version or data version is refused, the NBT in `player` wins over the
plain fields, unknown fields are ignored.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 13:49:51 +01:00
rdbtCVSandCodex gpt-6.1-sol 25574a2d21 Merge main and reconcile parallel changes
Co-Authored-By: Codex gpt-6.1-sol <[email protected]>
2026-11-04 12:02:49 +00:00
rdbtCVSandCodex gpt-6.1-sol d938f6a1dd Merge main and reconcile parallel changes
Co-Authored-By: Codex gpt-6.1-sol <[email protected]>
2026-11-04 12:02:46 +00:00
Ludovic MarieandClaude Opus 5.5 48430a7647 shader docs: one consistent intro, the stages that exist, what is still missing
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 04:41:21 +01:00