CTT/Server/Hotfix/Game/System/Task/TaskComponentSystem.cs

343 lines
13 KiB
C#

using Microsoft.CodeAnalysis.CSharp.Syntax;
using Cal.DataTable;
using System;
using System.Collections.Generic;
using System.Text;
namespace ET
{
namespace EventType
{
public struct CompleteTask
{
public Unit unit;
public TaskBase taskBase;
public System.Collections.Generic.List<int> indexList;
}
}
public class TaskComponentAwakeSystem : AwakeSystem<TaskComponent>
{
public override void Awake(TaskComponent self)
{
TaskComponent.Instance = self;
self.Awake();
}
}
public class TaskComponentLoadSystem : LoadSystem<TaskComponent>
{
public override void Load(TaskComponent self)
{
self.Load();
}
}
public static class TaskComponentSystem
{
public static void Awake(this TaskComponent self)
{
self.Load();
}
public static void Load(this TaskComponent self)
{
self.TaskBaseNpcIdDic.Clear();
IEnumerable<TaskBase> arr = DataTableHelper.GetAll<TaskBase>();
foreach (TaskBase taskBase in arr)
{
self.TaskBaseNpcIdDic.Add(taskBase.GiveNPCId, taskBase);
self.TaskBaseNpcIdDic.Add(taskBase.SubmitNPCId, taskBase);
}
}
public static void SendTaskState(this TaskComponent self, Unit unit, int npcId)
{
M2C_SendTaskState sendTaskState = new M2C_SendTaskState();
sendTaskState.NPCState = new NPCTask();
self.GetNPCState(unit, npcId, sendTaskState.NPCState);
MessageHelper.SendActor(unit, sendTaskState);
}
public static void GetNPCState(this TaskComponent self, Unit unit, System.Collections.Generic.List<NPCTask> npcList)
{
foreach (KeyValuePair<int, List<TaskBase>> kp in self.TaskBaseNpcIdDic.GetDictionary())
{
NPCTask npcTask = new NPCTask();
self.GetNPCState(unit, kp.Key, npcTask);
npcList.Add(npcTask);
}
}
public static void GetNPCState(this TaskComponent self, Unit unit, int npcId, NPCTask npcTask)
{
UnitTask unitTask = unit.GetComponent<UnitTask>();
NumericComponent num = unit.GetComponent<NumericComponent>();
List<TaskBase> list = self.TaskBaseNpcIdDic[npcId];
if (list == null)
{
return;
}
npcTask.Id = npcId;
bool isFinish = false, isRunning = false, isWaitting = false;
foreach (TaskBase taskBase in list)
{
//!前置条件
if (taskBase.PreTaskId != 0 &&
!unitTask.FinishTaskIdList.Contains(taskBase.PreTaskId))
{
continue;
}
//!限制等级
if (num.GetAsInt(NumericType.Level) < taskBase.Level)
{
continue;
};
//!日常任务特殊处理
switch (taskBase.TaskFinishCount)
{
case 0:
break;
case -1:
//!多次
break;
case 1:
if (unitTask.FinishTaskIdList.Contains((int)taskBase.Id))
{
continue;
}
break;
}
bool ___isRuning = false;
//!是否完成了
if (unitTask.CompleteTaskIdList.Contains((int)taskBase.Id))
{
isFinish = true;
}
else
{
//!是否进行中
foreach (Task item in unitTask.RunningTaskList)
{
if (item.Id == taskBase.Id)
{
isRunning = true;
___isRuning = true;
break;
}
}
}
isWaitting = !___isRuning;
}
if (isRunning)
{
npcTask.TaskState = TaskState.TaskRunning;
}
if (isWaitting)
{
npcTask.TaskState = TaskState.TaskWaiting;
}
if (isFinish)
{
npcTask.TaskState = TaskState.TaskCompleted;
}
}
/// <summary>
/// 获取能够接受和能够领取奖励的任务
/// </summary>
/// <param name="self"></param>
/// <param name="unit"></param>
/// <param name="inpcId">NPCId</param>
/// <returns></returns>
public static List<NPCTask> CanAcceptTask(this TaskComponent self, Unit unit, int inpcId)
{
List<NPCTask> _list = new List<NPCTask>();
List<TaskBase> taskList = self.TaskBaseNpcIdDic[inpcId];
if (taskList != null)
{
UnitTask unitTask = unit.GetComponent<UnitTask>();
NumericComponent num = unit.GetComponent<NumericComponent>();
foreach (TaskBase taskBase in taskList)
{
//!前置条件
if (taskBase.PreTaskId != 0 &&
!unitTask.FinishTaskIdList.Contains(taskBase.PreTaskId)) continue;
//!限制等级
if (num.GetAsInt(NumericType.Level) < taskBase.Level) continue;
//!日常任务特殊处理
switch (taskBase.TaskFinishCount)
{
case 0:
break;
case -1:
//!多次
break;
case 1:
if (unitTask.FinishTaskIdList.Contains((int)taskBase.Id))
continue;
break;
}
bool isDitast = false;
//!判断重复
foreach (NPCTask item in _list)
{
if (item.Id == taskBase.Id) isDitast = true;
}
if (isDitast) continue;
NPCTask nPCTask = new NPCTask
{
Id = (int)taskBase.Id,
TaskState = TaskState.TaskWaiting
};
//!是否完成了
if (unitTask.CompleteTaskIdList.Contains((int)taskBase.Id))
nPCTask.TaskState = TaskState.TaskCompleted;
else
{
//!是否进行中
foreach (Task item in unitTask.RunningTaskList)
{
if (item.Id == taskBase.Id)
{
nPCTask.TaskState = TaskState.TaskRunning;
break;
}
}
}
_list.Add(nPCTask);
}
}
return _list;
}
/// <summary>
/// 接受任务
/// </summary>
/// <param name="self"></param>
/// <param name="unitTask"></param>
public static bool AcceptTask(this TaskComponent self, Unit unit, int taskId)
{
UnitTask unitTask = unit.GetComponent<UnitTask>();
TaskBase taskBase = DataTableHelper.Get<TaskBase>(taskId);
if (taskBase == null) return false;
NumericComponent num = unit.GetComponent<NumericComponent>();
//!前置条件
if (taskBase.PreTaskId != 0 &&
!unitTask.FinishTaskIdList.Contains(taskBase.PreTaskId)) return false;
//!限制等级
if (num.GetAsInt(NumericType.Level) < taskBase.Level) return false;
//!日常任务特殊处理
switch (taskBase.TaskFinishCount)
{
case 0:
DateTime lastDate = DateTimeOffset.FromUnixTimeMilliseconds(unitTask.DateTimeArr[taskBase.DaliyTaskIndex]).UtcDateTime.Date;
if (DateTime.UtcNow < lastDate.AddDays(1))
{
return false;
}
unitTask.DateTimeArr[taskBase.DaliyTaskIndex] = TimeHelper.ClientNow();
break;
case 1:
if (unitTask.FinishTaskIdList.Contains(taskId))
return false;
break;
}
if (unitTask.CompleteTaskIdList.Contains(taskId)) return false;
foreach (Task item in unitTask.RunningTaskList)
{
if (item.Id == taskId) return false;
}
Task task = unitTask.CreateTask(taskBase);
unitTask.RunningTaskList.Add(task);
UnitHelper.SaveComponenet(unitTask).Coroutine();
//!更新客户端
self.SendTaskState(unit, taskBase.GiveNPCId);
return true;
}
/// <summary>
/// 放弃任务
/// </summary>
/// <param name="self"></param>
/// <param name="unitId"></param>
/// <param name="taskId"></param>
public static void AbandonTask(this TaskComponent self, long unitId, int taskId)
{
}
/// <summary>
/// 完成任务/领取奖励
/// </summary>
/// <param name="self"></param>
/// <param name="unit"></param>
/// <param name="taskId"></param>
public static string CompleteTask(this TaskComponent self, Unit unit, int taskId, System.Collections.Generic.List<int> indexList)
{
TaskBase taskBase = DataTableHelper.Get<TaskBase>(taskId);
if (taskBase == null)
{
Log.Error($"taskBase ==null where id ={taskId}");
return "系统错误";
}
if (taskBase.RwardCount != indexList.Count) return "请选择相应数量的奖励!";
UnitTask unitTask = unit.GetComponent<UnitTask>();
if (unitTask.CompleteTaskIdList.Remove(taskId))
{
unitTask.FinishTaskIdList.Add(taskId);
UnitHelper.SaveComponenet(unitTask).Coroutine();
string ret = GetReward(unit, taskBase, indexList);
if (ret != null)
{
unitTask.CompleteTaskIdList.Add(taskId);
unitTask.FinishTaskIdList.Remove(taskId);
UnitHelper.SaveComponenet(unitTask).Coroutine();
return ret;
}
return string.Empty;
}
return "系统错误";
}
private static string GetReward(Unit unit,TaskBase taskBase,List<int> indexList)
{
using ListComponent<(int, long)> listComponent = ListComponent<(int, long)>.Create();
//!发送奖励信息
for (int i = 0; i < taskBase.RewardArr.Length; i++)
{
if (indexList.Count != 0 && !indexList.Contains(i)) continue;
TaskBase.Reward reward = taskBase.RewardArr[i];
listComponent.List.Add((reward.Reward_Id, reward.Reward_Count));
}
if(!ItemComponent.Instance.CanAddItem(unit, listComponent.List))
{
return ConstDefine.BagFullError;
}
for (int i = 0; i < taskBase.RewardArr.Length; i++)
{
if (indexList.Count != 0 && !indexList.Contains(i)) continue;
TaskBase.Reward reward = taskBase.RewardArr[i];
string ret = BagHelper.AddItem(unit, reward.Reward_Id, reward.Reward_Count, true, getSource: "任务奖励");
if (ret != null)
{
Log.Error($"{ret}");
return ret;
}
}
//!更新客户端
TaskComponent.Instance.SendTaskState(unit, taskBase.SubmitNPCId);
return null;
}
private static void DeleteGaveItem(Unit unit, List<(int, long)> list)
{
foreach ((int id, long count) in list)
{
try
{
BagHelper.DeleteItem(unit, id, count);
}
catch (Exception e)
{
Log.Error(e);
}
}
}
}
}