feat(rust): zone presets, and the zone step's options, messages and dome (PLAN_REDESIGNS §3, D210-D212) #27

Merged
whitlocktech merged 2 commits from feat/zones-domes into edge 2026-09-29 16:28:11 +00:00
Member

What & why

PLAN_REDESIGNS §3, the site half. Core's step editor holds one value per field, so a zone's flags are ticked on a module page and the step copies them (D210).

  • Admin → Rust zone presets (new page, nav row, /admin/rust/zones API):
    • A preset is a named set of ZoneManager flags and settings for one server, several, or every server (D195). None ship with the module.
    • The flags are drawn in groups (Vehicles, Combat, Building, Loot, NPCs, Communication, Survival, and Other for anything unknown), read from each server's last hello (D211).
    • A flag not on a covered server is refused on save, with the server named. Two presets of one name may not share a server.
  • rust.zone.open gains options, enterMessage, leaveMessage, delivery, dome and domeStack:
    • options is one line of text, such as NoBuild, NoPlayerLoot, radiation=10.
    • Its dropdown (rust.options.zone_presets) has one row per preset, whose value is the preset's line itself. Picking a preset copies it, so no published event changes when a preset does (D210).
    • The dome dropdown lists Standard first as the full dome, which is also the default. Each colour is labelled "only where it meets the ground or a building" (D212).
    • The line and the dome are checked against the server's hello on save and in a dry run. bad-option and dome-unavailable are permanent refusals.
  • Schema: rust_zone_presets and rust_zone_preset_servers, both dropped by purge.sql.
  • Swagger fragment and routes.manifest.json regenerated against the pinned core f0e7d2a (65 routes, all documented).

Plugin half: Rust-Plugins feat/zones-domes. Spec: docs docs/rust-zones-domes.

How it was tested

  • 443 server tests, 23 of them new in test/zones.test.js, and 58 client tests.
  • check:swagger, check:imports, check:bundle, check:externals, and the frozen manifest.
  • Walked on a local core against rust-carbon, 2026-09-29, signed in as an admin in the browser:
    • Presets page: each server's report, the grouped flags, and the settings. A save with comfort 3 was refused with the reason; 0.5 saved.
    • API refusals: a flag Carbon lacks, no servers, and a duplicate name (409).
    • Event editor: after the preset changed, the published step kept its old line. Picking the preset wrote the new one.
    • Dry run: refused NoFlying, with the reason.
    • A real run: it opened the zone on Carbon with the preset's flags and a full dome, and cleanup removed it.
    • No console errors.
  • Deferred to the later in-game walk: the rows that need a player.

Checklist

  • I have read CONTRIBUTING.md.
  • The change builds and existing tests/checks pass locally.
  • I have added or updated tests/docs where it makes sense.
  • My commits are reasonably scoped with clear messages.

AI-assisted contributions (required)

  • No AI tools were used to produce this contribution.
  • AI tools were used. Tool(s): Claude Code (Claude Opus 5.5). I have reviewed and understand
    every change, and take responsibility for it. AI-authored commits are
    marked with a Co-Authored-By / Assisted-By trailer.

License

  • I agree that my contribution is licensed under this project's license
    (GNU GPL v3.0 or later), and I have the right to contribute it.

Merge note: #26 (§5 titles) also touches schema.sql, purge.sql, swagger/doc.js, swagger-fragment.json and routes.manifest.json. Whichever merges second needs a conflict fix and a regenerated fragment and manifest.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

## What & why PLAN_REDESIGNS §3, the site half. Core's step editor holds one value per field, so a zone's flags are ticked on a module page and the step copies them (D210). - **Admin → Rust zone presets** (new page, nav row, `/admin/rust/zones` API): - A preset is a named set of ZoneManager flags and settings for one server, several, or every server (D195). None ship with the module. - The flags are drawn in groups (Vehicles, Combat, Building, Loot, NPCs, Communication, Survival, and Other for anything unknown), read from each server's last hello (D211). - A flag not on a covered server is refused on save, with the server named. Two presets of one name may not share a server. - **`rust.zone.open` gains `options`, `enterMessage`, `leaveMessage`, `delivery`, `dome` and `domeStack`:** - `options` is one line of text, such as `NoBuild, NoPlayerLoot, radiation=10`. - Its dropdown (`rust.options.zone_presets`) has one row per preset, whose value is the preset's line itself. Picking a preset copies it, so no published event changes when a preset does (D210). - The dome dropdown lists Standard first as the full dome, which is also the default. Each colour is labelled "only where it meets the ground or a building" (D212). - The line and the dome are checked against the server's hello on save and in a dry run. `bad-option` and `dome-unavailable` are permanent refusals. - **Schema:** `rust_zone_presets` and `rust_zone_preset_servers`, both dropped by `purge.sql`. - **Swagger fragment and `routes.manifest.json`** regenerated against the pinned core `f0e7d2a` (65 routes, all documented). Plugin half: Rust-Plugins `feat/zones-domes`. Spec: docs `docs/rust-zones-domes`. ## How it was tested - 443 server tests, 23 of them new in `test/zones.test.js`, and 58 client tests. - `check:swagger`, `check:imports`, `check:bundle`, `check:externals`, and the frozen manifest. - **Walked on a local core against rust-carbon, 2026-09-29,** signed in as an admin in the browser: - **Presets page:** each server's report, the grouped flags, and the settings. A save with comfort 3 was refused with the reason; 0.5 saved. - **API refusals:** a flag Carbon lacks, no servers, and a duplicate name (409). - **Event editor:** after the preset changed, the published step kept its old line. Picking the preset wrote the new one. - **Dry run:** refused `NoFlying`, with the reason. - **A real run:** it opened the zone on Carbon with the preset's flags and a full dome, and cleanup removed it. - No console errors. - **Deferred to the later in-game walk:** the rows that need a player. ## Checklist - [x] I have read [CONTRIBUTING.md](CONTRIBUTING.md). - [x] The change builds and existing tests/checks pass locally. - [x] I have added or updated tests/docs where it makes sense. - [x] My commits are reasonably scoped with clear messages. ## AI-assisted contributions (required) - [ ] No AI tools were used to produce this contribution. - [x] AI tools were used. Tool(s): `Claude Code (Claude Opus 5.5)`. I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a `Co-Authored-By` / `Assisted-By` trailer. ## License - [x] I agree that my contribution is licensed under this project's license (**GNU GPL v3.0 or later**), and I have the right to contribute it. **Merge note:** #26 (§5 titles) also touches `schema.sql`, `purge.sql`, `swagger/doc.js`, `swagger-fragment.json` and `routes.manifest.json`. Whichever merges second needs a conflict fix and a regenerated fragment and manifest. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 2 commits 2026-09-29 16:26:14 +00:00
Admin → Rust zone presets: named sets of ZoneManager flags and settings for
one server, several, or every server (D195), ticked in groups read from each
server's own ZoneManager list in its last hello (D211). A flag not on a
covered server is refused on save with the server named; two presets of one
name may not share a server.

rust.zone.open gains options (one line, NoBuild, radiation=10), enterMessage,
leaveMessage, delivery, dome and domeStack. The options field's dropdown is
rust.options.zone_presets, whose row VALUE is the preset's line, so picking
one copies it into the step (D210) and no published event changes when a
preset does. The line and the dome are checked against the server's hello
on save and in a dry run; bad-option and dome-unavailable are permanent.

Schema: rust_zone_presets, rust_zone_preset_servers. Swagger fragment and
routes.manifest regenerated against the pinned core f0e7d2a.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
feat(rust): the zone step labels its domes for what they show (D212)
All checks were successful
PR Checks / client-build (pull_request) Successful in 17s
PR Checks / frozen-manifest (pull_request) Successful in 43s
PR Checks / server-tests (pull_request) Successful in 7m44s
d89ebbdd23
Standard is listed first as the full shaded dome and is the default; each
colour says it shows only where it meets the ground or a building.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit ea2a40320a into edge 2026-09-29 16:28:11 +00:00
whitlocktech deleted branch feat/zones-domes 2026-09-29 16:28:12 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Module-Rust#27
No description provided.