TaskDataManager.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using cfg.GfgCfg;
  5. using ET;
  6. namespace GFGGame
  7. {
  8. public class TaskInfo
  9. {
  10. public int ID;
  11. public int State; //任务奖励状态 由ConstBonusStatus定义
  12. public long Progress; //进度
  13. public int FuncType;
  14. }
  15. public class TaskDataManager : SingletonBase<TaskDataManager>
  16. {
  17. //解锁的任务列表
  18. public Dictionary<int, TaskInfo> TaskInfosDic = new Dictionary<int, TaskInfo>();
  19. //已解锁的任务类型对应的任务id列表
  20. public Dictionary<int, List<int>> TaskType2TaskIdListDic = new Dictionary<int, List<int>>();
  21. //成就类别进度
  22. private List<AchievementTaskTypePro> saveAchievementTaskTypeProList;
  23. //获取某个类型任务数据
  24. public Dictionary<int, TaskInfo> GetTaskInfos(int taskType)
  25. {
  26. return TaskType2TaskIdListDic.TryGetValue(taskType, out var taskIds)
  27. ? taskIds.ToDictionary(taskId => taskId, taskId => TaskInfosDic[taskId])
  28. : new Dictionary<int, TaskInfo>();
  29. }
  30. public void UpdateTaskInfo(int taskId, TaskInfo info)
  31. {
  32. TaskInfosDic.TryGetValue(taskId, out var taskInfo);
  33. if (taskInfo == null)
  34. {
  35. TaskInfosDic.Add(taskId, info);
  36. TaskType2TaskIdListDic.TryGetValue(info.FuncType, out var taskIds);
  37. if (taskIds == null)
  38. {
  39. taskIds = new List<int>();
  40. TaskType2TaskIdListDic.Add(info.FuncType, taskIds);
  41. }
  42. taskIds.Add(taskId);
  43. }
  44. else
  45. {
  46. TaskInfosDic[taskId] = info;
  47. }
  48. }
  49. //RemoveTaskInfo
  50. public void RemoveTaskInfo(int taskId)
  51. {
  52. TaskInfosDic.Remove(taskId);
  53. //获取任务配置
  54. var cfg = CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId);
  55. if (cfg == null)
  56. {
  57. Log.Error($"出现了没有配置的任务id{taskId}");
  58. return;
  59. }
  60. var funcType = cfg.FuncType;
  61. TaskType2TaskIdListDic.TryGetValue(funcType, out var taskIds);
  62. if (taskIds == null) return;
  63. taskIds.Remove(taskId);
  64. if (taskIds.Count == 0) TaskType2TaskIdListDic.Remove(funcType);
  65. }
  66. public void UpdateTaskState(int taskId, int state)
  67. {
  68. TaskInfosDic.TryGetValue(taskId, out var taskInfo);
  69. if (taskInfo == null)
  70. {
  71. Log.Error($"出现了不存在的任务id{taskId}");
  72. return;
  73. }
  74. taskInfo.State = state;
  75. }
  76. /// <summary>
  77. /// 获取任务列表
  78. /// </summary>
  79. /// <returns></returns>
  80. public List<TaskCfg> GetTaskCfgs(int taskType)
  81. {
  82. var cfgs = new List<TaskCfg>();
  83. TaskType2TaskIdListDic.TryGetValue(taskType, out var taskIds);
  84. if (taskIds == null) return cfgs;
  85. cfgs.AddRange(taskIds.Select(taskId => CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId)));
  86. cfgs.Sort((a, b) =>
  87. {
  88. var stateA = TaskInfosDic[a.Id].State == 1 ? 1 : -1;
  89. var stateB = TaskInfosDic[b.Id].State == 1 ? 1 : -1;
  90. if (stateA > stateB) return -1;
  91. return stateB > stateA ? 1 : TaskInfosDic[a.Id].State.CompareTo(TaskInfosDic[b.Id].State);
  92. });
  93. return cfgs;
  94. }
  95. /// <summary>
  96. /// 获取任务成就列表
  97. /// </summary>
  98. /// <returns></returns>
  99. public List<TaskCfg> GetTaskAchieveCfgs(int taskType)
  100. {
  101. var cfgs = new List<TaskCfg>();
  102. TaskType2TaskIdListDic.TryGetValue(taskType, out var taskIds);
  103. if (taskIds == null) return cfgs;
  104. cfgs.AddRange(taskIds.Select(taskId => CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId)));
  105. cfgs.Sort((a, b) =>
  106. {
  107. var stateA = TaskInfosDic[a.Id].State == 1 ? 1 : -1;
  108. var stateB = TaskInfosDic[b.Id].State == 1 ? 1 : -1;
  109. if (stateA > stateB)
  110. return -1;
  111. else if (stateA < stateB)
  112. return 1;
  113. else
  114. {
  115. if (TaskInfosDic[a.Id].State.CompareTo(TaskInfosDic[b.Id].State) > 0)
  116. return 1;
  117. else if (TaskInfosDic[a.Id].State.CompareTo(TaskInfosDic[b.Id].State) < 0)
  118. return -1;
  119. else
  120. {
  121. if (a.Id > b.Id)
  122. return 1;
  123. else
  124. return -1;
  125. }
  126. }
  127. });
  128. return cfgs;
  129. }
  130. /// <summary>
  131. /// 获取任务列表
  132. /// </summary>
  133. /// <returns></returns>
  134. public List<TaskCfg> GetTaskCfgs(List<int> taskIds)
  135. {
  136. var cfgs = new List<TaskCfg>();
  137. if (taskIds == null) return cfgs;
  138. cfgs.AddRange(taskIds.Select(taskId => CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId)));
  139. cfgs.Sort((a, b) =>
  140. {
  141. var stateA = TaskInfosDic[a.Id].State == 1 ? 1 : -1;
  142. var stateB = TaskInfosDic[b.Id].State == 1 ? 1 : -1;
  143. if (stateA > stateB) return -1;
  144. return stateB > stateA ? 1 : TaskInfosDic[a.Id].State.CompareTo(TaskInfosDic[b.Id].State);
  145. });
  146. return cfgs;
  147. }
  148. /// <summary>
  149. /// 根据任务id获取任务状态
  150. /// </summary>0未完成,1可领取,2已领取
  151. /// <param name="taskId"></param>
  152. /// <returns></returns>
  153. public int GetTaskStateById(int taskId)
  154. {
  155. return !TaskInfosDic.ContainsKey(taskId) ? 0 : TaskInfosDic[taskId].State;
  156. }
  157. /// <summary>
  158. /// 根据任务id获取任务进度
  159. /// </summary>
  160. /// <param name="taskId"></param>
  161. /// <returns></returns>
  162. public long GetTaskProgressById(int taskId)
  163. {
  164. return !TaskInfosDic.ContainsKey(taskId) ? 0 : TaskInfosDic[taskId].Progress;
  165. }
  166. public string GetTaskDesc(int taskId)
  167. {
  168. var taskCfg = CommonDataManager.Tables.TblTaskCfg.GetOrDefault(taskId);
  169. var activeRewardCfg = CommonDataManager.Tables.TblTaskTypeCfg.GetOrDefault(taskCfg.Type);
  170. switch ((ConstTaskType)activeRewardCfg.Id)
  171. {
  172. case ConstTaskType.CompleteInstanceZones:
  173. var name = CommonDataManager.Tables.TblEctypeCfg.GetGroup1ByType(taskCfg.Params1[0])[0].TypeName;
  174. if (taskCfg.Params1.Count > 1)
  175. {
  176. name =CommonDataManager.Tables.TblEctypeCfg
  177. .GetGroup1ByTypeAndSubType(taskCfg.Params1[0], taskCfg.Params1[1])[0].SubName;
  178. }
  179. return string.Format(activeRewardCfg.Desc, taskCfg.GetTargetCount(), name);
  180. case ConstTaskType.UseItem:
  181. case ConstTaskType.AddItem:
  182. var cfg = CommonDataManager.Tables.TblItemCfg.GetOrDefault(taskCfg.Params1[0]);
  183. return string.Format(activeRewardCfg.Desc, taskCfg.GetTargetCount(), cfg.Name);
  184. case ConstTaskType.Suitsynthesis:
  185. var suitCfg = CommonDataManager.Tables.TblSuitCfg.GetOrDefault(taskCfg.Params1[0]);
  186. return string.Format(activeRewardCfg.Desc, suitCfg.Name);
  187. case ConstTaskType.UpgradeCardLvl:
  188. return string.Format(activeRewardCfg.Desc, taskCfg.GetTargetCount(), taskCfg.Params1[0]);
  189. case ConstTaskType.UpgradeCardStar:
  190. return string.Format(activeRewardCfg.Desc, taskCfg.GetTargetCount(), taskCfg.Params1[0] / 5);
  191. case ConstTaskType.FinishStory:
  192. case ConstTaskType.FinishInstanceZones:
  193. {
  194. return string.Format(activeRewardCfg.Desc, taskCfg.Params1[0]);
  195. }
  196. case ConstTaskType.PlayTheLuckyBox:
  197. var luckyBoxId = taskCfg.Params1[0];
  198. var luckyBoxCfg = CommonDataManager.Tables.TblLuckyBoxCfg.GetOrDefault(luckyBoxId);
  199. return string.Format(activeRewardCfg.Desc, luckyBoxCfg.Name, taskCfg.GetTargetCount());
  200. case ConstTaskType.UpgradeCardSkill:
  201. return string.Format(activeRewardCfg.Desc, taskCfg.Params1[0], taskCfg.GetTargetCount());
  202. case ConstTaskType.CollectParts:
  203. string itemType = CommonDataManager.Tables.TblItemCfg.GetOrDefault(taskCfg.Params1[0]).Name;
  204. return string.Format(activeRewardCfg.Desc, itemType, taskCfg.GetTargetCount());
  205. default: return string.Format(activeRewardCfg.Desc, taskCfg.GetTargetCount());
  206. }
  207. }
  208. public bool CheckTaskRewardCanGet(int taskFuncType)
  209. {
  210. var taskInfos = TaskDataManager.Instance.GetTaskInfos(taskFuncType);
  211. if (taskInfos.Select(taskInfo => taskInfo.Value).Any(info => info.State == ConstBonusStatus.CAN_GET))
  212. {
  213. if (taskFuncType == TaskFuncType.BattlePass && !BattlePassTaskDataManager.Instance.GetIsBuy())
  214. {
  215. return false;
  216. }
  217. else
  218. {
  219. return true;
  220. }
  221. }
  222. return false;
  223. }
  224. public bool CheckTaskSubRewardCanGet(int taskFuncType, int taskFuncSub)
  225. {
  226. var _cfgsAll = TaskDataManager.Instance.GetTaskCfgs(taskFuncType);
  227. foreach (var info in _cfgsAll)
  228. {
  229. if (info.AchievementType == taskFuncSub + 1)
  230. {
  231. if (TaskDataManager.Instance.GetTaskStateById(info.Id) == 1)
  232. return true;
  233. }
  234. }
  235. return false;
  236. }
  237. public void Clear()
  238. {
  239. TaskInfosDic.Clear();
  240. TaskType2TaskIdListDic.Clear();
  241. }
  242. public List<ItemParamProto> GetReward(TaskCfg taskCfg)
  243. {
  244. var activityId = taskCfg.ActivityId;
  245. if (activityId == 0) return taskCfg.Rewards.ToGfgGameItemParam();
  246. return !ActivityGlobalDataManager.Instance.IsActivityOpen(activityId)
  247. ? taskCfg.Rewards.ToGfgGameItemParam()
  248. : taskCfg.ActivityRewards.ToGfgGameItemParam();
  249. }
  250. public void SaveAchievementTaskTypeProList(List<AchievementTaskTypePro> AchievementTaskTypeProList)
  251. {
  252. saveAchievementTaskTypeProList = AchievementTaskTypeProList;
  253. }
  254. public void SaveAchievementTaskTypePro(AchievementTaskTypePro AchievementTaskTypePro)
  255. {
  256. foreach (var info in saveAchievementTaskTypeProList)
  257. {
  258. if (info.AchievementType == AchievementTaskTypePro.AchievementType)
  259. {
  260. info.AchievementType = AchievementTaskTypePro.AchievementType;
  261. info.CompleteTaskNum = AchievementTaskTypePro.CompleteTaskNum;
  262. }
  263. }
  264. }
  265. public List<AchievementTaskTypePro> GetAchievementTaskTypeProList()
  266. {
  267. return saveAchievementTaskTypeProList;
  268. }
  269. }
  270. }