feat(upserver): 保存M2客户端KV迁移至本人统计写检查点

保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。
保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。

验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。
包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
This commit is contained in:
Liubing\LB
2026-09-30 19:19:05 +08:00
parent 1c0cdf7a99
commit 6813da149a
511 changed files with 151858 additions and 2376 deletions

View File

@@ -1,4 +1,4 @@
using asap.core;
using asap.core;
using cfg;
using game;
using GameCore;
@@ -12,6 +12,8 @@ using UnityEngine;
public class AquariumManager
{
public const string AquariumEventDataNewKey = "AquariumEventDataNewKey";
readonly game.PlayerDataStorage.IPlayerSaveStore saveStore;
readonly IUserService loginUser;
private cfg.Tables _tables;
private ICustomServerMgr customServerMgr;
public AquariumManagerData data { get; private set; }
@@ -21,12 +23,15 @@ public class AquariumManager
public List<AquariumSlotData> sellList;
public AquariumManager()
{
saveStore = GContext.container.Resolve<game.PlayerDataStorage.IPlayerSaveStore>();
loginUser = GContext.container.Resolve<IUserService>();
_tables = GContext.container.Resolve<Tables>();
customServerMgr = GContext.container.Resolve<ICustomServerMgr>();
}
public static AquariumManagerData GetAquariumManagerData()
public static AquariumManagerData GetAquariumManagerData(game.PlayerDataStorage.IPlayerSaveStore store = null)
{
string dataStr = PlayFabMgr.Instance.GetLocalData(AquariumEventDataNewKey);
var source = store ?? GContext.container.Resolve<game.PlayerDataStorage.IPlayerSaveStore>();
string dataStr = source.Read(AquariumEventDataNewKey).ValueOrThrow();
if (!string.IsNullOrEmpty(dataStr))
{
try
@@ -43,7 +48,8 @@ public class AquariumManager
public async Task Synchrodata()
{
//从服务器拿数据
var dataSever = GetAquariumManagerData();
if (!saveStore.IsCurrent) throw new OperationCanceledException();
var dataSever = GetAquariumManagerData(saveStore);
if (dataSever == null)
{
//新数据
@@ -63,8 +69,9 @@ public class AquariumManager
return;
}
GetAquariumDataRequest request = new GetAquariumDataRequest();
request.playFabId = GContext.container.Resolve<IUserService>().UserId;
request.playFabId = loginUser.UserId;
string result = await customServerMgr.CustomServerPost("aquarium/GetAquariumData", Newtonsoft.Json.JsonConvert.SerializeObject(request));
if (!saveStore.IsCurrent) throw new OperationCanceledException();
AquariumServerData serverData = null;
if (result != null)
{
@@ -611,7 +618,7 @@ public class AquariumManager
}
void UpdateUserData()
{
PlayFabMgr.Instance.UpdateUserDataValue(AquariumEventDataNewKey, data.Serialize());
saveStore.Write(AquariumEventDataNewKey, data.Serialize()).RequireAccepted();
}
void SaveData(bool all = false)
{
@@ -637,7 +644,7 @@ public class AquariumManager
if (all)
{
UpdateAquariumAllDataRequest request = new UpdateAquariumAllDataRequest();
request.playFabId = GContext.container.Resolve<IUserService>().UserId;
request.playFabId = loginUser.UserId;
request.data = new AquariumServerData()
{
startTime = data.startTime,
@@ -653,7 +660,7 @@ public class AquariumManager
else
{
UpdateSlotDatasRequest request = new UpdateSlotDatasRequest();
request.playFabId = GContext.container.Resolve<IUserService>().UserId;
request.playFabId = loginUser.UserId;
request.slotDatas = data.slotDatas;
request.cardLv = string.Join(',', cardLv);
customServerMgr.CustomServerPost("aquarium/UpdateSlotData", Newtonsoft.Json.JsonConvert.SerializeObject(request));