Client session 02:20 died in AdventurePhase._EnterStep1_InitializeMapInfo
('AdventureModule should not be null' -> RuntimeGroupManager
_InitMissionToLegacyGroupRelation NRE) and never left the loading screen.
The 01:00 session reached the scene when this request was dropped; the
empty reply added in the auto-empty round put the client into map-rotation
mode with a null state. Drop it again until real RotaterData is built.
Round-2 fixes from the 01:44-01:53 client session:
- StartChallenge (MoC/PF/AS normal start) decoded challenge_id=0 -> client
retried and aborted. detectChallengeID scans top-level varints for the
first plausible id (challenge_data + known mode ranges) when the strict
tag-14 decode misses; payload hexdump logged when still 0
- StartChallengeScRsp now carries stage_info (tag 13) with boss node buff
echo, per the 4.6.51 proto
- GetSwitchHandData replies 8108 (the real ScRsp) - 8104 is
SwitchHandStartCsReq, we were sending a request id back at the client
- GetSceneMapInfo: strict proto parse failed on some payloads (layout
drift) which stalled the map UI ('no pillars / navigation loading') -
now a raw handler with a lenient wire walk fallback + hexdump logging
- teleport destination ('AA teleport landed in AP'): teleport ids repeat
on every floor and teleports.json was scanned globally in random map
order. Map clicks now resolve floor-first via scene_identifier, and the
global id scan never touches teleports.json
- tierce: arena 3014101 -> 3000101 fallback (client has no MapEntrance
3014101), same as StartChallenge
First real-client session (2026-10-07 01:00) showed the client walking and
attacking but UI interactions stalling: ~120 CsReq dropped with no reply.
- auto-empty responder: any unknown CsReq with a Cmd-enum ScRsp pair now
gets an empty ScRsp, except the danger families (GridFight/ChessRogue/
EvolveBuild/ChimeraDuel/Jukebox/CycleScore) which must stay dropped
(client Sync(nil) NREs on empty, per the Rust lessons)
- GetUnreleasedBlockInfo: the Endgame entry waits on this - 4.6.51 wire is
CsReq 4190 -> ScRsp 4112 retcode tag 14 (the Rust build answered 4130,
an id this client never sends)
- SetClientPaused acked (client pauses itself when opening menus/map)
- explicit handlers: TakeQuestReward, GetFirstTalkNpc, QuitBattle,
GetMapRotationData (Amphoreus teleport pillars), GetPamSkinData,
GetAllServerPrefsData/UpdateServerPrefsData, GetHeartDialInfo, GetPetData,
GetShopList
- SendRaw now logs (dummy/raw replies were invisible in gameserver.log)
- cmdpairs.go: req->rsp id pairs generated from the Cmd enum (865 pairs),
stable across message renames
- smoke test extended: 4190->4112 and SetClientPaused ack verified
- mihoyo-variant KCP in pure Go (28-byte conv+token header), UDP gateway
with 0xFF/0x145/0x194 handshake, ms-precision KCP clock + retransmit ticker
- protobuf for 4.6.51 generated from the AstralOS StarRail.proto (4932
messages) plus CmdID map from // CmdID: comments (2114 ids)
- sdkserver port: query_dispatch/query_gateway (Gateserver pb + base64),
hotfix fetch, auth endpoints, SRTools freesr-data.json upload
- gameserver handlers: login flow, scene load/spawn with real monster
entity tracking, lineup, avatar/skin, missions, tutorials (1249+855),
bag/equip, challenge incl. StartChallenge 1787 layout + Tierce 8973 +
peak 8948, all raw tierce replies
- SceneCastSkill camera bug fix: only real scene monsters (tracked per
session) trigger battle; attacking props/NPCs/air replies retcode 0
without battle_info so the camera stays locked on the character
- end-to-end smoke test simulating a client over real UDP: handshake,
PlayerGetToken, and both SceneCastSkill paths
- reuses the Rust PS data files unchanged (freesr-data.json, persistent,
res.json, teleports.json, challenge_data.json, mission_unlocks.json)