refactor(wpf): asst任务状态 (#12985)

* rft(wpf): asst任务状态监控

* rft: 迁移刷理智, 基建任务状态
This commit is contained in:
status102
2025-06-16 11:07:43 +08:00
committed by GitHub
parent 2859225bc7
commit 39b9d35d69
2 changed files with 73 additions and 32 deletions

View File

@@ -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<AsstTaskId[]>();
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<AsstTaskId, TaskType> _taskStatus = [];
private readonly Dictionary<AsstTaskId, (TaskType Type, TaskStatus Status)> _tasksStatus = [];
public IReadOnlyDictionary<AsstTaskId, TaskType> TaskStatus => new Dictionary<AsstTaskId, TaskType>(_taskStatus);
public IReadOnlyDictionary<AsstTaskId, (TaskType Type, TaskStatus Status)> TasksStatus => new Dictionary<AsstTaskId, (TaskType, TaskStatus)>(_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,
}
/// <summary>
/// 任务状态
/// </summary>
public enum TaskStatus
{
/// <summary>
/// 未开始
/// </summary>
Idle = 0,
/// <summary>
/// 进行中
/// </summary>
InProgress = 1,
/// <summary>
/// 已完成
/// </summary>
Completed = 2,
}
public enum AsstStaticOptionKey
{
/// <summary>

View File

@@ -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);
}
}