Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-C3c客户端剩余项核查与本人统计独立实施待裁决-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

97 lines
14 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.
# C3c 客户端剩余项核查与本人统计独立实施待裁决
日期:2026-09-30。依据用户本轮要求:“先完成客户端剩余项核查,同时把‘本人统计写能否独立实施’集中列入原 C3c 裁决”。本轮仅静态核查及文档,不批准编码,不修改原ZCode独立报告,不新建逐功能审核轮。本文补充原C3c统一审查入口;旧受审文件原字节保留。
## 1. 当前结论与证据范围
- 客户端并非只能等待服务端。本人统计写有现成KV能力,可单独讨论实施边界;当前阻塞是第四轮把统计键对齐与聚合读取绑定、第五轮明确不批准LeadboardData,不是缺少本人KV接口。申请在原C3c报告一次裁决是否可解除这项耦合。
- C3d已审缓存/昵称头像接线完成。交付清单13/13项hash匹配,原ZCode报告hash仍为`E0A9A124F98F36EED1CA902A14F6D890E5528A52D58B12C86183D2A26369560F`,未发现新的批准段落。GetPlayLv未接远端普通等级,不能把已接昵称/头像写成公开资料全部完成。
- 本轮建立2121项源码基线(Client/Assets/Scripts及ServiceHost的C#,排除bin/obj)。SDK和KV分支文本扫描作为附件;逐项阅读关键调用与消费者。文本检索不替代运行调用计数,也不证明任意反射、二进制插件和动态资源均无引用。
- 本轮不运行已通过测试、不进入Play、不发正式请求、不读改服务器、不改配置、不打包。已有C3d双条件各24组491断言及Unity编译证据保持原限定,不冒充本轮新执行或真实场景通关。
下文源码路径相对`C:/projects/ft/Client/Assets/Scripts/`,行号为本轮定位。全部迁移仅做必要平移,不修原业务缺陷或重构。
## 2. 剩余调用与可继续工作
| 项目 | 当前源码与实际状态 | 下一步及依赖 |
|---|---|---|
| 本人统计写 | `DataCenter/DataCenter.LeadboardData.cs:158–169`仍调用UpdatePlayerStatisticsAsync | 本文第5节申请独立实施;仅本人KV写,不等待新聚合路由才能具备技术能力;尚未获准编码 |
| 等级榜读取 | 同文件`:171–186`仍调用GetLeaderboardAsync;默认前50,全球/地区沿原统计名 | 待服务端实际等价读取合同后接线;不以活动榜event/GetLeaderboards替代,不客户端拼榜 |
| 好友资料 | `Services/FriendService.cs:145`仍调用GetFriendsListAsync | 原GetFriendsList路由及新ID已有实测;缺的是原Statistics[LevelB]/LastLogin投影。不能用普通Level或假时间替代 |
| 他人普通等级 | `Services/KVUserService.cs:279–286`当前GetPlayLv只读本人或缓存,未知返回失败Task | 待真实普通等级来源;SearchFriend曾返回1而本人档62/60,不把该值缓存成已查询等级 |
| 他人昵称/头像 | `Services/KVUserService.cs:288–321`已走SearchFriend,保持占位对象、异步填充、事件 | C3d完成;不重开相同编码或重审。正式字段来源及真实UI联调继续在整链验收核对 |
| 公告 | `Services/TileNewsManager.cs:28`仍调用GetTitleNewsAsync | 等价全局内容入口待交付;保留首条选择、时间及红点,不以本人私有KV替代 |
| 匹配 | `Duel/UI/EventFishingDuelPanel.cs:658/692/740/817`仍有创建、查询、取结果、取消四个PF调用 | 待四步替代合同;`:610–615`和`:726–730`两处非PF分支仍提前MachingEnd(null),均须最终恢复 |
| 本人登录时间 | `Stages/FishingStage.cs:211`已有WriteAndConfirmAsync(LastLoginTimeUtc);KVUserService读取旧值 | 已实现,不新增LastLogin同义键,不改每日初始化先后;真实首场景保存与再次登录证据仍欠缺 |
| 提示存档三处PF文本命中 | `SettingService.cs:172/195`、`ClubService.cs:226` | 已有固定原handle的KV分支且先返回;保留PF分支,不能按字符串残余一律删除 |
| 原PF/AGG提供方 | UserService.cs、AggUserService.cs、PlayFabMgr.cs、PlayFabPlayerSaveStore | 双提供方要求保留;KV入口由LoginStage选择KVUserService/存档,SubBoostrap不创建PF管理器;最终用运行证据核实隔离 |
| 旧验证实现 | UserService.KVLoad/GameplayLoop、PlayerKVEditorValidationHost | 仍有Editor/ServiceHost/AGG验证消费者,不是已证无消费者;不能为了“KV”命名或位于旧类中直接删除 |
当前共用业务文件仍有8处直接SDK调用点:统计写1、榜读1、好友1、公告1、匹配4。此计数不包括仍需保留的PF提供方、管理器或验证路径,也不包括GetPlayLv这种尚无新远端调用的缺口,不等同全项目只有8个PlayFab引用。
本人统计原调用链核实:FishingStage`:249`直接SetLvData;PlayerData.SetLv完成原事件/保存后在`:395`调用AwaitSetLvData;InfiniteBuildingAct`:668`在原升级条件下调用;AwaitSetLvData仍按300秒延迟,SetLvData仍为async void。调用者与调度均不需要为统计存储平移改造。
## 3. 临时冻结、真实边界及清理候选
| 编号 | 当前状态及位置 | 最终处理要求 |
|---|---|---|
| F1 登录双闸 | LoginStage`:126–127`返回;PFLoginAct`:98–114`正式KV成功仍提示Gameplay未启用并返回 | 首场景PF残余完成替代并通过整批裁决后解除;不跳过好友/榜单来伪造PF计数0 |
| F1补充 生命周期交接 | PFLoginAct`:307–313`销毁时对正式KV调用Logout | 必须与双闸同批核原正常交接/异常退出/注销区别;只删两个return会有正常转场撤销会话的风险。当前不编码、不自行改生命周期 |
| F2/F3旧清单状态纠正 | 正式KV已有独立KVUserService,IsLogin=>IsAuthorized(`:39–40`),固定原handle及加载接收接口;旧UserService.KVLoad是仍使用的验证支路 | 不再将旧PF类排除KV、旧OnInitData描述当正式链未实现;正式发布/初始化真实验收仍未完成 |
| F5普通业务请求 | CustomServerMgr`:68–74`已有EnableKVBusiness;`:159–177`正式就绪后经租约发送并检查过期 | 全局“KV拒绝普通请求”已解除,不能再申请重复恢复;加载期、失效会话拒绝应保留 |
| F6匹配绕行 | 上述两处非PF提前MachingEnd(null) | 都是待恢复的迁移绕行;原超时/匹配失败等也调用MachingEnd(null),不可全局删除这个原业务调用 |
| 移动平台 | 原UserService`:213/217`调用易盾/TapJoy;KVUserService未接。KVTapJoyBalance已解码但正式KV无平台消费 | 已登记暂缓项,仍欠同等初始化与真实渠道证据;不因桌面阶段通过销账,不擅自引入平台改造 |
| F7开发/空服务 | LoginStage非AGG仍注册DevIAPService;EmptyMailService检索仅见定义 | DevIAP为原渠道实现,不能推断为迁移新增冻结;空服务是否删除须先证迁移因果与全引用,不能仅凭名称处理 |
| F8账号/渠道 | PlayerKVRuntimeSelection`:24–43`拒绝AGG、固定地址、仅101/102 | 已裁决准入边界。103–110测试许可不等于正式扩员许可;最终支持范围需明确,当前不删除约束 |
| F9验收证据 | 首场景、正常退出/新进程恢复、RT及渠道/真实Player仍欠证 | 离线通过不能替代;暂不打包要求继续遵守 |
清理复核:`UI/ShootingRange/BaseEventData.cs`的泛型BaseEventData<T>只有定义,Unity事件系统的同名BaseEventData不算其消费者。git HEAD中已存在同一原PF上传实现,当前该文件相对HEAD无diff;未证明是本次迁移造成闲置,因此当前不纳入可删除白名单。Assets/LocalPackages非C#、非meta、非DLL文本检索未发现该文件GUID、EmptyMailServices GUID或所查类型字符串引用;这不覆盖二进制/动态反射。最终删除必须同时证明迁移因果、源/资源/反射消费者消失。不得沿历史清单“无调用者就删除”的简略表述扩大清理范围。旧验证类有实际消费者,继续保留;PlayerKV改名留全部迁移完成后。
底层边界复核:KVMgr四入口接收固定handle,PlayerKVClient只有本人Get/Set/Delete协议,不引用LeadboardData/FriendService/UI。本人统计候选应从现有业务层调用store,不能向底层增加等级榜/玩家业务依赖。本轮结论限所核入口,不声称完成整个工程依赖图审计。
## 4. 验证缺口与执行顺序
1. 已完成:C3d缓存/事件/远端昵称头像成功失败、SDK哨兵、两编译条件回归;C3a加载/装备/退出回调限定验证。无需因等待服务端机械重跑。
2. 客户端可独立补齐但须获审:本人统计的真实类入宿主、KV写入/确认/失败/旧会话及PF对照。现有ServiceHost的C3IdentityCompatibilityTests仍使用LeadboardData替身;已有491断言不覆盖真实SetLvData,也不证明统计写已迁。
3. 接口交付后同批完成:榜/好友/普通等级/公告/匹配接线,真实消费者、原返回/失败语义以及KV链PF调用计数。
4. 最终一起验收:解除开发绕行与正常交接、真实首场景→业务保存→退出→新进程恢复、渠道/RT,以及仅迁移造成的闲置实现。最终独立实施复核保持,不逐方法送审。
## 5. 并入原C3c的集中裁决项 R2-S:本人统计写能否独立实施
### 5.1 已定事实与申请
用户已定LevelB及本人登录时间可存KV;原计算、名称和时机不重做。`PlayerKVClient.SetAsync`(`:44`)已有data字典写本人数据,固定会话store已有Write/FlushAsync/ConfirmAsync。拟持久化的是原统计值本身,**不是临时副本,也不是新等级真值**。服务端读取后续消费同一键,不客户端重算历史统计。
申请审核明确:在聚合/跨玩家读取接口未交付时,是否允许先完成本人统计存储提供方替换,继续保留首场景闸和整链未完成状态?不能将“能写本人KV”推导为“等级榜功能已完成”,也不把键名既定当作全部失败/并发合同已审通过。
### 5.2 最小候选,供裁决而非编码许可
生产候选仅`DataCenter/DataCenter.LeadboardData.cs`:SetLeadboardData增加KV存储分支和必要using;SetLvData只在已审未知地区边界确需适配统计名列表时最小处理,公式/原lv回写/async void/isRefreshing/原调用点不动。GetLeadboardData、活动榜、UI、登录阶段、LastLogin、KVUserService、底层KV与服务器均不改。
拟映射:原LevelB与合法ContinentCode+LevelB保存同一复合整数的InvariantCulture十进制字符串。地区缺失处理沿已审“不冒充地区榜”边界;审核须确认其与原字符串拼接在KV缺地区情况下的精确差异,不能误称逐字符不变。值仍由原lv×100000+建筑生成,无负数归零、额外溢出保护或新调度。
现有接口候选:在原请求位置捕获本次KVUserService.SaveStore,先完成原参数列表构造,再按原统计顺序Write,至少一项接受时await一次现有FlushAsync。明确拒写及非Confirmed结果记录错误,沿原SDK错误log后Task正常结束的业务合同;无PF回退、额外重试、抛错阻断、锁/finally重构。意外编程异常不新增宽泛吞错。PF/AGG原分支不变。
**这不是恢复已撤回的“通用Flush临时快照”许可。** 此候选只是说明现有接口可如何复用,必须由原C3c重新明确以下差异是否可接受;不能用旧暂存增量的白名单开工。若不等价,给出具体差异,不扩建统计管理器来绕开审查。
### 5.3 本次须一次给出结论的项目
| 裁决点 | 已核事实及需要明确的判断 |
|---|---|
| 独立实施是否允许 | 第四轮要求写与聚合键对齐共同批准,第五轮明确挂起。是否以本包固定键/序列化为客户端合同先批准写入,读侧之后照此对齐?若不可,指出确实阻塞写入的字段/业务语义,不笼统归因于四项服务未完成 |
| 原统计更新语义 | 客户端发一次两项列表,但源码不能证明原PF统计后端的Last/Max/Sum、版本/重置及事务语义。本人KV是键值覆盖;如原配置影响等价性,列准确缺证项。不得推定原PF必然原子或必然覆盖,也不暗改成max累积 |
| 等待和失败 | SDK包装器UpdatePlayerStatisticsAsync错误回调log+SetResult(null),原调用者忽略结果后复位。store拒写/Unknown/Cancelled/Superseded等怎样映射到同样的公开完成方式,且不把任务正常结束冒充远端成功 |
| 现有Flush范围 | KVPlayerSaveStore.FlushAsync捕获全部pendingReceipts并刷新固定handle,可能包含无关待写;因此本次结果可能受其他键影响,传输请求数/完成时点也不能保证与PF单请求相同。审核须判断能否满足纯平移;不默认允许扩大刷新或额外等待 |
| 多键和并发 | 两次Write可部分接受/确认,同键新写可Superseded。现有层无统计专用原子批接口;不得声称同时成功,不新增回滚、补偿或修改原并发规则。若这些差异阻塞,则精确列出,不能将客户端简单可写称完整等价 |
| 文件与测试边界 | 只批准确需的具体方法/测试,或给出最小修订;新增抽象不在候选。允许范围内编译/测试修正连续完成,不再逐方法提交审核 |
测试候选范围:ServiceHost.csproj链接完整真实LeadboardData;C3IdentityCompatibilityTests移除同名业务替身;Stubs补未执行依赖的最小签名和PF统计请求记录;Program接入测试;新增C3StatisticsWriteTests.cs。不复制算法凑通过,未测试依赖不返回假业务成功。既有M2MergedGameplayTests/C3ProfileCacheTests不因统计写随意改断言;精确测试文件许可由本次裁决给出。
应覆盖:真实SetLvData原公式/上限/坏建筑值及原负值;全球/地区名;原等待前后状态;参数不匹配在写入前暴露;拒写/部分接受/各确认状态;延迟确认中换号/注销/同键更新;其他待写键失败;真实store/handle合成传输及重新读取;PF/AGG请求参数和错误返回对照。通过后完整双条件回归及Unity CLI Loop编译。formalRequests=0,不解除场景闸,不自动写正式账号,不打包。
### 5.4 原审核端回写要求
请核本包hash后,把R2-S与本次剩余项核查的结论**追加到原`M2-C3c剩余SDK接线独立差异审查-2026-09-30.md`**:允许独立实施/附具体条件允许/不允许及具体原因;列文件、方法、测试边界,并明确是否替代第四/第五轮对本人统计写的挂起限制。其余四项读取/协调能力继续沿原合同等待实交,不要求重审C3d。
主会话收到后核受审hash、逐条裁决,再在获准范围连续编码和验证。本轮用户授权的是核查及列入裁决,不是直接实施统计写;现阶段保持未编码。