feat(upserver): 保存M2客户端KV迁移至本人统计写检查点
保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。 保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。 验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。 包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
using asap.core;
|
||||
using cfg;
|
||||
using game;
|
||||
using LitJson;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace GameCore
|
||||
{
|
||||
public class DailySignEvent
|
||||
{
|
||||
public int ID;
|
||||
//领取第几个
|
||||
public int index;
|
||||
//签到最后一次是哪一天or链式礼包PackManager.ID
|
||||
public int lastID;
|
||||
//结束时间
|
||||
public string time;
|
||||
}
|
||||
public class MonthlySignEvent
|
||||
{
|
||||
public int index;
|
||||
//结束时间
|
||||
public DailySignEvent dailySignEvent;
|
||||
}
|
||||
public class OnSignEvent
|
||||
{
|
||||
public List<ItemData> itemDataList;
|
||||
}
|
||||
public class SigninData
|
||||
{
|
||||
[asap.core.Inject] public game.PlayerDataStorage.IPlayerSaveStore SaveStore { get; set; }
|
||||
|
||||
private cfg.Tables _tables;
|
||||
public SigninData(cfg.Tables tables)
|
||||
{
|
||||
this._tables = tables;
|
||||
}
|
||||
|
||||
MonthlySignEvent _monthlySignEvent = null;
|
||||
|
||||
internal static game.PlayerDataStorage.PlayerKVMonthlySignState DecodeForKVLoad(IReadOnlyDictionary<string,string> raw,
|
||||
game.PlayerDataStorage.PlayerKVSchemaDiagnostics errors) => game.PlayerDataStorage.PlayerKVSaveSchema.DecodeMonthlySign(raw,errors);
|
||||
internal void ResetForKVLoad() { _monthlySignEvent = null; }
|
||||
internal void ReplaceFromKVDecoded(game.PlayerDataStorage.PlayerKVMonthlySignState state)
|
||||
{
|
||||
if (state == null) throw new ArgumentNullException(nameof(state));
|
||||
_monthlySignEvent = !state.IsPresent ? null : new MonthlySignEvent
|
||||
{
|
||||
index = state.Index,
|
||||
dailySignEvent = new DailySignEvent { ID=state.DailyId, index=state.DailyIndex, lastID=state.LastId, time=state.Time }
|
||||
};
|
||||
}
|
||||
|
||||
public DailySignEvent dailySignEvent
|
||||
{
|
||||
get => _monthlySignEvent == null ? null : _monthlySignEvent.dailySignEvent;
|
||||
}
|
||||
|
||||
public MonthlySignEvent monthlySignEvent
|
||||
{
|
||||
get => _monthlySignEvent;
|
||||
set => _monthlySignEvent = value;
|
||||
}
|
||||
public void SetDailySignEvent(FishingEvent t)
|
||||
{
|
||||
DateTime dateTime = ZZTimeHelper.UtcNow().UtcNowOffset();
|
||||
bool isSave = false;
|
||||
DailySignEvent data = null;
|
||||
if (_monthlySignEvent == null)
|
||||
{
|
||||
_monthlySignEvent = new MonthlySignEvent()
|
||||
{
|
||||
index = 0,
|
||||
};
|
||||
isSave = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<MonthlySign> MonthlySignL = _tables.TbMonthlySign.DataList;
|
||||
|
||||
data = _monthlySignEvent.dailySignEvent;
|
||||
if (_monthlySignEvent.index >= MonthlySignL[^1].SignDayAccount && data.lastID != dateTime.DayOfYear)
|
||||
{
|
||||
_monthlySignEvent = new MonthlySignEvent()
|
||||
{
|
||||
index = 0,
|
||||
dailySignEvent = data,
|
||||
};
|
||||
isSave = true;
|
||||
}
|
||||
}
|
||||
SetTheme();
|
||||
if (data == null || (data.index >= 7 && data.lastID != dateTime.DayOfYear))
|
||||
{
|
||||
_monthlySignEvent.dailySignEvent = new DailySignEvent()
|
||||
{
|
||||
ID = t.RedirectID,
|
||||
lastID = -1,
|
||||
index = 0,
|
||||
time = dateTime.Date.ToString()
|
||||
};
|
||||
isSave = true;
|
||||
}
|
||||
if (isSave)
|
||||
{
|
||||
SaveStore.Write("MonthlySignEvent", JsonMapper.ToJson(_monthlySignEvent)).RequireAccepted();
|
||||
}
|
||||
bool isReward = CanDailySign();
|
||||
if (isReward)
|
||||
{
|
||||
ILoadResourceService loadResourceService = GContext.container.Resolve<ILoadResourceService>();
|
||||
loadResourceService.EnqueueBundleSilently(new List<string>() { UITypes.EventSignupPopupPanel_2.Name });
|
||||
GContext.container.Resolve<IFaceUIService>().AddGiftFaceUI(t.ID, UITypes.EventSignupPopupPanel_2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//签到
|
||||
public bool OnDailySign(int index, int DropID)
|
||||
{
|
||||
if (_monthlySignEvent == null || _monthlySignEvent.dailySignEvent == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool isSign = SignEvent(_monthlySignEvent.dailySignEvent, index);
|
||||
if (isSign)
|
||||
{
|
||||
_monthlySignEvent.index++;
|
||||
List<ItemData> itemDataList = GContext.container.Resolve<PlayerItemData>().AddItemByDropLureInflation(null, DropID, null, false);
|
||||
#if AGG
|
||||
DateTime tomorrow = GlobalUtils.TryParseDateTime(_monthlySignEvent.dailySignEvent.time, ZZTimeHelper.UtcNow().UtcNowOffset());
|
||||
TimeSpan remaining = ZZTimeHelper.UtcNow().UtcNowOffset() - tomorrow;
|
||||
using (var e = GEvent.GameEvent("user_checkin"))
|
||||
{
|
||||
e.AddContent("day_num", remaining.Days)
|
||||
.AddContent("day_count", _monthlySignEvent.dailySignEvent.index);
|
||||
if (itemDataList != null)
|
||||
{
|
||||
for (int i = 0; i < itemDataList.Count; i++)
|
||||
{
|
||||
e.AddContent($"item_{itemDataList[i].id}", itemDataList[i].count);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
List<MonthlySign> MonthlySignL = _tables.TbMonthlySign.DataList;
|
||||
List<ItemData> monthlySignReward = null;
|
||||
for (int i = 0; i < MonthlySignL.Count; i++)
|
||||
{
|
||||
if (_monthlySignEvent.index == MonthlySignL[i].SignDayAccount)
|
||||
{
|
||||
monthlySignReward = GContext.container.Resolve<PlayerItemData>().AddItemByDropLureInflation(null, MonthlySignL[i].DropID, null, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//GContext.Publish(new ShowData());
|
||||
SaveStore.Write("MonthlySignEvent", JsonMapper.ToJson(_monthlySignEvent)).RequireAccepted();
|
||||
GContext.Publish(new OnSignEvent() { itemDataList = monthlySignReward });
|
||||
}
|
||||
return isSign;
|
||||
}
|
||||
|
||||
|
||||
bool SignEvent(DailySignEvent data, int index)
|
||||
{
|
||||
if (data.lastID == ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear)
|
||||
{
|
||||
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_1"));
|
||||
return false;
|
||||
}
|
||||
if (index == data.index)
|
||||
{
|
||||
data.lastID = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear;
|
||||
data.index++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool DailySignIsOpen()
|
||||
{
|
||||
return _monthlySignEvent != null && _monthlySignEvent.dailySignEvent != null;
|
||||
}
|
||||
|
||||
public bool CanDailySign()
|
||||
{
|
||||
DailySignEvent data = dailySignEvent;
|
||||
return data != null
|
||||
&& data.lastID != ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear
|
||||
&& data.index < 7;
|
||||
}
|
||||
|
||||
public bool ShouldLoadSignInInterstitial()
|
||||
{
|
||||
return DailySignIsOpen() && FishingEventData.Condition_NoRechargeDay(15);
|
||||
}
|
||||
|
||||
private const string DefaultPanel = "EventSignupPopupPanel_2";
|
||||
private void SetTheme()
|
||||
{
|
||||
var themeList = _tables.TbEventSignSpTheme.DataList;
|
||||
UITypes.EventSignupPopupPanel_2.SetType(DefaultPanel);
|
||||
foreach (var theme in themeList)
|
||||
{
|
||||
try
|
||||
{
|
||||
var startTime = DateTime.Parse((theme.TimeDefinition as LimitedTime).StartTime);
|
||||
var endTime = DateTime.Parse((theme.TimeDefinition as LimitedTime).EndTime);
|
||||
var timeNow = ZZTimeHelper.UtcNow();
|
||||
if (startTime <= timeNow && timeNow <= endTime)
|
||||
{
|
||||
UITypes.EventSignupPopupPanel_2.SetType(theme.Prefab);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
UnityEngine.Debug.LogError($"[DataCenter] SetSignInTheme Error:");
|
||||
UnityEngine.Debug.LogError(e);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async void ResetTheme(TimeSpan duration)
|
||||
{
|
||||
await System.Threading.Tasks.Task.Delay(duration);
|
||||
UITypes.EventSignupPopupPanel_2.SetType(DefaultPanel);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user