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 indexList; } } public class TaskComponentAwakeSystem : AwakeSystem { public override void Awake(TaskComponent self) { TaskComponent.Instance = self; self.Awake(); } } public class TaskComponentLoadSystem : LoadSystem { 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 arr = DataTableHelper.GetAll(); 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 npcList) { foreach (KeyValuePair> 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(); NumericComponent num = unit.GetComponent(); List 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; } } /// /// 获取能够接受和能够领取奖励的任务 /// /// /// /// NPCId /// public static List CanAcceptTask(this TaskComponent self, Unit unit, int inpcId) { List _list = new List(); List taskList = self.TaskBaseNpcIdDic[inpcId]; if (taskList != null) { UnitTask unitTask = unit.GetComponent(); NumericComponent num = unit.GetComponent(); 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; } /// /// 接受任务 /// /// /// public static bool AcceptTask(this TaskComponent self, Unit unit, int taskId) { UnitTask unitTask = unit.GetComponent(); TaskBase taskBase = DataTableHelper.Get(taskId); if (taskBase == null) return false; NumericComponent num = unit.GetComponent(); //!前置条件 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; } /// /// 放弃任务 /// /// /// /// public static void AbandonTask(this TaskComponent self, long unitId, int taskId) { } /// /// 完成任务/领取奖励 /// /// /// /// public static string CompleteTask(this TaskComponent self, Unit unit, int taskId, System.Collections.Generic.List indexList) { TaskBase taskBase = DataTableHelper.Get(taskId); if (taskBase == null) { Log.Error($"taskBase ==null where id ={taskId}"); return "系统错误"; } if (taskBase.RwardCount != indexList.Count) return "请选择相应数量的奖励!"; UnitTask unitTask = unit.GetComponent(); 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 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); } } } } }