diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index 6a3b8072d2..9feca251e1 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -739,6 +739,7 @@ namespace MaaWpfGui.Main { case AsstMsg.TaskChainStopped: Instances.TaskQueueViewModel.SetStopped(); + TaskStatusUpdate(taskId, TaskStatus.Completed); if (isCopilotTaskChain) { _runningState.SetIdle(true); @@ -781,6 +782,7 @@ namespace MaaWpfGui.Main _runningState.SetIdle(true); Instances.CopilotViewModel.AddLog(LocalizationHelper.GetString("CombatError"), UiLogColor.Error); + TaskStatusUpdate(taskId, TaskStatus.Completed); AchievementTrackerHelper.Instance.Unlock(AchievementIds.CopilotError); } @@ -788,21 +790,19 @@ namespace MaaWpfGui.Main } case AsstMsg.TaskChainStart: - Instances.TaskQueueViewModel.FightTaskRunning = taskChain switch { - "Fight" => true, - _ => Instances.TaskQueueViewModel.FightTaskRunning, - }; - - Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("StartTask") + taskChain); - break; + Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("StartTask") + taskChain); + TaskStatusUpdate(taskId, TaskStatus.InProgress); + break; + } case AsstMsg.TaskChainCompleted: { // 判断 _latestTaskId 中是否有元素的值和 details["taskid"] 相等,如果有再判断这个 id 对应的任务是否在 _mainTaskTypes 中 - if (_taskStatus.TryGetValue(taskId, out var taskType)) + TaskStatusUpdate(taskId, TaskStatus.Completed); + if (_tasksStatus.TryGetValue(taskId, out var task)) { - if (_mainTaskTypes.Contains(taskType)) + if (_mainTaskTypes.Contains(task.Type)) { Instances.TaskQueueViewModel.UpdateMainTasksProgress(); } @@ -810,12 +810,7 @@ namespace MaaWpfGui.Main switch (taskChain) { - case "Fight": - Instances.TaskQueueViewModel.FightTaskRunning = false; - break; - case "Infrast": - Instances.TaskQueueViewModel.InfrastTaskRunning = false; InfrastSettingsUserControlModel.Instance.IncreaseCustomInfrastPlanIndex(); InfrastSettingsUserControlModel.Instance.RefreshCustomInfrastPlanIndexByPeriod(); break; @@ -846,9 +841,10 @@ namespace MaaWpfGui.Main Instances.CopilotViewModel.AddLog(LocalizationHelper.GetString("CompleteCombat"), UiLogColor.Info); AchievementTrackerHelper.Instance.AddProgressToGroup(AchievementIds.UseCopilotGroup, 1); } + + break; } - break; case AsstMsg.TaskChainExtraInfo: break; @@ -857,11 +853,11 @@ namespace MaaWpfGui.Main var taskList = details["finished_tasks"]?.ToObject(); if (taskList?.Length > 0) { - var latestMainTaskIds = _taskStatus.Where(i => _mainTaskTypes.Contains(i.Value)).Select(i => i.Key); + var latestMainTaskIds = _tasksStatus.Where(i => _mainTaskTypes.Contains(i.Value.Type)).Select(i => i.Key); isMainTaskQueueAllCompleted = taskList.Any(i => latestMainTaskIds.Contains(i)); } - if (_taskStatus.ContainsValue(TaskType.Copilot)) + if (_tasksStatus.Any(t => t.Value.Type == TaskType.Copilot)) { if (SettingsViewModel.GameSettings.CopilotWithScript) { @@ -873,8 +869,8 @@ namespace MaaWpfGui.Main } } - bool buyWine = _taskStatus.ContainsValue(TaskType.Mall) && Instances.SettingsViewModel.DidYouBuyWine(); - _taskStatus.Clear(); + bool buyWine = _tasksStatus.Any(t => t.Value.Type == TaskType.Mall) && Instances.SettingsViewModel.DidYouBuyWine(); + _tasksStatus.Clear(); TaskQueueViewModel.FightTask.ResetFightVariables(); TaskQueueViewModel.RecruitTask.ResetRecruitVariables(); @@ -2084,9 +2080,38 @@ namespace MaaWpfGui.Main TaskType.Reclamation, ]; - private readonly Dictionary _taskStatus = []; + private readonly Dictionary _tasksStatus = []; - public IReadOnlyDictionary TaskStatus => new Dictionary(_taskStatus); + public IReadOnlyDictionary TasksStatus => new Dictionary(_tasksStatus); + + private bool TaskStatusUpdate(AsstTaskId id, TaskStatus status) + { + if (id == 0) + { + return false; + } + + if (_tasksStatus.TryGetValue(id, out var value)) + { + value.Status = status; + if (value.Type == TaskType.Fight) + { + Instances.TaskQueueViewModel.FightTaskRunning = status == TaskStatus.InProgress; + } + else if (value.Type == TaskType.Infrast) + { + Instances.TaskQueueViewModel.InfrastTaskRunning = status == TaskStatus.InProgress; + } + + return true; + } + else + { + Log.Error("Task ID {TaskId} not found in _tasksStatus", id); + } + + return false; + } public bool AsstAppendCloseDown(string clientType) { @@ -2159,7 +2184,7 @@ namespace MaaWpfGui.Main ["filename"] = filename, }; AsstTaskId id = AsstAppendTaskWithEncoding(AsstTaskType.VideoRecognition, taskParams); - _taskStatus.Add(id, TaskType.Copilot); + _tasksStatus.Add(id, (TaskType.Copilot, TaskStatus.Idle)); return id != 0 && AsstStart(); } @@ -2177,7 +2202,7 @@ namespace MaaWpfGui.Main return false; } - _taskStatus.Add(id, wpfTasktype); + _tasksStatus.Add(id, (wpfTasktype, TaskStatus.Idle)); return true; } @@ -2220,7 +2245,7 @@ namespace MaaWpfGui.Main bool ret = MaaService.AsstStop(_handle); if (clearTask) { - _taskStatus.Clear(); + _tasksStatus.Clear(); } return ret; @@ -2328,6 +2353,27 @@ namespace MaaWpfGui.Main SubTaskStopped, } + /// + /// 任务状态 + /// + public enum TaskStatus + { + /// + /// 未开始 + /// + Idle = 0, + + /// + /// 进行中 + /// + InProgress = 1, + + /// + /// 已完成 + /// + Completed = 2, + } + public enum AsstStaticOptionKey { /// diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index e76b21c341..ca21b50cdf 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -1288,8 +1288,6 @@ namespace MaaWpfGui.ViewModels.UI TaskItemSelectionChanged(); InfrastTask.InfrastOrderSelectionChanged(); - InfrastTaskRunning = true; - await Task.Run(() => SettingsViewModel.GameSettings.RunScript("StartsWithScript")); AddLog(LocalizationHelper.GetString("ConnectingToEmulator")); @@ -1648,7 +1646,7 @@ namespace MaaWpfGui.ViewModels.UI public void SetFightParams() { var type = TaskType.Fight; - var id = Instances.AsstProxy.TaskStatus.FirstOrDefault(t => t.Value == type).Key; + var id = Instances.AsstProxy.TasksStatus.FirstOrDefault(t => t.Value.Type == type).Key; if (!EnableSetFightParams || id == default) { return; @@ -1661,7 +1659,7 @@ namespace MaaWpfGui.ViewModels.UI public static void SetFightRemainingSanityParams() { var type = TaskType.FightRemainingSanity; - var id = Instances.AsstProxy.TaskStatus.FirstOrDefault(t => t.Value == type).Key; + var id = Instances.AsstProxy.TasksStatus.FirstOrDefault(t => t.Value.Type == type).Key; if (id == default) { return; @@ -1687,8 +1685,7 @@ namespace MaaWpfGui.ViewModels.UI public static void SetInfrastParams() { - const TaskType Type = TaskType.Infrast; - int id = Instances.AsstProxy.TaskStatus.FirstOrDefault(i => i.Value == Type).Key; + int id = Instances.AsstProxy.TasksStatus.FirstOrDefault(i => i.Value.Type == TaskType.Infrast).Key; if (id == default) { return; @@ -1739,8 +1736,6 @@ namespace MaaWpfGui.ViewModels.UI return; } - FightTaskRunning = false; - InfrastTaskRunning = false; UpdateMainTasksProgress(0); } }