210 lines
11 KiB
Markdown
210 lines
11 KiB
Markdown
# TWS T6 Zombies scripts
|
||
|
||
Plutonium T6 versions of the T5 server scripts. Defaults live in the scripts,
|
||
just like T5. The telemetry token is embedded in the reporter script; no
|
||
separate telemetry token config is required. The optional bank needs its own
|
||
private server token.
|
||
|
||
| File | Role | Dependencies |
|
||
| --- | --- | --- |
|
||
| `tws_t6_common.gsc` | Shared HUD values, helpers, `.help`, connection and first-spawn dispatchers | Stock T6 |
|
||
| `tws_t6_hud.gsc` | Top-left Discord URL, match/round timers, name, zombie count and health bar | Common |
|
||
| `tws_t6_afk.gsc` | `.afk` / `.back`, protection, movement and weapon blocking | Common |
|
||
| `tws_t6_lock.gsc` | Lock at round 20; clear password on game over | Common, HUD |
|
||
| `tws_t6_telemetry.gsc` | Async queued game reports (game_start/heartbeat/round_change/game_end) | tws-t6-gsc-utils |
|
||
| `tws_t6_join.gsc` | `.join` chat command lets a spectator newcomer enter mid-match once | Common |
|
||
| `tws_t6_leaderboard.gsc` | Private map high-round record and every tied holder on connection | Common, tws-t6-gsc-utils |
|
||
| `tws_t6_bank.gsc` | Persistent shared GUID bank | Common, telemetry, TWS plugin 1.1.0 |
|
||
|
||
## Install
|
||
|
||
1. Copy all eight `tws_t6_*.gsc` files into
|
||
`Plutonium/storage/t6/scripts/zm/`. Update common along with leaderboard.
|
||
2. For telemetry, leaderboard or bank, install the [tws-t6-gsc-utils build](../plugins/README.md), based on upstream v3.1.1,
|
||
in `Plutonium/plugins/` and restart the server process. The other five scripts
|
||
do not require that plugin.
|
||
3. Ensure the API service's `EC_TELEMETRY_TOKEN` matches the token embedded in
|
||
the reporter; see [authentication setup](../../README.md#telemetry-authentication-t5-and-t6).
|
||
4. Restart the map to load script updates.
|
||
|
||
If upgrading from the earlier leaderboard filename, **remove
|
||
`tws_leaderboard.gsc` from the T6 server script directory** before installing
|
||
`tws_t6_leaderboard.gsc`, so both copies do not load.
|
||
|
||
If upgrading from the old direct-database bank, remove `tws_t6_db.gsc` and
|
||
replace the old `tws_t6_bank.gsc` with this release's file. Remove any
|
||
`exec server.example.cfg` added for that legacy version; configure the new
|
||
Electric Cherry bank using the private per-server token described below.
|
||
|
||
Source `.gsc` files load directly under Plutonium's
|
||
[documented T6 script layout](https://plutonium.pw/docs/modding/loading-mods/).
|
||
Keep the filenames and `scripts/zm` location so shared references resolve.
|
||
To omit telemetry, remove its script; disabling it at runtime does not remove
|
||
its plugin dependency during linking. The same rule applies to leaderboard.
|
||
|
||
## Player bank
|
||
|
||
The optional `tws_t6_bank.gsc` adds `.b`, `.d <amount|all>` and
|
||
`.w <amount|all>` and registers them in help. It requires common and telemetry
|
||
`1.0.0` or newer, the TWS t6 plugin `1.1.0`, Electric Cherry's bank API and
|
||
a private per-server credential. Follow [bank setup and recovery](../../README.md#player-bank-t5-and-t6),
|
||
including a full process restart for the plugin. Bank `2.0.0` uses only
|
||
`https://ec.thewrightserver.net/api/bank` and ignores `tws_bank_url`.
|
||
Update EC agents to `1.9.1+` first. If the old endpoint differs, follow the
|
||
[endpoint upgrade procedure](../../README.md#upgrading-the-bank-endpoint):
|
||
an EC rebuild must settle legacy journals before the new scripts start.
|
||
When the endpoint already matches, only a map restart is required.
|
||
|
||
## Persistent Discord text
|
||
|
||
The HUD shows `https://discord.thewrightserver.net` in small light-gray text
|
||
at the top-left, including for newcomers waiting in spectator mode. The label
|
||
is created once per connection and persists across death and respawn. The
|
||
gameplay HUD starts one line lower, keeping timers, help and records clear.
|
||
Install HUD and common `1.1.0` together, then restart the map; no plugin update
|
||
or full server-process restart is required.
|
||
|
||
## Map record announcements
|
||
|
||
`tws_t6_leaderboard.gsc` reads the public Electric Cherry API without credentials.
|
||
It works independently of telemetry and HUD, and privately announces records
|
||
once per connection, including newcomers waiting in spectator mode.
|
||
|
||
Map selection uses stock `level.scr_zm_ui_gametype` and
|
||
`level.scr_zm_map_start_location`, falling back to the corresponding
|
||
`ui_gametype` / `ui_zm_mapstartlocation` dvars when absent. For example,
|
||
`zstandard` + `town` selects `t6:zm_transit:town`, while `zclassic` + `transit`
|
||
selects TranZit. Survival, Grief and Turned variants follow Electric Cherry's
|
||
catalogue. An unknown mode/location is logged instead of guessing from the engine
|
||
map. Use `tws_leaderboard_map_key` for a custom registered selection if needed.
|
||
|
||
The plugin must expose `httpPost` (with the GET method override), `jsonParse`,
|
||
`typeof` and `formatString`. [Shared configuration, caching and validation](../../README.md#map-record-announcements)
|
||
apply to both versions. All T6 script filenames use the `tws_t6_` prefix.
|
||
|
||
## Chat commands
|
||
|
||
Type `.help` or `.commands` in chat to see the commands supplied by the loaded TWS modules and
|
||
a short description of each. The list is shown only to the requesting player,
|
||
including spectators who have not spawned. Commands are case-insensitive.
|
||
Help appears below the health bar for 12 seconds, clear of the timers, zombie
|
||
counter and health display. Typing either command again restarts that display time.
|
||
|
||
| Command | Description |
|
||
| --- | --- |
|
||
| `.help`, `.commands` | List available commands |
|
||
| `.afk` | Pause with protection |
|
||
| `.back` | Return from AFK |
|
||
| `.join` | Join mid-round (newcomers only) |
|
||
| `.leaders` | Show the map record again (leaderboard module required) |
|
||
|
||
AFK and Join register their commands during `init()` through
|
||
`tws_t6_common::register_help_command(command, description)`. If a module is
|
||
omitted, its commands are omitted from `.help`. Register new commands alongside
|
||
their module's initialization so the list stays current.
|
||
The enabled leaderboard module registers `.leaders`, which replays the latest
|
||
cached map record privately. Repeating it restarts the record from the first page;
|
||
help temporarily hides the record until its own display ends.
|
||
|
||
## Defaults, matching T5
|
||
|
||
- HUD values live in `tws_t6_common::common_config()`. That function and
|
||
`ensure_config()` came from T5; they initialize in-script values and do not
|
||
load a config file. The requested fullscreen corner alignment is retained.
|
||
- AFK uses T5's native `level waittill("say", message, player)` listener.
|
||
`.back` restores movement and weapons immediately, then ends protection after
|
||
two seconds. The T6 control/weapon fix remains in place.
|
||
- Lock uses T5's HUD round/game-over notifications. Default threshold is 20.
|
||
As in T5, it clears `g_password` at startup and game over.
|
||
- Telemetry is enabled by default and posts to
|
||
`https://ec.thewrightserver.net/api/telemetry`. Set `tws_server_id` to the exact,
|
||
case-sensitive Electric Cherry registry name; missing or overlong names
|
||
disable reporting with a console diagnostic. An embedded token matching the service's
|
||
`EC_TELEMETRY_TOKEN` (at least 32 characters) and an HTTPS URL are required as well.
|
||
|
||
The dvars already present in T5 are still supported: `tws_lock_round`,
|
||
`tws_server_id`, `tws_telemetry_url`, and `tws_telemetry_enabled` (`0` disables
|
||
telemetry). Earlier settings still override defaults; remove any old HTTP URL
|
||
override when upgrading. The reporter token lives in `level.telemetry_token`.
|
||
|
||
## Round telemetry
|
||
|
||
Telemetry runs directly in GSC using tws-t6-gsc-utils. Configure the exact Electric
|
||
Cherry registry name and full endpoint in your existing server configuration:
|
||
|
||
```cfg
|
||
set tws_server_id "t6_zombie_town_1"
|
||
set tws_telemetry_url "https://ec.thewrightserver.net/api/telemetry"
|
||
```
|
||
|
||
The script embeds the reporter token in `level.telemetry_token`; it must match
|
||
the API service's `EC_TELEMETRY_TOKEN` environment variable. Follow the shared
|
||
[authentication setup](../../README.md#telemetry-authentication-t5-and-t6). Every
|
||
request includes `Authorization: Bearer <token>` and `Content-Type:
|
||
application/json`. Token rotation requires updating and redeploying both reporter
|
||
scripts. Token and endpoint changes require a map restart.
|
||
|
||
It sends four event types over the life of a match, mirroring the T5 script:
|
||
|
||
| Event | When | Round in payload |
|
||
| --- | --- | --- |
|
||
| `game_start` | First playable spawn | omitted |
|
||
| `heartbeat` | Every 30s while the match is in progress | current round |
|
||
| `round_change` | Every new positive round | new round |
|
||
| `game_end` | `end_game` / `game_ended` / `intermission` | final round |
|
||
|
||
Each event payload includes `event`, `server`, `map`, `match`, `seq`, `round` (except `game_start`)
|
||
and a `players` array with `name`, `guid`, `kills`, `headshots`, `downs`, `revives`
|
||
and `score` plus `score_total` per player in stat reports. `game_start` includes
|
||
only player identity. `guid` reads Plutonium's `player.guid` engine property
|
||
(T5 uses the `player getGuid()` method — T6 has no such method, but the field is
|
||
equivalent for identity purposes). `kills`/`headshots`/`downs`/`revives` read
|
||
from T6's stock match counters in `player.pers[]`; missing or negative values
|
||
are reported as `0`. `score` is the player's current spendable `player.score`.
|
||
`score_total` reads `player.score_total`, the stock cumulative match score used
|
||
by the final scoreboard. Spending does not reduce it; stock grants can opt out
|
||
of adding to the total. Missing or negative totals report as `0`, independently
|
||
of the balance. Deploy Electric Cherry's receiver support before these scripts;
|
||
older payloads without totals remain valid and their totals are unknown.
|
||
|
||
Stock `end_game` yields before `player_intermission` replaces the balance with
|
||
the total. The reporter serializes both at the first end signal without yielding,
|
||
so retries and replay keep the original balance and total. Custom end sequences
|
||
must emit a supported end signal before overwriting the balance.
|
||
|
||
Delivery uses one in-flight request and a FIFO queue. Every match receives a
|
||
native-generated key; `seq` starts at 1 for `game_start` and increases at capture.
|
||
Start/end snapshots are saved to disk before sending and replayed before the next
|
||
start after map/process restarts. Transport failures, native timeouts, HTTP 429
|
||
and 5xx retain the head with 1–30 second backoff. Other 4xx are terminal. Round
|
||
and heartbeat failures remain best effort; waiting heartbeats collapse to the
|
||
newest snapshot. Acceptance requires 2xx plus the JSON boolean `ok: true`; logs
|
||
include `telemetry.timing.matchId` as `ec_match_id` when available.
|
||
|
||
The TWS plugin still enforces 5-second connection and 15-second transfer deadlines.
|
||
Increase `tws_telemetry_log_level` to `2` for capture/queue/response logging; set to
|
||
`0` for errors and recovery. **Deploy Electric Cherry #144 and the updated native
|
||
plugin before these scripts.** See the shared
|
||
[delivery and rollout notes](../../README.md#telemetry-delivery-and-rollout-t5-and-t6)
|
||
for outbox storage, error handling, limits and live validation.
|
||
|
||
## `.join` for newcomers
|
||
|
||
Late connectors who never got a spawn can type `.join` in chat to leave spectator
|
||
mode before the round ends, once per connection. `.join` is rejected if the player
|
||
has already played, if the game is not running, if no active player is alive, or
|
||
during intermission. The script hooks the stock `spectator_respawn` path via
|
||
`level.custom_spawnplayer`; it does not skip the map-authored spawn callback if
|
||
another mod installed one first.
|
||
|
||
## Validation
|
||
|
||
To compile all eight scripts for T6 PC with gsc-tool:
|
||
|
||
```powershell
|
||
.\tools\check.ps1 -CompilerPath C:\path\to\gsc-tool.exe
|
||
```
|
||
|
||
Compilation does not verify engine/plugin linking or gameplay. T6 differences,
|
||
research sources and live checks are in [NOTES.md](NOTES.md).
|