using System; using System.Collections.Generic; using System.Linq; using cfg.ActorCfg; using Framework; using Gameplay.Net; using NLDPB; using PhxhSDK; public class TaskManager: Singlenton, IInitable, IUpdatable { private Dictionary _taskDic; private const int UpdateMaxCount = 5; private const int EachFrameCount = 30; private int _updateFrameCount = 0; private bool _isStartUpdate = false; public Dictionary TaskDic => _taskDic; public void Init() { EventManager.Instance.Register(EventManager.EventName.UpdateAllTask, StartUpdateTask); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.UpdateAllTask, StartUpdateTask); } //分帧刷新任务 public void Update(float dt) { if (_isStartUpdate && _updateFrameCount < UpdateMaxCount) { _UpdateCheckTask(); ++_updateFrameCount; } if (_updateFrameCount >= UpdateMaxCount) { _EndCheckTask(); //刷新完毕 } } private void _LoadTaskData() { _taskDic = new Dictionary(); for (TaskType i = TaskType.Normal; i < TaskType.Max; i++) { _taskDic.Add(i, new TaskMap(i)); } var taskData = TableManager.Instance.Tables.TaskMain; var dataList = taskData.DataList; for (int i = 0; i < dataList.Count; i++) { var data = dataList[i]; var taskInfo = new TaskInfo(data.ID, data); var taskMap = _taskDic[data.TaskType]; taskMap.AddTask(taskInfo); } //InitAllTaskStatus(); } private void _OnTaskUpdateStart() { _updateFrameCount = 0; _isStartUpdate = true; } private void _UpdateCheckTask() { var startIdx = _updateFrameCount * EachFrameCount; var endIdx = startIdx + EachFrameCount; _CheckTasks(startIdx, endIdx); } private void _EndCheckTask() { _updateFrameCount = 0; _isStartUpdate = false; } private void _CheckTasks(int startIdx, int endIdx) { var taskConfig = TableManager.Instance.Tables.TaskMain; var dataList = taskConfig.DataList; for (int i = startIdx; i < endIdx; i++) { if (i >= dataList.Count) { return; } var data = dataList[i]; CheckTaskByType(data.ID, data.CheckType); _SetTaskStatus(data); } } private void _SetTaskStatus(DataTaskMain taskData) { TaskStatus pbStatus = GetTaskPbStatus(taskData); TaskState status = TaskState.InValid; switch (pbStatus) { case (TaskStatus.NewTask): { status = TaskState.Uncompleted; break; } case (TaskStatus.Tsclaimed): { status = TaskState.Claimed; break; } case (TaskStatus.Done): { status = TaskState.Available; break; } default: break; } var taskMap = _taskDic[taskData.TaskType]; taskMap.SetTaskStatus(taskData.ID, status); } private void _ClaimTaskReward(TaskInfo taskInfo) { if (taskInfo.Status == TaskState.Available) { ClaimTaskReward(taskInfo.TaskID); } } public bool CheckTaskByType(int taskID, TaskCheckType checkType) { var dataTask = TableManager.Instance.Tables.TaskMain.GetOrDefault(taskID); if (dataTask == null) { return false; } return ITaskCheck.GetCheck((int)checkType).Check(dataTask); } public TaskMap GetTaskMap(TaskType taskType) { return _taskDic[taskType]; } public TaskStatus GetTaskPbStatus(DataTaskMain dataTask) { //Check的时候会刷新状态 return Actor.Instance.Task.Check(dataTask); } public void OnLoginOk() { _LoadTaskData(); } public void StartUpdateTask() { _OnTaskUpdateStart(); } //领取任务奖励 public void ClaimTaskReward(int taskId) { NetHelper.ClaimTaskReward((uint)taskId); } public void ClaimTaskTypeRewards(TaskType type) { var taskMap = _taskDic[type]; taskMap.Foreach(_ClaimTaskReward); } public uint GetTaskCountById(int taskId) { return Actor.Instance.Task.GetCount((uint)taskId); } public uint GetTaskCount(TaskInfo taskInfo) { var cfg = taskInfo.Cfg; var taskId = taskInfo.TaskID; var checkType = cfg.CheckType; switch (checkType) { case (TaskCheckType.CountCheck): { return GetTaskCountById(taskId); } case (TaskCheckType.CheckChapterStar): { break; } case (TaskCheckType.CheckActorLevel): { return Actor.Instance.Base.GetProp(ActorProp.Level); } case (TaskCheckType.CheckCharacterMaxLevel): { var charInfo = CharacterDataInfoManager.Instance.GetMaxLevelCharacter(); if (charInfo != null) { return charInfo.Level; } return 0; } case (TaskCheckType.CountCharacter): { return (uint)CharacterDataInfoManager.Instance.DataList.Count; } case (TaskCheckType.CountLevelCharacter): { return 0; } } return 0; } } public interface ITask { void SetStatus(TaskState status); } public enum TaskState { InValid, Uncompleted, Available, Claimed } /// /// 任务类,包含配置信息 /// public class TaskInfo : ITask { private readonly int _taskId; private readonly DataTaskMain _cfg; private TaskState _status; public DataTaskMain Cfg => _cfg; public int TaskID => _taskId; public TaskState Status => _status; private TaskInfo() { } public TaskInfo(int taskId) { _taskId = taskId; var cfg = TableManager.Instance.Tables.TaskMain.GetOrDefault(taskId); if (cfg == null) { DebugUtil.LogError($"=== 创建任务时传入ID有误,ID: {taskId} ==="); } _cfg = cfg; _status = TaskState.Uncompleted; } public TaskInfo(int taskId, DataTaskMain cfg, TaskState status = TaskState.InValid) { _taskId = taskId; _cfg = cfg; _status = status; } public void SetStatus(TaskState status) { _status = status; } } /// /// 某一种任务的map对象 /// public class TaskMap { private TaskType _typeKey; private Dictionary _values; public TaskType Key => _typeKey; public Dictionary Value => _values; public TaskMap(TaskType key, bool isAutoLoad = false) { _typeKey = key; _values = new Dictionary(); if (isAutoLoad) { var table = TableManager.Instance.Tables.TaskMain; for (int i = 0; i < table.DataList.Count; i++) { var data = table.DataList[i]; if (key == data.TaskType) { _values.Add(data.ID, new TaskInfo(data.ID, data)); } } } } public void AddTask(TaskInfo task) { _values.Add(task.TaskID, task); } public TaskInfo Get(int taskId) { if (_values.TryGetValue(taskId, out var value)) { return value; } return null; } public TaskState GetTaskStatus(int taskId) { if (_values.TryGetValue(taskId, out var value)) { return value.Status; } return default; } public void SetTaskStatus(int taskId, TaskState status) { if (_values.TryGetValue(taskId, out var value)) { value.SetStatus(status); } } public bool Contains(int idx) { return _values.ContainsKey(idx); } public bool Contains(TaskInfo val) { return _values.ContainsValue(val); } public void Foreach(Action action) { foreach (var taskItem in _values) { var taskInfo = taskItem.Value; action(taskInfo); } } //统一设置所有任务状态 public void ForeachSetStatus(TaskState status) { foreach (var val in _values) { val.Value.SetStatus(status); } } public int Count() { if (_values == null) { return 0; } return _values.Count; } }