Files
ft/CodexOutput/upserver/B3BatchMigration/M2/M2-客户端致服务端线上合同集中问题单-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

31 lines
4.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 客户端与服务端集中确认项
日期:2026-09-29。用户裁决:**KV 模式使用认证会话的新玩家 ID(`PlayerKVAccountDescriptor.PlayerId`);原 PlayFab 玩家数据改经 KV 读写;原有游戏服请求沿用原逻辑。** 本 Agent 只处理客户端,不读取或修改本机、远程服务器代码。本文件只记录服务端实现依赖,不再向用户追问存储位置,也不对现有接口逐项索要 Swagger、路由和完整响应说明。
## 既有游戏服接口的新 ID 接线
现有游戏服接口若显式接收原 `playFabId`/`UserId`,KV 模式改传**新的玩家 ID**;原请求字段名、路由和业务流程保持现状。按用户指示,服务端开发侧接受新 ID 的兼容性由该侧核实;客户端不以逐项合同确认阻断接线。线上实测尚未完成,接线后做功能回归;只有出现具体不兼容时才记录接口、输入和响应并集中处理。
客户端已核:邮件 fetch/send/updateState 请求体没有 `playFabId`,请求身份由登录 Cookie 承载;`UserId` 只用于邮件本地缓存与同步游标分账号键,KV 将改用新 ID。好友邀请数请求体为空;俱乐部已有部分请求使用 `ApiPlayerId`;反作弊 `CheckBan` 明确发送 `playerID=userService.UserId`。这些都按上述原则接线,不再分别发起合同确认。
## 跨账号等级榜读取的实现依赖
用户已裁决:**KV 模式等级榜分数以 KV 为数据源,不再使用 PlayFab 统计存储。** 当前 KV 存档已有 `Lv` 和 `InfiniteBuildingData`,旧等级榜分数由等级乘 `100000` 再加建筑等级计算;客户端方案优先从这些已存 KV 值推导个人分数,避免未经评审重复存一份分数。`PlayerKVClient.Get/Set/Delete` 仅操作认证账号自己的 KV;旧等级榜另需全服/地区前 50 名及其他玩家资料,不能由客户端读取自己的 KV 后推算。服务端开发侧只需说明是否已有**从 KV 数据汇总的等级榜读取入口**;如果没有,则由该侧实现相应聚合读取并提供最小调用方式。本客户端 Agent 不读/改服务器代码,也不会伪造前 50 名或把个人分数当成全服榜。
`LeadboardData.GetLeaderboard` 的活动榜已通过现有 `event/GetLeaderboards` 游戏服请求,属于不同功能;沿用原流程并将显式玩家 ID 改为新 ID,不与等级榜聚合需求混为一谈。
问卷的旧 PlayFab 存档和十六进制 ID 抽样属于**客户端迁移**;`LoginDays`、邮件领奖、RT 重连等按原流程做客户端回归与旧会话保护。除非实测出现具体协议差异,不再要求服务端预先逐项解释原有接口。
## 跨账号公开资料读取
原 `UserService.GetPlayInfo/GetPlayLv` 在缓存缺失时调用 PlayFab 的 GetPlayerProfile/GetUserData;KV 自有档接口不能查询别人的公开档案。现有 Club、活动榜、伙伴等响应自带的资料直接复用;其余他人昵称、头像、等级、最后登录时间需要按**新 PlayerId**读取的公开资料入口。服务端侧提供已有入口及最小字段/错误语义即可,无需客户端查看服务端源码或再次裁定数据存储位置。客户端消费者包括社交/成员/伙伴列表,不能读本人KV代替对方,也不能用空成功伪装已迁移。
## 直接 PF 能力的替代(与普通游戏服请求区别)
- `FriendService.GetFriendList` 仍直接调用 PlayFab `GetFriendsListAsync`,包含好友关系、头像、昵称、统计和最后登录时间。AddFriend/DeleteFriend/SearchFriend等现有 `friend/*` 请求保持原逻辑/字段并传新ID;还需服务端侧指出已有的好友关系列表读取能力,若无则由该侧实现。客户端不猜测新的 `friend/GetFriendList` 路由。
- `Duel/UI/EventFishingDuelPanel.cs` 使用 PlayFab Multiplayer 创建/轮询/取消匹配票据及读取Match,旧EntityKey只属于PF。KV需对应的新ID匹配能力(创建、查询、取消、匹配结果/成员),不是把PlayerId塞进旧EntityKey即可。服务端侧说明可复用入口;客户端保留PF路线,未有依据前不伪造KV匹配成功。此项不阻断独立KV用户服务与个人存档编码,但阻断该功能最终通关。
以上条目来自具体客户端旧SDK调用,不是新增逐接口审批清单。邮件等既有游戏服接口不因此要求重做协议确认。多键KV与邮件状态跨系统崩溃窗口记录在合批正式方案奖励节;客户端不会声称ID替换同时获得事务保证。
首批正式 KV 仍限 **101、102 且已有 KV 档**,地址固定 `http://s101.local:18080/`。PF/AGG 模式保留原 PlayFab ID 和原路线;KV 不伪造 PlayFab ID/`EntityKey`。开发前完整方案评审、检查点日志、最终清理临时门控与闲置实现照常执行;不因本确认项拆成多轮审核。