using asap.core; using cfg; using GameCore; using System; using System.Collections.Generic; using UnityEngine; public class WelcomeBackData { public string lastLoginTime; public string openTime; public string rewardTime; public int received; public int eventCount; public int offlineDays; } public class EventWelcomeBackManager { string DataKey_WelcomeBack = "WelcomeBack"; Tables tables; public TbEventWelcomeBackConfig eventWelcomeBackConfig; public WelcomeBackData welcomeBackData; public EventWelcomeBackManager() { tables = GContext.container.Resolve(); eventWelcomeBackConfig = tables.TbEventWelcomeBackConfig; } public WelcomeBackData LoadData() { try { string data = PlayFabMgr.Instance.GetLocalData(DataKey_WelcomeBack); if (!string.IsNullOrEmpty(data)) { welcomeBackData = Newtonsoft.Json.JsonConvert.DeserializeObject(data) ?? new WelcomeBackData(); } else { welcomeBackData = new WelcomeBackData(); } } catch (Exception e) { Debug.LogError($"LoadData failed: {e}"); welcomeBackData = new WelcomeBackData(); } return welcomeBackData; } public int GetState(int index, EventWelcomeBackTimeReward timeReward) { if (index < welcomeBackData.received) { return 2; } // 仅用于本方法内计算,不修改 welcomeBackData,避免 GetState 产生副作用 string baseTimeStr = welcomeBackData.received < 7 ? welcomeBackData.openTime : welcomeBackData.rewardTime; if (string.IsNullOrEmpty(baseTimeStr)) return 0; System.DateTime curTime = ZZTimeHelper.UtcNow(); System.DateTime baseTime = System.DateTime.Parse(baseTimeStr); return baseTime.AddMinutes(timeReward.Time) <= curTime ? 1 : 0; } public int CheckRedPoint() { var dataList = tables.TbEventWelcomeBackTimeReward.DataList; int red = 0; int count = dataList.Count; if (welcomeBackData.received < 7) { count = Math.Min(7, dataList.Count); } for (int i = welcomeBackData.received; i < count; i++) { int state = GetState(i, dataList[i]); if (state == 1) { red++; } else { break; } } return red; } public List ClaimReward() { var dataList = tables.TbEventWelcomeBackTimeReward.DataList; List dropID = new List(); int state = 0; int count = dataList.Count; if (welcomeBackData.received < 7) { count = Math.Min(7, dataList.Count); } int curIndex = welcomeBackData.received; for (int i = welcomeBackData.received; i < count; i++) { state = GetState(i, dataList[i]); if (state == 1) { dropID.Add(dataList[i].DropID); welcomeBackData.received = i + 1; } else { break; } } if (dropID.Count > 0) { if (curIndex < 7 && welcomeBackData.received >= 7) { welcomeBackData.rewardTime = ZZTimeHelper.UtcNow().ToString(); } GContext.container.Resolve().AddItemByDropListLureInflation(null, dropID, null, false); SaveData(); return dropID; } return null; } public System.DateTime GetCurrentRoundEndTime() { System.DateTime baseTime; int windowSeconds; if (welcomeBackData.received < 7) { baseTime = System.DateTime.Parse(welcomeBackData.openTime); windowSeconds = eventWelcomeBackConfig.WelcomeBackTimeRewardWindow[0]; } else { baseTime = System.DateTime.Parse(welcomeBackData.rewardTime); windowSeconds = eventWelcomeBackConfig.WelcomeBackTimeRewardWindow[1]; } return baseTime.AddSeconds(windowSeconds); } public EventWelcomeBackTimeReward GetCurRefreshTime() { if (welcomeBackData.received < tables.TbEventWelcomeBackTimeReward.DataList.Count) { return tables.TbEventWelcomeBackTimeReward.DataList[welcomeBackData.received]; } return null; } public bool CheckWelcomeBack() { if (GContext.container.Resolve().lv < eventWelcomeBackConfig.WelcomeBackConditionLevel) { return false; } try { LoadData(); if (string.IsNullOrEmpty(welcomeBackData.lastLoginTime)) { SetLastLoginTime(); return false; } else { System.DateTime lastTime = System.DateTime.Parse(welcomeBackData.lastLoginTime); System.DateTime curTime = ZZTimeHelper.UtcNow(); if (!string.IsNullOrEmpty(welcomeBackData.openTime)) { System.DateTime openTime = System.DateTime.Parse(welcomeBackData.openTime); var offlineTime = curTime - openTime; if (offlineTime.TotalSeconds >= eventWelcomeBackConfig.WelcomeBackCD) { welcomeBackData.openTime = string.Empty;// 超过回归活动CD时间,重置数据 SaveData(); // 不 return,继续往下判断能否开启新一轮(依据 lastLogin 离线时间) } else if (curTime >= GetCurrentRoundEndTime() || welcomeBackData.received >= tables.TbEventWelcomeBackTimeReward.DataList.Count) { return false; } else { return true; } } if (string.IsNullOrEmpty(welcomeBackData.openTime)) { var offlineTime = curTime - lastTime; if (offlineTime.TotalSeconds >= eventWelcomeBackConfig.WelcomeBackConditionTime) { welcomeBackData.openTime = curTime.ToString(); welcomeBackData.rewardTime = curTime.ToString(); welcomeBackData.received = 0; welcomeBackData.eventCount++; welcomeBackData.offlineDays = (int)offlineTime.TotalDays; SetLastLoginTime(); GContext.container.Resolve().AddFaceCustomUIData(new UIType("ComebackGiftPopupPanel")); GContext.container.Resolve().AddFaceCustomUIData(new UIType("ComebackChainsPopupPanel")); return true; } } } } catch (System.Exception e) { Debug.LogError(e); SetLastLoginTime(); return false; } return false; } void SetLastLoginTime() { if (welcomeBackData == null) { welcomeBackData = new WelcomeBackData(); } welcomeBackData.lastLoginTime = ZZTimeHelper.UtcNow().ToString(); SaveData(); } void SaveData() { PlayFabMgr.Instance.UpdateUserDataValue(DataKey_WelcomeBack, Newtonsoft.Json.JsonConvert.SerializeObject(welcomeBackData)); } } public struct ClaimComeBack { public int state; }