保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。 保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。 验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。 包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
14 KiB
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. 验证缺口与执行顺序
- 已完成:C3d缓存/事件/远端昵称头像成功失败、SDK哨兵、两编译条件回归;C3a加载/装备/退出回调限定验证。无需因等待服务端机械重跑。
- 客户端可独立补齐但须获审:本人统计的真实类入宿主、KV写入/确认/失败/旧会话及PF对照。现有ServiceHost的C3IdentityCompatibilityTests仍使用LeadboardData替身;已有491断言不覆盖真实SetLvData,也不证明统计写已迁。
- 接口交付后同批完成:榜/好友/普通等级/公告/匹配接线,真实消费者、原返回/失败语义以及KV链PF调用计数。
- 最终一起验收:解除开发绕行与正常交接、真实首场景→业务保存→退出→新进程恢复、渠道/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、逐条裁决,再在获准范围连续编码和验证。本轮用户授权的是核查及列入裁决,不是直接实施统计写;现阶段保持未编码。