mergemilitary/Assets/MMOModule/Scripts/MMOStorage/MMOUserData.cs

383 lines
11 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MMO
{
public class MMOUserData : MMOStorageBase<MMOUserData>
{
public Action<int> DelUpdateDiamond;
public Action<int> 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<MMOTaskRecord> mTaskRecordList = new List<MMOTaskRecord>();
public List<MMOTaskRecord> TaskRecordList => mTaskRecordList;
[SerializeField] private Dictionary<string, int> mTaskValueDic = new Dictionary<string, int>();
[SerializeField] private List<string> mTaskFinishList = new List<string>();
[SerializeField] private Dictionary<int, int> mSkinPieceCountDic = new Dictionary<int, int>();
[SerializeField] private Dictionary<int, int> mSkinAdCountDic = new Dictionary<int, int>();
[SerializeField] private List<int> mSkinRedeemList = new List<int>();
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;
}
}