Remove T5 bank and database modules and standardize script names
This commit is contained in:
+70
-134
@@ -1,9 +1,8 @@
|
||||
# tws-t5-aio
|
||||
# TWS T5 Zombies scripts
|
||||
|
||||
Custom HUD + persistent bank + AFK toggle + immediate join + lobby lock + game telemetry + map records for Plutonium T5
|
||||
(Black Ops 1) zombies dedicated servers. Split across nine `.gsc` files,
|
||||
each installable / removable in isolation (with `tws_common` as the shared
|
||||
hub).
|
||||
Custom HUD + AFK toggle + immediate join + lobby lock + game telemetry + map records for Plutonium T5
|
||||
(Black Ops 1) zombies dedicated servers. Split across seven `.gsc` files,
|
||||
with `tws_t5_common` as the shared hub. Lobby lock also requires the HUD module.
|
||||
|
||||
Platform quirks and deploy commands: [NOTES.md](NOTES.md).
|
||||
|
||||
@@ -11,19 +10,30 @@ Platform quirks and deploy commands: [NOTES.md](NOTES.md).
|
||||
|
||||
| File | Role |
|
||||
|---|---|
|
||||
| [tws_common.gsc](tws_common.gsc) | Shared config, HUD helpers, `.help`, connect/spawn registries, single `connected` listener + dispatcher |
|
||||
| [tws_db.gsc](tws_db.gsc) | MariaDB pool config + reachability probe |
|
||||
| [tws_hud.gsc](tws_hud.gsc) | Bottom-left HUD stack: timers, zombie count, health bar |
|
||||
| [tws_bank.gsc](tws_bank.gsc) | Persistent per-player bank + console commands |
|
||||
| [tws_afk.gsc](tws_afk.gsc) | `.afk` / `.back` chat toggle + `[AFK]` indicator |
|
||||
| [tws_join.gsc](tws_join.gsc) | `.join` lets newcomers spawn before the current round ends |
|
||||
| [tws_lock.gsc](tws_lock.gsc) | Lobby `g_password` lock at a milestone round |
|
||||
| [tws_telemetry.gsc](tws_telemetry.gsc) | Direct HTTP game start, round, heartbeat, and game end reports |
|
||||
| [tws_leaderboard.gsc](tws_leaderboard.gsc) | Private map high-round record and all tied holders on connection |
|
||||
| [tws_t5_common.gsc](tws_t5_common.gsc) | Shared config, HUD helpers, `.help`, connect/spawn registries, single `connected` listener + dispatcher |
|
||||
| [tws_t5_hud.gsc](tws_t5_hud.gsc) | Bottom-left HUD stack: timers, zombie count, health bar |
|
||||
| [tws_t5_afk.gsc](tws_t5_afk.gsc) | `.afk` / `.back` chat toggle + `[AFK]` indicator |
|
||||
| [tws_t5_join.gsc](tws_t5_join.gsc) | `.join` lets newcomers spawn before the current round ends |
|
||||
| [tws_t5_lock.gsc](tws_t5_lock.gsc) | Lobby `g_password` lock at a milestone round |
|
||||
| [tws_t5_telemetry.gsc](tws_t5_telemetry.gsc) | Direct HTTP game start, round, heartbeat, and game end reports |
|
||||
| [tws_t5_leaderboard.gsc](tws_t5_leaderboard.gsc) | Private map high-round record and all tied holders on connection |
|
||||
|
||||
## Install / upgrade
|
||||
|
||||
Copy `tws_t5_*.gsc` to `storage/t5/scripts/sp/`, then restart the map.
|
||||
When upgrading an existing installation, first remove these old scripts from
|
||||
that directory:
|
||||
|
||||
- `tws_bank.gsc` and `tws_db.gsc` (removed modules)
|
||||
- `tws_common.gsc`, `tws_hud.gsc`, `tws_afk.gsc`, `tws_join.gsc`,
|
||||
`tws_lock.gsc`, `tws_telemetry.gsc` and `tws_leaderboard.gsc` (renamed modules)
|
||||
|
||||
Do not leave both common scripts installed: duplicate connection listeners
|
||||
break T5's connect handshake. Existing dvar names are unchanged.
|
||||
|
||||
## Map record announcements
|
||||
|
||||
Copy `tws_leaderboard.gsc` and the updated `tws_common.gsc` to
|
||||
Copy `tws_t5_leaderboard.gsc` and the updated `tws_t5_common.gsc` to
|
||||
`storage/t5/scripts/sp/`, then restart the map. Leaderboard requires a
|
||||
[t5-gsc-utils](https://github.com/alicealys/t5-gsc-utils) build exposing
|
||||
`http::request`, `jsonParse`, `typeof` and `formatString`. A plugin upgrade
|
||||
@@ -31,7 +41,7 @@ requires a full server-process restart. To omit leaderboard, remove its script;
|
||||
the enable dvar does not bypass native linking dependencies.
|
||||
|
||||
Records are read from the public Electric Cherry API with no credentials and
|
||||
work independently of telemetry, HUD and the bank. Spectator newcomers receive
|
||||
work independently of telemetry and HUD. Spectator newcomers receive
|
||||
the same private announcement as playable joins. T5 matches its engine map to
|
||||
the API's map list. [Shared configuration, caching and validation](../README.md#map-record-announcements)
|
||||
apply to both games.
|
||||
@@ -52,62 +62,55 @@ counter and health display. Typing `.help` again restarts that display time.
|
||||
| `.join` | Join mid-round (newcomers only) |
|
||||
|
||||
Each module registers its own help entries; removing AFK or join also removes
|
||||
those entries from `.help` after a map restart. The bank's `bank`, `deposit`, and
|
||||
`withdraw` commands are server-console commands and are not listed in chat help.
|
||||
those entries from `.help` after a map restart.
|
||||
|
||||
## Dependency graph
|
||||
|
||||
Arrows read "depends on" — solid means the source names the target with
|
||||
`scripts\sp\tws_common::...`, dashed means the source waits on a level
|
||||
notify fired by the target. Transitive edges are elided (so `tws_bank`
|
||||
and `tws_lock` reach `tws_common` through `tws_db` / `tws_hud` on the
|
||||
graph, but they also call `tws_common` directly).
|
||||
`scripts\sp\tws_t5_common::...`, dashed means the source waits on a level
|
||||
notify fired by the target.
|
||||
|
||||
```mermaid
|
||||
graph BT
|
||||
common[tws_common<br/><i>config + helpers + dispatcher</i>]
|
||||
common[tws_t5_common<br/><i>config + helpers + dispatcher</i>]
|
||||
|
||||
db[tws_db]
|
||||
hud[tws_hud]
|
||||
afk[tws_afk]
|
||||
join[tws_join]
|
||||
bank[tws_bank]
|
||||
lock[tws_lock]
|
||||
telemetry[tws_telemetry]
|
||||
leaderboard[tws_leaderboard]
|
||||
hud[tws_t5_hud]
|
||||
afk[tws_t5_afk]
|
||||
join[tws_t5_join]
|
||||
lock[tws_t5_lock]
|
||||
telemetry[tws_t5_telemetry]
|
||||
leaderboard[tws_t5_leaderboard]
|
||||
|
||||
db --> common
|
||||
hud --> common
|
||||
afk --> common
|
||||
join --> common
|
||||
lock --> common
|
||||
telemetry --> common
|
||||
leaderboard --> common
|
||||
|
||||
bank -. db_probe_done .-> db
|
||||
lock -. hud_round_changed<br/>hud_game_over .-> hud
|
||||
```
|
||||
|
||||
- `tws_common` is the only module named by other files at compile time.
|
||||
- `tws_t5_common` is the only module named by other files at compile time.
|
||||
- All other cross-module coupling flows through level notifies
|
||||
(`db_probe_done`, `hud_round_changed`, `hud_match_started`,
|
||||
(`hud_round_changed`, `hud_match_started`,
|
||||
`hud_game_over`) or through spawn handlers registered with
|
||||
`tws_common::register_spawn_handler` / `register_connect_handler`.
|
||||
- Any file except `tws_common` can be removed; the rest still load.
|
||||
`tws_afk` has no downstream consumers — pull it independently.
|
||||
`tws_bank` needs `tws_db`; `tws_lock` needs `tws_hud`.
|
||||
`tws_t5_common::register_spawn_handler` / `register_connect_handler`.
|
||||
- Any file except `tws_t5_common` can be removed; the rest still load.
|
||||
`tws_t5_afk` has no downstream consumers — pull it independently.
|
||||
`tws_t5_lock` needs `tws_t5_hud` to receive round and game-over notifications.
|
||||
|
||||
## Runtime notifies
|
||||
|
||||
| Notify | Fired by | Read by |
|
||||
|---|---|---|
|
||||
| `db_probe_done` | `tws_db` | `tws_bank` (via `bank_deferred_start`) |
|
||||
| `hud_round_changed` | `tws_hud` | `tws_hud` (round-timer reset), `tws_lock` |
|
||||
| `hud_match_started` | `tws_hud` | `tws_hud` (match-timer reveal) |
|
||||
| `hud_game_over` | `tws_hud` | `tws_hud` (freeze timers), `tws_lock` (clear password) |
|
||||
| `hud_round_changed` | `tws_t5_hud` | `tws_t5_hud` (round-timer reset), `tws_t5_lock` |
|
||||
| `hud_match_started` | `tws_t5_hud` | `tws_t5_hud` (match-timer reveal) |
|
||||
| `hud_game_over` | `tws_t5_hud` | `tws_t5_hud` (freeze timers), `tws_t5_lock` (clear password) |
|
||||
|
||||
---
|
||||
|
||||
## tws_common.gsc
|
||||
## tws_t5_common.gsc
|
||||
|
||||
Hub file. Shared config, HUD helpers, spawn-handler registry, and the
|
||||
single `level waittill("connected")` in the fleet. Adding a second
|
||||
@@ -153,31 +156,7 @@ connect listener anywhere else crashes the T5 SP handshake.
|
||||
|
||||
---
|
||||
|
||||
## tws_db.gsc
|
||||
|
||||
**Features**
|
||||
- One MariaDB connection pool for the whole script (used by bank now,
|
||||
leaderboard later)
|
||||
- Reachability probe: round-trips `SELECT 1` and flips `level.db_online`
|
||||
- Fires `db_probe_done` so waiters can proceed regardless of outcome
|
||||
|
||||
**Provides**
|
||||
| Level var / notify | Meaning |
|
||||
|---|---|
|
||||
| `level.db_online` | `true` iff the probe query returned without error |
|
||||
| `level.db_probe_done` | `true` once the probe has completed (either way) |
|
||||
| notify `db_probe_done` | Fired once after probe completion |
|
||||
|
||||
**Depends on**
|
||||
- `scripts\sp\tws_common::ensure_config()`
|
||||
- `t5-gsc-utils` (`mysql::set_config`, `mysql::query`)
|
||||
|
||||
**Config (currently hardcoded — TODO: dvarize before repo goes public)**
|
||||
- Host `mariadb`, port `3306`, DB `tws_zm`, user `josh`, password `joshster`
|
||||
|
||||
---
|
||||
|
||||
## tws_hud.gsc
|
||||
## tws_t5_hud.gsc
|
||||
|
||||
Bottom-left cluster. Per-player elements spawn via `::hud_start`.
|
||||
|
||||
@@ -201,56 +180,17 @@ Spawn handler registered: `::hud_start` — threads `hud_timer_row`,
|
||||
`hud_zombie_counter`, `hud_health_display`.
|
||||
|
||||
**Depends on**
|
||||
- `scripts\sp\tws_common::` — `ensure_config`, `make_text_elem`,
|
||||
- `scripts\sp\tws_t5_common::` — `ensure_config`, `make_text_elem`,
|
||||
`make_shader_elem`, `destroy_on_disconnect`, `format_mmss`,
|
||||
`register_spawn_handler`
|
||||
- Every `level.hud_*` config value from `tws_common`
|
||||
- Every `level.hud_*` config value from `tws_t5_common`
|
||||
- Stock BO1 state: `level.round_number`, `level.zombie_total`,
|
||||
`level.players`, `self.health`, `self.maxhealth`, `self.name` /
|
||||
`self.playername`, AI entities' `.animname` and `.ignore_enemy_count`
|
||||
|
||||
---
|
||||
|
||||
## tws_bank.gsc
|
||||
|
||||
Persistent per-player bank. Balances survive server hops within the fleet
|
||||
because rows are keyed on XUID.
|
||||
|
||||
**Features**
|
||||
- Server-console commands: `bank`, `deposit <amount>`, `withdraw <amount>`
|
||||
- DB-first / memory-second: `self.bank` and `self.score` only move after
|
||||
the DB write confirms
|
||||
- Deposits: `INSERT ... ON DUPLICATE KEY UPDATE` — lazy row create, atomic
|
||||
- Withdrawals: `WHERE balance >= ?` — DB blocks overdrafts under concurrency
|
||||
- Score-drift refund guard on deposit
|
||||
- `bank_load` currently a **diagnostic stub** (bare-minimum to isolate the
|
||||
connect-handshake crash — do not restore the stripped body until it passes
|
||||
join)
|
||||
|
||||
**Provides**
|
||||
| Command | Args | Effect |
|
||||
|---|---|---|
|
||||
| `bank` | — | Prints current `Bank` and `Score` to the caller |
|
||||
| `deposit` | `<amount>` | Score → bank, DB-first with refund on race |
|
||||
| `withdraw` | `<amount>` | Bank → score, DB-first with overdraft guard |
|
||||
|
||||
Per-player state: `self.bank` (int), `self.bank_unavailable` (bool),
|
||||
`self.bank_guid` (set in the full impl — currently unset by the stub).
|
||||
|
||||
**Depends on**
|
||||
- `scripts\sp\tws_common::` — `ensure_config`, `register_spawn_handler`
|
||||
- `tws_db` — waits on `db_probe_done`, gates on `level.db_online`
|
||||
- `t5-gsc-utils` — `mysql::query`, `mysql::prepared_statement`,
|
||||
`command::add_sv`
|
||||
- Stock BO1: `self.score`
|
||||
- Dvar: `tws_server_id` (optional; labels `last_server` on bank rows)
|
||||
- External: MariaDB schema — `bank(guid, balance, last_name, last_server)`
|
||||
|
||||
Spawn handler registered: `::bank_load`.
|
||||
|
||||
---
|
||||
|
||||
## tws_afk.gsc
|
||||
## tws_t5_afk.gsc
|
||||
|
||||
Self-invoked pause mode. Owns the `[AFK]` indicator element entirely — HUD
|
||||
module has zero knowledge of AFK.
|
||||
@@ -271,7 +211,7 @@ module has zero knowledge of AFK.
|
||||
- Level var: `level.afk_grace_seconds` (default 2)
|
||||
|
||||
**Depends on**
|
||||
- `scripts\sp\tws_common::` — `ensure_config`, `make_text_elem`,
|
||||
- `scripts\sp\tws_t5_common::` — `ensure_config`, `make_text_elem`,
|
||||
`destroy_on_disconnect`, `register_spawn_handler`, `register_help_command`
|
||||
- Shared config: `level.hud_x`, `level.hud_row_match`,
|
||||
`level.hud_font_small`, `level.hud_c_afk`
|
||||
@@ -282,10 +222,10 @@ Spawn handler registered: `::afk_spawn`.
|
||||
|
||||
---
|
||||
|
||||
## tws_join.gsc
|
||||
## tws_t5_join.gsc
|
||||
|
||||
Type `.join` in chat while spectating after joining a match in progress to
|
||||
spawn immediately. Install with `tws_common.gsc`; no HUD or DB dependency.
|
||||
spawn immediately. Install with `tws_t5_common.gsc`; no HUD dependency.
|
||||
|
||||
**Eligibility**
|
||||
|
||||
@@ -323,7 +263,7 @@ and [spawn entry point](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/
|
||||
|
||||
---
|
||||
|
||||
## tws_lock.gsc
|
||||
## tws_t5_lock.gsc
|
||||
|
||||
**Features**
|
||||
- Sets `g_password` to a random per-lobby value when the round crosses a
|
||||
@@ -339,8 +279,8 @@ and [spawn entry point](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/
|
||||
| `level.lock_active` | `true` after the password has been set |
|
||||
|
||||
**Depends on**
|
||||
- `scripts\sp\tws_common::` — `ensure_config`, `int_dvar_or`
|
||||
- `tws_hud` — waits on `hud_round_changed` and `hud_game_over`
|
||||
- `scripts\sp\tws_t5_common::` — `ensure_config`, `int_dvar_or`
|
||||
- `tws_t5_hud` — waits on `hud_round_changed` and `hud_game_over`
|
||||
- Stock BO1: `level.round_number`
|
||||
- Dvar: `tws_lock_round` (int, default `20`)
|
||||
|
||||
@@ -351,17 +291,17 @@ and [spawn entry point](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/
|
||||
| Dvar | Consumer | Default | Purpose |
|
||||
|---|---|---|---|
|
||||
| `zombiemode` | every module | — | Gate: every `init()` returns early unless `"1"` |
|
||||
| `tws_lock_round` | `tws_lock` | `20` | Round at which the lobby locks |
|
||||
| `tws_server_id` | `tws_bank`, `tws_telemetry` | Required for telemetry | Exact registered Electric Cherry server name; also used as the bank label |
|
||||
| `tws_telemetry_enabled` | `tws_telemetry` | `1` | Set to `0` to disable telemetry at init |
|
||||
| `tws_telemetry_url` | `tws_telemetry` | `https://ec.thewrightserver.net/api/telemetry` | Electric Cherry telemetry endpoint for JSON POSTs |
|
||||
| `tws_telemetry_log_level` | `tws_telemetry` | `1` | Read live: `0` warnings/errors/recovery only, `1` lifecycle/request/health logs, `2` also capture/queue logs and response previews |
|
||||
| `tws_lock_round` | `tws_t5_lock` | `20` | Round at which the lobby locks |
|
||||
| `tws_server_id` | `tws_t5_telemetry` | Required for telemetry | Exact registered Electric Cherry server name |
|
||||
| `tws_telemetry_enabled` | `tws_t5_telemetry` | `1` | Set to `0` to disable telemetry at init |
|
||||
| `tws_telemetry_url` | `tws_t5_telemetry` | `https://ec.thewrightserver.net/api/telemetry` | Electric Cherry telemetry endpoint for JSON POSTs |
|
||||
| `tws_telemetry_log_level` | `tws_t5_telemetry` | `1` | Read live: `0` warnings/errors/recovery only, `1` lifecycle/request/health logs, `2` also capture/queue logs and response previews |
|
||||
|
||||
## tws_telemetry.gsc
|
||||
## tws_t5_telemetry.gsc
|
||||
|
||||
Uses `t5-gsc-utils` HTTP/JSON components to POST directly to Electric Cherry's
|
||||
`/api/telemetry`. Install alongside `tws_common.gsc` in `storage/t5/scripts/sp/`.
|
||||
No HUD or database dependency. Reports run whether or not a beta is active.
|
||||
`/api/telemetry`. Install alongside `tws_t5_common.gsc` in `storage/t5/scripts/sp/`.
|
||||
No HUD dependency. Reports run whether or not a beta is active.
|
||||
Follow the shared [authentication setup](../README.md#telemetry-authentication-t5-and-t6)
|
||||
to configure the service before upgrading. The reporter token is embedded in
|
||||
`level.telemetry_token`; it must match the service's `EC_TELEMETRY_TOKEN`. Short
|
||||
@@ -503,7 +443,7 @@ and [score tracking](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/Com
|
||||
4. Delay HTTP completion while rounds advance and the match ends. Verify
|
||||
requests remain ordered and retain the stats captured at each event.
|
||||
With the API unreachable, verify transport-error logging and continued
|
||||
gameplay. Repeat without an active beta and with HUD/DB modules removed.
|
||||
gameplay. Repeat without an active beta and with the HUD module removed.
|
||||
5. Stay in one round for over a minute. Verify heartbeats at 30 and 60 seconds
|
||||
after start, with current stats and the same fields as `round_change`.
|
||||
Check that round changes and joins do not reset or duplicate the interval,
|
||||
@@ -522,11 +462,7 @@ and [score tracking](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/Com
|
||||
|
||||
## External dependencies
|
||||
|
||||
- **[t5-gsc-utils](https://github.com/alicealys/t5-gsc-utils)** — required.
|
||||
`tws_db` and `tws_bank` need the `mysql::` namespace; `tws_bank` also
|
||||
needs `command::add_sv`.
|
||||
- **MariaDB / MySQL server** reachable from the Plutonium container as
|
||||
`mariadb:3306` (currently hardcoded — see `tws_db.gsc`).
|
||||
- **Schema** — `bank(guid VARCHAR PRIMARY KEY, balance INT, last_name
|
||||
VARCHAR, last_server VARCHAR)`. `tws_bank` lazily inserts rows on first
|
||||
deposit.
|
||||
[t5-gsc-utils](https://github.com/alicealys/t5-gsc-utils) is required for telemetry
|
||||
and leaderboard HTTP, JSON, type and string helpers. Install a build exposing
|
||||
the natives listed in each module's documentation, then restart the server
|
||||
process. No database is required.
|
||||
|
||||
Reference in New Issue
Block a user