Files
better-genshin-impact/BetterGenshinImpact/GameTask/AutoPathing/Handler/AutoFightHandler.cs
mfkvfhpdx 225f78b769 战斗后拾取支持根据点位标记是否精英,自动关闭拾取 (#1616)
* 修改调度器任务和部分独立任务失去焦点时,强制切换回游戏窗口,如果用常规的方式无法激活窗口,则第10次会尝试最小化所有窗口后激活游戏。

* 去除未引入的类引用

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

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

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

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

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

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

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

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

* 去除了未使用的引用

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

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

* 调整暂停拾取方法

* 调整个日志输出

* 路径追踪复苏时,暂停拾取

* 增加根据点位配置,支持能在点位未识别情况下,使用大地图中心点的方式来定位,从而支持像铜锁小岛处这种小地图无法识别的点位。调整了对未识别点位的默认逻辑,未配置点位配置情况下,未识别点位,会取上一个识别的点位,从而支持在某些地方断续小地图能识别情况下的脚本。

* Changes

* 修复暂停后,距离过远,小地图无法识别时,无限取当前一个坐标,导致无法正常恢复的问题。调度器管理增加了按天为单位的周期配置,适用于批量执行时,无需人工判断当天执行哪个任务。

* 调度器配置增加,或开启万叶拾取,并且不存在万叶,但配置了万叶队伍情况下,会切换队伍进行拾取。

* 调度器配置,增加了  只拾取精英掉落模式 ,根据编辑器点位配置,可设定非标记精英或传奇的点位跳过拾取。
2025-05-19 23:32:22 +08:00

104 lines
3.9 KiB
C#

using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.GameTask.AutoFight;
using BetterGenshinImpact.GameTask.Common;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using BetterGenshinImpact.GameTask.AutoPathing.Model;
using Microsoft.Extensions.Logging;
namespace BetterGenshinImpact.GameTask.AutoPathing.Handler;
internal class AutoFightHandler : IActionHandler
{
private readonly ILogger<AutoFightHandler> _logger = App.GetLogger<AutoFightHandler>();
public async Task RunAsyncByScript(CancellationToken ct, WaypointForTrack? waypointForTrack = null, object? config = null)
{
if (!(config != null && config is PathingPartyConfig patyConfig && patyConfig is {AutoFightEnabled:true,JsScriptUseEnabled:true,SoloTaskUseFightEnabled:true} ))
{
config = null;
}
await StartFight(ct, config,waypointForTrack);
}
public async Task RunAsync(CancellationToken ct, WaypointForTrack? waypointForTrack = null, object? config = null)
{
await StartFight(ct, config,waypointForTrack);
}
private async Task StartFight(CancellationToken ct, object? config = null , WaypointForTrack? waypointForTrack = null)
{
TaskControl.Logger.LogInformation("执行 {Text}", "自动战斗");
// 爷们要战斗
AutoFightParam taskParams = null;
if (config != null && config is PathingPartyConfig patyConfig && patyConfig.AutoFightEnabled)
{
//替换配置为地图追踪
taskParams = GetFightAutoFightParam(patyConfig.AutoFightConfig);
}
else
{
taskParams = new AutoFightParam(GetFightStrategy(), TaskContext.Instance().Config.AutoFightConfig);
}
//根据怪物标签,调整拾取配置
if (waypointForTrack!=null)
{
// normal 小怪,elite 精英,legendary 传奇
//不为精英或者小怪
if (!(waypointForTrack.MonsterTag == "elite" || waypointForTrack.MonsterTag == "legendary"))
{
if (taskParams.OnlyPickEliteDropsMode == "AllowAutoPickupForNonElite" || taskParams.OnlyPickEliteDropsMode == "DisableAutoPickupForNonElite")
{
//允许自动拾取,即只关闭配置上的拾取即刻
taskParams.KazuhaPickupEnabled = false;
taskParams.PickDropsAfterFightEnabled = false;
_logger.LogInformation("当前非精英或传奇点位,关闭战斗拾取配置!");
//禁止自动拾取,除了关闭配置拾取外,连自动拾取都关掉
if (taskParams.OnlyPickEliteDropsMode == "DisableAutoPickupForNonElite")
{
await RunnerContext.Instance.StopAutoPickRunTask(
async () => await new AutoFightTask(taskParams).Start(ct),
5);
return;
}
}
}
}
var fightSoloTask = new AutoFightTask(taskParams);
await fightSoloTask.Start(ct);
}
private AutoFightParam GetFightAutoFightParam(AutoFightConfig? config)
{
AutoFightParam autoFightParam = new AutoFightParam(GetFightStrategy(config), config);
return autoFightParam;
}
private string GetFightStrategy(AutoFightConfig config)
{
var path = Global.Absolute(@"User\AutoFight\" + config.StrategyName + ".txt");
if ("根据队伍自动选择".Equals(config.StrategyName))
{
path = Global.Absolute(@"User\AutoFight\");
}
if (!File.Exists(path) && !Directory.Exists(path))
{
throw new Exception("战斗策略文件不存在");
}
return path;
}
private string GetFightStrategy()
{
return GetFightStrategy(TaskContext.Instance().Config.AutoFightConfig);
}
}