docs(runicnpc): 9e step 1 — dome stack 3 and the PopupNotifications banner (D326-D328)

D326: a blank dome stack is 3 (module only; the wire still defaults to 1).
D327: the recommended PopupNotifications banner ships as a paste block
(rust-link/INTEGRATION.md §2.4), from the installer (install and update) and
from the egg's install. D328: "at the plugin's defaults" is all or nothing.
PLAN_REDESIGNS §3's "until it is chosen by eye" closes; rust-link/INSTALL.md
says what the installer and the egg write, and that uninstall leaves it.
Code: Module-Rust#36, installer#39, Rust-Link#22.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-09 01:25:57 -05:00
parent f4b7b9f3eb
commit 0a826ee366
4 changed files with 81 additions and 4 deletions

View File

@@ -77,6 +77,12 @@ What a run does:
The plugin fills in every other key on its first load. An existing config is never rewritten,
and one that names a different server stops the run and says so — the website locks a server's
id once it has seen it.
It also writes the **recommended PopupNotifications banner** (`PopupNotifications.json` beside it;
[`INTEGRATION.md` §2.4](INTEGRATION.md#24-the-recommended-popupnotifications-look-optional)), but
only where that file is missing or still exactly the plugin's own defaults. A config with any
setting changed is kept whole. `install` and `update` both apply this rule, and the plan names
which case it found (`popup look … banner written` or `kept`). PopupNotifications itself stays
optional and yours to install. One that is already running shows the banner after its next reload.
4. **Installs the sidecar**, writes its config with this server's ports, and registers its service.
5. **Places the plugin** in `oxide/plugins/` or `carbon/plugins/`. Both frameworks load a plugin
the moment it lands, so on a running server the bridge comes up at once; on a stopped one, at
@@ -125,7 +131,10 @@ When you create a server from it:
against the bundle's checksum, and only then places them: the sidecar in `rust-link/`, the plugin in
`oxide/plugins/` or `carbon/plugins/`. `RunicNPC.cs` goes beside the plugin (its data directory is left for RunicNPC to make); a bundle
without RunicNPC is refused. Any mismatch fails the install with the reason, before
anything is placed.
anything is placed. It then writes the recommended PopupNotifications banner by the installer's
rule: only where `PopupNotifications.json` is missing or still the plugin's defaults, so a look
you chose survives a reinstall. If that write fails, the console says so and the install still
succeeds, because it only affects how popups look.
**The first boot** prints, in the console, the token the sidecar generated — **once** — and a line
with what the website needs:
@@ -230,7 +239,7 @@ With the installer:
|---|---|
| `doctor --game rust [--server-id <id>]` | Per server: the framework; whether the plugin file is still the one deployed; each helper deployed beside it, as a **warning** when missing or edited (the bridge runs without one, and the row says what that costs); RunicNPC as a **failure** when it is missing or was never installed (it is required: without it every NPC an event places is refused), and a warning when edited by hand; that the plugin's config names this server; the required uMod plugins; the service; and `/health` through to **plugin connected**. A stopped server is a warning; a running one whose plugin never connected is a failure, printed with the framework versions the plugin is known good on |
| `update --game rust` | Moves the sidecar and every server's plugin to the current bundle, and restarts the sidecars. Always all servers together — they share one binary |
| `uninstall --game rust [--server-id <id>] [--purge]` | Removes the service, the plugin file, its helpers and RunicNPC. **Keeps the plugin's config** and RunicNPC's `data/RunicNPC/` (an admin's placements and routes) — it is the website's, and it names the server. `--purge` also removes the sidecar config (the token) and the database. Removing the last server removes the shared binary too |
| `uninstall --game rust [--server-id <id>] [--purge]` | Removes the service, the plugin file, its helpers and RunicNPC. **Keeps the plugin's config** and RunicNPC's `data/RunicNPC/` (an admin's placements and routes) — it is the website's, and it names the server. `--purge` also removes the sidecar config (the token) and the database. Removing the last server removes the shared binary too. `PopupNotifications.json` is never touched: it belongs to PopupNotifications |
With the egg: reinstall to update (above); the console is the diagnosis.

View File

@@ -137,6 +137,50 @@ Then press **Test**, which probes the sidecar and reports what came back:
Within a poll interval the server appears at `/rust/servers`.
### 2.4 The recommended PopupNotifications look (optional)
PopupNotifications is optional (D141). Where it is installed, news, events and zone messages can
arrive as popups, and its stock look is a small grey box at the right of the screen, sized for one
short line. The look we recommend is a **banner across the top of the screen**: no close button,
Roboto Condensed Bold at 18 (chosen in RunicNPC's 9d player session, D327). Paste this over
`oxide/config/PopupNotifications.json` (Carbon: `carbon/configs/PopupNotifications.json`), then
`oxide.reload PopupNotifications` (Carbon: `c.reload PopupNotifications`):
```json
{
"Notification duration (in seconds)": 8,
"Maximum notifications shown at any time": 6,
"UI Positioning": {
"Position of the left side of notification (0.0 - 1.0)": 0.15,
"Position of the bottom of noticiation (0.0 - 1.0)": 0.87,
"Width (0.0 - 1.0)": 0.7,
"Height (0.0 - 1.0)": 0.07,
"Space between notification (0.0 - 1.0)": 0.005
},
"UI Options": {
"Show close button": false,
"Panel color (hex)": "#2b2b2b",
"Panel transparency (0.0 - 1.0)": 0.8,
"Close button color (hex)": "#d85540",
"Close button transparency (0.0 - 1.0)": 0.5,
"Font": "robotocondensed-bold.ttf",
"Font size": 18
},
"Version": {
"Major": 0,
"Minor": 2,
"Patch": 1
}
}
```
- **Keep the `Version` block.** PopupNotifications resets a config with no version (or one below
0.2.0) to its defaults when it loads, which would undo the banner.
- The key `noticiation` is PopupNotifications' own spelling. Leave it as it is.
- **The installer and the Pterodactyl egg write this for you**, but only where the file is missing
or is still exactly the plugin's own defaults (D328). A config with any setting changed is kept
whole, so a look you chose is never replaced. See [`INSTALL.md`](INSTALL.md).
---
## 3. When it does not work