From 3f2a3b118aba6e95c4e21a0d3fe7f564f998fef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Thu, 9 Jan 2025 23:41:53 +0800 Subject: [PATCH 01/12] auto pathing: add auto run config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 并且枫丹合成台不自动跑步 --- BetterGenshinImpact/Core/Config/PathingPartyConfig.cs | 6 +++++- BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs | 2 +- .../GameTask/Common/Job/GoToCraftingBenchTask.cs | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs index 90bfec37..19883c82 100644 --- a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs @@ -68,10 +68,14 @@ public partial class PathingPartyConfig : ObservableObject // 启用进入剧情自动脱离 [ObservableProperty] private bool _autoSkipEnabled = true; + + // 自动冲刺启用 + [ObservableProperty] + private bool _autoRunEnabled = true; //启用自动战斗配置 [ObservableProperty] - private bool _autoFightEabled = false; + private bool _autoFightEnabled = false; [ObservableProperty] private AutoFightConfig _autoFightConfig = new(); diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 8c528b94..f099f6b8 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -770,7 +770,7 @@ public class PathExecutor } // 自动疾跑 - if (distance > 20) + if (distance > 20 && PartyConfig.AutoRunEnabled) { if (Math.Abs((fastModeColdTime - now).TotalMilliseconds) > 2500) //冷却时间2.5s,回复体力用 { diff --git a/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs b/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs index c2050a93..f7ca9cfd 100644 --- a/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs +++ b/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs @@ -100,7 +100,8 @@ public class GoToCraftingBenchTask PartyConfig = new PathingPartyConfig { Enabled = true, - AutoSkipEnabled = true + AutoSkipEnabled = true, + AutoRunEnabled = country != "枫丹" , }, EndAction = region => Bv.FindFAndPress(region, "合成") }; From cd3713175a37621d2443d24a844d9a7dbfac26d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Thu, 9 Jan 2025 23:49:49 +0800 Subject: [PATCH 02/12] auto pathing: don't get close during the battle. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 战斗时不需要接近点位 --- BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index f099f6b8..20cbfd62 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -188,7 +188,10 @@ public class PathExecutor && waypoint.Action != ActionEnum.CombatScript.Code && waypoint.Action != ActionEnum.Mining.Code)) { - await MoveCloseTo(waypoint); + if (waypoint.Action != ActionEnum.Fight.Code) // 战斗时不需要接近 + { + await MoveCloseTo(waypoint); + } } //skipOtherOperations如果重试,则跳过相关操作 From 78539011372cb0b287cd25009c1f60d3335c36d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Thu, 9 Jan 2025 23:58:28 +0800 Subject: [PATCH 03/12] =?UTF-8?q?log=20text=20optimization=20=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E4=BC=98=E5=8C=96=EF=BC=88=E6=88=98=E6=96=97=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E6=96=87=E4=BB=B6=E4=B8=8D=E5=AD=98=E5=9C=A8=E3=80=81?= =?UTF-8?q?sendInput=E8=A2=AB=E6=8B=A6=E6=88=AA=E3=80=81=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=BF=BD=E8=B8=AA=E4=B8=AD=E6=88=98=E6=96=97=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0=E4=BF=AE=E6=94=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoPathing/Handler/AutoFightHandler.cs | 2 +- .../GameTask/AutoPathing/Handler/CombatScriptHandler.cs | 4 ++-- .../View/Pages/View/ScriptGroupConfigView.xaml | 2 +- .../ViewModel/Pages/TaskSettingsPageViewModel.cs | 9 ++++++++- Fischless.WindowsInput/WindowsInputMessageDispatcher.cs | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Handler/AutoFightHandler.cs b/BetterGenshinImpact/GameTask/AutoPathing/Handler/AutoFightHandler.cs index 7d40fc09..7b380e29 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/Handler/AutoFightHandler.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/Handler/AutoFightHandler.cs @@ -22,7 +22,7 @@ internal class AutoFightHandler : IActionHandler TaskControl.Logger.LogInformation("执行 {Text}", "自动战斗"); // 爷们要战斗 AutoFightParam taskParams = null; - if (config != null && config is PathingPartyConfig patyConfig && patyConfig.AutoFightEabled) + if (config != null && config is PathingPartyConfig patyConfig && patyConfig.AutoFightEnabled) { //替换配置为路径追踪 diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Handler/CombatScriptHandler.cs b/BetterGenshinImpact/GameTask/AutoPathing/Handler/CombatScriptHandler.cs index 2546522a..a150ff77 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/Handler/CombatScriptHandler.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/Handler/CombatScriptHandler.cs @@ -15,7 +15,7 @@ public class CombatScriptHandler : IActionHandler { if (waypointForTrack is { CombatScript: not null }) { - Logger.LogInformation("执行 {Text}", "战斗策略脚本"); + Logger.LogInformation("执行 {Text}", "简易策略脚本"); var combatScript = waypointForTrack.CombatScript; var combatScenes = await RunnerContext.Instance.GetCombatScenes(ct); if (combatScenes == null) @@ -41,7 +41,7 @@ public class CombatScriptHandler : IActionHandler } else { - Logger.LogError("战斗脚本action_params内容为空"); + Logger.LogError("策略脚本action_params内容为空"); } } diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 7bc0760d..e5e997f7 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -268,7 +268,7 @@ Grid.RowSpan="2" Grid.Column="1" Margin="0,0,24,0" - IsChecked="{Binding PathingConfig.AutoFightEabled, Mode=TwoWay}" /> + IsChecked="{Binding PathingConfig.AutoFightEnabled, Mode=TwoWay}" /> diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index 88cbbe21..1542ab96 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -245,6 +245,13 @@ public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAw public bool GetFightStrategy(out string path) { + if (string.IsNullOrEmpty(Config.AutoFightConfig.StrategyName)) + { + Toast.Warning("请先在【独立任务——自动战斗】下拉列表配置中选择战斗策略!"); + path = string.Empty; + return true; + } + path = Global.Absolute(@"User\AutoFight\" + Config.AutoFightConfig.StrategyName + ".txt"); if ("根据队伍自动选择".Equals(Config.AutoFightConfig.StrategyName)) { @@ -253,7 +260,7 @@ public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAw if (!File.Exists(path) && !Directory.Exists(path)) { - Toast.Error("战斗策略文件不存在"); + Toast.Error("当前选择的自动战斗策略文件不存在"); return true; } diff --git a/Fischless.WindowsInput/WindowsInputMessageDispatcher.cs b/Fischless.WindowsInput/WindowsInputMessageDispatcher.cs index 08177086..c5f4c5b6 100644 --- a/Fischless.WindowsInput/WindowsInputMessageDispatcher.cs +++ b/Fischless.WindowsInput/WindowsInputMessageDispatcher.cs @@ -21,7 +21,7 @@ internal class WindowsInputMessageDispatcher : IInputMessageDispatcher if (num != (ulong)(long)inputs.Length) { - throw new Exception("Some simulated input commands were not sent successfully. The most common reason for this happening are the security features of Windows including User Interface Privacy Isolation (UIPI). Your application can only send commands to applications of the same or lower elevation. Similarly certain commands are restricted to Accessibility/UIAutomation applications. Refer to the project home page and the code samples for more information."); + throw new Exception("模拟键鼠消息发送失败!常见原因:1.你未以管理员权限运行程序;2.存在安全软件拦截(比如360)"); } } } From e2afabc7f6c07a84046c07b870884d35419f00d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 00:04:14 +0800 Subject: [PATCH 04/12] fixed #988 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复战斗策略参数校验提示在()不存在时未正确展示的问题 --- .../AutoFight/Script/CombatCommand.cs | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoFight/Script/CombatCommand.cs b/BetterGenshinImpact/GameTask/AutoFight/Script/CombatCommand.cs index a7798714..d503ec35 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Script/CombatCommand.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Script/CombatCommand.cs @@ -27,38 +27,41 @@ public class CombatCommand Method = Method.GetEnumByCode(method); var parameters = command.Substring(startIndex + 1, endIndex - startIndex - 1); - Args = new List(parameters.Split(',', StringSplitOptions.TrimEntries)); - // 校验参数 - if (Method == Method.Walk) - { - AssertUtils.IsTrue(Args.Count == 2, "walk方法必须有两个入参,第一个参数是方向,第二个参数是行走时间。例:walk(s, 0.2)"); - var s = double.Parse(Args[1]); - AssertUtils.IsTrue(s > 0, "行走时间必须大于0"); - } - else if (Method == Method.W || Method == Method.A || Method == Method.S || Method == Method.D) - { - AssertUtils.IsTrue(Args.Count == 1, "w/a/s/d方法必须有一个入参,代表行走时间。例:d(0.5)"); - } - else if (Method == Method.MoveBy) - { - AssertUtils.IsTrue(Args.Count == 2, "moveby方法必须有两个入参,分别是x和y。例:moveby(100, 100))"); - } - else if (Method == Method.KeyDown || Method == Method.KeyUp || Method == Method.KeyPress) - { - AssertUtils.IsTrue(Args.Count == 1, $"{Method.Alias[0]}方法必须有一个入参,代表按键"); - try - { - User32Helper.ToVk(Args[0]); - } - catch - { - throw new ArgumentException($"{Method.Alias[0]}方法的入参必须是VirtualKeyCodes枚举中的值,当前入参 {Args[0]} 不合法"); - } - } + Args = [..parameters.Split(',', StringSplitOptions.TrimEntries)]; + } else { Method = Method.GetEnumByCode(command); + Args = []; + } + + // 校验参数 + if (Method == Method.Walk) + { + AssertUtils.IsTrue(Args.Count == 2, "walk方法必须有两个入参,第一个参数是方向,第二个参数是行走时间。例:walk(s, 0.2)"); + var s = double.Parse(Args[1]); + AssertUtils.IsTrue(s > 0, "行走时间必须大于0"); + } + else if (Method == Method.W || Method == Method.A || Method == Method.S || Method == Method.D) + { + AssertUtils.IsTrue(Args.Count == 1, "w/a/s/d方法必须有一个入参,代表行走时间。例:d(0.5)"); + } + else if (Method == Method.MoveBy) + { + AssertUtils.IsTrue(Args.Count == 2, "moveby方法必须有两个入参,分别是x和y。例:moveby(100, 100))"); + } + else if (Method == Method.KeyDown || Method == Method.KeyUp || Method == Method.KeyPress) + { + AssertUtils.IsTrue(Args.Count == 1, $"{Method.Alias[0]}方法必须有一个入参,代表按键"); + try + { + User32Helper.ToVk(Args[0]); + } + catch + { + throw new ArgumentException($"{Method.Alias[0]}方法的入参必须是VirtualKeyCodes枚举中的值,当前入参 {Args[0]} 不合法"); + } } } From 2e27154871a358be419550de5a62bb011bae022c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 00:11:22 +0800 Subject: [PATCH 05/12] =?UTF-8?q?mandatory=20verification=20of=20game=20re?= =?UTF-8?q?solution=20=E8=87=AA=E5=8A=A8=E6=88=98=E6=96=97=20=E7=A7=98?= =?UTF-8?q?=E5=A2=83=20=E5=BC=BA=E5=88=B6=E6=A0=A1=E9=AA=8C=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=88=86=E8=BE=A8=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoDomain/AutoDomainTask.cs | 1 + .../GameTask/AutoFight/AutoFightTask.cs | 82 +++++++++---------- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs index bf6f7bb2..a160cf5c 100644 --- a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs +++ b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs @@ -189,6 +189,7 @@ public class AutoDomainTask : ISoloTask if (gameScreenSize.Width * 9 != gameScreenSize.Height * 16) { Logger.LogError("游戏窗口分辨率不是 16:9 !当前分辨率为 {Width}x{Height} , 非 16:9 分辨率的游戏无法正常使用自动秘境功能 !", gameScreenSize.Width, gameScreenSize.Height); + throw new Exception("游戏窗口分辨率不是 16:9"); } if (gameScreenSize.Width < 1920 || gameScreenSize.Height < 1080) diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs index 928a4a57..0f576e2e 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs @@ -42,22 +42,24 @@ public class AutoFightTask : ISoloTask private class TaskFightFinishDetectConfig { - public int DelayTime=1500; + public int DelayTime = 1500; public Dictionary DelayTimes = new(); public double CheckTime = 5; public List CheckNames = new(); public bool FastCheckEnabled; + public TaskFightFinishDetectConfig(AutoFightParam.FightFinishDetectConfig finishDetectConfig) { - FastCheckEnabled=finishDetectConfig.FastCheckEnabled; - ParseCheckTimeString(finishDetectConfig.FastCheckParams,out CheckTime,CheckNames); - ParseFastCheckEndDelayString(finishDetectConfig.CheckEndDelay,out DelayTime,DelayTimes); + FastCheckEnabled = finishDetectConfig.FastCheckEnabled; + ParseCheckTimeString(finishDetectConfig.FastCheckParams, out CheckTime, CheckNames); + ParseFastCheckEndDelayString(finishDetectConfig.CheckEndDelay, out DelayTime, DelayTimes); BattleEndProgressBarColor = ParseStringToTuple(finishDetectConfig.BattleEndProgressBarColor, (95, 235, 255)); BattleEndProgressBarColorTolerance = ParseSingleOrCommaSeparated(finishDetectConfig.BattleEndProgressBarColorTolerance, (6, 6, 6)); } - public (int, int, int) BattleEndProgressBarColor{ get; } - public (int, int, int) BattleEndProgressBarColorTolerance{ get; } + public (int, int, int) BattleEndProgressBarColor { get; } + public (int, int, int) BattleEndProgressBarColorTolerance { get; } + public static void ParseCheckTimeString( string input, out double checkTime, @@ -68,6 +70,7 @@ public class AutoFightTask : ISoloTask { return; // 直接返回 } + var uniqueNames = new HashSet(); // 用于临时去重的集合 // 按分号分割字符串 @@ -90,6 +93,7 @@ public class AutoFightTask : ISoloTask names.AddRange(uniqueNames); // 将集合转换为列表 } + public static void ParseFastCheckEndDelayString( string input, out int delayTime, @@ -99,9 +103,9 @@ public class AutoFightTask : ISoloTask if (string.IsNullOrEmpty(input)) { - return; // 直接返回 } + // 分割字符串,以分号为分隔符 var segments = input.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); @@ -130,7 +134,7 @@ public class AutoFightTask : ISoloTask } } - + static bool IsSingleNumber(string input, out int result) { return int.TryParse(input, out result); @@ -162,10 +166,10 @@ public class AutoFightTask : ISoloTask // 如果解析失败,返回默认值 return defaultValue; } - } private TaskFightFinishDetectConfig _finishDetectConfig; + public AutoFightTask(AutoFightParam taskParam) { _taskParam = taskParam; @@ -176,11 +180,11 @@ public class AutoFightTask : ISoloTask _predictor = BgiYoloV8PredictorFactory.GetPredictor(@"Assets\Model\World\bgi_world.onnx"); } - _finishDetectConfig=new TaskFightFinishDetectConfig(_taskParam.FinishDetectConfig); + _finishDetectConfig = new TaskFightFinishDetectConfig(_taskParam.FinishDetectConfig); } // 方法1:判断是否是单个数字 - + /*public int delayTime=1500; public Dictionary delayTimes = new(); public double checkTime = 5; @@ -205,11 +209,11 @@ public class AutoFightTask : ISoloTask combatScenes.BeforeTask(cts2.Token); TimeSpan fightTimeout = TimeSpan.FromSeconds(_taskParam.Timeout); // 战斗超时时间 Stopwatch timeoutStopwatch = Stopwatch.StartNew(); - + Stopwatch checkFightFinishStopwatch = Stopwatch.StartNew(); TimeSpan checkFightFinishTime = TimeSpan.FromSeconds(_finishDetectConfig.CheckTime); //检查战斗超时时间的超时时间 - + //战斗前检查,可做成配置 /* if (await CheckFightFinish()) { return; @@ -223,7 +227,6 @@ public class AutoFightTask : ISoloTask { while (!cts2.Token.IsCancellationRequested) { - // 通用化战斗策略 for (var i = 0; i < combatCommands.Count; i++) { @@ -239,18 +242,16 @@ public class AutoFightTask : ISoloTask lastFighttName = command.Name; - if (!fightEndFlag && _taskParam is { FightFinishDetectEnabled: true } ) + if (!fightEndFlag && _taskParam is { FightFinishDetectEnabled: true }) { - //处于最后一个位置,或者当前执行人和下一个人名字不一样的情况,满足一定条件(开启快速检查,并且检查时间大于0或人名存在配置)检查战斗 - if (i==combatCommands.Count - 1 + if (i == combatCommands.Count - 1 || ( - _finishDetectConfig.FastCheckEnabled && command.Name!=combatCommands[i+1].Name && - ((_finishDetectConfig.CheckTime>0 && checkFightFinishStopwatch.Elapsed>checkFightFinishTime) - || _finishDetectConfig.CheckNames.Contains(command.Name)) - )) + _finishDetectConfig.FastCheckEnabled && command.Name != combatCommands[i + 1].Name && + ((_finishDetectConfig.CheckTime > 0 && checkFightFinishStopwatch.Elapsed > checkFightFinishTime) + || _finishDetectConfig.CheckNames.Contains(command.Name)) + )) { - checkFightFinishStopwatch.Restart(); var delayTime = _finishDetectConfig.DelayTime; if (_finishDetectConfig.DelayTimes.TryGetValue(command.Name, out var time)) @@ -270,12 +271,11 @@ public class AutoFightTask : ISoloTask fightEndFlag = await CheckFightFinish(delayTime); } } - + if (fightEndFlag) { break; } - } @@ -331,33 +331,30 @@ public class AutoFightTask : ISoloTask var kazuha = combatScenes.Avatars.FirstOrDefault(a => a.Name == "枫原万叶"); if (kazuha != null) { - var time = DateTime.UtcNow - kazuha.LastSkillTime; + var time = DateTime.UtcNow - kazuha.LastSkillTime; //当万叶最后一个出招,并且cd大于3时,此时不再触发万叶拾取 - if (!(lastFighttName== "枫原万叶" && time.TotalSeconds>3)) + if (!(lastFighttName == "枫原万叶" && time.TotalSeconds > 3)) { - Logger.LogInformation("使用枫原万叶长E拾取掉落物"); await Delay(300, ct); if (kazuha.TrySwitch()) { - if (time.TotalMilliseconds > 0 && time.TotalSeconds <= kazuha.SkillHoldCd) - { - Logger.LogInformation("枫原万叶长E技能可能处于冷却中,等待 {Time} s",time.TotalSeconds); - await Delay((int)Math.Ceiling(time.TotalMilliseconds), ct); - } - kazuha.UseSkill(true); - await Task.Delay(100); - Simulation.SendInput.SimulateAction(GIActions.NormalAttack); - await Delay(1500, ct); - + if (time.TotalMilliseconds > 0 && time.TotalSeconds <= kazuha.SkillHoldCd) + { + Logger.LogInformation("枫原万叶长E技能可能处于冷却中,等待 {Time} s", time.TotalSeconds); + await Delay((int)Math.Ceiling(time.TotalMilliseconds), ct); + } + + kazuha.UseSkill(true); + await Task.Delay(100); + Simulation.SendInput.SimulateAction(GIActions.NormalAttack); + await Delay(1500, ct); } } else { Logger.LogInformation("最后一次由万叶出招,不再重复拾取!"); } - - } } @@ -373,7 +370,8 @@ public class AutoFightTask : ISoloTask var gameScreenSize = SystemControl.GetGameScreenRect(TaskContext.Instance().GameHandle); if (gameScreenSize.Width * 9 != gameScreenSize.Height * 16) { - Logger.LogWarning("游戏窗口分辨率不是 16:9 !当前分辨率为 {Width}x{Height} , 非 16:9 分辨率的游戏可能无法正常使用自动战斗功能 !", gameScreenSize.Width, gameScreenSize.Height); + Logger.LogError("游戏窗口分辨率不是 16:9 !当前分辨率为 {Width}x{Height} , 非 16:9 分辨率的游戏无法正常使用自动战斗功能 !", gameScreenSize.Width, gameScreenSize.Height); + throw new Exception("游戏窗口分辨率不是 16:9"); } } @@ -385,7 +383,7 @@ public class AutoFightTask : ISoloTask Math.Abs(a.Item3 - b.Item3) < c.Item3; } - private async Task CheckFightFinish(int delayTime=1500) + private async Task CheckFightFinish(int delayTime = 1500) { // YOLO 判断血条和怪物位置 // if (HasFightFlagByYolo(CaptureToRectArea())) @@ -418,7 +416,7 @@ public class AutoFightTask : ISoloTask } } **/ - + await Delay(delayTime, _ct); Logger.LogInformation("打开编队界面检查战斗是否结束"); // 最终方案确认战斗结束 From 902b3192118d635d748180f77508f99b05c3829b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 00:51:35 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=99=A8=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E9=A2=91=E7=8E=87=E5=BF=85=E9=A1=BB=E5=A4=A7=E4=BA=8E?= =?UTF-8?q?0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs index bb7613d6..ebb3f37a 100644 --- a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs @@ -220,6 +220,12 @@ public partial class HomePageViewModel : ObservableObject, INavigationAware, IVi private void Start(IntPtr hWnd) { + if (Config.TriggerInterval <= 0) + { + MessageBox.Error("触发器触发频率必须大于0"); + return; + } + if (!TaskDispatcherEnabled) { _hWnd = hWnd; From 9f11fc984da9530aeba6e5d9be14297a423d1f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 00:59:31 +0800 Subject: [PATCH 07/12] add no select domain option --- BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs | 2 +- .../ViewModel/Pages/TaskSettingsPageViewModel.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs index 6b68039a..c0841742 100644 --- a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs @@ -61,7 +61,7 @@ public partial class OneDragonFlowViewModel : ObservableObject, INavigationAware private List _adventurersGuildCountry = ["枫丹", "稻妻", "璃月", "蒙德"]; [ObservableProperty] - private List _domainNameList = MapLazyAssets.Instance.DomainNameList; + private List _domainNameList = ["", ..MapLazyAssets.Instance.DomainNameList]; public OneDragonFlowViewModel() { diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index 1542ab96..9b910fed 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -115,7 +115,7 @@ public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAw //_combatStrategyList = ["根据队伍自动选择", .. LoadCustomScript(Global.Absolute(@"User\AutoFight"))]; - _domainNameList = MapLazyAssets.Instance.DomainNameList; + _domainNameList = ["", ..MapLazyAssets.Instance.DomainNameList]; _autoFightViewModel = new AutoFightViewModel(Config); } @@ -251,7 +251,7 @@ public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAw path = string.Empty; return true; } - + path = Global.Absolute(@"User\AutoFight\" + Config.AutoFightConfig.StrategyName + ".txt"); if ("根据队伍自动选择".Equals(Config.AutoFightConfig.StrategyName)) { From 6591c8a387486a7ebcbfe4170adcd48c692594b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 01:04:31 +0800 Subject: [PATCH 08/12] fixed #951 --- BetterGenshinImpact/Model/OneDragonTaskItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BetterGenshinImpact/Model/OneDragonTaskItem.cs b/BetterGenshinImpact/Model/OneDragonTaskItem.cs index 49c8c08c..18375fb6 100644 --- a/BetterGenshinImpact/Model/OneDragonTaskItem.cs +++ b/BetterGenshinImpact/Model/OneDragonTaskItem.cs @@ -93,7 +93,7 @@ public partial class OneDragonTaskItem : ObservableObject case "领取每日奖励": Action = async () => { - await new GoToAdventurersGuildTask().Start(config.AdventurersGuildCountry, CancellationContext.Instance.Cts.Token); + await new GoToAdventurersGuildTask().Start(config.AdventurersGuildCountry, CancellationContext.Instance.Cts.Token, config.DailyRewardPartyName); await new ClaimBattlePassRewardsTask().Start(CancellationContext.Instance.Cts.Token); }; break; From 072943baf9a9faf988ba854c3ead2031de038a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 01:07:15 +0800 Subject: [PATCH 09/12] #955 --- .../GameTask/Common/Job/GoToAdventurersGuildTask.cs | 3 +++ .../GameTask/Common/Job/GoToCraftingBenchTask.cs | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs b/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs index 7c064cf5..a1d10bd4 100644 --- a/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs +++ b/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs @@ -31,6 +31,9 @@ public class GoToAdventurersGuildTask { try { + // 合成完毕后领取奖励 + await new ClaimEncounterPointsRewardsTask().Start(ct); + // 如果有好感队伍名称,先切换到好感队伍 if (!string.IsNullOrEmpty(dailyRewardPartyName)) { diff --git a/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs b/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs index f7ca9cfd..4d2bcdba 100644 --- a/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs +++ b/BetterGenshinImpact/GameTask/Common/Job/GoToCraftingBenchTask.cs @@ -29,8 +29,6 @@ public class GoToCraftingBenchTask try { await DoOnce(country, ct); - // 合成完毕后领取奖励 - await new ClaimEncounterPointsRewardsTask().Start(ct); break; } catch (Exception e) From fcac4aa811ccd77576f5cbaf27ead72a1ffdec32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 01:18:40 +0800 Subject: [PATCH 10/12] tp wait 1 min #932 --- BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs index 4056d694..3fd2b06c 100644 --- a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs +++ b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs @@ -87,7 +87,7 @@ public class TpTask(CancellationToken ct) await ClickTpPoint(CaptureToRectArea()); // 等待传送完成 - for (var i = 0; i < 20; i++) + for (var i = 0; i < 50; i++) { await Delay(1200, ct); using var ra3 = CaptureToRectArea(); From 1469da469911ef064428a86d963eccb3a28269f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 01:32:21 +0800 Subject: [PATCH 11/12] ui #936 --- .../View/Pages/TaskSettingsPage.xaml | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 19c624f7..1ae3a9d7 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -852,6 +852,32 @@ SelectedItem="{Binding Config.AutoDomainConfig.DomainName, Mode=TwoWay}"> + + + + + + + + + + + + + @@ -1016,32 +1042,7 @@ Margin="0,0,36,0" IsChecked="{Binding Config.AutoDomainConfig.AutoEat, Mode=TwoWay}" /> - - - - - - - - - - - - - + From 6e7c7fb78e08c9e0e38fe625156f7a7ad9f79d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Fri, 10 Jan 2025 01:56:19 +0800 Subject: [PATCH 12/12] eye catching tips --- BetterGenshinImpact/View/MaskWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BetterGenshinImpact/View/MaskWindow.xaml.cs b/BetterGenshinImpact/View/MaskWindow.xaml.cs index c9991605..f341722f 100644 --- a/BetterGenshinImpact/View/MaskWindow.xaml.cs +++ b/BetterGenshinImpact/View/MaskWindow.xaml.cs @@ -172,7 +172,7 @@ public partial class MaskWindow : Window if (width * 9 != height * 16) { - _logger.LogWarning("当前游戏分辨率不是16:9,部分功能可能无法正常使用"); + _logger.LogError("当前游戏分辨率不是16:9,一条龙、配队识别、地图传送、地图追踪等所有独立任务与全自动任务相关功能,都将会无法正常使用!"); } // 读取游戏注册表配置