- Telemetry: async queued game_start/heartbeat/round_change/game_end with sequenced FIFO, watchdog, log-level dvar, and per-player stats snapshot - Join: new tws_t6_join.gsc chat command lets late spectators enter mid-match - Update NOTES/README/check.ps1 to reflect the six-module layout
7.0 KiB
T6 port notes
Baseline: the current files in C:\Users\josh1\Documents\Code\TWS-T5-AIO.
The T5 originals were not modified. DB, bank, their schema and the added example
config have been removed from this project.
Differences retained for T6 and requested fixes
| Area | Difference from T5 | Reason |
|---|---|---|
| Paths | maps/mp/_utility, scripts/zm/tws_t6_common |
T6 namespaces and requested filenames |
| Loading | No T5 zombiemode dvar gate; each module has main() and init() |
Zombies-only folder loading; avoid r5346 missing-main warnings |
| HUD positioning | Fullscreen screen anchors, same 10-unit margin | Requested fix for inset HUD |
| HUD rendering | Precached white shader, local max-health fallback, floating-point ratio, getPlayers() |
T6 rendering/state handling without changing player max health |
| Enemy count | Stock _zm_utility::get_current_zombie_count() plus queued zombies |
Uses the map's zombie team and enemy filters |
| Timers | Seed elapsed time for late joiners; stop round watcher/reset on game over | T6 timer behavior; keep frozen timers frozen |
| AFK | Maintain control freeze, disable guns/grenades, guard player state and stale grace threads | Requested movement/shooting fix; retain .afk / .back and two-second grace |
| Telemetry | Global httpPost(url, options); T5-parity queue + heartbeat + game_start/end + watchdog + log-level dvar; per-player guid sources from Plutonium's player.guid engine property (T5 uses player getGuid() method); per-match kills/headshots/downs/revives fall back to 0 when player.stats[] is unpopulated |
T6 has no getGuid method but exposes the persistent identity as .guid on the player entity; _zm_stats writes only into persistent stat storage, so player.stats[] is not a stock T6 field. Payload keys match T5 for downstream shape parity |
| Join | Port of T5 tws_join.gsc; uses level.spawnplayer / level.custom_spawnplayer (lowercase) and maps\mp\zombies\_zm::spectator_respawn; readiness gated on self.sessionstate == "spectator" instead of T5's self.initialized |
T6 stock spectator respawn hook lives in _zm.gsc; self.initialized is a T5 SP zombiemode marker that T6 stock does not populate the same way |
Common retains the T5 HUD constants, helpers and first-spawn dispatcher.
HUD again owns the hud_game_over notification fan-out. Lock again waits on HUD
notifications, applies T5's random password, and clears it on startup/game over.
The added password-preservation dvars and independent lock watcher are gone.
AFK again listens to the native say notification, so it no longer needs plugin
chat registration. The additional T6 controls are only held while AFK; .back
releases them before the protection grace period. Restoration is deferred during
death/laststand/intermission until active play. Other mods controlling the same
invulnerability or weapon flags can still conflict and need live testing.
The four optional T5 dvars remain; no new configuration switches are introduced.
common_config() and ensure_config() are original T5 in-memory HUD helpers,
not an external configuration system.
Verified primary sources
- Plutonium loading guide: T6
source scripts load from
storage/t6/scripts/zm. - Entry-point lifecycle:
main()runs early;init()runs after gametype startup. Emptymain()must not callinit()and duplicate initialization. - Plutonium changelog, r2234: documents T6
level waittill("say", message, player). - Stock T6 Zombies:
round state,
end_game, invulnerability, and stock control resets. - Stock zombie utility: map-aware enemy counting.
- Released plugin HTTP implementation:
global
httpPost(url, options)takes an options array withbodyandheaders. Its positional README example does not match this implementation. Completion isdone(response, success, error); success reports transport only. - Plugin JSON implementation:
jsonSerializehandles the event payload.
Do not create a dummy http.gsc. An unresolved httpPost/jsonSerialize means
the installed server/plugin must be checked. Installing a DLL requires a full
server-process restart, not just a map restart.
Telemetry reboot investigation
The T5 and T6 implementations are not runtime-verified equivalents. In particular,
T6 plugin v3.0.4
expects httpPost(url, body, headers) and notifies only the response body;
v3.1.1 expects httpPost(url, options) and also provides success/error values.
The current script targets v3.1.1. Switching the function name does not establish
compatibility with an unknown installed DLL.
Console markers identify main, init, round serialization, HTTP invocation,
handle return and completion. They do not log the URL or response body. If startup
fails before main, inspect the first linker/plugin error, not the last supervisor
restart message. If no occupied positive round was observed, this script has not
called JSON serialization or HTTP yet.
Earlier live validation: the operator confirmed successful server startup and Fleet delivery with the original direct reporter. The earlier reboot cause was not established; logging alone should not be treated as a proven fix.
To recover the server while investigating, move tws_t6_telemetry.gsc outside the
autoload directory. The enable dvar cannot bypass unresolved native functions
at link time. The other four TWS modules can run without telemetry.
Checks
Local: all five files pass gsc-tool 1.4.10 T6 PC compilation; shared references and
entry points are checked by tools/check.ps1. No live server was run for this
baseline simplification. Compiler success does not certify runtime linking.
Live checks after deploying:
- Join, late-join, die/respawn, and reconnect: one HUD per player, correct corner position, health/Juggernog changes, zombies remaining, timers frozen at game over.
.afkblocks movement, shooting and grenades;.backrestores them. Try rapid toggles, a round transition, death/respawn and game over.- Lock fires at the threshold and clears on game over/restart. HUD must be installed. T5 semantics intentionally clear an existing password at startup.
- Telemetry sends the initial occupied round and each new round to the existing endpoint. Check server ID/player count, same-round joins and an unreachable API.
- Repeat on the actual server maps, especially afterlife and special-enemy rounds.