Files
better-genshin-impact/BetterGenshinImpact/GameTask/RunnerContext.cs
mfkvfhpdx 4760752e70 在调度器里面的任务之前,增加月卡处理,解决4点如果未进入任务会卡住的问题。增加了日志分析小怪详细。解决日志分析兜底结束日期不生效的问题。 (#1433)
* 修改调度器任务和部分独立任务失去焦点时,强制切换回游戏窗口,如果用常规的方式无法激活窗口,则第10次会尝试最小化所有窗口后激活游戏。

* 去除未引入的类引用

* 修正战斗结束后,大概率打开队伍界面的问题

* 修复有些电脑上因未知原因,战斗0秒打断

* 把失焦激活放入了设置-通用设置-其他设置中,默认关闭。暂停恢复时,重置移动的起始时间,防止因暂停而导致超时放弃任务。

* 在调度器里面的任务之前,增加月卡处理,解决4点如果未进入任务会卡住的问题。增加了日志分析小怪详细。解决日志分析兜底结束日期不生效的问题。

* 在设置=》其他设置中 增加调度器任务传送过程中自动领取探索奖励功能配置。

* 调整自动派遣后恢复原任务的逻辑

* 自动领取派遣奖励时,跳过异常,防止整个配置组任务被打断。

* 把打开大地图方法从TpTask中抽出为公共方法,自动领取派遣代码调整到了调度器中。

* 去除了未使用的引用

* 暂停恢复逻辑增加恢复中条件和非空判断

* 增加了临时暂停自动拾取的逻辑(RunnerContext.AutoPickTriggerStopCount 为0时不限制,大于0时停止,多次暂停会累加该值,每次恢复-1),支持嵌套情况的暂停,在自动派遣(和结束后5秒)或暂停调度器任务时,同时暂停自动拾取功能。

* 调整暂停拾取方法

* 调整个日志输出

* 路径追踪复苏时,暂停拾取
2025-04-26 21:47:57 +08:00

189 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using BetterGenshinImpact.GameTask.AutoFight.Model;
using BetterGenshinImpact.Model;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
using BetterGenshinImpact.GameTask.AutoPathing.Suspend;
using BetterGenshinImpact.GameTask.Common.Job;
using OpenCvSharp;
using Wpf.Ui.Controls;
using static BetterGenshinImpact.GameTask.Common.TaskControl;
namespace BetterGenshinImpact.GameTask;
/// <summary>
/// 使用 TaskRunner 运行任务时的上下文
/// </summary>
public class RunnerContext : Singleton<RunnerContext>
{
/// <summary>
/// 是否是连续执行配置组的场景
/// </summary>
public bool IsContinuousRunGroup { get; set; }
/// <summary>
/// 暂停逻辑
/// </summary>
public bool IsSuspend { get; set; }
/// <summary>
/// 暂停实现
/// </summary>
public Dictionary<string, ISuspendable> SuspendableDictionary = new();
/// <summary>
/// 是否正在自动领取派遣任务
/// </summary>
public bool isAutoFetchDispatch { get; set; }
/// <summary>
/// 当前使用队伍名称
/// 游戏内定义的队伍名称
/// </summary>
public string? PartyName { get; set; }
/// <summary>
/// 自动拾取暂停计数当大于0时暂停等于0时不限制。
/// </summary>
public int AutoPickTriggerStopCount { get; private set; } = 0;
/// <summary>
/// 当前队伍角色信息
/// </summary>
private CombatScenes? _combatScenes;
public async Task<CombatScenes?> 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 void ClearCombatScenes()
{
_combatScenes = null;
}
/// <summary>
/// 任务结束后的清理
/// </summary>
public void Clear()
{
// 连续执行配置组的情况下,不清理当前队伍
if (!IsContinuousRunGroup)
{
PartyName = null;
}
_combatScenes = null;
IsSuspend = false;
isAutoFetchDispatch = false;
SuspendableDictionary.Clear();
}
/// <summary>
/// 彻底恢复到初始状态
/// </summary>
public void Reset()
{
IsContinuousRunGroup = false;
PartyName = null;
_combatScenes = null;
IsSuspend = false;
isAutoFetchDispatch = false;
SuspendableDictionary.Clear();
AutoPickTriggerStopCount = 0;
}
/// <summary>
/// 暂停自动拾取如果传入时间大于0(单位秒),则在该时间之后自动取消此次暂停(暂停自动拾取计数器-1,反之暂停拾取(暂停自动拾取计数器+1此时需要恢复需要手动调用ResumeAutoPick。
/// </summary>
public void StopAutoPick(int time = -1)
{
AutoPickTriggerStopCount++;
Logger.LogInformation("暂停自动拾取拾取:"+AutoPickTriggerStopCount);
ResumeAutoPick(time);
}
/// <summary>
/// 恢复自动拾取(暂停自动拾取计数器-1。传入参数决定几秒后恢复
/// </summary>
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();
}
}
/// <summary>
/// 在暂停拾取情况下,执行任务
/// </summary>
public async Task StopAutoPickRunTask(Func<Task> taskFactory,int time=0)
{
try
{
AutoPickTriggerStopCount++;
await taskFactory();
}
finally
{
ResumeAutoPick(time);
}
}
public void stop()
{
_combatScenes = null;
}
}