Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-PlayFab移植修改清单-分模块-2026-09-30.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

85 lines
9.3 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 PlayFab→KV 移植修改清单(分模块)
日期:2026-09-30。编制:原 ZCode(审查侧),基于已完成的全部核验(合批正式前审 2165/2165、C2d 交付 113 项中 112 一致、防跑偏十项源码实证、C3c 审查 R1 13/13)。范围:当前工作树 `Client/Assets/Scripts` 全部迁移改动=**111 个修改文件 + 14 个新增文件(含 meta)**。每项均标注性质:〔平移〕=提供方/身份/接线替换;〔原样〕=经 C2d 核减后与原行为一致(含登记未修的旧缺陷);〔待接线〕=依赖 C3c 服务端四问,未动或不可放行。
## A. KV 存储基础设施(新增模块,`Services/PlayerData/`)
| 文件(新增) | 内容 |
|---|---|
| `PlayerKVClient/CacheStore/SyncState/SyncCoordinator/LoginContext/GameSessionBridge/GameLoadCoordinator/GameLoadGuard/GameLoadTransaction/GameplayBindings/SaveSchema/LoginPrepareResult/DecodedSave/KeyRead* 等系列` | 早期阶段建立:HTTP 协议、KV 缓存、3A 同步状态机、3B 串行同步、登录上下文(epoch/租约/三 handler)、会话桥、加载编排(Prepare/Decode/Apply)、加载 Guard、31 模块事务、严格解码器。本合批内 `GameplayBindings` 改窄接口 `IKVUserLoadReceiver`、`GameLoadCoordinator` 成功结果携带 `PlayerKVAccountDescriptor` |
| `PlayerKVRuntimeSelection.cs`(新) | 启动一次捕获 SaveBackend→提供方选择;固定正式 URL、AGG 拒绝、101/102 准入 |
| `IPlayerSaveStore.cs` + `PlayerSaveStores.cs`(本合批新增) | 共用存档契约与 KV/PF 双实现:Read 三态、Write 接受语义、WriteAndConfirmAsync、40 秒单调度者、固定会话绑定〔平移〕 |
| `IKVUserLoadReceiver.cs` / `IKVUserLifecycle.cs`(本合批新增) | 31 模块接收窄契约(消费者=Bind);生命周期观察窄契约(消费者=PFLoginAct/QuitAct) |
| `PlayerKVEditorValidationHost.cs` | 受控验证宿主(离线全链验证入口,不改业务) |
## B. 核心管理器(`Core/`)
- `KVMgr.cs`(新增):四个静态入口 ReadKV/WriteKV/FlushKVAsync/WaitForKVTicketAsync,Guard 检查后转发固定 handle——替代 PlayFabMgr 的存档入口生态位〔平移〕。
- `PlayFabMgr.cs`:四个 KV 入口移除;Guard 接线(Lifecycle/Compare/Update/ReadLocal/Sync/PrefsSave/Immediate 七检查点);kv-loop 分支;新增内部 `FlushBufferedData` 委托原 SyncData(供 PF store)。PF 原同步/缓存/40 秒定时器**全部保留**〔平移+保留 PF〕。
- `CustomServerMgr.cs`:`kvOnly` 租约运输(BindKVForValidation/BindKVForGame/EnableKVBusiness/DisableKVBusiness)、KVUnauthorized 事件、Cookie 同源返回、主线程 Post、15 秒超时〔平移〕。
## C. 用户服务与身份(`Services/`)
- `KVUserService.cs`(新增):正式 KV 登录编排(认证→31 模块 Apply→释放 Guard→原 handle→三提示服务→启用租约→**就绪后同步发布 UserId/ApiPlayerId/InternalId/IsAuthorized**→发一次 `EvtAPISvrLoginSuccess`→Login 返回 Done);不继承/不引用 PlayFabUserService 与 SDK;显式失败成员表;新 PlayerId 身份〔平移〕。他人资料 `GetPlayInfo/GetPlayLv` 当前未命中返回 null/抛错——**原语义形状恢复列为 C3c ①可批未实施**。
- `UserService.cs`:`IUserService` 移除 `EntityKey`(PF DTO 出共用契约)、`CustomId` 加 setter、移除 formal KV 分支;PF 登录/资料/其他玩家缓存原样保留〔平移〕。
- `UserService.KVLoad.cs`:formal 段已迁出至 KVUserService;保留受控验证成员(ConfigureKVForValidation/LoadKVForValidationAsync 等)〔平移〕。
- `UserService.KVGameplayLoop.cs`:Editor kv-loop 测试通道(PF 身份背景),按设计不改仅回归。
- `AggUserService.cs`:仅 B3-C168 retain-agg 零行为修改。
- `ChatService.cs`:对 HEAD 仅 BOM 差异〔原样〕。
## D. 登录/舞台流程(`Stages/`)
- `LoginStage.cs`:按冻结选择注册 PlayFabUserService/AggUserService/**KVUserService** 及对应存档实现;`RequestNextAct` KV 双闸之一(保留)〔平移〕。
- `PFLoginAct.cs`:中立 formal 检测(读 RuntimeSelection)、共用接口 CustomId 赋值、KV 就绪/错误状态经 `IKVUserLifecycle`、输入/重试/销毁流程原样〔平移〕。
- `QuitAct.cs`:经窄契约观察 KV 关闭(validation/formal 两实现)〔平移〕。
- `FishingStage.cs`/`FishingAct.cs`:store 注入消费、身份发布后时序、暂停恢复核旧 lifetime;5 秒软门不作为 KV 凭据〔平移〕。**双闸保留至 PF 调用计数=0**。
## E. 数据中心 31 存档模块(`DataCenter/` 等,27 文件)
- 全部 31 模块新增 `ResetForKVLoad`/`ReplaceFromKVDecoded` 受控加载入口(KV 档按序同步 Apply,Guard/回滚/主线程约束)〔平移〕。
- **202 项业务存档调用**迁 `IPlayerSaveStore`(原键、原序列化、原 remoteStore 参数、原调用时序):PlayerData/SmallGame/PlayerFishData(含鱼竿配件)/PlayerShopData/FishingEventData(主体 16+PVP/单双人 11)/Buff/Camp/Achievement/Box/Guide/BattlePass/Signin/Trigger/Club/Challenge/Chains/Disco/Partner/Cube/EventPack/Piggy/Bargain/FootPrint/Shooting/Potion/Pinball/Scratch/Pinata/Digging/LuckyTask×2/MiniBP/EventToken/水族馆/累计充值/配对游戏/Bingo/Break/Can/GatherCore/Mow/Smash/广告轮/扫荡/拼图等〔平移〕。
- 2 项即时消耗(`FishingBehaviorB.ConsumeBaitOnPlayfab`、`FishingTurntablePanel.ConsumeOnPlayfab`):`SyncDataImmidiate`→`WriteAndConfirmAsync` 存储替换,**调用者时序原样**(不等待、无条件 isDataSynced、原随机/动画顺序)〔原样〕。
- 余 4 项:3 项 Club/Setting 已有固定 KV 提示路线保留 PF 分支;1 项 `BaseEventData.UploadData` 无消费者待最终清理。
## F. 业务服务层(`Services/` 15 文件)
- `InGameMailService/InGameMailHandler`:Cookie 身份、缓存按新 UserId 分键、回包核生命周期〔平移〕;**批量 HasRead→HasReward 旧语义原样保留**(缺陷已登记待移植后授权)〔原样〕。
- `FriendService`:普通 `friend/*` 请求字段值换新 UserID(字段名保留)〔平移〕;`GetFriendData` 的 PF SDK 读取**待 C3c 裁决未动**〔待接线〕。
- `ClubService`:提示键走原 handle 固定路线、`GetSelfClub` 经租约〔平移〕。
- `SurveyService`:两键原键名迁 KV、十进制尾数 %10 抽样、原同步签名原样〔平移+原样〕。
- `SettingService/LocalNotificationService`:B01 固定 owner 读写〔平移〕。
- `AntiCheatManager`:`CheckBan` playerID=新 UserId〔平移〕。
- `RTService/SignalRService`:SessionVersion/Cookie 消费、旧连接失效〔平移〕;真连接未验。
- `FootPrintService/EventTokenService/TileNewsManager(候选) 等`:store/身份接线〔平移/待接线〕。
## G. UI 层(Setting 6、Shop 4、LuckyTask 3、Partner 4、Social 3、各活动 UI)
- 全部为 store 注入后的**最小适配**:await 后核旧 store/会话、资源过期回调不更新新界面〔平移〕。
- `EventFishingDuelPanel.cs`:EntityKey 消费改 PF 具体能力分支(EntityKey 已移出共用契约);KV 匹配路径 `MachingEnd(null)` 为开发性结束**不得放行**〔待接线〕。
- `SocialFriends/SocialLeadboardItem` 等解码 UI:**零修改**(`/100000`、`%100000` 解码依赖服务端 LevelB 投影,见 C3c)。
- `HomePanel`:**零修改**(补单原异步流程,与 HEAD 字节一致)。
## H. 活动系统(`FishingEvent` 全类型、Offer、礼包等)
- Type2 签到/Type3 礼包战令/Type4·7 动态活动(沙Dig/伙伴/魔药/弹珠/Bingo/CubeMelt/射击/Break/Can/GatherCore/Mow/Smash)/Type8 LuckyTask/Type9 MiniBP·OfferJourney:存档读写迁 store,原条件、原键、原序列化、原异常处理(含原逐活动 catch 继续)〔平移+原样〕。
- 通用 `EventDataRepository`/`AEventDataManager`:泛型活动仓库迁固定 store〔平移〕。
## I. 编辑器与测试(`CodexOutput/upserver/`,非生产)
- `KVGameLoadTests`(90 组 2006 断言)、`KVSyncTests/KVSyncCoordinatorTests/KVLoginContextTests/B01Tests/B02RouteTests/KVFishingConsume·RewardValidation`、ServiceHost 双条件宿主(18 组 254 断言)、`M2MergedContractTests/M2MergedGameplayTests`、ExitRegression、PlayerProbe。
- Editor 工具:kv-loop 许可通道、`S101LoginWindow` 最小认证探针。
## J. 其他
- `AOTScripts/Boostrap.cs`/`SubBoostrap.cs`:RuntimeSelection 捕获与注册时序〔平移〕。
- `TimeManager/TimeRefreshManager.cs`:LastLoginTime 哨兵三分映射(MinValue→null 首登分支)〔平移〕。
- `DebugFunc`/配置投影/manifest 等辅助。
## 已核减回原样的项(C2d,避免误读为"已修复")
邮件批量枚举缺陷、钓鱼/转盘调用者等待、Survey/Friend 的 Task 化与领取锁、商店/签到确认与订单去重、PlayerSaveAction 聚合、坏档抛错汇总、Chat 重试——**全部恢复原实现**,登记在《纯平移主会话裁决与C2d实施记录》待移植完成后另行授权。
## 尚未迁移(PF SDK 残余,待 C3c 四问)
等级榜统计写/读(`UpdatePlayerStatisticsAsync/GetLeaderboardAsync`)、好友列表(`GetFriendsListAsync`)、公告(`GetTitleNewsAsync`)、Duel 匹配(Multiplayer 四调用)、他人资料远端读取——此五类是当前首场景 PF 计数≠0 的全部来源。