The synthetic 1000-60000 ranges filled the Travel Log with entries the
client cannot resolve. Replaced with the 147 real (activityId, panelId)
rows dumped from the March7th PS ActivityConfig (matches the 4.6.51
client), keeping the Apocalyptic Shadow panel 21001 block that the AS
tab requires
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
The user report: pillars visible on the map but locked, and clicking a
teleport does nothing (client never sends EnterScene).
Root cause: mapDefaultEntranceMap covers only 115 of 371 floors - the
GetSceneMapInfo reply had no unlocked teleports for the missing floors
(mostly new-region 2xxxxx maps), so the client locked the pillars and
never initiated the teleport.
- findEntryForFloor: resolve entry by searching config names P*_F<floor>
directly, with mapDefaultEntranceMap as the first chance
- GetSceneMapInfo: use the new resolver and merge teleports.json keys
into unlocked_teleport_list for every floor
- EnterScene: floor ids resolve through the same path; a teleport id
arriving via scene_identifier (MDAIDPPKOPO.PLIDNBMCIJH) now also
resolves the destination entry
- loadScene: exact teleport position from teleports.json when the res
config has no inline teleport with that id
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)