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