|
|
2026-8-29
1.修复换宠物及进出副本后结婚属性/名誉等级丢失
问题
服务端以抓包回放方式实现结婚属性(选角序列末尾硬编码下发 WEDDING_INFO 0x03D0 / WEDDING_CHARAC 0x03F3 / COUPLE_ROOM 0x03D8),名誉等级靠 NOTI 0x0289 HONOR_LEVEL_INFO 下发。两者都只在选角/过图时下发一次,之后由客户端缓存维持。
客户端在用 USERINFO subtype0 重建自身角色信息时会重置婚姻/名誉 UI 状态,而以下路径只重发 USERINFO、不补发上述补偿包:
地下城/城镇内切换宠物(MOVE_ITEMSPACE 0x0013 → PetInventoryMoveCoordinator)
进入地下城(DungeonEntryHandler)
结算回城(DungeonTownReturnCoordinator,BloodAltar/DeathTower 共用)与放弃/通关回城(TownHandler.ReturnSelfToTownAsync)
症状:换宠物或进出副本后左下角结婚属性图标消失、面板丢失结婚属性加成、名誉等级显示变 lv1;重新选角后恢复。
名誉变 lv1 的直接原因:USERINFO0 的 64B 无公会尾 blob(UserInfoSubtype0Builder.BuildA21AfterAliveNoGuild)把旧协议名誉等级槽位(偏移 39-42)硬编码为 1、名誉经验(43-46)为 0,而真实值已被 HonorLevelDataProvider.ApplyToSubtype0Tail 写进 tail.ProgressA/ProgressB,序列化器未读取(死写)。
修改
UserInfoSubtype0Builder: 64B 尾 blob 偏移 39/43 改填 tail.ProgressA/ProgressB 真实值(照 ExpertJobExp 现有写法,偏移来源为旧 WriteTail 字段序,blob[52]=0x64 锚点交叉验证)
InventoryRefreshSender: 新增 SendHonorLevelInfoRefresh(转发 HonorLevelSyncService)与静态 SendWeddingReplayRefresh(按选角顺序补发婚礼三包,包体复用 WeddingReplayBodyBuilders 新增的静态 BuildBody)
PetInventoryMoveCoordinator / DungeonEntryHandler / DungeonTownReturnCoordinator / TownHandler.ReturnSelfToTownAsync:在各自 USERINFO/状态投影之后按「USERINFO 在前、补偿包在后」相对顺序补发
A21StartupProtocolSelfTest: 新增断言,验证名誉等级/经验落在 64B 尾的 39/43 偏移,防 blob 布局回归
不改动:选角序列、城镇内其他过图点(避免 COUPLE_ROOM 导致的房间动画频繁重播)、名誉经验获取逻辑。无数据库/协议格式变化。
2.修复镇魂回城后副本选择界面卡死
问题: 从镇魂(area 26)副本回城后首次打开副本选择界面, 客户端反复播放 选本音效且界面无法点击。抓包证实客户端持续重发 CMD SEQUENTIAL_DUNGEON_INFO(0x035D, 单次数百次), 而服务端未注册该 CMD, 只记日志不应答;同时进选择界面时服务端无条件推送安徒恩序列(key=28) 的 NOTI 0x025B, 错区域数据诱发客户端追问自身区域的序列状态。
修改(owner: 副本选择/安徒恩序列机制):
GameProtocolHandler 注册 CMD 0x035D, DungeonEntryHandler 新增 HandleSequentialDungeonInfo: 按请求体中的 int32 configKey 应答 NOTI 0x025B(int32 key + byte progress + int32 routeMask, 与既有主动 推送同布局);无对应序列或无进度记录时 progress 按 0(未开始)应答
AntonNormalConquest 新增 TryGetSequenceByKey 与按 key 的 TryResolveSyncState 重载(key=41 与 key=28 共享部分副本, 不能用 "第一条匹配序列"代替);原解析逻辑提取为 TryResolveSequenceState 复用
AntonNormalConquestNotifier.RestoreBeforeSelectAsync 收窄: 只恢复玩家 当前所在副本入口区域的序列, 非序列区域不再推送 0x025B
新增聚焦 SelfTest SequentialDungeonInfoProtocolSelfTest(枚举锚定/ 包体布局/按 key 进度解析, 真实 PVF + 临时 SQLite) |
|