using asap.core; using cfg; using GameCore; using System; using System.Collections.Generic; using UniRx; public class AchievementData { public int Id; public ulong Target; public int day; public override string ToString() { return $"{Id}|{Target}|{day}"; } public void ToObject(string[] arr) { Id = int.Parse(arr[0]); Target = ulong.Parse(arr[1]); day = int.Parse(arr[2]); } } public class AchievementDataManager : IDisposable { Tables _tables; //待释放 IDisposable disposable; public bool IsOpen; Dictionary _achievementDatas = new Dictionary(); public AchievementDataManager(Tables tables) { _tables = tables; } public void LoadAchievementData(string value) { _achievementDatas = Newtonsoft.Json.JsonConvert.DeserializeObject>(value); } public void LoadAchievementDataToObject(string value) { var dic = Newtonsoft.Json.JsonConvert.DeserializeObject>(value); foreach (var item in dic) { string[] Value = item.Value.Split('|'); if (Value.Length == 3) { AchievementData achievementData = new AchievementData(); achievementData.ToObject(Value); _achievementDatas[item.Key] = achievementData; } } } public void LoadAchievementDataToObjectNew(string value) { try { string[] strings = value.Split(';'); foreach (var item in strings) { string[] keyValue = item.Split(':'); if (keyValue.Length == 2) { ConditionType type = (ConditionType)Enum.Parse(typeof(ConditionType), keyValue[0]); string[] Value = keyValue[1].Split('|'); if (Value.Length == 3) { AchievementData achievementData = new AchievementData(); achievementData.ToObject(Value); _achievementDatas[type] = achievementData; } } } } catch (Exception e) { UnityEngine.Debug.LogError($"LoadAchievementDataToObjectNew Error:{e}"); } } public string AchievementDataToJson() { try { Dictionary keyValuePairs = new Dictionary(); List strings = new List(); foreach (var item in _achievementDatas) { strings.Add($"{(int)item.Key}:{item.Value.ToString()}"); } string result = string.Join(";", strings); return result; } catch (Exception e) { UnityEngine.Debug.LogError($"LoadAchievementDataToObjectNew Error:{e}"); return ""; } } public void Init() { if (disposable == null) { disposable = GContext.OnEvent().Subscribe(UpdateData); } } public ulong GetAchievementDatas(ConditionType type) { switch (type) { case ConditionType.AllRodLevel: return (ulong)(GContext.container.Resolve().GetRoodAllLevel() + GContext.container.Resolve().GetRodAllCount()); case ConditionType.AllFishCardLevel: return (ulong)GContext.container.Resolve().GetAllLevel(); default: if (_achievementDatas.ContainsKey(type)) { return _achievementDatas[type].Target; } else { return 0; } } } void UpdateData(ConditionTypeEvent condition) { //GetFishWeight ConditionType type = condition.type; List stats = _tables.TbStatistics.DataList; foreach (var item in stats) { if (type == item.ConditionType) { int day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; ulong count = (ulong)condition.count; if (_achievementDatas.ContainsKey(type)) { if (type == ConditionType.LoginDays && _achievementDatas[type].day == day) { return; } switch (type) { case ConditionType.LoginDays: if (_achievementDatas[type].day == day) { return; } else { _achievementDatas[type].Target++; } break; case ConditionType.MaxCashFromFishing: case ConditionType.MaxCashFromBomb: case ConditionType.MaxCashFromRaid: case ConditionType.AllRodLevel: case ConditionType.AllFishCardLevel: if (count > _achievementDatas[type].Target) { _achievementDatas[type].Target = count; } break; default: _achievementDatas[type].Target += count; break; } _achievementDatas[type].day = day; } else { _achievementDatas[type] = new AchievementData() { day = day, Id = item.Id, Target = count }; } //PlayFabMgr.Instance.UpdateUserDataValue("AchievementData", Newtonsoft.Json.JsonConvert.SerializeObject(_achievementDatas)); return; } } } public void Dispose() { disposable?.Dispose(); disposable = null; } }