Compare commits
4 Commits
159eb53e73
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2719716c9c | |||
| 8f96dde7ee | |||
| 5deaf74049 | |||
| 0a7d138daa |
31
README.md
31
README.md
@@ -12,7 +12,7 @@ Players get the same public content and self-service on the web **or** a native
|
|||||||
The platform itself knows nothing about any particular game. Everything game-specific —
|
The platform itself knows nothing about any particular game. Everything game-specific —
|
||||||
routes, tables, pages, navigation, notifications — arrives as an installable **module**,
|
routes, tables, pages, navigation, notifications — arrives as an installable **module**,
|
||||||
installed from the admin panel with nothing to build. *Ultima Online* (ServUO) is the
|
installed from the admin panel with nothing to build. *Ultima Online* (ServUO) is the
|
||||||
first game, and one installer sets up its shard side.
|
first game, *Rust* (Oxide and Carbon) the second, and one installer sets up the game side of either.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ first game, and one installer sets up its shard side.
|
|||||||
|
|
||||||
## The pieces
|
## The pieces
|
||||||
|
|
||||||
Runic Gateway is eight repositories that deploy together but build independently.
|
Runic Gateway is thirteen repositories that deploy together but build independently.
|
||||||
|
|
||||||
**The platform** — the same for every game:
|
**The platform** — the same for every game:
|
||||||
|
|
||||||
@@ -30,6 +30,7 @@ Runic Gateway is eight repositories that deploy together but build independently
|
|||||||
| [**Android-app**](https://gitea.whitlocktech.com/RunicGateway/Android-app) | Kotlin (Jetpack Compose) | The **native Android client** — public content + player self-service, purely an API client of the website backend. Same features as the browser client *minus* every admin console. Never touches a game server. |
|
| [**Android-app**](https://gitea.whitlocktech.com/RunicGateway/Android-app) | Kotlin (Jetpack Compose) | The **native Android client** — public content + player self-service, purely an API client of the website backend. Same features as the browser client *minus* every admin console. Never touches a game server. |
|
||||||
| [**docs**](https://gitea.whitlocktech.com/RunicGateway/docs) | Markdown | All project documentation — design docs, the module contract, the wire-protocol spec, the integration guide, the Android plan, research. Start here when you want the *why*. |
|
| [**docs**](https://gitea.whitlocktech.com/RunicGateway/docs) | Markdown | All project documentation — design docs, the module contract, the wire-protocol spec, the integration guide, the Android plan, research. Start here when you want the *why*. |
|
||||||
| [**Integration-kit**](https://gitea.whitlocktech.com/RunicGateway/Integration-kit) | Markdown + a buildable template | **How to put a *different* game on a Runic Gateway site.** A four-chapter book and a module template that builds and loads. Read this if your game is not Ultima Online. |
|
| [**Integration-kit**](https://gitea.whitlocktech.com/RunicGateway/Integration-kit) | Markdown + a buildable template | **How to put a *different* game on a Runic Gateway site.** A four-chapter book and a module template that builds and loads. Read this if your game is not Ultima Online. |
|
||||||
|
| [**runicgateway.com**](https://gitea.whitlocktech.com/RunicGateway/runicgateway.com) | Astro | The platform's own **public site** at [runicgateway.com](https://runicgateway.com) — what Runic Gateway is, how to install it, and the developer docs. Not a game site. |
|
||||||
|
|
||||||
**Ultima Online support** — the first game, and the worked example everything else is measured against:
|
**Ultima Online support** — the first game, and the worked example everything else is measured against:
|
||||||
|
|
||||||
@@ -40,6 +41,15 @@ Runic Gateway is eight repositories that deploy together but build independently
|
|||||||
| [**servuo-plugins**](https://gitea.whitlocktech.com/RunicGateway/servuo-plugins) | C# | The **ServUO plugin** — the shard side of the bridge. Compiled by ServUO at boot; dials the sidecar over loopback and emits game events / accepts commands. |
|
| [**servuo-plugins**](https://gitea.whitlocktech.com/RunicGateway/servuo-plugins) | C# | The **ServUO plugin** — the shard side of the bridge. Compiled by ServUO at boot; dials the sidecar over loopback and emits game events / accepts commands. |
|
||||||
| [**installer**](https://gitea.whitlocktech.com/RunicGateway/installer) | Rust | The **installer** — one binary per OS that deploys the plugin and the sidecar onto a shard host as a matched, protocol-checked pair, registers the service, and hands you the values the website needs. How you set a shard up. |
|
| [**installer**](https://gitea.whitlocktech.com/RunicGateway/installer) | Rust | The **installer** — one binary per OS that deploys the plugin and the sidecar onto a shard host as a matched, protocol-checked pair, registers the service, and hands you the values the website needs. How you set a shard up. |
|
||||||
|
|
||||||
|
**Rust support** — the second game, the same three layers, built from the Integration-kit:
|
||||||
|
|
||||||
|
| Repo | Language | What it is |
|
||||||
|
|------|----------|------------|
|
||||||
|
| [**Module-Rust**](https://gitea.whitlocktech.com/RunicGateway/Module-Rust) | JavaScript (Node + React) | The **Rust module** — everything that makes a site a site for Rust. Installed into a website as `modules/rust/`; released as a versioned bundle. |
|
||||||
|
| [**Rust-Link**](https://gitea.whitlocktech.com/RunicGateway/Rust-Link) | Rust | The **rust-link** sidecar — the Rust mirror of uo-link: terminates the game plugin's loopback link and serves the WebSocket + REST API the website consumes. Ships a Pterodactyl egg. |
|
||||||
|
| [**Rust-Plugins**](https://gitea.whitlocktech.com/RunicGateway/Rust-Plugins) | C# | The **bridge plugin** for Oxide and Carbon — the game side of the bridge. Dials the sidecar over loopback. |
|
||||||
|
| [**runicnpc-rust**](https://gitea.whitlocktech.com/RunicGateway/runicnpc-rust) | C# | **RunicNPC** — Runic Gateway's own NPC plugin for Rust: an API other plugins call and in-game admin commands, with NPCs equipped through Kits. Works on its own too. *In development.* |
|
||||||
|
|
||||||
## How they fit together
|
## How they fit together
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -79,6 +89,16 @@ Three layers, and the shape is the same for any game:
|
|||||||
the widest audience a rule may ever be given — so a sensitive game event cannot be mailed to
|
the widest audience a rule may ever be given — so a sensitive game event cannot be mailed to
|
||||||
everyone by a misconfiguration. A module brings its own triggers: for Ultima Online that is
|
everyone by a misconfiguration. A module brings its own triggers: for Ultima Online that is
|
||||||
a house about to collapse, a vendor running out of gold, a champion spawn, a new governor.
|
a house about to collapse, a vendor running out of gold, a champion spawn, a new governor.
|
||||||
|
- **Staff can put an event on the calendar and let it run itself.** An event is written once
|
||||||
|
as phases and steps, published as an immutable version, and executed unattended — announcing
|
||||||
|
itself, spawning what it needs, borrowing values the world already had, counting who took
|
||||||
|
part and publishing the results. Everything it may do arrives **switched off**, every run
|
||||||
|
spends against per-run caps enforced in the database rather than in a role check, and every
|
||||||
|
world write is ledgered so the undo is **generated rather than authored** and runs on
|
||||||
|
completion, cancellation and abort alike. An event does not edit the world; it holds a
|
||||||
|
**lease** the game restores on its own deadline — even if the site never speaks to it again.
|
||||||
|
The game keeps its own switch: scheduled events are off in `Bridge.cfg` until an operator
|
||||||
|
turns them on, separately from the staff write plane.
|
||||||
- **Accounts are hardened out of the box** — TOTP two-factor with trusted devices, optional
|
- **Accounts are hardened out of the box** — TOTP two-factor with trusted devices, optional
|
||||||
SSO (Google / Discord / any OIDC provider, link-only: an external identity must already
|
SSO (Google / Discord / any OIDC provider, link-only: an external identity must already
|
||||||
belong to an account), bot scoring with automatic IP bans, and rate limiting.
|
belong to an account), bot scoring with automatic IP bans, and rate limiting.
|
||||||
@@ -142,11 +162,11 @@ Ultima Online that manifest is `module-uo-<version>.json` from the
|
|||||||
[Module-uo releases](https://gitea.whitlocktech.com/RunicGateway/Module-uo/releases):
|
[Module-uo releases](https://gitea.whitlocktech.com/RunicGateway/Module-uo/releases):
|
||||||
|
|
||||||
```
|
```
|
||||||
https://gitea.whitlocktech.com/RunicGateway/Module-uo/releases/download/v1.1.0/module-uo-1.1.0.json
|
https://gitea.whitlocktech.com/RunicGateway/Module-uo/releases/download/v1.2.2/module-uo-1.2.2.json
|
||||||
```
|
```
|
||||||
|
|
||||||
A compose-managed host can declare the set instead of clicking, with
|
A compose-managed host can declare the set instead of clicking, with
|
||||||
`MODULES=uo@1.1.0=<that URL>` — resolution at container start is idempotent and offline-safe,
|
`MODULES=uo@1.2.2=<that URL>` — resolution at container start is idempotent and offline-safe,
|
||||||
so a restart with the network down brings the site up exactly as it was.
|
so a restart with the network down brings the site up exactly as it was.
|
||||||
|
|
||||||
> **The module system shipped on 2026-08-12** and this is now simply how the site works — a
|
> **The module system shipped on 2026-08-12** and this is now simply how the site works — a
|
||||||
@@ -184,7 +204,7 @@ unprivileged account, and finishes by printing the four values to paste into **A
|
|||||||
```
|
```
|
||||||
Base URL http://<shard-host>:8080
|
Base URL http://<shard-host>:8080
|
||||||
WebSocket URL ws://<shard-host>:8080/ws
|
WebSocket URL ws://<shard-host>:8080/ws
|
||||||
Protocol version 5
|
Protocol version 7
|
||||||
Auth token 4f9c…
|
Auth token 4f9c…
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -225,6 +245,7 @@ and the design contract in [`docs/android/PLAN.md`](https://gitea.whitlocktech.c
|
|||||||
- **Setting up a shard** → [`docs/installer/INSTALL.md`](https://gitea.whitlocktech.com/RunicGateway/docs/src/branch/main/installer/INSTALL.md) — the operator guide: what the run asks, where it writes, the patch tier, `doctor` / `update` / `uninstall`, troubleshooting, and the by-hand path.
|
- **Setting up a shard** → [`docs/installer/INSTALL.md`](https://gitea.whitlocktech.com/RunicGateway/docs/src/branch/main/installer/INSTALL.md) — the operator guide: what the run asks, where it writes, the patch tier, `doctor` / `update` / `uninstall`, troubleshooting, and the by-hand path.
|
||||||
- **Running / customizing the site** → [website README](https://gitea.whitlocktech.com/RunicGateway/website) (tech stack, API endpoints, env vars, security, branding, Swagger at `/api/docs`).
|
- **Running / customizing the site** → [website README](https://gitea.whitlocktech.com/RunicGateway/website) (tech stack, API endpoints, env vars, security, branding, Swagger at `/api/docs`).
|
||||||
- **The Android client** → [Android-app README](https://gitea.whitlocktech.com/RunicGateway/Android-app) and [`docs/android/PLAN.md`](https://gitea.whitlocktech.com/RunicGateway/docs) — the authoritative design contract, milestones, and the push-notification architecture.
|
- **The Android client** → [Android-app README](https://gitea.whitlocktech.com/RunicGateway/Android-app) and [`docs/android/PLAN.md`](https://gitea.whitlocktech.com/RunicGateway/docs) — the authoritative design contract, milestones, and the push-notification architecture.
|
||||||
|
- **The event system** → [`docs/website/EVENTS.md`](https://gitea.whitlocktech.com/RunicGateway/docs/src/branch/main/website/EVENTS.md) — the design of record: leases, the resource ledger, the caps, and the module seam an event's world verbs arrive through.
|
||||||
- **The bridge internals** → [docs](https://gitea.whitlocktech.com/RunicGateway/docs) — design docs, the canonical wire-protocol spec, and the integration guide.
|
- **The bridge internals** → [docs](https://gitea.whitlocktech.com/RunicGateway/docs) — design docs, the canonical wire-protocol spec, and the integration guide.
|
||||||
- **Working on the sidecar or plugin** → [link README](https://gitea.whitlocktech.com/RunicGateway/link) and [servuo-plugins](https://gitea.whitlocktech.com/RunicGateway/servuo-plugins) — building from source, the loopback protocol, and the compatibility rules.
|
- **Working on the sidecar or plugin** → [link README](https://gitea.whitlocktech.com/RunicGateway/link) and [servuo-plugins](https://gitea.whitlocktech.com/RunicGateway/servuo-plugins) — building from source, the loopback protocol, and the compatibility rules.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user