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

352 lines
8.3 KiB
C#
Raw Normal View History

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<TaskManager>, IInitable, IStart, IUpdatable
{
private Dictionary<TaskType, TaskMap> _taskDic;
private const int UpdateMaxCount = 5;
private const int EachFrameCount = 30;
private int _updateFrameCount = 0;
private bool _isStartUpdate = false;
public Dictionary<TaskType, TaskMap> TaskDic => _taskDic;
public void Start()
{
}
public void Init()
{
EventManager.Instance.Register(EventManager.EventName.EN_CharacterLevelUp, (Action<UpgradeType>)_OnCharLevelUp);
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.EN_CharacterLevelUp, (Action<UpgradeType>)_OnCharLevelUp);
}
//分帧刷新任务
public void Update(float dt)
{
if (_isStartUpdate && _updateFrameCount < UpdateMaxCount)
{
_UpdateCheckTask();
++_updateFrameCount;
}
if (_updateFrameCount >= UpdateMaxCount)
{
_EndCheckTask();
//刷新完毕
}
}
private void _LoadTaskData()
{
_taskDic = new Dictionary<TaskType, TaskMap>();
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 _OnCharLevelUp(UpgradeType type)
{
//_OnTaskUpdateStart();
}
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 InitAllTaskStatus()
{
foreach (var taskItem in _taskDic)
{
var taskMap = taskItem.Value;
foreach (var val in taskMap.Value)
{
var taskInfo = val.Value;
var taskData = taskInfo.Cfg;
var pbStatus = GetTaskPbStatus(taskData);
switch (pbStatus)
{
case(TaskStatus.Done):
{
taskInfo.SetStatus(TaskState.Available);
break;
}
case (TaskStatus.Tsclaimed):
{
taskInfo.SetStatus(TaskState.Claimed);
break;
}
case (TaskStatus.NewTask):
{
taskInfo.SetStatus(TaskState.Uncompleted);
break;
}
default:
break;
}
}
}
}
public void OnLoginOk()
{
_LoadTaskData();
}
public void StartUpdateTask()
{
_OnTaskUpdateStart();
}
public void ClaimTaskReward(int taskId)
{
NetHelper.ClaimTaskReward((uint)taskId);
}
}
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;
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;
}
}
/// <summary>
/// 某一种任务的map对象
/// </summary>
public class TaskMap
{
private TaskType _typeKey;
private Dictionary<int, TaskInfo> _values;
public TaskType Key => _typeKey;
public Dictionary<int, TaskInfo> Value => _values;
public TaskMap(TaskType key, bool isAutoLoad = false)
{
_typeKey = key;
_values = new Dictionary<int, 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)
{
_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 ForeachSetStatus(TaskState status)
{
foreach (var val in _values)
{
val.Value.SetStatus(status);
}
}
}