using asap.core; using cfg; using GameCore; using System; using System.Collections.Generic; using UnityEngine; /// /// 同一系列的活动使用同一个Model /// 礼包、代币、进度奖励等数据结构都相同 /// 后续活动只用关系自己的玩法数据即可 /// public class EventLuckyGameModel : ILuckyTaskGetData, ILuckyTaskUIGetData { public static EventLuckyGameModel Get() { var model = GContext.container.Resolve(); if (model == null) { GContext.container.Register().AsSingleton(); model = GContext.container.Resolve(); } return model; } public const string Key = "EventLuckGameRecord"; public const string PackRedPointKey = "luckgame.pack"; public const string RedPointKey = "luckgame"; EventLuckGameRecord eventLuckGameRecord = new EventLuckGameRecord(); FishingEventData fishingEventData; Tables tables; public FishingEvent fishingEvent { get; private set; } public EventLuckGameInfo eventInfo { get; private set; } = new EventLuckGameInfo(); public FishingEventCycleItem3 cycle { get; private set; } public int EventId => eventLuckGameRecord.EventId; public int Progress => eventLuckGameRecord.Progress; public string EventGameData => eventLuckGameRecord.EventGameData; public TimeSpan RemainingTime { get { if (fishingEvent == null || fishingEvent.TimeDefinition is not LimitedTime limitedTime) { return TimeSpan.Zero; } return System.DateTime.Parse(limitedTime.EndTime) - ZZTimeHelper.UtcNow(); } } public EventLuckyGameModel(FishingEventData fishingEventData, Tables tables) { this.fishingEventData = fishingEventData ?? GContext.container.Resolve(); this.tables = tables ?? GContext.container.Resolve(); luckyTaskData = new LuckyTaskData(this); } public void Save() { string s = Newtonsoft.Json.JsonConvert.SerializeObject(eventLuckGameRecord); //Debug.Log($"[EventLuckGameModel] Save EventLuckGameRecord: {s}"); PlayFabMgr.Instance.UpdateUserDataValue(Key, s); } //=========================以下是活动数据========================= public int TicketCount { get { if (!IsActive) { return 0; } //_ticketCount = fishingEventData.GetTransitionDataCount(EventId); return eventLuckGameRecord.TicketCount; } private set { if (!IsActive) { return; } eventLuckGameRecord.TicketCount = value; if (eventLuckGameRecord.TicketCount < 0) { eventLuckGameRecord.TicketCount = 0; } fishingEventData.SaveTransitionData(EventId, eventLuckGameRecord.TicketCount); Save(); RedPointManager.Instance.SetRedPointState(RedPointKey, eventLuckGameRecord.TicketCount >= cycle.RedDot); } } public bool IsActive { get { if (fishingEvent == null) { return false; } if (fishingEvent.TimeDefinition is LimitedTime limitedTime) { return ZZTimeHelper.UtcNow() < System.DateTime.Parse(limitedTime.EndTime) && ZZTimeHelper.UtcNow() > System.DateTime.Parse(limitedTime.StartTime); } return false; } } public void AddTicket(int count) { if (fishingEvent == null || cycle == null || !IsActive) { Debug.LogError("[EventLuckGameModel] _tableEvent is null, cannot add ticket."); return; } TicketCount += count; } #region 进度奖励 public void AddProgress(int progress) { if (fishingEvent == null) { Debug.LogError("[EventLuckGameModel] _tableEvent is null, cannot add progress."); return; } eventLuckGameRecord.Progress += progress; if (eventLuckGameRecord.Progress < 0) { eventLuckGameRecord.Progress = 0; } Save(); } #endregion 进度奖励 public void OnEvent(FishingEvent t) { fishingEvent = t; if (t == null) { return; } string s = PlayFabMgr.Instance.GetLocalData(Key); if (string.IsNullOrEmpty(s)) { eventLuckGameRecord = new EventLuckGameRecord(); } else { try { eventLuckGameRecord = Newtonsoft.Json.JsonConvert.DeserializeObject(s); } catch (Exception e) { Debug.LogError($"[EventLuckGameModel] Deserialize Error: {e.Message}"); eventLuckGameRecord = new EventLuckGameRecord(); } } DicTasks = eventLuckGameRecord.DicTasks; cycle = tables.TbFishingEventCycleItem3.GetOrDefault(t.RedirectID); if (cycle == null) { Debug.LogError($"[EventLuckGameModel] CycleItem3 not found for RedirectID: {t.RedirectID}"); return; } if (eventLuckGameRecord.EventId != t.ID) { eventLuckGameRecord.EventId = t.ID; eventLuckGameRecord.ChainProgress = 0; eventLuckGameRecord.Progress = 0; eventLuckGameRecord.EventGameData = string.Empty; TicketCount = cycle.WelcomeGift; DicTasks.Clear(); } SetEventInfo(); } //=========================以上是活动数据========================= //=========================以下是玩法数据========================= public void SetEventGameData(string data) { if (fishingEvent == null) { Debug.LogError("[EventLuckyGameModel] fishingEvent is null, cannot set event game data."); return; } eventLuckGameRecord.EventGameData = data; Save(); } void SetEventInfo() { if (fishingEvent == null) { Debug.LogError("[EventLuckyGameModel] fishingEvent is null, cannot set event info."); return; } eventInfo = GetEventLuckGameInfo(); if (DicTasks.Count == 0 && eventInfo.TaskRound1 != null && eventInfo.TaskRound1.Count > 0) { luckyTaskData.InitDicTasks(eventInfo.TaskRound1); } else { luckyTaskData.SetRedPoint(); } RedPointManager.Instance.SetRedPointState(RedPointKey, eventLuckGameRecord.TicketCount >= cycle.RedDot); } EventLuckGameInfo GetEventLuckGameInfo() { var eventInfo = new EventLuckGameInfo(); if (fishingEvent.SubType == 4) { EventLuckyCardsMain _tableMain = tables.TbEventLuckyCardsMain.GetOrDefault(cycle.RedirectID); if (_tableMain == null) { Debug.LogError($"[EventLuckyCardsMain] EventLuckyCardsMain is Null RedirectID {cycle.RedirectID}"); fishingEvent = null; return null; } eventInfo.IconName = _tableMain.Icon; eventInfo.MainPrefab = _tableMain.Prefab; eventInfo.TaskPanelName = _tableMain.TaskPrefab; eventInfo.ItemID = _tableMain.Item; eventInfo.PackId = _tableMain.PackId; eventInfo.TaskRound1 = _tableMain.TaskRound1; eventInfo.TaskRound2 = _tableMain.TaskRound2; } return eventInfo; } #region 任务相关数据获取接口 //这是一个工具类,只有一个监听任务触发的状态,处理任务数据 private LuckyTaskData luckyTaskData; /// 获取任务面板名称,配表 public string TaskPanelName => eventInfo.TaskPanelName; public string LuckyTaskRedPointKey => "luckgame.luckytask"; //任务数据存储 public Dictionary DicTasks { get; set; } = new Dictionary(); public void InitDicTasks() { luckyTaskData.InitDicTasks(eventInfo.TaskRound2); } public void SaveTaskData() { eventLuckGameRecord.DicTasks = DicTasks; Save(); } public bool OnGetTaskReward(int id) { return luckyTaskData.OnGetTaskReward(id, eventInfo.TaskRound2); } public int GetLuckyPackID() { if (fishingEvent == null || cycle == null || eventInfo == null) { Debug.LogError("[EventLuckyGameModel] fishingEvent or cycle is null, cannot get lucky gift info."); return 0; } return eventInfo.PackId; } #endregion 任务相关数据获取接口 //=========================以上是玩法数据========================= public void Dispose() { luckyTaskData.Dispose(); } } public class EventLuckGameRecord { public int EventId { get; set; } public int ChainProgress { get; set; } public int Progress { get; set; } public int TicketCount { get; set; } = 0; public string EventGameData { get; set; } = ""; public Dictionary DicTasks { get; set; } = new Dictionary(); } public class EventLuckGameInfo { public string ActName = "EventLuckyCardsAct"; public string IconName; public string MainPrefab; public string TaskPanelName; public int ItemID; public int PackId; public List TaskRound1; public List TaskRound2; }