using System; using asap.core; using cfg; using GameCore; using Newtonsoft.Json; using UniRx; using UnityEngine; namespace game { public abstract class AEventDataManager:IDisposable where T : class, IEventData, new() { protected AEventDataManager() { Disposables=new CompositeDisposable(); GContext.OnEvent().Subscribe(OnEvent_TargetEvent).AddTo(Disposables); } private Tables _tables; [Inject] public Tables Tables { get=>_tables??=GContext.container.Resolve(); set=>_tables=value; } protected CompositeDisposable Disposables { get; } public virtual void Dispose() { Disposables?.Dispose(); } #region event protected abstract int EventType { get; } protected abstract int EventSubType { get; } protected virtual void OnEvent_TargetEvent(TargetEvent targetEvent) { if (targetEvent.type == EventType && targetEvent.subType == EventSubType) RefreshData(targetEvent.id); } #endregion #region data protected T _data; protected internal T Data => _data ??= new T(); protected virtual void SaveData() { #if UNITY_EDITOR Debug.Log($"jsd {typeof(T).Name} SaveData {JsonConvert.SerializeObject(Data)}"); #endif PlayFabMgr.Instance.UpdateUserDataValue(typeof(T).Name, JsonConvert.SerializeObject(Data)); } protected virtual void SaveData(T data) { #if UNITY_EDITOR Debug.Log($"jsd {typeof(T).Name} SaveData {JsonConvert.SerializeObject(data)}"); #endif PlayFabMgr.Instance.UpdateUserDataValue(typeof(T).Name, JsonConvert.SerializeObject(data)); } protected virtual void RefreshData(int eventId) { //判断周开启时间 var fishingEvent = Tables.TbFishingEvent.GetOrDefault(eventId); if (fishingEvent == null) return; var cacheData = GetCacheData(); if (cacheData != null && cacheData.EventID == eventId) { Data.SetData(cacheData); return; } InitData(eventId); } protected T GetCacheData() { var dataStr = PlayFabMgr.Instance.GetLocalData(typeof(T).Name); #if UNITY_EDITOR Debug.Log($"jsd {typeof(T).Name} LoadData sData {dataStr}"); #endif return string.IsNullOrEmpty(dataStr) ? new T() : JsonConvert.DeserializeObject(dataStr); } protected virtual void InitData(int eventId) { _data = new T(); Data.EventID = eventId; Data.InflationRate=GContext.container.Resolve().InflationRate; } #endregion public static void Register()where M:AEventDataManager { var instance=GContext.container.Resolve(); if (instance != null) return; GContext.container.Register().AsSingleton(); GContext.container.Resolve(); } #region Token public virtual void AddToken(int count) { var currentCount = GetTokenCount(); if (Data == null) return; var totalCount = currentCount + count; GContext.container.Resolve().SaveTransitionData(Data.EventID, totalCount); } protected virtual void RemoveToken(int count) { if (Data == null) return; var eventData = GContext.container.Resolve(); if (eventData == null) return; var current = GetTokenCount(); var resCount = Mathf.Max(0, current - count); eventData.SaveTransitionData(Data.EventID, resCount); } public virtual int GetTokenCount() { if (Data == null) return 0; var eventData = GContext.container.Resolve(); return eventData?.GetTransitionDataCount(Data.EventID) ?? 0; } #endregion } }