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

14 KiB
Raw Blame History

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只有定义,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、逐条裁决,再在获准范围连续编码和验证。本轮用户授权的是核查及列入裁决,不是直接实施统计写;现阶段保持未编码。