NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Task/TaskManager.cs

595 lines
14 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using cfg.ActorCfg;
using Cysharp.Threading.Tasks;
using Framework;
2024-01-02 18:26:55 +08:00
using Gameplay;
using Gameplay.Net;
using NLDPB;
using PhxhSDK;
public class TaskManager: Singlenton<TaskManager>, IInitable, IUpdatable
{
private Dictionary<TaskType, TaskMap> _taskDic = new Dictionary<TaskType, TaskMap>();
private const int UpdateMaxCount = 6; //分6帧刷新
private const int EachFrameCount = 100; //每帧刷新任务数
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;
public Dictionary<TaskType, TaskMap> 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();
//刷新完毕
}
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;
}
}
}
}
//打开任务界面
public static async UniTask OpenTaskUI()
{
2024-05-16 12:40:15 +08:00
await UIManager.Instance.CreateAndOpenWindow(UINameConst.UITask);
}
private void _LoadTaskData()
{
//_taskDic = new Dictionary<TaskType, TaskMap>();
2024-01-22 14:13:14 +08:00
_taskDic.Clear();
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);
taskMap.AddTaskInList(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;
2023-12-29 14:50:57 +08:00
EventManager.Instance.Send(EventManager.EventName.UpdateTaskCompleted);
}
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)
{
TaskStatus pbStatus = GetTaskPbStatus(taskData);
TaskState status = TaskState.InValid;
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
}
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
taskMap.SetTaskStatus(taskData.ID, status);
}
2024-01-02 16:19:15 +08:00
private void _ClaimTaskReward(uint[] taskIds)
{
2024-01-02 16:19:15 +08:00
NetHelper.ClaimTaskReward(taskIds);
}
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
{
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)
{
2024-01-02 16:19:15 +08:00
uint[] taskIds = {(uint)taskId};
_ClaimTaskReward(taskIds);
}
public void ClaimTaskTypeRewards(TaskType type)
{
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);
}
}
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)
{
var cfg = taskInfo.Cfg;
2023-12-27 19:42:58 +08:00
ITaskCheck.GetCheck((int)cfg.CheckType).SetTaskRequestCount(cfg, out curCount, out maxCount);
}
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-05-16 12:40:15 +08:00
#region Task类
public interface ITask
{
void SetStatus(TaskState status);
}
public enum TaskState
{
InValid,
Uncompleted,
Available,
Claimed
}
/// <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;
private TaskState _status;
public DataTaskMain Cfg => _cfg;
public int TaskID => _taskId;
public TaskState Status => _status;
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;
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();
}
}
public TaskInfo(int taskId, DataTaskMain cfg, TaskState status = TaskState.InValid)
{
_taskId = taskId;
_cfg = cfg;
_status = status;
_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]);
_itemList.AddRange(reward.ItemList.Get());
2023-12-29 12:54:41 +08:00
}
}
2023-12-29 12:54:41 +08:00
// private int _ParseReward(int rewardId)
// {
// var rewardData = ;
// }
public void SetStatus(TaskState status)
{
_status = status;
}
}
2024-05-16 12:40:15 +08:00
#endregion
#region TaskMap
/// <summary>
/// 某一种任务的map对象
/// </summary>
public class TaskMap
{
private TaskType _typeKey;
private Dictionary<int, TaskInfo> _values;
private List<TaskInfo> _list;
public TaskType Key => _typeKey;
public Dictionary<int, TaskInfo> Value => _values;
public List<TaskInfo> List => _list;
public TaskMap(TaskType key, bool isAutoLoad = false)
{
_typeKey = key;
_values = new Dictionary<int, TaskInfo>();
_list = new List<TaskInfo>();
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)
{
var taskInfo = new TaskInfo(data.ID, data);
_values.Add(data.ID, taskInfo);
_list.Add(taskInfo);;
}
}
}
}
public void AddTask(TaskInfo task)
{
_values.Add(task.TaskID, task);
}
public void AddTaskInList(TaskInfo task)
{
_list.Add(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))
{
2024-01-02 15:05:38 +08:00
if (value.Status == TaskState.Uncompleted && status == TaskState.Available)
{
//TODO 展示完成弹框
2024-05-16 12:40:15 +08:00
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
}
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<TaskInfo> 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()
{
2024-08-26 16:32:02 +08:00
int count = 0;
if (null == _values)
return count;
foreach (TaskInfo info in _values.Values)
{
2024-08-26 16:32:02 +08:00
if (info.Status == TaskState.InValid)
continue;
++count;
}
2024-08-26 16:32:02 +08:00
return count;
}
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