120 lines
8.4 KiB
Markdown
120 lines
8.4 KiB
Markdown
# 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.
|
|
|
|
Common also listens for `.help` through the native `say` notification, independent
|
|
of first-spawn initialization so newcomers can view commands while spectating.
|
|
Each loaded command module registers its command and description with
|
|
`register_help_command()` during `init()`. Lazy registry initialization preserves
|
|
registrations regardless of module initialization order. Help uses client HUD
|
|
elements below the health bar, sharing the HUD's anchors to avoid overlap with
|
|
timers, zombie count and health numbers. Text is created once per connection and
|
|
reused; each request restarts a 12-second visibility timer. Disconnect cleanup
|
|
is independent of that timer. The command handlers retain their existing listeners.
|
|
|
|
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](https://plutonium.pw/docs/modding/loading-mods/): T6
|
|
source scripts load from `storage/t6/scripts/zm`.
|
|
- [Entry-point lifecycle](https://plutonium.pw/docs/modding/gsc/new-scripting-features/):
|
|
`main()` runs early; `init()` runs after gametype startup. Empty `main()` must
|
|
not call `init()` and duplicate initialization.
|
|
- [Plutonium changelog, r2234](https://plutonium.pw/docs/changelog/): documents T6
|
|
`level waittill("say", message, player)`.
|
|
- [Stock T6 Zombies](https://github.com/plutoniummod/t6-scripts/blob/2d8440321602f22f63f5335817110d60ddf223d5/ZM/Core/maps/mp/zombies/_zm.gsc):
|
|
round state, `end_game`, invulnerability, and stock control resets.
|
|
- [Stock zombie utility](https://github.com/plutoniummod/t6-scripts/blob/2d8440321602f22f63f5335817110d60ddf223d5/ZM/Core/maps/mp/zombies/_zm_utility.gsc):
|
|
map-aware enemy counting.
|
|
- [Released plugin HTTP implementation](https://github.com/alicealys/t6-gsc-utils/blob/v3.1.1/src/component/http.cpp):
|
|
global `httpPost(url, options)` takes an options array with `body` and `headers`.
|
|
Its positional README example does not match this implementation.
|
|
Completion is `done(response, success, error)`; success reports transport only.
|
|
- [Plugin JSON implementation](https://github.com/alicealys/t6-gsc-utils/blob/v3.1.1/src/component/json.cpp):
|
|
`jsonSerialize` handles 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](https://github.com/alicealys/t6-gsc-utils/blob/v3.0.4/src/component/http.cpp)
|
|
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: `tools/check.ps1` compiles all six files for T6 PC and checks shared
|
|
references and entry points. It requires PowerShell and gsc-tool. The `.help`
|
|
change passed the static entry-point/reference checks, but compilation and live
|
|
gameplay were not run. Compiler success does not certify runtime linking.
|
|
|
|
Live checks after deploying:
|
|
|
|
1. Join, late-join, die/respawn, and reconnect: one HUD per player, correct corner
|
|
position, health/Juggernog changes, zombies remaining, timers frozen at game over.
|
|
2. `.afk` blocks movement, shooting and grenades; `.back` restores them. Try rapid
|
|
toggles, a round transition, death/respawn and game over.
|
|
3. Lock fires at the threshold and clears on game over/restart. HUD must be installed.
|
|
T5 semantics intentionally clear an existing password at startup.
|
|
4. 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.
|
|
5. Repeat on the actual server maps, especially afterlife and special-enemy rounds.
|
|
6. Type `.help` and `.HELP` before first spawn, during play and while AFK: see
|
|
`.help`, `.afk`, `.back` and `.join` with descriptions, only on the requesting
|
|
player's screen below the health bar. Take damage so health numbers appear
|
|
and verify they do not overlap help. Repeat the command before 12 seconds
|
|
elapse: one list should remain visible until 12 seconds after the latest
|
|
request. Reopen after expiry and reconnect; verify no duplicates or leftovers.
|
|
Remove the AFK or Join module, restart the map and confirm its commands are
|
|
absent. Restore the modules and confirm `.afk`, `.back` and `.join` still
|
|
behave as before.
|