using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BetterGenshinImpact.GameTask.AutoFight.Model; using BetterGenshinImpact.GameTask.AutoPathing.Suspend; using BetterGenshinImpact.GameTask.Common.Job; using BetterGenshinImpact.Model; using Microsoft.Extensions.Logging; using static BetterGenshinImpact.GameTask.Common.TaskControl; namespace BetterGenshinImpact.GameTask; /// /// 使用 TaskRunner 运行任务时的上下文 /// public class RunnerContext : Singleton { /// /// 是否是连续执行配置组的场景 /// public bool IsContinuousRunGroup { get; set; } public TaskProgress.TaskProgress? taskProgress { get; set; } /// /// 暂停逻辑 /// public bool IsSuspend { get; set; } /// /// 优先执行配置组 /// public bool IsPreExecution { get; set; } = false; /// /// 暂停实现 /// public Dictionary SuspendableDictionary = new(); /// /// 是否正在自动领取派遣任务 /// public bool isAutoFetchDispatch { get; set; } /// /// 当前使用队伍名称 /// 游戏内定义的队伍名称 /// public string? PartyName { get; set; } /// /// 自动拾取暂停计数,当大于0时暂停,等于0时不限制。 /// public int AutoPickTriggerStopCount { get; private set; } = 0; /// /// 当前队伍角色信息 /// private CombatScenes? _combatScenes; public async Task GetCombatScenes(CancellationToken ct) { if (_combatScenes == null) { // 返回主界面再识别 var returnMainUiTask = new ReturnMainUiTask(); await returnMainUiTask.Start(ct); await Delay(200, ct); _combatScenes = new CombatScenes().InitializeTeam(CaptureToRectArea()); if (!_combatScenes.CheckTeamInitialized()) { Logger.LogError("队伍角色识别失败"); _combatScenes = null; } } return _combatScenes; } /// /// 尝试静默识别当前队伍信息(无副作用,不出错) /// public CombatScenes? TrySyncCombatScenesSilent() { try { using var region = CaptureToRectArea(); var scenes = new CombatScenes(logger: Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance).InitializeTeamSilent(region); if (scenes.CheckTeamInitialized()) { return scenes; } scenes.Dispose(); } catch { // 静默模式忽略一切异常 } return null; } public void ClearCombatScenes() { _combatScenes = null; } /// /// 任务结束后的清理 /// public void Clear() { // 连续执行配置组的情况下,不清理当前队伍 if (!IsContinuousRunGroup) { PartyName = null; } _combatScenes = null; IsSuspend = false; isAutoFetchDispatch = false; SuspendableDictionary.Clear(); } /// /// 彻底恢复到初始状态 /// public void Reset() { IsContinuousRunGroup = false; PartyName = null; _combatScenes = null; IsSuspend = false; isAutoFetchDispatch = false; SuspendableDictionary.Clear(); AutoPickTriggerStopCount = 0; taskProgress = null; IsPreExecution = false; } /// /// 暂停自动拾取,如果传入时间大于0(单位秒),则在该时间之后自动取消此次暂停(暂停自动拾取计数器-1),反之暂停拾取(暂停自动拾取计数器+1),此时需要恢复需要手动调用ResumeAutoPick。 /// public void StopAutoPick(int time = -1) { AutoPickTriggerStopCount++; Logger.LogInformation("暂停自动拾取拾取:"+AutoPickTriggerStopCount); ResumeAutoPick(time); } /// /// 恢复自动拾取(暂停自动拾取计数器-1)。传入参数决定几秒后恢复 /// public void ResumeAutoPick(int time=0) { if (time == -1) { return; } if (time>0) { Logger.LogInformation(time+"秒后恢复自动拾取:"+AutoPickTriggerStopCount); } if (time <= 0) { if (AutoPickTriggerStopCount>0) { AutoPickTriggerStopCount--; Logger.LogInformation("恢复自动拾取:"+AutoPickTriggerStopCount); } } else { new Thread(() => { while (time>0) { if (AutoPickTriggerStopCount == 0) { return; } Thread.Sleep(1000); time--; } ResumeAutoPick(); }).Start(); } } /// /// 在暂停拾取情况下,执行任务 /// public async Task StopAutoPickRunTask(Func taskFactory,int time=0) { try { AutoPickTriggerStopCount++; await taskFactory(); } finally { ResumeAutoPick(time); } } public void stop() { _combatScenes = null; } }