343 lines
20 KiB
Markdown
343 lines
20 KiB
Markdown
# Changelog
|
||
|
||
Changes are listed newest first, with an independent version for every individual
|
||
T5/T6 script and each native plugin. Current versions are recorded in
|
||
[versions.json](versions.json); see the [version policy](README.md#versioning).
|
||
|
||
## 2026-10-13
|
||
|
||
### Shorter Discord URL
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_hud.gsc` | `1.1.2` | `t5/scripts/tws_t5_hud.gsc` |
|
||
| `tws_t6_hud.gsc` | `1.1.2` | `t6/scripts/tws_t6_hud.gsc` |
|
||
|
||
- Both games replace the displayed Discord URL with `https://discord.tws.lol`.
|
||
Keep the smaller font and muted gray introduced in the already-uploaded
|
||
`1.1.1` release.
|
||
- Compatibility: no new dependency requirement; matching common `1.1.0+`
|
||
remains required. Deployment: copy each updated HUD script and restart the
|
||
map. No plugin update or full server-process restart is required. No
|
||
deployment of `1.1.2` performed here; GSC compilation and live T5/T6 display
|
||
verification remain required.
|
||
|
||
### More subtle Discord label
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_hud.gsc` | `1.1.1` | `t5/scripts/tws_t5_hud.gsc` |
|
||
| `tws_t6_hud.gsc` | `1.1.1` | `t6/scripts/tws_t6_hud.gsc` |
|
||
|
||
- Both games reduce the top-left Discord URL font scale from `1.4` to `1.2`
|
||
and darken its neutral gray from `(0.85, 0.85, 0.85)` to `(0.65, 0.65, 0.65)`.
|
||
The label keeps its position and connection lifetime; other HUD text is
|
||
unaffected.
|
||
- Compatibility: no new dependency requirement; matching common `1.1.0+`
|
||
remains required. Deployment: copy each updated HUD script and restart the
|
||
map. No plugin update or full server-process restart is required. The user
|
||
reports `1.1.1` has been uploaded; GSC compilation and live T5/T6 appearance
|
||
verification have not been performed here.
|
||
|
||
### Simplified bank balance message
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_bank.gsc` | `2.0.3` | `t5/scripts/tws_t5_bank.gsc` |
|
||
| `tws_t6_bank.gsc` | `2.0.3` | `t6/scripts/tws_t6_bank.gsc` |
|
||
|
||
- Both games now display `.b` as `Bank: {balance} points`, retaining the
|
||
existing colors and omitting the available amount. Update startup version
|
||
reporting and the existing balance-message fixtures. API data and point
|
||
accounting are unchanged.
|
||
- Validation: all 42 portable bank script fixture groups passed with
|
||
`node tools/check_bank.mjs`, including exact balance text for both games.
|
||
- Compatibility: no new dependency requirement; matching TWS plugins `1.2.0+`
|
||
remain required. Deployment: copy each updated bank script and restart the
|
||
map. No plugin update or full server-process restart is required for this
|
||
change. No deployment performed; GSC compilation and live T5/T6 display
|
||
verification remain required.
|
||
|
||
### Bank failure diagnostics — TWS #14
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_bank.gsc` | `2.0.2` | `t5/scripts/tws_t5_bank.gsc` |
|
||
| `tws_t6_bank.gsc` | `2.0.2` | `t6/scripts/tws_t6_bank.gsc` |
|
||
| `t5-plugin` | `1.2.0` | `t5/plugins/tws-t5-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
|
||
| `t6-plugin` | `1.2.0` | `t6/plugins/tws-t6-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
|
||
|
||
- Both engines log startup script/loaded TWS plugin versions, effective endpoint,
|
||
safe server identity, credential format validation and pending journal count.
|
||
Add diagnostic correlation for every HTTP attempt without changing API IDs;
|
||
balance requests keep their empty acknowledgment ID contract.
|
||
- Distinguish creation, transport, HTTP, missing diagnostics, JSON/schema,
|
||
response-ID and application failures, with safe HTTP/curl/timing fields.
|
||
Native acknowledgment parsing adds fixed failure reasons without changing
|
||
existing validity rules. Only known bounded response codes reach logs; never
|
||
log credentials, headers, bodies or native exception contents.
|
||
- Log journal load/write/removal failures and settlement decision, attempts,
|
||
pending duration, next retry delay and resolution. Suppress identical failures
|
||
for 30 seconds, report suppression counts, and log reason changes and recovery
|
||
immediately. Recovered pending duration starts at this map's journal load.
|
||
Preserve points, durable decisions, retry behavior and player-facing messages.
|
||
- Compatibility: both scripts require matching plugin `1.2.0+` for the additive
|
||
`bankVersion()` native and parser reason field. No new EC/agent or third-party
|
||
dependency requirement; existing common/telemetry and migration requirements
|
||
remain. Upstream pins and native loader `plugin_version()` are unchanged.
|
||
- Deployment: build/install both DLLs and **restart the full server processes**;
|
||
install matching scripts, restarting the map if copied after process startup.
|
||
Verify installed DLL/GSC hashes against the release artifacts and startup
|
||
version logs, particularly Ascension's reported stale GSC artifact. No deployment
|
||
performed. Windows DLL builds, GSC compilation and live T5/T6 checks remain
|
||
required; see [bank diagnostics](README.md#bank-diagnostics--tws-14).
|
||
- Validation: 44 portable script fixture groups passed, including actual EC
|
||
bank service/SQLite integration at checkout `d614707`. Fixtures assert safe
|
||
startup/outcome logs, missing diagnostics, HTTP 401, timeout, malformed/schema
|
||
acknowledgments, ID mismatch, storage failures, rate limiting and recovery,
|
||
alongside existing accounting/replay tests. Native parser/storage/process-restart
|
||
and registration-adapter checks run with address/undefined-behavior sanitizers.
|
||
|
||
## 2026-10-12
|
||
|
||
### String bank identities — TWS #15
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_bank.gsc` | `2.0.1` | `t5/scripts/tws_t5_bank.gsc` |
|
||
| `tws_t6_bank.gsc` | `2.0.1` | `t6/scripts/tws_t6_bank.gsc` |
|
||
|
||
- Normalize T5's `player getGuid()` and T6's persistent `player.guid` to
|
||
strings before balance/prepare requests or durable cancel/commit decisions.
|
||
Preserve large and zero-prefixed string GUIDs without numeric conversion.
|
||
Reject missing, unsupported or invalid identities privately before HTTP,
|
||
journaling or score changes, using EC's 1–64 character token contract.
|
||
- Both engines receive the fix. T6 uses the same field as telemetry, populated
|
||
by stock connection initialization; fixtures no longer give T6 a getter shim.
|
||
Other scripts and native plugins are unchanged.
|
||
- Checks: `node tools/check_bank.mjs` covers numeric/string/missing identities,
|
||
balance, prepare, both decisions and exact-body replay after restart.
|
||
Its optional `--ec-root` mode executes the actual EC bank service and bank
|
||
migrations against isolated SQLite, covering the original numeric rejection,
|
||
deposits, withdrawals, zero-balance `.w all`, cancellation and idempotent
|
||
commit recovery. All 34 fixture groups passed with EC checkout `d614707`;
|
||
`python3 tools/test_plugin_bank.py` also passed both engines' native
|
||
storage/response, process-restart and component checks with sanitizers.
|
||
- Compatibility: no new dependency requirement or EC source change. Existing
|
||
plugins `1.1.0`, common/telemetry `1.0.0+`, and EC agent `1.9.1+` remain
|
||
sufficient. Deployment: copy each updated bank script to its game's script
|
||
directory and restart the map; no full server-process restart is required
|
||
for this fix. Continue following the endpoint migration procedure if also
|
||
upgrading from a legacy URL.
|
||
- This fix prevents new invalid journals; it does not rewrite old pending
|
||
decisions. No production recovery or deployment was performed as part of
|
||
this change.
|
||
GSC compilation, deployed-artifact verification and live T5/T6 command checks
|
||
remain required; see [bank identity validation](README.md#bank-identity-validation).
|
||
|
||
### Public game-bank endpoint — TWS #13
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_bank.gsc` | `2.0.0` | `t5/scripts/tws_t5_bank.gsc` |
|
||
| `tws_t6_bank.gsc` | `2.0.0` | `t6/scripts/tws_t6_bank.gsc` |
|
||
|
||
- Use `https://ec.thewrightserver.net/api/bank` for all balance, transfer and
|
||
settlement requests on both engines. Remove the `tws_bank_url` override;
|
||
stale settings are ignored. This configuration removal requires a major bump.
|
||
Keep EC's `tws_server_id` and private per-instance `tws_bank_token` authentication.
|
||
- Both T5 and T6 receive the same behavior with their existing namespaces and
|
||
startup guards. Native plugins and other scripts need no source changes.
|
||
- Compatibility: requires companion EC agent `1.9.1+` to recognize public and
|
||
legacy controller-derived journals during authenticated teardown settlement.
|
||
Existing plugin `1.1.0`, common `1.0.0+` and telemetry `1.0.0+` remain sufficient;
|
||
no new native API or third-party dependency requirement.
|
||
- Deployment: update agents first. When changing endpoints, **rebuild through
|
||
EC** so the old process stops and its pending decisions settle before a new
|
||
process starts. Do not switch scripts with just a map restart in that case;
|
||
journals are endpoint-scoped. If the old URL already matches exactly, copy the
|
||
scripts and restart the map; no full server-process restart is required.
|
||
See [endpoint upgrade and recovery](README.md#upgrading-the-bank-endpoint).
|
||
No deployment was performed; agent release signing, Windows/GSC compilation
|
||
and live T5/T6 validation remain required.
|
||
- Checks: portable script fixtures exercise real initialization with stale
|
||
overrides, every request type, authentication, empty balances and retries.
|
||
Native fixtures cover zero-balance and insufficient-balance replies alongside
|
||
existing durable storage and process-restart checks.
|
||
|
||
### Persistent cross-game player bank — TWS #3 / Electric Cherry #146
|
||
|
||
| Component | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_bank.gsc` | `1.0.0` | New `t5/scripts/tws_t5_bank.gsc` |
|
||
| `tws_t6_bank.gsc` | `1.0.0` | New `t6/scripts/tws_t6_bank.gsc` |
|
||
| `t5-plugin` | `1.1.0` | `t5/plugins/tws-t5-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
|
||
| `t6-plugin` | `1.1.0` | `t6/plugins/tws-t6-gsc-utils/src/component/bank.cpp`, `src/utils/bank.cpp`, `src/utils/bank.hpp` |
|
||
|
||
- Add `.b`, `.d <amount|all>` and `.w <amount|all>` plus help registration on
|
||
both engines. Store shared GUID balances and ledger history through Electric
|
||
Cherry's authenticated bank API. EC generates and injects a private token per
|
||
immutable server instance, preserving it on rebuild/move and revoking it on
|
||
retirement. No manual token map is required;
|
||
the shared telemetry token does not authorize bank operations.
|
||
- Add native `bankLoad`, `bankStore`, `bankRemove` and `bankResponse` helpers.
|
||
Save cancellation before preparing a transfer, replace it with a commit
|
||
decision before applying points without yielding, and replay settlement
|
||
after map/process restarts. Invalid replies, insufficient funds, changed
|
||
player state, and failed journal writes leave spendable points unchanged.
|
||
Preserve earned `score_total`; applied withdrawals belong to the current match.
|
||
- T5 and T6 receive equivalent behavior with their own namespaces, last-stand
|
||
APIs, entry points and journal directories. Other scripts are unchanged;
|
||
existing common help registration and telemetry match keys already suffice.
|
||
- Compatibility: deploy Electric Cherry #146 first, then each game's plugin
|
||
`1.1.0` and bank script `1.0.0`, with common and telemetry `1.0.0` or newer.
|
||
EC host agents `1.9.0+` settle pending journals before destructive teardown.
|
||
No new third-party dependency, upstream pin, or loader version requirement.
|
||
Keep `tws-bank/<game>/` on persistent writable storage; preserve pending
|
||
journals when rotating credentials or restarting servers.
|
||
- Deployment: build/install both Windows x86 DLLs and **restart the full server
|
||
processes**, then install the new bank scripts and create/rebuild through EC
|
||
to inject private credentials. Restart maps after script changes. See
|
||
[bank setup and recovery](README.md#player-bank-t5-and-t6).
|
||
No deployment was performed. Windows DLL linking, GSC compilation and live
|
||
Plutonium checks remain required.
|
||
- Checks: `node tools/check_bank.mjs` exercises the actual transfer functions;
|
||
`python3 tools/test_plugin_bank.py` checks native journals, response validation,
|
||
failed writes and process recovery with sanitizers. The T6 compiler check
|
||
now includes all eight modules.
|
||
|
||
### T6 newcomer join eligibility — `tws_t6_join.gsc` `1.0.1`
|
||
|
||
- Fix `t6/scripts/tws_t6_join.gsc` treating the initial T6 setup spawn as
|
||
gameplay, which rejected a new spectator's `.join` on Farm Survival round 3.
|
||
Wait for the stock delayed spectator transition, then record actual play.
|
||
Continue observing later spawns so waiting for the next round cannot grant
|
||
an extra life after death. Reject requests while a spawn is settling; a real
|
||
death during that window also permanently closes eligibility.
|
||
- T5 is unchanged: its separate SP spawn flow and `self.initialized` guard
|
||
do not use T6's delayed game-mode spectator transition.
|
||
- Compatibility: existing T6 common `1.0.0` or later; no new dependency
|
||
requirement. Deploy the updated join script to `storage/t6/scripts/zm/`
|
||
and restart the map. No full server-process restart is required.
|
||
- Portable regression fixtures: `node tools/check_join.mjs`. Compilation and
|
||
live Plutonium validation remain required; no deployment was performed.
|
||
|
||
### Persistent top-left Discord URL
|
||
|
||
| Script | Version | Affected source |
|
||
| --- | --- | --- |
|
||
| `tws_t5_hud.gsc` | `1.1.0` | `t5/scripts/tws_t5_hud.gsc` |
|
||
| `tws_t5_common.gsc` | `1.1.0` | `t5/scripts/tws_t5_common.gsc` |
|
||
| `tws_t6_hud.gsc` | `1.1.0` | `t6/scripts/tws_t6_hud.gsc` |
|
||
| `tws_t6_common.gsc` | `1.1.0` | `t6/scripts/tws_t6_common.gsc` |
|
||
|
||
- Add `https://discord.thewrightserver.net` as a small, light-gray top-left
|
||
HUD label, created once per connection, including spectator newcomers.
|
||
It has no expiry or death/respawn reset and is cleaned up on disconnect.
|
||
Move the gameplay stack down 20 HUD units to leave room above the timers;
|
||
help and record positioning follow the shared layout automatically.
|
||
- Both engines receive the feature using their existing HUD anchors: T5
|
||
left/top safe-area alignment and T6 fullscreen alignment.
|
||
- Compatibility: deploy each game's HUD and common `1.1.0` together for the
|
||
reserved top line. No new native plugin or external dependency requirement.
|
||
Other scripts and both plugins retain their existing versions.
|
||
- Deployment: copy the updated HUD and common scripts to `storage/t5/scripts/sp/`
|
||
or `storage/t6/scripts/zm/`, respectively, and restart the map. No full
|
||
server-process restart is required. No deployment has been performed here.
|
||
- Live validation remains required on both Plutonium games: check placement
|
||
and readability, join as a spectator, die/respawn, reconnect, and open help
|
||
and records to verify spacing and that only one URL label appears.
|
||
|
||
### Initial versioning baseline
|
||
|
||
Established independent version `1.0.0` entries for each of the 14 scripts and
|
||
both plugins from source commit
|
||
`b508b6739b185d5048e8a8f96ccb16e429f1d37a`. This records the existing source state;
|
||
earlier changes remain in Git history without retroactively assigned versions.
|
||
The baseline introduces `versions.json`, this changelog, the README links and
|
||
version policy, and the maintenance rules in `AGENTS.md`. It changes no game
|
||
script or plugin behavior and requires no deployment by itself.
|
||
|
||
The component entries below summarize the existing functionality and deployment
|
||
requirements for servers adopting this baseline. Version assignment does not
|
||
indicate that a Windows build, live-game validation, or deployment was performed.
|
||
|
||
### T5 script baselines
|
||
|
||
Each row is a separately versioned script under `t5/scripts/`.
|
||
|
||
| Script | Version | Existing functionality |
|
||
| --- | --- | --- |
|
||
| `tws_t5_afk.gsc` | `1.0.0` | AFK toggle, protection, and indicator |
|
||
| `tws_t5_common.gsc` | `1.0.0` | Shared configuration, helpers, commands, and player dispatchers |
|
||
| `tws_t5_hud.gsc` | `1.0.0` | Timers, zombie count, and health display |
|
||
| `tws_t5_join.gsc` | `1.0.0` | Immediate join for newcomers |
|
||
| `tws_t5_leaderboard.gsc` | `1.0.0` | Map record announcements and `.leaders` command |
|
||
| `tws_t5_lock.gsc` | `1.0.0` | Lobby lock at the configured round milestone |
|
||
| `tws_t5_telemetry.gsc` | `1.0.0` | Game reports, durable boundary retries, balance and cumulative score |
|
||
|
||
- Compatibility: these initial script versions use `tws_t5_common.gsc` `1.0.0`;
|
||
lobby lock also needs `tws_t5_hud.gsc` `1.0.0`. Telemetry and leaderboard use
|
||
TWS T5 plugin `1.0.0`. Telemetry additionally requires
|
||
Electric Cherry's match/sequence deduplication and `score_total` support;
|
||
follow the [receiver and plugin rollout order](README.md#telemetry-delivery-and-rollout-t5-and-t6).
|
||
Disabling telemetry by dvar does not remove its native linking requirements.
|
||
- Deployment: follow the [T5 installation/upgrade instructions](t5/scripts/README.md#install--upgrade),
|
||
copy the desired scripts and their required dependencies to
|
||
`storage/t5/scripts/sp/`, and restart the map.
|
||
Installing or updating the required plugin needs a full server-process restart.
|
||
|
||
### T6 script baselines
|
||
|
||
Each row is a separately versioned script under `t6/scripts/`, adapted to T6 APIs
|
||
and map variants.
|
||
|
||
| Script | Version | Existing functionality |
|
||
| --- | --- | --- |
|
||
| `tws_t6_afk.gsc` | `1.0.0` | AFK toggle, protection, and indicator |
|
||
| `tws_t6_common.gsc` | `1.0.0` | Shared configuration, helpers, commands, and player dispatchers |
|
||
| `tws_t6_hud.gsc` | `1.0.0` | Timers, zombie count, and health display |
|
||
| `tws_t6_join.gsc` | `1.0.0` | Immediate join for newcomers |
|
||
| `tws_t6_leaderboard.gsc` | `1.0.0` | Map record announcements and `.leaders` command |
|
||
| `tws_t6_lock.gsc` | `1.0.0` | Lobby lock at the configured round milestone |
|
||
| `tws_t6_telemetry.gsc` | `1.0.0` | Game reports, durable boundary retries, balance and cumulative score |
|
||
|
||
- Compatibility: these initial script versions use `tws_t6_common.gsc` `1.0.0`;
|
||
lobby lock also needs `tws_t6_hud.gsc` `1.0.0`. Telemetry and leaderboard use
|
||
TWS T6 plugin `1.0.0`. Telemetry additionally requires
|
||
Electric Cherry's match/sequence deduplication and `score_total` support;
|
||
follow the [receiver and plugin rollout order](README.md#telemetry-delivery-and-rollout-t5-and-t6).
|
||
Disabling telemetry by dvar does not remove its native linking requirements.
|
||
- Deployment: follow the [T6 installation instructions](t6/scripts/README.md#install),
|
||
copy the desired scripts and their required dependencies to
|
||
`storage/t6/scripts/zm/`, and restart the map.
|
||
Installing or updating the required plugin needs a full server-process restart.
|
||
|
||
### T5 plugin — 1.0.0
|
||
|
||
- Baseline: the TWS-maintained plugin, including configurable HTTP deadlines,
|
||
status/timing diagnostics, and durable telemetry storage and response helpers.
|
||
- Source covered: `t5/plugins/tws-t5-gsc-utils/` and the existing shared plugin
|
||
build/dependency tooling under `tools/`.
|
||
- Compatibility: provides the native functions used by `tws_t5_telemetry.gsc`
|
||
`1.0.0` and `tws_t5_leaderboard.gsc` `1.0.0`.
|
||
Upstream source and dependency pins remain in the plugin's `upstream.json`.
|
||
Upstream binary downloads do not include these TWS changes.
|
||
- Deployment: [build the x86 DLL on Windows](README.md#building-plugins), install
|
||
`tws-t5-gsc-utils.dll` in `Plutonium/plugins/`, remove the old upstream DLL if
|
||
present, and restart the full server process before loading dependent scripts.
|
||
|
||
### T6 plugin — 1.0.0
|
||
|
||
- Baseline: the matching TWS T6 plugin with configurable HTTP deadlines,
|
||
status/timing diagnostics, and durable telemetry storage and response helpers.
|
||
- Source covered: `t6/plugins/tws-t6-gsc-utils/` and the existing shared plugin
|
||
build/dependency tooling under `tools/`.
|
||
- Compatibility: provides the native functions used by `tws_t6_telemetry.gsc`
|
||
`1.0.0` and `tws_t6_leaderboard.gsc` `1.0.0`.
|
||
Upstream source and dependency pins remain in the plugin's `upstream.json`.
|
||
Upstream binary downloads do not include these TWS changes.
|
||
- Deployment: [build the x86 DLL on Windows](README.md#building-plugins), install
|
||
`tws-t6-gsc-utils.dll` in `Plutonium/plugins/`, remove the old upstream DLL if
|
||
present, and restart the full server process before loading dependent scripts.
|