136 lines
4.1 KiB
C#
136 lines
4.1 KiB
C#
using System;
|
|
using asap.core;
|
|
using cfg;
|
|
using GameCore;
|
|
using Newtonsoft.Json;
|
|
using UniRx;
|
|
using UnityEngine;
|
|
|
|
namespace game
|
|
{
|
|
public abstract class AEventDataManager<T>:IDisposable where T : class, IEventData, new()
|
|
{
|
|
protected AEventDataManager()
|
|
{
|
|
Disposables=new CompositeDisposable();
|
|
GContext.OnEvent<TargetEvent>().Subscribe(OnEvent_TargetEvent).AddTo(Disposables);
|
|
}
|
|
private Tables _tables;
|
|
|
|
[Inject]
|
|
public Tables Tables
|
|
{
|
|
get=>_tables??=GContext.container.Resolve<Tables>();
|
|
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<T>(dataStr);
|
|
}
|
|
|
|
protected virtual void InitData(int eventId)
|
|
{
|
|
_data = new T();
|
|
Data.EventID = eventId;
|
|
Data.InflationRate=GContext.container.Resolve<PlayerData>().InflationRate;
|
|
}
|
|
|
|
#endregion
|
|
|
|
public static void Register<M>()where M:AEventDataManager<T>
|
|
{
|
|
var instance=GContext.container.Resolve<M>();
|
|
if (instance != null) return;
|
|
GContext.container.Register<M>().AsSingleton();
|
|
GContext.container.Resolve<M>();
|
|
}
|
|
#region Token
|
|
|
|
public virtual void AddToken(int count)
|
|
{
|
|
var currentCount = GetTokenCount();
|
|
if (Data == null) return;
|
|
var totalCount = currentCount + count;
|
|
GContext.container.Resolve<FishingEventData>().SaveTransitionData(Data.EventID, totalCount);
|
|
}
|
|
|
|
protected virtual void RemoveToken(int count)
|
|
{
|
|
if (Data == null) return;
|
|
var eventData = GContext.container.Resolve<FishingEventData>();
|
|
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<FishingEventData>();
|
|
return eventData?.GetTransitionDataCount(Data.EventID) ?? 0;
|
|
}
|
|
#endregion
|
|
}
|
|
} |