using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MMO { public class MMOUserData : MMOStorageBase { public Action DelUpdateDiamond; public Action DelUpdateLevel; public bool HasRegistered => !string.IsNullOrEmpty(mUsername); [SerializeField] private bool mHasFirstLoaded = false; public bool HasFirstLoaded { get => mHasFirstLoaded; } [SerializeField] private bool mHasFirstSubmitted = false; public bool HasFirstSubmitted { get => mHasFirstSubmitted; } [SerializeField] private bool mIsGuideFinished = false; public bool IsGuideFinished { get => mIsGuideFinished; } [SerializeField] private bool mHasBeenInvited = false; public bool HasBeenInvited { get => mHasBeenInvited; set { mHasBeenInvited = value; Save(); } } [SerializeField] private bool mIsMMOUser = false; public bool IsMMOUser { get => mIsMMOUser; set { mIsMMOUser = value; Save(); } } [SerializeField] private string mUsername = ""; public string Username { get => mUsername; set { mUsername = value; Save(); } } [SerializeField] private int mSex = 1; public int Sex { get => mSex; set { mSex = value; Save(); } } [SerializeField] private int mDiamond = 0; public int Diamond { get => mDiamond; set { mDiamond = value; Save(); } } [SerializeField] private int mGameLevel = 0; public int GameLevel { get => mGameLevel; set { mGameLevel = value; DelUpdateLevel?.Invoke(mGameLevel); Save(); } } [SerializeField] private int mRecordCount = 0; [SerializeField] private List mTaskRecordList = new List(); public List TaskRecordList => mTaskRecordList; [SerializeField] private Dictionary mTaskValueDic = new Dictionary(); [SerializeField] private List mTaskFinishList = new List(); [SerializeField] private Dictionary mSkinPieceCountDic = new Dictionary(); [SerializeField] private Dictionary mSkinAdCountDic = new Dictionary(); [SerializeField] private List mSkinRedeemList = new List(); public void FinishLoading() { mHasFirstLoaded = true; Save(); } public void FinishFirstSubmit() { mHasFirstSubmitted = true; Save(); } public void FinishGuide() { mIsGuideFinished = true; Save(); } #region Task public void GenerateTaskRecord(int pTaskID) { mRecordCount++; MMODataTask tTask = MMOTableTask.Instance.GetData(pTaskID); MMOTaskRecord tRecord = new MMOTaskRecord(); tRecord.RecordID = "TaskRecord" + mRecordCount; tRecord.RewardNum = tTask.RewardNum; tRecord.TaskID = pTaskID; tRecord.TaskType = tTask.TaskType; tRecord.TargetNum = tTask.TargetNum; AddTaskValue(tRecord); mTaskRecordList.Add(tRecord); Save(); } public void ModifyTaskRecord(string pRecordID, int pNewTaskID) { MMOTaskRecord tRecord = mTaskRecordList.Find(pItem => pItem.RecordID.Equals(pRecordID)); if (tRecord != null) { MMODataTask tTask = MMOTableTask.Instance.GetData(pNewTaskID); tRecord.TaskID = pNewTaskID; tRecord.TaskType = tTask.TaskType; tRecord.TargetNum = tTask.TargetNum; AddTaskValue(tRecord); Save(); } } public void RemoveTaskRecord(string pRecordID) { MMOTaskRecord tRecord = mTaskRecordList.Find(pItem => pItem.RecordID.Equals(pRecordID)); if (tRecord != null) { mTaskRecordList.Remove(tRecord); Save(); } } public bool HasTaskRecordOfType(MMOTaskType pType) { return mTaskRecordList.Find(pItem => pItem.TaskType == pType) != null; } public void CheckTask() { if (mTaskRecordList == null) { GenerateTaskRecord(-1); GenerateTaskRecord(-2); GenerateTaskRecord(101); GenerateTaskRecord(201); } else { if (!HasFinishedTaskToday(MMOTaskType.DailyReward) && !HasTaskRecordOfType(MMOTaskType.DailyReward)) { GenerateTaskRecord(-1); } if (!HasFinishedTask(MMOTaskType.InviteUsers) && !HasTaskRecordOfType(MMOTaskType.InviteUsers)) { GenerateTaskRecord(-2); } if (!HasFinishedTask(MMOTaskType.GetDiamond) && !HasTaskRecordOfType(MMOTaskType.GetDiamond)) { GenerateTaskRecord(101); } if (!HasFinishedTask(MMOTaskType.PassLevel) && !HasTaskRecordOfType(MMOTaskType.PassLevel)) { GenerateTaskRecord(201); } } for (int i = 0; i < mTaskRecordList.Count; i++) { AddTaskValue(mTaskRecordList[i]); } } public void FinishTask(MMOTaskType pType) { int tDayOfYear = DateTime.Now.DayOfYear; string tSaveStr = pType.ToString() + "_" + tDayOfYear; if (!mTaskFinishList.Contains(tSaveStr)) { mTaskFinishList.Add(tSaveStr); Save(); } } public bool HasFinishedTask(MMOTaskType pType) { bool tHasFinished = false; for (int i = 0; i < mTaskFinishList.Count; i++) { string tTaskStr = mTaskFinishList[i]; if (tTaskStr.Contains(pType.ToString())) { tHasFinished = true; break; } } return tHasFinished; } public bool HasFinishedTaskToday(MMOTaskType pType) { int tDayOfYear = DateTime.Now.DayOfYear; string tSaveStr = pType.ToString() + "_" + tDayOfYear; return mTaskFinishList.Contains(tSaveStr); } public void AddTaskValue(MMOTaskRecord pRecord) { if (!mTaskValueDic.ContainsKey(pRecord.RecordKey)) { int tValue = 0; if (pRecord.TaskType == MMOTaskType.GetDiamond) { tValue = mDiamond; } else if (pRecord.TaskType == MMOTaskType.PassLevel) { tValue = mGameLevel; } else if (pRecord.TaskType == MMOTaskType.RiseRank) { MMODataTask tTask = MMOTableTask.Instance.GetData(pRecord.TaskID); tValue = UnityEngine.Random.Range(tTask.InitialMin, tTask.InitialMax); } mTaskValueDic.Add(pRecord.RecordKey, tValue); Save(); } } public void SetTaskValue(string pKey, int pValue) { if (!mTaskValueDic.ContainsKey(pKey)) { return; } mTaskValueDic[pKey] = pValue; Save(); } public int GetTaskValue(string pKey) { if (!mTaskValueDic.ContainsKey(pKey)) { return 0; } return mTaskValueDic[pKey]; } #endregion #region Skin public void AddSkinPieceCount(int pSkinID, int pAddCount) { if (!mSkinPieceCountDic.ContainsKey(pSkinID)) { mSkinPieceCountDic[pSkinID] = 0; } mSkinPieceCountDic[pSkinID] += pAddCount; Save(); } public int GetSkinPieceCount(int pSkinID) { if (!mSkinPieceCountDic.ContainsKey(pSkinID)) { mSkinPieceCountDic[pSkinID] = 0; } return mSkinPieceCountDic[pSkinID]; } public void AddSkinAdCount(int pSkinID) { if (!mSkinAdCountDic.ContainsKey(pSkinID)) { mSkinAdCountDic[pSkinID] = 0; } mSkinAdCountDic[pSkinID]++; Save(); } public bool IsSkinAdAvailable(int pSkinID) { MMODataSkin tData = MMOTableSkin.Instance.GetData(pSkinID); if(!mSkinAdCountDic.ContainsKey(pSkinID)) { mSkinAdCountDic[pSkinID] = 0; } return mSkinAdCountDic[pSkinID] < 10 && GetSkinPieceCount(pSkinID) < tData.MaxCount; } public void RedeemSkin(int pSkinID) { if (!mSkinRedeemList.Contains(pSkinID)) { mSkinRedeemList.Add(pSkinID); Save(); } } public bool IsSkinRedeemed(int pSkinID) { return mSkinRedeemList.Contains(pSkinID); } #endregion } [Serializable] public class MMOTaskRecord { public string RecordID; public int TaskID; public MMOTaskType TaskType; public int RewardNum; public int TargetNum; public string RecordKey { get { if (TaskType == MMOTaskType.DailyReward || TaskType == MMOTaskType.DailyLevel || TaskType == MMOTaskType.DailyAds) { return string.Format("{0}_{1}:{2}_{3}", RecordID, TaskID, DateTime.Now.Year, DateTime.Now.DayOfYear); } return string.Format("{0}_{1}", RecordID, TaskID); } } public bool IsFinished => MMOUserData.Instance.GetTaskValue(RecordKey) >= TargetNum; } }