mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-10 00:44:10 +08:00
* 修改调度器任务和部分独立任务失去焦点时,强制切换回游戏窗口,如果用常规的方式无法激活窗口,则第10次会尝试最小化所有窗口后激活游戏。 * 去除未引入的类引用 * 修正战斗结束后,大概率打开队伍界面的问题 * 修复有些电脑上因未知原因,战斗0秒打断 * 把失焦激活放入了设置-通用设置-其他设置中,默认关闭。暂停恢复时,重置移动的起始时间,防止因暂停而导致超时放弃任务。 * 在调度器里面的任务之前,增加月卡处理,解决4点如果未进入任务会卡住的问题。增加了日志分析小怪详细。解决日志分析兜底结束日期不生效的问题。 * 在设置=》其他设置中 增加调度器任务传送过程中自动领取探索奖励功能配置。 * 调整自动派遣后恢复原任务的逻辑 * 自动领取派遣奖励时,跳过异常,防止整个配置组任务被打断。 * 把打开大地图方法从TpTask中抽出为公共方法,自动领取派遣代码调整到了调度器中。 * 去除了未使用的引用 * 暂停恢复逻辑增加恢复中条件和非空判断 * 增加了临时暂停自动拾取的逻辑(RunnerContext.AutoPickTriggerStopCount 为0时不限制,大于0时停止,多次暂停会累加该值,每次恢复-1),支持嵌套情况的暂停,在自动派遣(和结束后5秒)或暂停调度器任务时,同时暂停自动拾取功能。 * 调整暂停拾取方法 * 调整个日志输出 * 路径追踪复苏时,暂停拾取
189 lines
4.9 KiB
C#
189 lines
4.9 KiB
C#
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;
|
||
}
|
||
} |