2023-12-20 18:42:43 +08:00
|
|
|
|
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()
|
|
|
|
|
|
{
|
2023-12-21 14:19:44 +08:00
|
|
|
|
EventManager.Instance.Register(EventManager.EventName.EN_CharacterLevelUp, (Action<UpgradeType>)_OnCharLevelUp);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
2023-12-21 14:19:44 +08:00
|
|
|
|
EventManager.Instance.Unregister(EventManager.EventName.EN_CharacterLevelUp, (Action<UpgradeType>)_OnCharLevelUp);
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//分帧刷新任务
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-21 14:19:44 +08:00
|
|
|
|
private void _OnCharLevelUp(UpgradeType type)
|
|
|
|
|
|
{
|
|
|
|
|
|
//_OnTaskUpdateStart();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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 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();
|
|
|
|
|
|
}
|
2023-12-21 14:19:44 +08:00
|
|
|
|
|
|
|
|
|
|
public void ClaimTaskReward(int taskId)
|
|
|
|
|
|
{
|
|
|
|
|
|
NetHelper.ClaimTaskReward((uint)taskId);
|
|
|
|
|
|
}
|
2023-12-20 18:42:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|