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

359 lines
8.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
{
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);
if (taskData.ID == 301001)
{
DebugUtil.LogError("---- <color=#00ff00>{0}</color>!!! ----", "Task 301001 Done");
}
break;
}
case (TaskStatus.Tsclaimed):
{
taskInfo.SetStatus(TaskState.Claimed);
if (taskData.ID == 301001)
{
DebugUtil.LogError("---- <color=#00ff00>{0}</color>!!! ----", "Task 301001 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);
}
}
}