Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-CP2首场景自动依赖核查-2026-09-29.md
Liubing\LB 6813da149a feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
2026-09-30 19:19:05 +08:00

17 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M2 CP2 首场景自动依赖核查(只读,非完整白名单)
日期:2026-09-29。仅按当前源码的显式调用链核查,未运行 Unity Play/真实账号;所有行号以 `M2-CP2-D1源码事实基线.json` 的版本为准。尚未覆盖反射注册、事件连锁、Prefab/UnityEvent 和配置启用条件;不能据此宣布首场景可运行。
| 顺序/触发 | 显式链 | 当前依赖 | CP2 方案必须确定 |
|---|---|---|---|
| 登录成功后 | `PFLoginAct.LoginAsync:120` → `InGameMailService.Init:153,162` → `BaseMailHandler.FetchMail:312` | `POST mail/fetch`,使用 `CustomServerMgr` | 正式租约的单路由放行;授权后才发,旧 epoch 回复丢弃 |
| 阶段跳转 | `LoginStage.RequestNextAct` → `FishingStage.StartAsync:186–192` → `SurveyService` 构造 `:35,40` | 两次 `PlayFabMgr.Instance.GetLocalData` | 在无旧组件的 KV 模式必需迁移/停用;不能以空 PF 组件兜底 |
| 首场景加载后 | `FishingStage.StartAsync:223` → `LeadboardData.SetLvData:189` → `SetLeadboardData` | PlayFab 排行榜异步调用 | 同批迁移或在明确合同下禁止本次调用;不能让其无监控失败 |
| 首场景加载后 | `FishingStage.StartAsync:236` → `SurveyService.GetSurveyMatchlist:55` | `UserId` 按 16 进制转换;该 ID 当前是 PF 身份 | 定义后端无关的抽样标识/保留语义;不能把 S101 十进制 ID 当十六进制 PF ID |
| 首场景加载后 | `FishingStage.StartAsync:243` → `AntiCheatManager.CheckBan:249` → `OnBan:260` | `POST anti-cheat/CheckBan`,请求内含 `UserId` | 定义新身份字段与 Method/路由许可及失败行为 |
| 初始化事件 | `FishingStage.InitEvent:254` → `FriendService.GetInvitedListCount:322` | `POST friend/GetInvitedListCount`,`async void` | 路由许可、失败/登出响应丢弃及异常观察 |
| Home 系统切换且已开 Club | `HomePanel.SystemSwitch:1080` → `ClubService.GetSelfClub:215,224` | `POST club/GetSelfClub` | 条件触发的单路由许可及 SessionVersion 检查;不通配开放 Club |
| 非 AGG 补单前置 | `FishingStage.StartAsync:204` → `PlayerShopData.GetReplenishmentData:520` → `DevIAPService.GetOrderUnreceived` | 当前 Dev 实现只返回空字典 | 只能说明该非 AGG 调用本身无网络;不代表 AGG 的购买/补单可用 |
`FishingStage.InitData` 还启动多个模块,`InitManager` 通过 `Assembly.GetExecutingAssembly().GetTypes()` 动态初始化活动管理器。静态表没有穷尽其后续存档和 API 调用。若 CP2 第一验收仅包含正式登录与句柄交接,阶段切换必须显式阻断并验证;若包含首场景,则以上依赖及动态触发都需纳入同一完整方案、源码白名单和回归矩阵,经原 ZCode 独立审查及主会话裁决后才能编码。