Server authority: proven
Combat report delivery: two channels
-
Inline (arena, PVE monster fights): a base64
battleContentfield on the SFS response itself, chunked intobattleContentArrif oversized. Decode: base64 → raw protobuf bytes →protobuf.BattleReport. -
Out-of-band (world combat, city sieges): the response carries only a
uuid. Fetch separately:CheckContent-Encoding: zstd, BestHTTP doesn’t auto-decompress it, the client does it manually. Decode asprotobuf.LwBattleReport(the richer, per-action-log schema, inferred by naming/structural convention; the exact CDN→proto-type pairing wasn’t directly confirmed against a call site).
BattleReport.proto: recovered in full
LwBattleReport.proto goes further, a genuine per-skill-cast, per-target action log (FightAction/TargetHit, with hit/miss/crit/damage/shield deltas), strong independent confirmation the server runs a full deterministic battle simulation (RNG included) purely for client-side replay:
Core commands
Duplicate-cmd gotcha:
MsgDefines.HeroRankUpgrade and MsgDefines.UpgradeHeroRank both resolve to the wire string "upgrade.hero.rank", MsgMap is a plain table literal, so the later assignment in file order silently wins at runtime. command_catalog.json preserves both entries since it’s a mechanical dump, not a resolved map; when duplicates collide, trust whichever handler class appears last in MsgMap.lua.