using System.Collections.Generic; using UnityEngine; using System.Linq; using System; using System.Threading.Tasks; using Common.Utility.CombatEvent; using Excel2Json; using Fort23.Core; using Fort23.Mono; using Fort23.UTool; using GameLogic.Bag; using GameLogic.Combat; using GameLogic.Combat.CombatTool; using GameLogic.Player; using Utility; public class TaskManager : Singleton { private List allTasks; private Dictionary allTsk; public TaskManager() { allTasks = ConfigComponent.Instance.GetAll().ToList(); allTsk = new Dictionary(); foreach (var playerDataTask in AccountFileInfo.Instance.playerData.tasks) { allTsk.Add(playerDataTask.taskID, playerDataTask); } EventManager.Instance.AddEventListener(CustomEventType.ItemUpdate, ItemUpdate); EventManager.Instance.AddEventListener(CustomEventType.JingJieUpgrade, JingJieUpgrade); } private void JingJieUpgrade(IEventData e) { OnJingJieUp(); } private void ItemUpdate(IEventData e) { ItemUpdateData data = e as ItemUpdateData; OnItemCollected(data.ItemInfo.itemID); } // 接取任务 public void AcceptTask(int taskID) { if (!allTsk.ContainsKey(taskID)) { AccountFileInfo.TaskData taskData = new AccountFileInfo.TaskData(); taskData.taskID = taskID; allTsk.Add(taskID, taskData); AccountFileInfo.Instance.playerData.tasks.Clear(); AccountFileInfo.Instance.playerData.tasks.AddRange(allTsk.Values); AccountFileInfo.Instance.SavePlayerData(); } } public void TriggerTask(int taskId) { if (allTsk.ContainsKey(taskId)) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskId); EventSystemManager.Instance.isOpenUi = true; if (taskConfig.finishConditionType == 3) { if (!IsTaskTrigger(taskId)) { return; } //触发对话 DialoguePanel.OpenDialoguePanel(taskConfig.finishVlaue, null, ShowDialogueEventData.MessageShowType.Verbatim, (int? s) => { OnDialog(taskConfig.ID); EventSystemManager.Instance.isOpenUi = false; }); } else if (taskConfig.finishConditionType == 2) { if (!IsTaskTrigger(taskId)) { return; } CombatDrive.Instance.LoadLevelBattleCombat(taskConfig.finishVlaue[0], (iswin) => { if (iswin) { OnMonsterKilled(taskConfig.finishVlaue[0]); CombatDrive.Instance.CombatController.ChangeState(CombatController.update); EventSystemManager.Instance.isOpenUi = false; } }); //进入战斗 } //不能直接做任务 通过其他系统检测完成任务条件 //这里直接弹出提示 else { EventSystemManager.Instance.isOpenUi = false; TaskInfoPanel.OpenPanel(taskId); } } } public void OnDialog(int taskId) { List tasks = allTsk.Values.ToList(); foreach (var taskData in tasks) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskData.taskID); if (!IsTaskComplete(taskData.taskID) && taskConfig.finishConditionType == 3 && taskConfig.ID == taskId) { taskData.fishCount++; if (IsTaskComplete(taskData.taskID)) { CompleteTask(taskData.taskID); } AccountFileInfo.Instance.SavePlayerData(); EventManager.Instance.Dispatch(CustomEventType.TaskUpdate, null); } } } // 击杀怪物 public void OnMonsterKilled(int leveBattleId) { List tasks = allTsk.Values.ToList(); foreach (var taskData in tasks) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskData.taskID); if (!IsTaskComplete(taskData.taskID) && taskConfig.finishConditionType == 2 && taskConfig.finishVlaue[0] == leveBattleId) { taskData.fishCount++; if (IsTaskComplete(taskData.taskID)) { CompleteTask(taskData.taskID); } AccountFileInfo.Instance.SavePlayerData(); EventManager.Instance.Dispatch(CustomEventType.TaskUpdate, null); } } } public void OnJingJieUp() { List tasks = allTsk.Values.ToList(); foreach (var taskData in tasks) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskData.taskID); if (!IsTaskComplete(taskData.taskID) && taskConfig.finishConditionType == 4 && PlayerManager.Instance.myHero.powerUpConfig.ID >= taskConfig.finishVlaue[0]) { taskData.fishCount++; if (IsTaskComplete(taskData.taskID)) { CompleteTask(taskData.taskID); } AccountFileInfo.Instance.SavePlayerData(); EventManager.Instance.Dispatch(CustomEventType.TaskUpdate, null); } } } // 收集道具 public void OnItemCollected(int itemID) { List tasks = allTsk.Values.ToList(); foreach (var taskData in tasks) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskData.taskID); if (!IsTaskComplete(taskData.taskID) && taskConfig.finishConditionType == 1 && taskConfig.finishVlaue[0] == itemID) { taskData.fishCount++; if (IsTaskComplete(taskData.taskID)) { CompleteTask(taskData.taskID); } AccountFileInfo.Instance.SavePlayerData(); EventManager.Instance.Dispatch(CustomEventType.TaskUpdate, null); } } } // 完成任务 private void CompleteTask(int taskID) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskID); List awardList = GrantReward(taskID); //可能需要处理弹出任务完成ui // 触发下一个任务(主线) if (taskConfig.nextTaskID != 0) { AcceptTask(taskConfig.nextTaskID); } } // 发放奖励 private List GrantReward(int taskID) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskID); if (taskConfig.awardItemId != null && taskConfig.awardItemId.Length > 0) { List itemInfos = new List(); for (var i = 0; i < taskConfig.awardItemId.Length; i++) { DropConfig dropConfig = ConfigComponent.Instance.Get(taskConfig.awardItemId[i]); if (dropConfig.dropType == 3) { ItemInfo itemInfo = new ItemInfo(dropConfig.dropGroupID[0], taskConfig.awardItemCount[i]); itemInfos.Add(itemInfo); } else { List items = DropManager.Instance.DropItem(taskConfig.awardItemCount[i]); itemInfos.AddRange(items); } } return itemInfos; } return null; } private bool IsTaskTrigger(int taskId) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskId); if (taskConfig.unlockType == 1) { return PlayerManager.Instance.myHero.powerUpConfig.ID >= taskConfig.unlockLevel; } return true; } //获取任务数据 public AccountFileInfo.TaskData GetTaskData(int taskID) { if (allTsk.ContainsKey(taskID)) { return allTsk[taskID]; } return null; } //任务是否完成 public bool IsTaskComplete(int taskID) { if (allTsk.ContainsKey(taskID)) { TaskConfig taskConfig = ConfigComponent.Instance.Get(taskID); return allTsk[taskID].fishCount >= taskConfig.finishCount; } return false; } //获得主线任务 public AccountFileInfo.TaskData GetMainTaskData() { foreach (var keyValuePair in allTsk) { TaskConfig taskConfig = ConfigComponent.Instance.Get(keyValuePair.Key); if (taskConfig.taskType == 10 && !IsTaskComplete(keyValuePair.Key)) { return keyValuePair.Value; } } return null; } }