2023-12-20 18:42:43 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using cfg.ActorCfg;
|
2024-12-26 15:46:37 +08:00
|
|
|
|
using cfg.RedPoint;
|
2023-12-28 14:06:06 +08:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
using Framework;
|
2024-01-02 18:26:55 +08:00
|
|
|
|
using Gameplay;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
using Gameplay.Net;
|
|
|
|
|
|
using NLDPB;
|
|
|
|
|
|
using PhxhSDK;
|
2024-12-26 15:46:37 +08:00
|
|
|
|
public class TaskManager: Singlenton<TaskManager>, IInitable, IUpdatable, IRedPointTreeNode
|
2023-12-20 18:42:43 +08:00
|
|
|
|
{
|
2024-01-12 16:04:49 +08:00
|
|
|
|
private Dictionary<TaskType, TaskMap> _taskDic = new Dictionary<TaskType, TaskMap>();
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
2024-06-25 16:02:57 +08:00
|
|
|
|
private const int UpdateMaxCount = 6; //分6帧刷新
|
|
|
|
|
|
private const int EachFrameCount = 100; //每帧刷新任务数
|
2023-12-20 18:42:43 +08:00
|
|
|
|
private int _updateFrameCount = 0;
|
|
|
|
|
|
private bool _isStartUpdate = false;
|
|
|
|
|
|
|
2024-05-15 15:22:41 +08:00
|
|
|
|
private static Queue<int> _completeShowQue = new ();
|
2024-05-16 12:40:15 +08:00
|
|
|
|
private static bool _needShow = false;
|
|
|
|
|
|
private float _showLeftSec = -1f;
|
|
|
|
|
|
private const float SHOW_TIME = 1.5f;
|
|
|
|
|
|
private const float START_HIDE_TIME = 0.5f;
|
|
|
|
|
|
private UIWindow _curShowWindow;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public Dictionary<TaskType, TaskMap> TaskDic => _taskDic;
|
2024-12-26 15:46:37 +08:00
|
|
|
|
|
|
|
|
|
|
private Dictionary<TaskType, RedPointNode> _redPointNodes = new ();
|
|
|
|
|
|
public Dictionary<TaskType, RedPointNode> RedPointNodes => _redPointNodes;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
2024-12-26 15:46:37 +08:00
|
|
|
|
private RedPointNode _redPoint;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 任务红点ID
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private const int TaskRedNodeID = 90;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
2023-12-26 19:36:48 +08:00
|
|
|
|
EventManager.Instance.Register(EventManager.EventName.UpdateAllTask, StartUpdateTask);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
2023-12-26 19:36:48 +08:00
|
|
|
|
EventManager.Instance.Unregister(EventManager.EventName.UpdateAllTask, StartUpdateTask);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//分帧刷新任务
|
|
|
|
|
|
public void Update(float dt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_isStartUpdate && _updateFrameCount < UpdateMaxCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
_UpdateCheckTask();
|
|
|
|
|
|
++_updateFrameCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_updateFrameCount >= UpdateMaxCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
_EndCheckTask();
|
|
|
|
|
|
//刷新完毕
|
|
|
|
|
|
}
|
2024-05-16 12:40:15 +08:00
|
|
|
|
|
|
|
|
|
|
if (_needShow)
|
|
|
|
|
|
{
|
|
|
|
|
|
_showLeftSec -= dt;
|
|
|
|
|
|
if (_showLeftSec < 0f)
|
|
|
|
|
|
{
|
|
|
|
|
|
_HideWindow();
|
|
|
|
|
|
if (_completeShowQue.Count <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
_needShow = false;
|
|
|
|
|
|
_showLeftSec = -1f;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskID = _completeShowQue.Dequeue();
|
|
|
|
|
|
_ShowWindow(taskID);
|
|
|
|
|
|
_showLeftSec = SHOW_TIME;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
2023-12-28 14:06:06 +08:00
|
|
|
|
|
|
|
|
|
|
//打开任务界面
|
|
|
|
|
|
public static async UniTask OpenTaskUI()
|
|
|
|
|
|
{
|
2024-05-16 12:40:15 +08:00
|
|
|
|
await UIManager.Instance.CreateAndOpenWindow(UINameConst.UITask);
|
2023-12-28 14:06:06 +08:00
|
|
|
|
}
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
|
|
|
|
|
private void _LoadTaskData()
|
|
|
|
|
|
{
|
2024-01-12 16:04:49 +08:00
|
|
|
|
//_taskDic = new Dictionary<TaskType, TaskMap>();
|
2024-01-22 14:13:14 +08:00
|
|
|
|
_taskDic.Clear();
|
2023-12-20 18:42:43 +08:00
|
|
|
|
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];
|
2025-01-13 14:00:26 +08:00
|
|
|
|
var taskInfo = new TaskInfo(data.ID, data, data.FunctionType);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
var taskMap = _taskDic[data.TaskType];
|
|
|
|
|
|
taskMap.AddTask(taskInfo);
|
2023-12-28 14:06:06 +08:00
|
|
|
|
taskMap.AddTaskInList(taskInfo);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-26 15:46:37 +08:00
|
|
|
|
ConstructRedPointTree(TaskRedNodeID);
|
2023-12-21 14:19:44 +08:00
|
|
|
|
//InitAllTaskStatus();
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
2023-12-29 14:50:57 +08:00
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.UpdateTaskCompleted);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
private DataTaskMain _GetCfgByID(int taskID)
|
2024-01-03 14:17:12 +08:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var map in _taskDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskMap = map.Value;
|
|
|
|
|
|
if (taskMap.Contains(taskID))
|
|
|
|
|
|
{
|
|
|
|
|
|
return taskMap.Get(taskID).Cfg;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-02 15:05:38 +08:00
|
|
|
|
private void _SetTaskStatus(DataTaskMain taskData, bool isOnLogin = false)
|
2023-12-20 18:42:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
TaskStatus pbStatus = GetTaskPbStatus(taskData);
|
|
|
|
|
|
TaskState status = TaskState.InValid;
|
2024-01-12 16:04:49 +08:00
|
|
|
|
if (taskData == null || !_taskDic.TryGetValue(taskData.TaskType, out var map))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-01-03 14:17:12 +08:00
|
|
|
|
var taskMap = _taskDic[taskData.TaskType];
|
|
|
|
|
|
|
|
|
|
|
|
//前置任务未完成, 置为Invalid
|
2024-01-03 14:32:47 +08:00
|
|
|
|
if (taskData.PreTaskID > 0)
|
2024-01-03 14:17:12 +08:00
|
|
|
|
{
|
2024-05-16 12:40:15 +08:00
|
|
|
|
var frontTaskData = _GetCfgByID(taskData.PreTaskID);
|
2024-01-03 14:32:47 +08:00
|
|
|
|
TaskStatus frontPbStatus = GetTaskPbStatus(frontTaskData);
|
|
|
|
|
|
if (frontPbStatus != TaskStatus.Tsclaimed)
|
|
|
|
|
|
{
|
|
|
|
|
|
taskMap.SetTaskStatus(taskData.ID, status);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-01-03 14:17:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2024-01-03 14:17:12 +08:00
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
taskMap.SetTaskStatus(taskData.ID, status);
|
|
|
|
|
|
}
|
2023-12-25 18:51:23 +08:00
|
|
|
|
|
2024-01-02 16:19:15 +08:00
|
|
|
|
private void _ClaimTaskReward(uint[] taskIds)
|
2023-12-25 18:51:23 +08:00
|
|
|
|
{
|
2024-01-02 16:19:15 +08:00
|
|
|
|
NetHelper.ClaimTaskReward(taskIds);
|
2023-12-25 18:51:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public bool CheckTaskByType(int taskID, TaskCheckType checkType)
|
|
|
|
|
|
{
|
|
|
|
|
|
var dataTask = TableManager.Instance.Tables.TaskMain.GetOrDefault(taskID);
|
|
|
|
|
|
if (dataTask == null)
|
2023-12-21 15:34:29 +08:00
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
2023-12-21 14:19:44 +08:00
|
|
|
|
|
2023-12-25 18:51:23 +08:00
|
|
|
|
//领取任务奖励
|
2023-12-21 14:19:44 +08:00
|
|
|
|
public void ClaimTaskReward(int taskId)
|
|
|
|
|
|
{
|
2024-01-02 16:19:15 +08:00
|
|
|
|
uint[] taskIds = {(uint)taskId};
|
|
|
|
|
|
_ClaimTaskReward(taskIds);
|
2023-12-21 14:19:44 +08:00
|
|
|
|
}
|
2023-12-25 18:51:23 +08:00
|
|
|
|
|
2023-12-26 19:36:48 +08:00
|
|
|
|
public void ClaimTaskTypeRewards(TaskType type)
|
2023-12-25 18:51:23 +08:00
|
|
|
|
{
|
|
|
|
|
|
var taskMap = _taskDic[type];
|
2024-01-02 16:19:15 +08:00
|
|
|
|
var list = taskMap.List;
|
|
|
|
|
|
var taskClaimIDList = new List<uint>();
|
|
|
|
|
|
for (int i = 0; i < list.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (list[i].Status == TaskState.Available)
|
|
|
|
|
|
{
|
|
|
|
|
|
taskClaimIDList.Add((uint)list[i].TaskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (taskClaimIDList.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskIds = taskClaimIDList.ToArray();
|
|
|
|
|
|
_ClaimTaskReward(taskIds);
|
|
|
|
|
|
}
|
2023-12-25 18:51:23 +08:00
|
|
|
|
}
|
2023-12-26 19:36:48 +08:00
|
|
|
|
|
|
|
|
|
|
public uint GetTaskCountById(int taskId)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Actor.Instance.Task.GetCount((uint)taskId);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-02 16:19:15 +08:00
|
|
|
|
public bool CheckCanGetAll(TaskType taskType)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskMap = _taskDic[taskType];
|
|
|
|
|
|
for (int i = 0; i < taskMap.List.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskInfo = taskMap.List[i];
|
|
|
|
|
|
if (taskInfo.Status == TaskState.Available)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-27 19:42:58 +08:00
|
|
|
|
public void SetTaskRequestCount(TaskInfo taskInfo, out uint curCount, out uint maxCount)
|
2023-12-26 19:36:48 +08:00
|
|
|
|
{
|
|
|
|
|
|
var cfg = taskInfo.Cfg;
|
2023-12-27 19:42:58 +08:00
|
|
|
|
ITaskCheck.GetCheck((int)cfg.CheckType).SetTaskRequestCount(cfg, out curCount, out maxCount);
|
2023-12-26 19:36:48 +08:00
|
|
|
|
}
|
2024-05-15 15:22:41 +08:00
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
public TaskInfo GetTaskInfo(int taskID)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var map in _taskDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskMap = map.Value;
|
|
|
|
|
|
if (taskMap.Contains(taskID))
|
|
|
|
|
|
{
|
|
|
|
|
|
return taskMap.Get(taskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public DataTaskMain GetTaskCfg(int taskID)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _GetCfgByID(taskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-15 15:22:41 +08:00
|
|
|
|
#region 展示任务完成
|
|
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
private async void _ShowWindow(int taskID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_curShowWindow == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_curShowWindow = await UI_AchievementController.Open(taskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_curShowWindow.ShowWindow(taskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void _HideWindow()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_curShowWindow != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_curShowWindow.HideWindow();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-05-15 15:22:41 +08:00
|
|
|
|
private static void _ShowComplete(int taskID)
|
|
|
|
|
|
{
|
2024-05-16 12:40:15 +08:00
|
|
|
|
if (_completeShowQue.Contains(taskID))
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-15 15:22:41 +08:00
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
_completeShowQue.Enqueue(taskID);
|
|
|
|
|
|
_needShow = true;
|
2024-05-15 15:22:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
public static void ShowComplete(int taskID)
|
|
|
|
|
|
{
|
|
|
|
|
|
_ShowComplete(taskID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
2024-12-26 15:46:37 +08:00
|
|
|
|
|
|
|
|
|
|
#region 红点
|
|
|
|
|
|
|
|
|
|
|
|
public void ConstructRedPointTree(RedPointNode parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ConstructRedPointTree(int parentID)
|
|
|
|
|
|
{
|
|
|
|
|
|
_redPointNodes.Clear();
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = TaskType.Normal; i < TaskType.Max; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var redPointNode = RedPointManager.Instance.AddDynamicNode(NodeType.Task, parentID, i);
|
|
|
|
|
|
_redPointNodes.Add(i, redPointNode);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
#region Task类
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public interface ITask
|
|
|
|
|
|
{
|
|
|
|
|
|
void SetStatus(TaskState status);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public enum TaskState
|
|
|
|
|
|
{
|
|
|
|
|
|
InValid,
|
|
|
|
|
|
Uncompleted,
|
|
|
|
|
|
Available,
|
2025-01-13 14:00:26 +08:00
|
|
|
|
Claimed,
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 任务类,包含配置信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class TaskInfo : ITask
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly int _taskId;
|
|
|
|
|
|
private readonly DataTaskMain _cfg;
|
2023-12-29 12:54:41 +08:00
|
|
|
|
private readonly List<RewardItem> _itemList;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
private TaskState _status;
|
2025-01-13 14:00:26 +08:00
|
|
|
|
private FunctionType _functionType;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
|
|
|
|
|
public DataTaskMain Cfg => _cfg;
|
|
|
|
|
|
public int TaskID => _taskId;
|
|
|
|
|
|
public TaskState Status => _status;
|
2025-01-13 14:00:26 +08:00
|
|
|
|
public FunctionType FunctionType => _functionType;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
2024-03-27 13:51:01 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 任务是否完成
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IsComplete
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2024-08-26 16:32:02 +08:00
|
|
|
|
return _status == TaskState.Claimed || _status == TaskState.Available;
|
2024-03-27 13:51:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-29 12:54:41 +08:00
|
|
|
|
public List<RewardItem> ItemList => _itemList;
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
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;
|
2023-12-29 12:54:41 +08:00
|
|
|
|
for (int i = 0; i < _cfg.RewardID.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var reward = RewardManager.Instance.Get(_cfg.RewardID[i]);
|
|
|
|
|
|
_itemList = reward.ItemList.Get();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-01-13 14:00:26 +08:00
|
|
|
|
public TaskInfo(int taskId, DataTaskMain cfg,FunctionType functionTyp = FunctionType.Normal, TaskState status = TaskState.InValid)
|
2023-12-20 18:42:43 +08:00
|
|
|
|
{
|
2025-01-13 14:00:26 +08:00
|
|
|
|
_functionType = functionTyp;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
_taskId = taskId;
|
|
|
|
|
|
_cfg = cfg;
|
|
|
|
|
|
_status = status;
|
2024-10-08 16:05:24 +08:00
|
|
|
|
_itemList = new List<RewardItem>();
|
2023-12-29 12:54:41 +08:00
|
|
|
|
for (int i = 0; i < _cfg.RewardID.Length; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var reward = RewardManager.Instance.Get(_cfg.RewardID[i]);
|
2024-10-08 16:05:24 +08:00
|
|
|
|
_itemList.AddRange(reward.ItemList.Get());
|
2023-12-29 12:54:41 +08:00
|
|
|
|
}
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-29 12:54:41 +08:00
|
|
|
|
// private int _ParseReward(int rewardId)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var rewardData = ;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public void SetStatus(TaskState status)
|
|
|
|
|
|
{
|
|
|
|
|
|
_status = status;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-16 12:40:15 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region TaskMap
|
2023-12-20 18:42:43 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 某一种任务的map对象
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class TaskMap
|
|
|
|
|
|
{
|
|
|
|
|
|
private TaskType _typeKey;
|
|
|
|
|
|
private Dictionary<int, TaskInfo> _values;
|
2023-12-28 14:06:06 +08:00
|
|
|
|
private List<TaskInfo> _list;
|
2025-01-13 14:00:26 +08:00
|
|
|
|
private FunctionType _functionType;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
|
|
|
|
|
public TaskType Key => _typeKey;
|
|
|
|
|
|
public Dictionary<int, TaskInfo> Value => _values;
|
|
|
|
|
|
|
2023-12-28 14:06:06 +08:00
|
|
|
|
public List<TaskInfo> List => _list;
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
public TaskMap(TaskType key, bool isAutoLoad = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
_typeKey = key;
|
|
|
|
|
|
_values = new Dictionary<int, TaskInfo>();
|
2023-12-28 14:06:06 +08:00
|
|
|
|
_list = new List<TaskInfo>();
|
2023-12-20 18:42:43 +08:00
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2025-01-13 14:00:26 +08:00
|
|
|
|
var taskInfo = new TaskInfo(data.ID, data, data.FunctionType);
|
2023-12-28 14:06:06 +08:00
|
|
|
|
_values.Add(data.ID, taskInfo);
|
|
|
|
|
|
_list.Add(taskInfo);;
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void AddTask(TaskInfo task)
|
|
|
|
|
|
{
|
|
|
|
|
|
_values.Add(task.TaskID, task);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-28 14:06:06 +08:00
|
|
|
|
public void AddTaskInList(TaskInfo task)
|
|
|
|
|
|
{
|
|
|
|
|
|
_list.Add(task);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
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))
|
|
|
|
|
|
{
|
2024-01-02 15:05:38 +08:00
|
|
|
|
if (value.Status == TaskState.Uncompleted && status == TaskState.Available)
|
|
|
|
|
|
{
|
2025-01-13 14:00:26 +08:00
|
|
|
|
if(value.FunctionType != FunctionType.BattlePass)
|
|
|
|
|
|
//TODO 展示完成弹框
|
|
|
|
|
|
TaskManager.ShowComplete(taskId);
|
2024-01-03 13:53:18 +08:00
|
|
|
|
DebugUtil.Log($"--- <color=green>完成任务:ID={taskId}</color> ---");
|
2024-03-27 13:51:01 +08:00
|
|
|
|
|
|
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.TaskCompleted, _typeKey);
|
2024-01-02 15:05:38 +08:00
|
|
|
|
}
|
2025-01-13 14:00:26 +08:00
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
value.SetStatus(status);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Contains(int idx)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _values.ContainsKey(idx);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Contains(TaskInfo val)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _values.ContainsValue(val);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-25 18:51:23 +08:00
|
|
|
|
public void Foreach(Action<TaskInfo> action)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var taskItem in _values)
|
|
|
|
|
|
{
|
|
|
|
|
|
var taskInfo = taskItem.Value;
|
|
|
|
|
|
action(taskInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-20 18:42:43 +08:00
|
|
|
|
//统一设置所有任务状态
|
|
|
|
|
|
public void ForeachSetStatus(TaskState status)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var val in _values)
|
|
|
|
|
|
{
|
|
|
|
|
|
val.Value.SetStatus(status);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-12-26 19:36:48 +08:00
|
|
|
|
|
|
|
|
|
|
public int Count()
|
|
|
|
|
|
{
|
2024-08-26 16:32:02 +08:00
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (null == _values)
|
|
|
|
|
|
return count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (TaskInfo info in _values.Values)
|
2023-12-26 19:36:48 +08:00
|
|
|
|
{
|
2024-08-26 16:32:02 +08:00
|
|
|
|
if (info.Status == TaskState.InValid)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
++count;
|
2023-12-26 19:36:48 +08:00
|
|
|
|
}
|
2024-08-26 16:32:02 +08:00
|
|
|
|
|
|
|
|
|
|
return count;
|
2023-12-26 19:36:48 +08:00
|
|
|
|
}
|
2024-03-27 13:51:01 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 完成的任务数量
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public int CompleteCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (_values == null)
|
|
|
|
|
|
return count;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (TaskInfo taskInfo in _values.Values)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (taskInfo.IsComplete)
|
|
|
|
|
|
++count;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
2024-05-16 12:40:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|