F1: the telemetry session id is new at every login. The original made one per
load of its assembly and its loader reloaded it at every login; the backend
counts new kills per (session id, character), so reusing one id across a
relog under-counted kills until the reset counter passed the old total.
F5/F6: .NET Framework never wrote a negative zero, and its fixed-point
formats (F7, F2, F0) rounded at fifteen significant digits, half away from
zero. Spawn and portal coordinates, kills_per_hour and the !report line now
format that way; the round-trip converter maps -0 to 0.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
DECAL handed the original each line as the chat window shows it, tell links
included; the host now reports the same wording (DisplayText). Kill, rare,
combat and !report parsing and the chat frame read that, with tags stripped
for the frame exactly as before; the plugin's own formatter remains only for
a line the host did not word.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The original ran Newtonsoft.Json on .NET Framework, whose "R" format writes
15 significant digits when they read back exactly and 17 otherwise (floats: 7,
else 9). Modern .NET writes the shortest round trip instead, so a value like
-0.066666670143604279 came out as -0.06666667014360428: equal when parsed,
different bytes. Every frame now goes through a converter that repeats the
Framework rule, with Newtonsoft's '.0' suffix and non-finite handling kept.
Goldens that encoded the modern digits are corrected.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Resolved FeatureCatalog (both blocks kept; the main window's Tools buttons now
open the Mossy Tracker and Metas panels). Tests from both sides adjusted to
the combined plugin: quest tests look at quest frames only (chat is streamed
too), and the stream tests ignore the /myquests request sent at login.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The frames the backend reads most, each pinned by a golden test written from
the original's source (field order, JSON types, string-formatted numbers,
mem_mb in bytes, the PascalCase aggregates Newtonsoft emits for combat_stats).
Coordinates repeat the original's float arithmetic from the landblock-local
float, so ew/ns carry the same float-widened values as before. Telemetry goes
out on connect and every 5 s, vitals every 5 s, combat stats every 10 s when
dirty. The rare meta-state switch is not carried over (owner decision); the
allegiance rare announcement and the !report reply are. Kill patterns and
combat patterns are the original's, unchanged.
Also fixes the tick scheduler re-arming repeating jobs from now instead of
from their due time, which made every cadence drift a frame late per period.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>