From ed3cbd47f51e7b3e7fafbd4361b69ad3bd8b4683 Mon Sep 17 00:00:00 2001 From: zjl Date: Tue, 31 Dec 2024 22:33:45 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=BD=93=E6=9C=80=E5=90=8E=E5=87=BA?= =?UTF-8?q?=E6=8B=9B=E4=BA=BA=E4=B8=BA=E4=B8=87=E5=8F=B6=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E5=89=A9=E4=BD=99cd>3=E6=97=B6=EF=BC=8C=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E6=AD=A4=E6=AC=A1=E4=B8=87=E5=8F=B6=E6=8B=BE=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoFight/AutoFightTask.cs | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs index 0bc00272..79700074 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs @@ -213,7 +213,7 @@ public class AutoFightTask : ISoloTask return; }*/ var fightEndFlag = false; - + string lastFighttName = ""; // 战斗操作 var fightTask = Task.Run(async () => { @@ -234,9 +234,9 @@ public class AutoFightTask : ISoloTask } command.Execute(combatScenes); - - + + lastFighttName = command.Name; if (!fightEndFlag && _taskParam is { FightFinishDetectEnabled: true } ) { @@ -329,23 +329,31 @@ public class AutoFightTask : ISoloTask var kazuha = combatScenes.Avatars.FirstOrDefault(a => a.Name == "枫原万叶"); if (kazuha != null) { + var time = DateTime.UtcNow - kazuha.LastSkillTime; + //当万叶最后一个出招,并且cd大于3时,此时不再触发万叶拾取 + if (!(lastFighttName== "枫原万叶" && time.TotalSeconds>3)) + { + Logger.LogInformation("使用枫原万叶长E拾取掉落物"); await Delay(300, ct); if (kazuha.TrySwitch()) { - - var time = DateTime.UtcNow - kazuha.LastSkillTime; - 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.Mouse.LeftButtonClick(); - 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.Mouse.LeftButtonClick(); + await Delay(1500, ct); + } - + } + else + { + Logger.LogInformation("最后一次由万叶出招,不再重复拾取!"); + } } From 3eecea21aa954675766b8c9d677ea276f764af25 Mon Sep 17 00:00:00 2001 From: zjl Date: Wed, 1 Jan 2025 20:54:19 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E8=B7=AF=E5=BE=84=E8=BF=BD=E8=B8=AA?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20=E6=9C=AA=E7=9F=A5=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=85=B3=E9=97=AD=EF=BC=8C=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E7=94=A8=E6=9D=A5=E8=A7=A3=E5=86=B3=E7=8B=97=E7=B2=AE=E3=80=81?= =?UTF-8?q?=E6=88=96=E9=94=84=E5=9C=B0=E6=8D=A1=E7=89=A9=E5=93=81=EF=BC=8C?= =?UTF-8?q?=E6=9C=89=E5=B0=8F=E6=A6=82=E7=8E=87=E8=AF=AF=E8=A7=A6=E7=83=B9?= =?UTF-8?q?=E9=A5=AA=E7=95=8C=E9=9D=A2=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Config/PathingPartyConfig.cs | 3 ++ .../AutoSkip/Assets/1920x1080/cook.png | Bin 0 -> 3829 bytes .../AutoSkip/Assets/AutoSkipAssets.cs | 11 +++- BetterGenshinImpact/Service/ScriptService.cs | 50 +++++++++++++++++- .../Pages/View/ScriptGroupConfigView.xaml | 24 +++++++++ 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook.png diff --git a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs index 90bfec37..b04c2207 100644 --- a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs @@ -75,6 +75,9 @@ public partial class PathingPartyConfig : ObservableObject [ObservableProperty] private AutoFightConfig _autoFightConfig = new(); + + [ObservableProperty] + private bool _closeUnknownInterfaceCheck = false; public static PathingPartyConfig BuildDefault() { diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook.png b/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook.png new file mode 100644 index 0000000000000000000000000000000000000000..970a649fb7d182caa561d62948bf6ca46bc16afc GIT binary patch literal 3829 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs b/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs index c9698fd9..5bfd8958 100644 --- a/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs @@ -36,7 +36,7 @@ public class AutoSkipAssets : BaseAssets public RecognitionObject HangoutUnselectedRo; public RecognitionObject HangoutSkipRo; - + public RecognitionObject CookRo; private AutoSkipAssets() { StopAutoButtonRo = new RecognitionObject @@ -47,7 +47,14 @@ public class AutoSkipAssets : BaseAssets RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height / 8), DrawOnWindow = true }.InitTemplate(); - + CookRo = new RecognitionObject + { + Name = "OptionIcon", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "cook.png"), + RegionOfInterest = OptionRoi, + DrawOnWindow = false + }.InitTemplate(); // ChatReviewButtonRo = new RecognitionObject // { // Name = "ChatReviewButton", diff --git a/BetterGenshinImpact/Service/ScriptService.cs b/BetterGenshinImpact/Service/ScriptService.cs index 676eabf6..3fc5cff8 100644 --- a/BetterGenshinImpact/Service/ScriptService.cs +++ b/BetterGenshinImpact/Service/ScriptService.cs @@ -12,9 +12,13 @@ using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; +using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; +using BetterGenshinImpact.GameTask.AutoSkip.Assets; using BetterGenshinImpact.GameTask.Common; using BetterGenshinImpact.GameTask.Common.BgiVision; +using BetterGenshinImpact.GameTask.Model.Area; +using Vanara.PInvoke; namespace BetterGenshinImpact.Service; @@ -64,13 +68,45 @@ public partial class ScriptService : IScriptService _logger.LogInformation("脚本 {Name} 状态为禁用,跳过执行", project.Name); continue; } - + + if (CancellationContext.Instance.Cts.IsCancellationRequested) { _logger.LogInformation("执行被取消"); break; } - + + var uictFlag = true; + var unknownInterfaceCheckingTask = Task.Run(async () => + { + if (project.GroupInfo.Config.PathingConfig.Enabled && project.GroupInfo.Config.PathingConfig.CloseUnknownInterfaceCheck) + { + _logger.LogInformation("开始未知界面检查"); + while (uictFlag && !CancellationContext.Instance.Cts.IsCancellationRequested) + { + ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); + var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); + if (cookRa.IsExist()) + { + _logger.LogInformation("检查到烹饪界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + } + + for (int i = 0; i < 5; i++) + { + if (!uictFlag || CancellationContext.Instance.Cts.IsCancellationRequested) + { + break; + } + await Task.Delay(1000,CancellationContext.Instance.Cts.Token); + } + + } + _logger.LogInformation("关闭未知界面检查"); + } + },CancellationContext.Instance.Cts.Token); + + for (var i = 0; i < project.RunNum; i++) { try @@ -85,6 +121,7 @@ public partial class ScriptService : IScriptService stopwatch.Reset(); stopwatch.Start(); await ExecuteProject(project); + } catch (NormalEndException e) { @@ -107,8 +144,17 @@ public partial class ScriptService : IScriptService _logger.LogInformation("------------------------------"); } + if (i == project.RunNum - 1) + { + uictFlag = false; + } + await Task.Delay(2000); } + + await Task.WhenAll(unknownInterfaceCheckingTask); + + } }); diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 6fbc076b..c4334762 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -232,7 +232,31 @@ IsChecked="{Binding PathingConfig.OnlyInTeleportRecover, Mode=TwoWay}" /> + + + + + + + + + + + + + From b52af1e9a758bb8151724f52e02cf9cc6a78456b Mon Sep 17 00:00:00 2001 From: zjl Date: Wed, 1 Jan 2025 22:15:53 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=8A=8A=E6=A3=80=E6=9F=A5=E7=A7=BB?= =?UTF-8?q?=E5=85=A5pathing=E4=B8=AD=EF=BC=8C=E5=AF=B9=E7=83=B9=E9=A5=AA?= =?UTF-8?q?=E5=81=9A=E4=BA=86=E4=BA=8C=E6=AC=A1=E5=88=A4=E6=96=AD=EF=BC=8C?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=8F=AF=E8=83=BD=E4=BC=9A=E5=9C=A8=E6=88=98?= =?UTF-8?q?=E6=96=97=E6=97=B6=EF=BC=8C=E8=AF=AF=E5=88=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoPathing/PathExecutor.cs | 45 ++++++++++++++++ .../AutoSkip/Assets/1920x1080/cook2.png | Bin 0 -> 6149 bytes .../AutoSkip/Assets/AutoSkipAssets.cs | 9 ++++ BetterGenshinImpact/Service/ScriptService.cs | 50 +----------------- 4 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index df85b60b..a36355b5 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -239,9 +239,11 @@ public class PathExecutor // 不管咋样,松开所有按键 Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); Simulation.SendInput.Mouse.RightButtonUp(); + } } } + _unknownInterfaceCheckingTask = false; } private async Task SwitchPartyBefore(PathingTask task) @@ -287,12 +289,55 @@ public class PathExecutor return true; } + bool _unknownInterfaceCheckingTask = false; + private void UnknownInterfaceCheckingTaskStart() + { + if (_partyConfig.Enabled && _partyConfig.CloseUnknownInterfaceCheck) + { + _unknownInterfaceCheckingTask = true; + Task.Run(async () => + { + + Logger.LogInformation("开始未知界面检查"); + while (_unknownInterfaceCheckingTask && !ct.IsCancellationRequested) + { + ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); + var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); + if (cookRa.IsExist()) + { + //一次判断,有时候会在战斗界面都误判,再判断一次 + var cook2Ra = imageRegion.Find(AutoSkipAssets.Instance.Cook2Ro); + if (cook2Ra.IsExist()) + { + Logger.LogInformation("检查到烹饪界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + } + } + + for (int i = 0; i < 5; i++) + { + if (!_unknownInterfaceCheckingTask || ct.IsCancellationRequested) + { + break; + } + await Task.Delay(1000,ct); + } + + } + Logger.LogInformation("关闭未知界面检查"); + + },ct); + } + } + + private void InitializePathing(PathingTask task) { LogScreenResolution(); WeakReferenceMessenger.Default.Send(new PropertyChangedMessage(this, "UpdateCurrentPathing", new object(), task)); + UnknownInterfaceCheckingTaskStart(); } private void LogScreenResolution() diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png b/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png new file mode 100644 index 0000000000000000000000000000000000000000..2361002891002edf2bdb8949645b3713daf08783 GIT binary patch literal 6149 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 public RecognitionObject HangoutUnselectedRo; public RecognitionObject HangoutSkipRo; public RecognitionObject CookRo; + public RecognitionObject Cook2Ro; private AutoSkipAssets() { StopAutoButtonRo = new RecognitionObject @@ -55,6 +56,14 @@ public class AutoSkipAssets : BaseAssets RegionOfInterest = OptionRoi, DrawOnWindow = false }.InitTemplate(); + Cook2Ro = new RecognitionObject + { + Name = "OptionIcon", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "cook2.png"), + RegionOfInterest = OptionRoi, + DrawOnWindow = false + }.InitTemplate(); // ChatReviewButtonRo = new RecognitionObject // { // Name = "ChatReviewButton", diff --git a/BetterGenshinImpact/Service/ScriptService.cs b/BetterGenshinImpact/Service/ScriptService.cs index 3fc5cff8..676eabf6 100644 --- a/BetterGenshinImpact/Service/ScriptService.cs +++ b/BetterGenshinImpact/Service/ScriptService.cs @@ -12,13 +12,9 @@ using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; -using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; -using BetterGenshinImpact.GameTask.AutoSkip.Assets; using BetterGenshinImpact.GameTask.Common; using BetterGenshinImpact.GameTask.Common.BgiVision; -using BetterGenshinImpact.GameTask.Model.Area; -using Vanara.PInvoke; namespace BetterGenshinImpact.Service; @@ -68,45 +64,13 @@ public partial class ScriptService : IScriptService _logger.LogInformation("脚本 {Name} 状态为禁用,跳过执行", project.Name); continue; } - - + if (CancellationContext.Instance.Cts.IsCancellationRequested) { _logger.LogInformation("执行被取消"); break; } - - var uictFlag = true; - var unknownInterfaceCheckingTask = Task.Run(async () => - { - if (project.GroupInfo.Config.PathingConfig.Enabled && project.GroupInfo.Config.PathingConfig.CloseUnknownInterfaceCheck) - { - _logger.LogInformation("开始未知界面检查"); - while (uictFlag && !CancellationContext.Instance.Cts.IsCancellationRequested) - { - ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); - var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); - if (cookRa.IsExist()) - { - _logger.LogInformation("检查到烹饪界面,使用ESC关闭界面"); - Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); - } - - for (int i = 0; i < 5; i++) - { - if (!uictFlag || CancellationContext.Instance.Cts.IsCancellationRequested) - { - break; - } - await Task.Delay(1000,CancellationContext.Instance.Cts.Token); - } - - } - _logger.LogInformation("关闭未知界面检查"); - } - },CancellationContext.Instance.Cts.Token); - - + for (var i = 0; i < project.RunNum; i++) { try @@ -121,7 +85,6 @@ public partial class ScriptService : IScriptService stopwatch.Reset(); stopwatch.Start(); await ExecuteProject(project); - } catch (NormalEndException e) { @@ -144,17 +107,8 @@ public partial class ScriptService : IScriptService _logger.LogInformation("------------------------------"); } - if (i == project.RunNum - 1) - { - uictFlag = false; - } - await Task.Delay(2000); } - - await Task.WhenAll(unknownInterfaceCheckingTask); - - } }); From 57953933d3421d498906fa08f2c276fe18ae974a Mon Sep 17 00:00:00 2001 From: zjl Date: Fri, 3 Jan 2025 20:13:51 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E7=94=B1=E4=BA=8E=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=8C=89=E9=92=AE=E5=92=8C=E7=83=B9=E9=A5=AA?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=8C=89=E9=92=AE=E4=B8=80=E6=A0=B7=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BD=9C=E4=B8=BA=E9=80=9A=E7=94=A8=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E6=89=80=E4=BB=A5=E4=BE=9D=E6=97=A7=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=8D=95=E4=B8=AA=E7=95=8C=E9=9D=A2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BA=86=E6=A3=80=E6=9F=A5=E7=83=B9?= =?UTF-8?q?=E9=A5=AA=E7=9A=84=E5=9B=BE=E7=89=87=E8=8C=83=E5=9B=B4=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=8C=89ESC=E5=87=BAuid=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E4=B8=AA=E7=95=8C=E9=9D=A2=E4=B9=9F=E4=BC=9AESC?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=EF=BC=8C=E6=9C=AA=E7=9F=A5=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=BB=98=E8=AE=A4=E5=BC=80=E5=90=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Config/PathingPartyConfig.cs | 2 +- .../GameTask/AutoPathing/PathExecutor.cs | 19 +++++--- .../AutoSkip/Assets/1920x1080/cook.png | Bin 3829 -> 6149 bytes .../AutoSkip/Assets/1920x1080/cook2.png | Bin 6149 -> 0 bytes .../Assets/1920x1080/page_close_main.png | Bin 0 -> 1633 bytes .../AutoSkip/Assets/AutoSkipAssets.cs | 42 +++++++++--------- .../Pages/View/ScriptGroupConfigView.xaml | 4 +- 7 files changed, 37 insertions(+), 30 deletions(-) delete mode 100644 BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png create mode 100644 BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/page_close_main.png diff --git a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs index b04c2207..ecfdafc8 100644 --- a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs @@ -77,7 +77,7 @@ public partial class PathingPartyConfig : ObservableObject private AutoFightConfig _autoFightConfig = new(); [ObservableProperty] - private bool _closeUnknownInterfaceCheck = false; + private bool _closeUnknownInterfaceCheck = true; public static PathingPartyConfig BuildDefault() { diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index a36355b5..71109af1 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -302,18 +302,23 @@ public class PathExecutor while (_unknownInterfaceCheckingTask && !ct.IsCancellationRequested) { ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); + var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); if (cookRa.IsExist()) { //一次判断,有时候会在战斗界面都误判,再判断一次 - var cook2Ra = imageRegion.Find(AutoSkipAssets.Instance.Cook2Ro); - if (cook2Ra.IsExist()) - { - Logger.LogInformation("检查到烹饪界面,使用ESC关闭界面"); - Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); - } + Logger.LogInformation("检测到烹饪界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); } - + var mainRa2 = imageRegion.Find(AutoSkipAssets.Instance.PageCloseMainRo); + if (mainRa2.IsExist()) + { + + Logger.LogInformation("检测到主界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + } + + for (int i = 0; i < 5; i++) { if (!_unknownInterfaceCheckingTask || ct.IsCancellationRequested) diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook.png b/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook.png index 970a649fb7d182caa561d62948bf6ca46bc16afc..2361002891002edf2bdb8949645b3713daf08783 100644 GIT binary patch literal 6149 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 diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png b/BetterGenshinImpact/GameTask/AutoSkip/Assets/1920x1080/cook2.png deleted file mode 100644 index 2361002891002edf2bdb8949645b3713daf08783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6149 zcmV+g82aalP) zU|ziE+#lZOSJDJJepIQ66*4i_dF0)k;ESjr|=Bi_O8aiJ~7yQ%4*T(QP(Oh*j zC(;-q3=e-5#a8{y;Nn~jjfY3BqYL~-<7uP0=&!lz%N&*8xT?z$EcmkvG|>O5@$piG z2}E;3`2ORF`C2+(OM`i;{wCscrVyZTA;b}|UhJz-pyBPGB1U{wG%oVr{}+4%SWmnX zxkxlu9qz?+ftJSCM)SbYB6)5Y;&6ihXV3YFgM9xXi8xuIfu*XA;ro|rD3Sk0I}|ZP zsKZ7VzyN3nF%m=7c}M?B|34u{{=qqjFUB{V+As8=>1pxE{u@|BuL-dPtwM&t&zB+8 z{T%T>gEa)Y<}BjCcN#RTU!WFn&kLP`q77Q4=dJEgK>u+&=#?~H1jIPvLCE=;UH3dv~xmmC_(T+WHJ0mKx6niY@z4U1-h6(G(Yp#|JlbVwm%<;Vk`Z| zQ3m-&b5%5+n#R-61zPOIFaW)_!x6K@BwI?cBm`54Bc4BX!-(ku4MPC;180*op8AR=NlloA z3X1Lz9=`zhe8lGkUw|0H*G2QRm$@2_gtYe6&Ohv(z2BoZrZR*CU7$l}`H$#kXcfxD zXE!^3n;m)ks83BKGttkm0y2bJmQc$SYR;GN@}{^ zXs#?PSeokdz8o6psNzd?mm!@1qw&;ev1@329bc}mt17wcwoKTXa&od6Lfz#+b{xe~ z)A?G@P{Wgn_6ciKeqJt}uN5k&#}n=E=SJ722P;ai(zsgW%fCh$c`@=|8dnp;gIqP} zaiI;ih!83Camqwlyz$9I`?1e`u(bIPDoP6~OA9JW^D9d8D@zN?OY+mxGu(sqf4sGRS+IdE z+CDGX{y_G5(f{%5lKsQnsG2ZcMp8iMt8;R)J}=llFIXR4x3o2ueqFL1``lwA4FVYv z#Zg9q(5q>D4M$1} ze{8xxycs3*DGa~-X+*KqJx}Y-ieqohxx4DvU4_QCW&5>}hDlHBvCsW|(~Wx$H=zA} z)4jXu__l06^11(dH}-EjS}F-6=1Oz}9aYC(_s)vLIZ)r#QvPMpcDUiXZf%NF8o3gJ zCnZ=SEsd{n4K>W%>zcmRnVFS6KH7BXb$wm3H`fOdYogd{u7n)!s{OX&__68v?e$2! z+QbqOw;V0|>&`>3`@yxgD{2!@N}e(q#gkD?5pjm;nU9wsZ3O?-&_OE+ut4${Y|sT- z6_NB|ZuDT?^?0Iv=5E))y7O?uHQHPIdBOJAJI_F8bw*~E_vO%!P0#xC!JM2N6_LC= z6@pl(rSUX0o<<-iN4jffAN0JR8~wiN`LXHwI6wOOeov33;;y^p$mjaDZ11sDPzLks z`#r}#z+F>OXi84qoEiS>-PqomQ%fZy5l~Cx_0Mm2qPybxykPtE)_S<%I`X-{F4=uA zht^*Vu0J1~ur|^7n%DQck9}~fiVE|uor{>GPSBX%y#^QFTXha~Rr91IWla4zZ~d|5 z`R?<4UbL+}A6%UtSbq+e#kTQcaOK%RbA2fzBIQdo9;{zKUm?Np+er$^5b9$1TE3ie z4%B~JvG1%nR-X;*uRD*t?v-Z)duz^jvmWoPF)pED>>;dsZKUzI^F~FZgdHQ|gjm-0eE@x(_$pM`$v~KKItE;oO{Dj)bHO zbu0;)nU($QR>vO;w#6s?zM0`;KVtI@M7s8-^4(SE{<>?htA;MrawNpH(Z*vR z(0Opp($iMqeK~{_-#KAx8tAP018E}m;(xJKG_Km#TerPzUwqP+o0FZCoNDc@`L^OX z+;Ba(W=T)aG$f`N5>pa1CK^xs=3y_m=g$$#;thB~9IU%0Jr;&gmt;;y>&*Ri$@b=9 zFLo*K%b~88il(~K=K8Yc`m&b#vZlIHlR2F(fLtKda8iqpmqPR*5?{KIh!N;g(=uP& z>D*m)eBT7hzL&#wRmDsZe8mtEf>=FUO2%oD%1W-bHI=VFAH-g))thmwgS|SataL09 z+1^}%5f69QFhx49lpIHhk9_X!CHu$u(fxJju@C;`^P=t3y!Bwi_2)a!-kL*8CI1gw z6~os&zuh@|zb7*zlP@ELa?;XJ`gO^ExZxVNHYt=wj+o#`2$o34;OinFj^b#ddD_ad z!cT9lSeLGiHu7bZXQc7a>-x6ha1S+%^wjRII*z>V7k9hl35g6L!4{K#laLIdE)-~Z z`w|l0NN}-hGetNTCKI&DukL}g9d5X4DvAUOJxf9|L`1C0G~8RO(Wfv(1YJnPt4%9` zaHpjZV#F7cJannfmWtgq@Z#Z~TDAltK1RI1?s_%ZJz;BlKQ{{h;&n~kY`^7b{<3KM zGoZ!Ti<@do`r0a68%kU1O4=LC9*$e~)*MG(*W81iZc9aLLy4uKw6?NHsZDTfrNSysqbWxA^s_GXr9t`j(^R)4UZWZIIQ0qxnEI_tu<{^DWxG zF4@A>b3yl zW1o9%dZ4kkq`dTMWm#cWd0|;`LA=@oWkE#He#D_b!`pO$E>3NFKR3Fw;`q8`KSDSB z$mjmH?D)3q__}1v&dzZUH|(r9j(qO9hrLPW45cn9m{I8TX8%$UlcG3de`oclx7NKi z81%8vy}$1KG;ehb)ZZU#JMy`G}$|An&M zwx;sC?$$|<<(|iKf2?h3s_$R}g7D_d(4+CTNsr~hnC04NqbWIk;c>u=i%w+}Yzb*h zO51!jj29)2W}B~uKh9e{!wm`Aq-dUoC!=~Sl{=t~p2H0o-q$6tofXIX*^z?$JeC-e zwg{9jg#!)mVF(Fftf8g8ti8E>w6|_|)$!*R{GVs2p`*E?t*Kmg#VCq1^mkN4^1tcc zcrjR7Qm`D7Q80xhLr5~kq$u7v(o?sy>NrMW8dKg`b$EuGFyimX4Zkges^V{VR~_5S zAccQ!dA67B3T0vxM;*=6(D=w;4?)8c=^ATGuojOEH;7^>oFiW5LJo7H#itRAxazBm70N_GtO3a}DU3Dbgy*RO-yb-Ef`#4VP!6QAL{LHOY>FhTq?eew?>{oVR{@YsKO280ER2 z=B*#zj4nRuYpyF{LrDgRSz=vwc6Q;_ysHIyr9}nTtxY?tjzh0&`gUhkSz%#8e$mzZ z?5u3Qj0_?!DasF)9xe4{qF6&)Q~BfT?b$gw6SgM2q{gj{YzYy?(V#v1AY$jS*FE>J zC&`?y(j{w1vxYLO$Yh>^iV+5M86`{L&OxO{Js0v~?ALUGjxeNpUknD5#Lb!E%CbVH z7{VPxL^4GrS4PFEOsVM^Y3Z4((}UkPJ%23NYATB>$_lG0idg8EbOFH>k!>d#MJ-DV z4z8h6Qq!|j)3a03veGlN-#+StIj=d}n#xmBGYqCwg))&T)J5|&*c8gdm1hHAP&6QCtnSQ=#wgAO-{oUvFFW{<;$<;m1Drk1daHX2_6~#*tA9l_@DD zqqr#F(pc^osGqvg@omL{S2`{Vwq}MoQi=|#H|%wFv{d4ZVx+g0E7dbZBu7f|X zu_VaEI+mD#t#@(hz3e#Ha4kOR&&$hucB|{t zTkF>)`}VSZd&v$}08-mSuj`Km+lM!!FYk2;V+{-;$q=1FJlqXl%#l)+<%JK%+aF$U ze=y$maJ>D~Jmf8h8?M>=JrAx~9$agCG~RaC-6D*ouoedqzq;40H>P&CR&FB&ziDqy zNzHtA3u^24b0ZqUyzsaWD_hakf?xsN(on{hP&iTv6sHiQZ3jPMK>+c0sP(N6u32uo zTJE@8@48#>xLQVfYDIB+8Xtaq+H^6nF%1TY&j1bo$Pf|=m1+8R*UpM#`Dy>k(}BYc z$hStiYZo5(?XEf|Y|V2IdcUnesNI|yes!<=$wd3-MH>jkTU%-I)dXF#B;Lr9P*^M2 z5~?%c#rFPsd4fr$GY@suY%e)>(56o?+(CVedsggwYtBF3T4R-o(deP=6}1U_@${`u zS-i2a28BDX%RSVf(j`B--gfMBf0!H9kSVVwyLVR|Td#&w(z3@!{M$e+elLcU>jH@V z;ckD;xwq!nTXXEMJ9pQd3s3qK%EV~CHV8DlaVZ>Vc#kmFU}-AfS#>Nt=}*thn!4F} zI<;nEzPKDCcTvxiiWIyz}Jj0C|GUdrc$C1zd;f+;GrIZvE z)K!%jlQLpe$zy?SpdjKHfli>%2ZX{oZfy+lVr{^Sp`iUVZ+&#V?VhJ~a?CP0X1O?i-&k>e_Hll6ajL(+qdGy8B)ejeqX#7lrSaum ze_mW#Tp&+K1XF?u6$X}wWC}^8*8BlgfG_TJ#i^2->&hT$^SW+2S_<;>mf;4&(pHmZ zp4`Bd=@~*&5}$a}-hwwXTN=taQaz0i)&FV4O?ZDY2GtY@aTV6$*OT39(kzNINUs>B zSBw&rs=_we&-sE-g!^oG4@W{N5=_!7My7}q$n__P(=%a%0=6$slnB3~5UV~xOeLnW z1Ber}Nh@fhZg0)`+w904S8GvWew@nG(Nx}Jspx6}>ujm$wp9AJfi_$>Y|Y)RRerNn zwbYkM;*2a2snq!qPu=KpQCuyJuM1iPzH|YswhJM~ z(EnY_(}nP8DH&?JFRC-3v!}0d%+g-~~2M*R@ zJL%&aYhGR+OH2h3UmI=uvE?~Hd3uN!6M(p_3Mc8)w>!nKM{&L^V4&g0UqB3ciV#nZ zS+@ANcIv!nb588wAwg=b19*(yKJ0D$dAGbCulqQy#8MwXZ&3~AS`&F@~1e1=C>_K)+{dmf7{!9*93bO8|~AovP{ zwXg2eTgdjRD~cFGg2spCPvaAOxuK)E;v=ek20Lr`aw;0O*TFq6XupV9L~v#L`s$Lw zuIk*pT(*Qbw>FRFX}MCew5XuAs+csS(2-i90fj%VhBTQeA~|A;Euq-b3mBv&rwnp- zsXi+!*E!J8-%%5*N@9vBCjN~?&qBtN8}&))<)uYc6~!4@Il@>YLj*NFT?mxfV$x_z zFDlGWOwM3Ss35x-0l}6~=G06}V|jULAy1}y{0E>RR~WQq0gg8*FIV8Sib^W;Xp!pM;s zm?F3bLBtFJ!GheM0x`r8g$N~jM!}LmO$2q5KnHyPtB9EZfe-Wpuo_7Xt_!@i4D&rV)Bh5DN*Mz4_6EGd)hId{%XKe;2b`n?+Uj!>M z&@8&( zSVKn@5itxD{O-d3ds62F6^h~a+%UdpfQEj=cOrn*&s0n@kcEz(E+T^l8%&`F_Z2{& zLM$_|rFyp1FBEX@8NSf-H!Ng4!GZl8F&ZCJe7-oGXsh3~PvGKe2Zk;JDCanDD9!LT zS~|gn&k!SsFzvu{hL;gSXa-Y}KqqE|xAcHA_F|cVjZF#~%@k9o_=cjnAmY$dBDT*% z>~|mVU$ni8=7uHpB1go6;ZGQFwhN9E$t1|vVEtl485L$10Cx&2+7S(E#o30?@7mB0 z&snI@zedrI^540LXo7C|HyfuA!%+PC>(>W(Chvc#GQ4UyuLr;E63W*?>siwIja~73tgPGUbK{3? zq>-h}tF)aWtU9e0RW=}~vK~Q2s8XrXsQuK+H=mQEFduPf5?m{Zvy_RWtTbWKs@15n zf#>P^xGVK~SZLrO0)!lckI- ziL*Nx&>RGejSLnQ--M4)A%MWTO@7Kk66W5Xm!fsX=?~}@Fa!WolOq?ii!$VeKgIL8 zan^10Qx+38Ct9Pe`{Yecj%4SSgha@SODles$0JG8D&r9GVI=p=5omX8WKgas4vCNj zi=}^7)xh^cAwWpMkl$kw1yF*v`g&fR&%6>6AqxtV1cgZ+KStn?PzYcO46&5)$Gq;Y z&ZM;5W8s^ypfE|((`P~qln=|Z7(Uk3Jvp0@C4>cqNh&Juc6W7lcXjGDeIF)9j7u{B z`9q$M#JBqg7yD`YZRw5M(Q)a)VkrnC?4wSm#h%HCJ(CeHx%gXRR$^*Sc5X@SgGYnf zeuwD`vtnRY4A9QDMeM?3Rt){UFD}RnL!*;+!XQ;B91E94{F)MX_Ckidu(hSdV)zJo zUSi7`vYq!mhH{u4Lc2edkA=&k;?lAd#Y4IQh!ncGg*QB;&CV?mpGe-PTYKR{B4n}@ zMf>+-Zx`O|`!{uUPfklS59ZcRaIjb^OHp)pb%MQw$W8xL?d?UyH^XC6cFsKTn_#gt zE2m_7a#Xm5n>^aJOgfgvMg}hzm4!to9hk9gVt7nSZS5nEb9uXeaBoS+lDfYqEu-M5 z0;|Zorq}du=fP(nIL&hn4NqfFpWiicV&czb$P04|uIJ>JX2=UANtb?!OgtW$u&c5p z>C){#?m_!o@)N!V!t~^5-sKxR!>j4~(fyi-!XYSwMVOao@7=G1ywIq` znD}#0Cr~`0lFyCPF2k3Z@yzV2$0HN2-MB3rf->L{wuMer2joS@rY5E3LY<%B(Jq6< z@G-aGdUkFJoG%mrk9I8&^u2^US&E{nx)!SKmj`YcX2oE|KHaLk1Lq3`z+17-x3{$c zUa(l2lV7S;_in1~y#Ivr_mb_#&$|u*o?(8f{8lyK#hf~)L>p<>_w(goyj@{FH|`}c z%DMDpTgD{D@|B6>H$#ViaKB*_c~+aJOOzdFyF>jag>4cU~7C5I4t public RecognitionObject ExclamationIconRo; public RecognitionObject PageCloseRo; - + public RecognitionObject CookRo; + public RecognitionObject PageCloseMainRo; public RecognitionObject CollectRo; public RecognitionObject ReRo; @@ -36,8 +37,7 @@ public class AutoSkipAssets : BaseAssets public RecognitionObject HangoutUnselectedRo; public RecognitionObject HangoutSkipRo; - public RecognitionObject CookRo; - public RecognitionObject Cook2Ro; + private AutoSkipAssets() { StopAutoButtonRo = new RecognitionObject @@ -48,22 +48,7 @@ public class AutoSkipAssets : BaseAssets RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height / 8), DrawOnWindow = true }.InitTemplate(); - CookRo = new RecognitionObject - { - Name = "OptionIcon", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "cook.png"), - RegionOfInterest = OptionRoi, - DrawOnWindow = false - }.InitTemplate(); - Cook2Ro = new RecognitionObject - { - Name = "OptionIcon", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "cook2.png"), - RegionOfInterest = OptionRoi, - DrawOnWindow = false - }.InitTemplate(); + // ChatReviewButtonRo = new RecognitionObject // { // Name = "ChatReviewButton", @@ -133,7 +118,24 @@ public class AutoSkipAssets : BaseAssets RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 8, 0, CaptureRect.Width / 8, CaptureRect.Height / 8), DrawOnWindow = true }.InitTemplate(); - + CookRo= new RecognitionObject + { + Name = "Cook", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "cook.png"), + RegionOfInterest = new Rect(CaptureRect.Width / 15, 0, CaptureRect.Width / 14, CaptureRect.Height /14), + DrawOnWindow = true + }.InitTemplate(); + PageCloseMainRo= new RecognitionObject + { + Name = "PageCloseMain", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "page_close_main.png"), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 25, CaptureRect.Height / 14), + DrawOnWindow = true + }.InitTemplate(); + + // 一键派遣 CollectRo = new RecognitionObject { diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 3ce70f67..37d99836 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -249,7 +249,7 @@ - 开启此项可制定战斗配置,关闭此项,则用于独立任务中的配置 + 需开启上方路径追踪配置,开启此项可制定战斗配置,关闭此项,则用于独立任务中的配置 Date: Fri, 3 Jan 2025 20:50:50 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E9=98=B5=E4=BA=A1=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E8=AF=A5=E8=B7=AF=E7=BA=BF=E3=80=82=E4=BD=86?= =?UTF-8?q?=E9=87=8D=E8=AF=95=EF=BC=8C=E5=87=86=E5=A4=87=E4=BC=A0=E5=9B=9E?= =?UTF-8?q?=E6=9D=A5=E6=97=B6=EF=BC=8C=E6=9C=89=E5=87=A0=E7=8E=87=E6=9C=AA?= =?UTF-8?q?=E6=89=93=E5=BC=80=E5=9C=B0=E5=9B=BE=E7=95=8C=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=BC=A0=E9=80=81=E5=A4=B1=E8=B4=A5=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E4=BB=A5=E5=8A=A0=E4=BA=86=E6=AF=8F=E6=AC=A1=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E9=83=BD=E6=A3=80=E6=9F=A5=E6=98=AF=E5=90=A6=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=9C=B0=E5=9B=BE=E7=95=8C=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoFight/Model/Avatar.cs | 3 ++- BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs index bf892dbf..98796e1c 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs @@ -11,6 +11,7 @@ using System; using System.Diagnostics; using System.Linq; using System.Threading; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; using BetterGenshinImpact.GameTask.AutoTrackPath; using BetterGenshinImpact.GameTask.Common.BgiVision; using Vanara.PInvoke; @@ -122,7 +123,7 @@ public class Avatar var tpTask = new TpTask(Ct); tpTask.Tp(TpTask.ReviveStatueOfTheSevenPointX, TpTask.ReviveStatueOfTheSevenPointY, true).Wait(Ct); - throw new Exception("检测到复苏界面,存在角色被击败,前往七天神像复活"); + throw new RetryException("检测到复苏界面,存在角色被击败,前往七天神像复活"); } } diff --git a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs index 454e4b24..db2113c7 100644 --- a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs +++ b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs @@ -151,7 +151,7 @@ public class TpTask(CancellationToken ct) return (clickX, clickY); } - public async Task<(double, double)> Tp(double tpX, double tpY, bool force = false) + private async Task checkInBigMapUi() { // M 打开地图识别当前位置,中心点为当前位置 var ra1 = CaptureToRectArea(); @@ -167,8 +167,14 @@ public class TpTask(CancellationToken ct) await Delay(500, ct); } } - } + } + } + public async Task<(double, double)> Tp(double tpX, double tpY, bool force = false) + { + + await checkInBigMapUi(); + for (var i = 0; i < 3; i++) { try @@ -185,6 +191,7 @@ public class TpTask(CancellationToken ct) } catch (Exception e) { + await checkInBigMapUi(); Logger.LogError("传送失败,重试 {I} 次", i + 1); Logger.LogDebug(e, "传送失败,重试 {I} 次", i + 1); } From 3174dc75c8949c2ec7dd0900d1dd2bf7d24aad10 Mon Sep 17 00:00:00 2001 From: zjl Date: Fri, 3 Jan 2025 20:51:25 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 71109af1..ebd3ca3d 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -306,7 +306,6 @@ public class PathExecutor var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); if (cookRa.IsExist()) { - //一次判断,有时候会在战斗界面都误判,再判断一次 Logger.LogInformation("检测到烹饪界面,使用ESC关闭界面"); Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); } From e8b939fbeec58cd7ae62cb28becc158153708ce4 Mon Sep 17 00:00:00 2001 From: zjl Date: Sun, 5 Jan 2025 14:57:32 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E6=9C=AA=E7=9F=A5=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=B8=B8=E9=A9=BB=E4=BA=8Epathing=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E9=99=A4=E4=BA=86=E8=AF=A5=E5=8F=AF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=EF=BC=8C=E4=BB=A5=E6=94=AF=E6=8C=81js?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=B7=AF=E5=BE=84=E8=BF=BD=E8=B8=AA=E3=80=82?= =?UTF-8?q?pathing=E9=80=BB=E8=BE=91=E7=94=A8try=E5=9D=97=E5=8C=85?= =?UTF-8?q?=E4=BA=86=E8=B5=B7=E6=9D=A5=EF=BC=8C=E6=9C=80=E5=90=8Efinally?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=EF=BC=8C=E9=A2=9D=E5=A4=96=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E7=9A=84=E7=BA=BF=E7=A8=8B=E5=BF=85=E5=AE=9A=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E3=80=82=E5=BC=82=E5=B8=B8=E7=95=8C=E9=9D=A2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=B4=BE=E8=92=99?= =?UTF-8?q?=E6=97=B6=E5=B0=9D=E8=AF=95=E6=8C=89ESC=EF=BC=88=E5=8D=B3?= =?UTF-8?q?=E4=BD=BF=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF=EF=BC=8C=E4=B9=9F?= =?UTF-8?q?=E4=BC=9A=E7=94=B1=E6=9C=AA=E7=9F=A5=E7=95=8C=E9=9D=A2=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=8C=E5=85=B3=E9=97=AD=E8=AF=A5=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Config/PathingPartyConfig.cs | 3 - .../GameTask/AutoPathing/PathExecutor.cs | 181 ++++++++++-------- .../Pages/View/ScriptGroupConfigView.xaml | 24 --- 3 files changed, 100 insertions(+), 108 deletions(-) diff --git a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs index ecfdafc8..90bfec37 100644 --- a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs @@ -75,9 +75,6 @@ public partial class PathingPartyConfig : ObservableObject [ObservableProperty] private AutoFightConfig _autoFightConfig = new(); - - [ObservableProperty] - private bool _closeUnknownInterfaceCheck = true; public static PathingPartyConfig BuildDefault() { diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index ebd3ca3d..ed53f54f 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -143,107 +143,114 @@ public class PathExecutor return; } - InitializePathing(task); - - // 转换、按传送点分割路径 - var waypointsList = ConvertWaypointsForTrack(task.Positions); - - await Delay(100, ct); - Navigation.WarmUp(); // 提前加载地图特征点 - - foreach (var waypoints in waypointsList) + + try { - CurWaypoints = (waypointsList.FindIndex(wps => wps == waypoints), waypoints); + InitializePathing(task); + // 转换、按传送点分割路径 + var waypointsList = ConvertWaypointsForTrack(task.Positions); + await Delay(100, ct); + Navigation.WarmUp(); // 提前加载地图特征点 - for (var i = 0; i < RetryTimes; i++) + foreach (var waypoints in waypointsList) { - try + CurWaypoints = (waypointsList.FindIndex(wps => wps == waypoints), waypoints); + + + for (var i = 0; i < RetryTimes; i++) { - await ResolveAnomalies(); // 异常场景处理 - foreach (var waypoint in waypoints) + try { - CurWaypoint = (waypoints.FindIndex(wps => wps == waypoint), waypoint); - TryCloseSkipOtherOperations(); - await RecoverWhenLowHp(waypoint); // 低血量恢复 - if (waypoint.Type == WaypointType.Teleport.Code) + await ResolveAnomalies(); // 异常场景处理 + foreach (var waypoint in waypoints) { - await HandleTeleportWaypoint(waypoint); + CurWaypoint = (waypoints.FindIndex(wps => wps == waypoint), waypoint); + TryCloseSkipOtherOperations(); + await RecoverWhenLowHp(waypoint); // 低血量恢复 + if (waypoint.Type == WaypointType.Teleport.Code) + { + await HandleTeleportWaypoint(waypoint); + } + else + { + await BeforeMoveToTarget(waypoint); + + // Path不用走得很近,Target需要接近,但都需要先移动到对应位置 + await MoveTo(waypoint); + + if (waypoint.Type == WaypointType.Target.Code + // 除了 fight mining 之外的 action 都需要接近 + || (!string.IsNullOrEmpty(waypoint.Action) + && waypoint.Action != ActionEnum.NahidaCollect.Code + && waypoint.Action != ActionEnum.Fight.Code + && waypoint.Action != ActionEnum.CombatScript.Code + && waypoint.Action != ActionEnum.Mining.Code)) + { + await MoveCloseTo(waypoint); + } + + //skipOtherOperations如果重试,则跳过相关操作 + if (!string.IsNullOrEmpty(waypoint.Action) && !_skipOtherOperations) + { + // 执行 action + await AfterMoveToTarget(waypoint); + } + } + } + + break; + } + catch (NormalEndException normalEndException) + { + Logger.LogInformation(normalEndException.Message); + if (RunnerContext.Instance.IsContinuousRunGroup) + { + throw; } else { - await BeforeMoveToTarget(waypoint); - - // Path不用走得很近,Target需要接近,但都需要先移动到对应位置 - await MoveTo(waypoint); - - if (waypoint.Type == WaypointType.Target.Code - // 除了 fight mining 之外的 action 都需要接近 - || (!string.IsNullOrEmpty(waypoint.Action) - && waypoint.Action != ActionEnum.NahidaCollect.Code - && waypoint.Action != ActionEnum.Fight.Code - && waypoint.Action != ActionEnum.CombatScript.Code - && waypoint.Action != ActionEnum.Mining.Code)) - { - await MoveCloseTo(waypoint); - } - - //skipOtherOperations如果重试,则跳过相关操作 - if (!string.IsNullOrEmpty(waypoint.Action) && !_skipOtherOperations) - { - // 执行 action - await AfterMoveToTarget(waypoint); - } + break; } } - - break; - } - catch (NormalEndException normalEndException) - { - Logger.LogInformation(normalEndException.Message); - if (RunnerContext.Instance.IsContinuousRunGroup) + catch (TaskCanceledException e) { - throw; + if (RunnerContext.Instance.IsContinuousRunGroup) + { + throw; + } + else + { + break; + } } - else + catch (RetryException retryException) { - break; + StartSkipOtherOperations(); + Logger.LogWarning(retryException.Message); } - } - catch (TaskCanceledException e) - { - if (RunnerContext.Instance.IsContinuousRunGroup) + catch (RetryNoCountException retryException) { - throw; + //特殊情况下,重试不消耗次数 + i--; + StartSkipOtherOperations(); + Logger.LogWarning(retryException.Message); } - else + finally { - break; + // 不管咋样,松开所有按键 + Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); + Simulation.SendInput.Mouse.RightButtonUp(); + } } - catch (RetryException retryException) - { - StartSkipOtherOperations(); - Logger.LogWarning(retryException.Message); - } - catch (RetryNoCountException retryException) - { - //特殊情况下,重试不消耗次数 - i--; - StartSkipOtherOperations(); - Logger.LogWarning(retryException.Message); - } - finally - { - // 不管咋样,松开所有按键 - Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); - Simulation.SendInput.Mouse.RightButtonUp(); - - } } } - _unknownInterfaceCheckingTask = false; + finally + { + _unknownInterfaceCheckingTask = false; + } + } private async Task SwitchPartyBefore(PathingTask task) @@ -292,8 +299,9 @@ public class PathExecutor bool _unknownInterfaceCheckingTask = false; private void UnknownInterfaceCheckingTaskStart() { - if (_partyConfig.Enabled && _partyConfig.CloseUnknownInterfaceCheck) - { + + /*if (_partyConfig.Enabled && _partyConfig.CloseUnknownInterfaceCheck) + {*/ _unknownInterfaceCheckingTask = true; Task.Run(async () => { @@ -331,7 +339,7 @@ public class PathExecutor Logger.LogInformation("关闭未知界面检查"); },ct); - } + /*} */ } @@ -967,6 +975,17 @@ public class PathExecutor // 判断是否进入剧情 await AutoSkip(); } + + ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); + + var primogemRa = imageRegion.Find(AutoSkipAssets.Instance.PrimogemRo); + if (!primogemRa.IsExist()) + { + Logger.LogInformation("未检测到派蒙,尝试使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + await Task.Delay(500, ct); + } + } private async Task AutoSkip() diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 37d99836..920e541f 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -232,31 +232,7 @@ IsChecked="{Binding PathingConfig.OnlyInTeleportRecover, Mode=TwoWay}" /> - - - - - - - - - - - - - From 1f6e3b78a50e5219b144591f9a2b4a16648805dc Mon Sep 17 00:00:00 2001 From: zjl Date: Sun, 5 Jan 2025 15:08:50 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=B8=AD=E7=9A=84=E6=B4=BE=E8=92=99=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=8C=E5=AF=B9=E4=BA=8E=E6=88=98=E6=96=97=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E7=BB=93=E6=9D=9F=E5=90=8E=E4=BC=9A=E8=AF=AF?= =?UTF-8?q?=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/AutoPathing/PathExecutor.cs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index ed53f54f..ee828042 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -975,17 +975,7 @@ public class PathExecutor // 判断是否进入剧情 await AutoSkip(); } - - ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); - - var primogemRa = imageRegion.Find(AutoSkipAssets.Instance.PrimogemRo); - if (!primogemRa.IsExist()) - { - Logger.LogInformation("未检测到派蒙,尝试使用ESC关闭界面"); - Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); - await Task.Delay(500, ct); - } - + } private async Task AutoSkip() From ebc8870478a0e0c22049fc7bae3cfeeb6ad491aa Mon Sep 17 00:00:00 2001 From: zjl Date: Mon, 6 Jan 2025 14:20:05 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E5=8A=9F=E8=83=BD=E4=B8=AD=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=86=E6=9E=90=EF=BC=8C=E4=BB=A5=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=BD=A2=E5=BC=8F=E5=B1=95=E7=A4=BA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=BB=84=E8=80=97=E6=97=B6=E5=92=8C=E6=8B=BE=E5=8F=96=E7=89=A9?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameTask/LogParse/LogParse.cs | 368 ++++++++++++++++++ .../View/Pages/ScriptControlPage.xaml | 1 + .../ViewModel/Pages/ScriptControlViewModel.cs | 107 +++++ 3 files changed, 476 insertions(+) create mode 100644 BetterGenshinImpact/GameTask/LogParse/LogParse.cs diff --git a/BetterGenshinImpact/GameTask/LogParse/LogParse.cs b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs new file mode 100644 index 00000000..68053393 --- /dev/null +++ b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs @@ -0,0 +1,368 @@ +using System.Collections.Generic; +using System; +using System.Data; +using System.Text; +using System.Text.RegularExpressions; +using static LogParse.LogParse.ConfigGroupEntity; +using System.Reflection; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Vanara.PInvoke; + +namespace LogParse +{ + public class LogParse + { + + public static List SafeReadAllLines(string filePath) + { + var lines = new List(); + try + { + // 使用 FileStream 和 StreamReader,允许共享读取 + using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var reader = new StreamReader(fileStream)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + lines.Add(line); + } + } + } + catch (IOException ex) + { + Console.WriteLine($"无法读取文件 {filePath}: {ex.Message}"); + } + return lines; + } + + public static List ParseFile(List<(string, string)> logFiles) + { + List<(string, string)> logLines = new(); + foreach (var logFile in logFiles) + { + string[] logstrs = SafeReadAllLines(logFile.Item1).ToArray(); + foreach (var logstr in logstrs) + { + logLines.Add((logstr, logFile.Item2)); + } + + } + return Parse(logLines); + } + public static List Parse(List<(string, string)> logLines) + { + + // var logstrs = log.Item1; + List configGroupEntities = new(); + ConfigGroupEntity configGroupEntity = null; + ConfigTask configTask = null; + for (int i = 0; i < logLines.Count; i++) + { + var logstr = logLines[i].Item1; + var logrq = logLines[i].Item2; + //if("配置组 \"${}\" 加载完成,共25个脚本,开始执行") + + + // 定义正则表达式 + + var result = parseBgiLine(@"配置组 ""(.+?)"" 加载完成,共(\d+)个脚本", logstr); + if (result.Item1) + { + configGroupEntity = new(); + configGroupEntity.Name = result.Item2[1]; + configGroupEntity.StartDate = parsePreDataTime(logLines, i - 1, logrq); + configGroupEntities.Add(configGroupEntity); + } + if (configGroupEntity != null) + { + //配置组 "战斗" 执行结束 + result = parseBgiLine($"配置组 \"{configGroupEntity.Name}\" 执行结束", logstr); + if (result.Item1) + { + + configGroupEntity.EndDate = parsePreDataTime(logLines, i - 1, logrq); + configGroupEntity = null; + } + + } + + + + + + if (configGroupEntity != null) + { + + result = parseBgiLine(@"→ 开始执行路径追踪任务: ""(.+?)""", logstr); + if (result.Item1) + { + configTask = new(); + configTask.Name = result.Item2[1]; + configTask.StartDate = parsePreDataTime(logLines, i - 1, logrq); + configGroupEntity.ConfigTaskList.Add(configTask); + } + + if (configTask != null) + { + + if (logstr.StartsWith("→ 脚本执行结束: \"" + configTask.Name + "\"")) + { + configTask.EndDate = parsePreDataTime(logLines, i - 1, logrq); + configTask = null; + } + result = parseBgiLine(@"交互或拾取:""(.+?)""", logstr); + if (result.Item1) + { + configTask.addPick(result.Item2[1]); + } + + } + } + + + + + Console.WriteLine(logstr); + } + + //if (configGroupEntity != null) + //{ + // configGroupEntities.Add(configGroupEntity); + //} + + + return configGroupEntities; + } + private static (bool, List) parseBgiLine(string pattern, string str) + { + Match match = Regex.Match(str, pattern); + if (match.Success) + { + return (true, match.Groups.Cast().Select(g => g.Value).ToList()); + } + return (false, []); + } + private static DateTime? parsePreDataTime(List<(string, string)> list, int index, string logrq) + { + + if (index < 0) + { + return null; + } + (bool, List) result = parseBgiLine(@"\[(\d{2}:\d{2}:\d{2})\.\d+\]", list[index].Item1); + if (result.Item1) + { + + DateTime dateTime = DateTime.ParseExact(logrq + " " + result.Item2[1], "yyyy-MM-dd HH:mm:ss", null); + return dateTime; + } + return null; + } + public class ConfigGroupEntity + { + + //配置组名字 + public string Name { get; set; } + //开始日期 + public DateTime? StartDate { get; set; } + + //结束日期 + public DateTime? EndDate { get; set; } + //配置人物列表xxx.json + public List ConfigTaskList { get; } = new(); + + public class ConfigTask + { + public string Name { get; set; } + //开始日期 + public DateTime? StartDate { get; set; } + + //结束日期 + public DateTime? EndDate { get; set; } + //拾取字典 + public Dictionary Picks { get; } = new(); + public void addPick(string val) + { + if (!Picks.ContainsKey(val)) + { + Picks.Add(val, 0); + } + Picks[val] = Picks[val] + 1; + } + } + + + + + + + } + public static List<(string FileName, string Date)> GetLogFiles(string folderPath) + { + // 定义返回的元组列表 + var result = new List<(string FileName, string Date)>(); + + // 确认文件夹是否存在 + if (!Directory.Exists(folderPath)) + { + Console.WriteLine("指定的文件夹不存在。"); + return result; + } + + // 定义文件名匹配的正则表达式 + string pattern = @"^better-genshin-impact(\d{8})\.log$"; + Regex regex = new Regex(pattern); + + // 遍历文件夹中的所有文件 + var files = Directory.GetFiles(folderPath); + foreach (var file in files) + { + string fileName = Path.GetFileName(file); + + // 检查文件名是否匹配模式 + var match = regex.Match(fileName); + if (match.Success) + { + string dateString = match.Groups[1].Value; + + // 尝试将日期字符串格式化为 yyyy-MM-dd + if (DateTime.TryParseExact(dateString, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out DateTime parsedDate)) + { + result.Add((folderPath + "\\" + fileName, parsedDate.ToString("yyyy-MM-dd"))); + } + } + } + + // 按日期排序 + result = result.OrderBy(r => r.Date).ToList(); + + return result; + } + + public static string ConvertSecondsToTime(double totalSeconds) + { + if (totalSeconds < 0) + throw new ArgumentException("Seconds cannot be negative."); + + int hours = (int)(totalSeconds / 3600); + int minutes = (int)((totalSeconds % 3600) / 60); + double seconds = totalSeconds % 60; + + string result = ""; + if (hours > 0) + { + result += $"{hours}小时"; + } + if (minutes > 0 || hours > 0) + { + result += $"{minutes}分钟"; + } + if (seconds > 0 || (hours == 0 && minutes == 0)) + { + // 根据小数点后是否为0决定是否保留小数 + if (seconds % 1 == 0) + { + result += $"{(int)seconds}秒"; + } + else + { + result += $"{seconds:F2}秒"; // 保留两位小数 + } + } + + return result; + } + public static string GenerHtmlByConfigGroupEntity(List configGroups) { + (string name, Func value)[] colConfigs = [ + (name: "名称", value: task => task.Name) + ,(name: "开始日期", value: task => task.StartDate?.ToString("yyyy-MM-dd HH:mm:ss")??"") + ,(name: "结束日期", value: task => task.EndDate?.ToString("yyyy-MM-dd HH:mm:ss")??"") + ,(name: "耗时", value: task => ConvertSecondsToTime((task.EndDate - task.StartDate)?.TotalSeconds ?? 0)) + ]; + return GenerHtmlByConfigGroupEntity(configGroups, "日志分析", colConfigs); + } + public static string GenerHtmlByConfigGroupEntity(List configGroups,string title, (string name, Func value)[] colConfigs) + { + + StringBuilder html = new StringBuilder(); + + // HTML头部 + html.AppendLine(""); + html.AppendLine(""); + html.AppendLine(""); + html.AppendLine(" "); + html.AppendLine(" "); + html.AppendLine($" {title}"); + html.AppendLine(" "); + html.AppendLine(""); + html.AppendLine(""); + + + + // 遍历每个配置组生成表格 + foreach (var group in configGroups) + { + TimeSpan? timeDiff = group.EndDate - group.StartDate; + double totalSeconds = timeDiff?.TotalSeconds ?? 0; + + html.AppendLine($"

配置组:{group.Name}({group.StartDate?.ToString("yyyy-MM-dd HH:mm:ss")}-{group.EndDate?.ToString("yyyy-MM-dd HH:mm:ss")}),耗时{ConvertSecondsToTime(totalSeconds)}

"); + html.AppendLine(""); + html.AppendLine(" "); + foreach (var item in colConfigs) + { + html.AppendLine($" "); + } + html.AppendLine(" "); + + // 合并所有任务的 Picks + Dictionary mergedPicks = new Dictionary(); + foreach (var task in group.ConfigTaskList) + { + foreach (var pick in task.Picks) + { + if (!mergedPicks.ContainsKey(pick.Key)) + { + mergedPicks[pick.Key] = 0; + } + mergedPicks[pick.Key] += pick.Value; + } + + // 任务行 + + timeDiff = task.EndDate - task.StartDate; + totalSeconds = timeDiff?.TotalSeconds ?? 0; + html.AppendLine(" "); + foreach (var item in colConfigs) + { + html.AppendLine($" "); + } + html.AppendLine(" "); + } + + // 按 Value 倒序排列 Picks + var sortedPicks = mergedPicks.OrderByDescending(p => p.Value) + .Select(p => $"{p.Key} ({p.Value})"); + + // Picks 行 + html.AppendLine(" "); + html.AppendLine($" "); + html.AppendLine(" "); + + html.AppendLine("
{item.name}
{item.value.Invoke(task)}
拾取物: {string.Join(", ", sortedPicks)}
"); + } + + // HTML尾部 + html.AppendLine(""); + html.AppendLine(""); + + return html.ToString(); + } + } +} diff --git a/BetterGenshinImpact/View/Pages/ScriptControlPage.xaml b/BetterGenshinImpact/View/Pages/ScriptControlPage.xaml index 9d7e7cb9..8dd23635 100644 --- a/BetterGenshinImpact/View/Pages/ScriptControlPage.xaml +++ b/BetterGenshinImpact/View/Pages/ScriptControlPage.xaml @@ -211,6 +211,7 @@ + diff --git a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs index ca9ed401..70e8386b 100644 --- a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs @@ -29,6 +29,7 @@ using Wpf.Ui.Controls; using Wpf.Ui.Violeta.Controls; using StackPanel = Wpf.Ui.Controls.StackPanel; using System.Windows.Navigation; +using BetterGenshinImpact.View.Controls.Webview; using Newtonsoft.Json.Linq; using static Vanara.PInvoke.User32; using TextBox = Wpf.Ui.Controls.TextBox; @@ -57,6 +58,7 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware private ScriptGroup? _selectedScriptGroup; public readonly string ScriptGroupPath = Global.Absolute(@"User\ScriptGroup"); + public readonly string LogPath = Global.Absolute(@"log"); public void OnNavigatedFrom() { @@ -104,7 +106,112 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware SelectedScriptGroup.Projects.Clear(); WriteScriptGroup(SelectedScriptGroup); } + [RelayCommand] + private async Task OpenLogParse() + { + + // 创建 StackPanel + var stackPanel = new StackPanel + { + Orientation = Orientation.Vertical, + Margin = new Thickness(10) + }; + + // 创建 ComboBox + var rangeComboBox = new ComboBox + { + Width = 200, + Margin = new Thickness(0, 0, 0, 10), + VerticalAlignment = VerticalAlignment.Center + }; + var rangeComboBoxItems = new List + { + new { Text = "当前配置组", Value = "CurrentConfig" }, + new { Text = "所有", Value = "All" } + }; + rangeComboBox.DisplayMemberPath = "Text"; // 显示的文本 + rangeComboBox.SelectedValuePath = "Value"; // 绑定的值 + rangeComboBox.ItemsSource = rangeComboBoxItems; + rangeComboBox.SelectedIndex = 0; // 默认选中第一个项 + stackPanel.Children.Add(rangeComboBox); + + + var dayRangeComboBox = new ComboBox + { + Width = 200, + Margin = new Thickness(0, 0, 0, 10), + VerticalAlignment = VerticalAlignment.Center + }; + // 定义范围选项数据 + var dayRangeComboBoxItems = new List + { + new { Text = "3天", Value = "3" }, + new { Text = "7天", Value = "7" }, + new { Text = "所有", Value = "All" } + }; + dayRangeComboBox.ItemsSource = dayRangeComboBoxItems; + dayRangeComboBox.DisplayMemberPath = "Text"; // 显示的文本 + dayRangeComboBox.SelectedValuePath = "Value"; // 绑定的值 + dayRangeComboBox.SelectedIndex = 0; + stackPanel.Children.Add(dayRangeComboBox); + + + + //PrimaryButtonText + var uiMessageBox = new Wpf.Ui.Controls.MessageBox + { + Title = "日志分析", + Content = stackPanel, + CloseButtonText = "取消", + PrimaryButtonText = "确定", + Owner = Application.Current.MainWindow, + }; + Wpf.Ui.Controls.MessageBoxResult result = await uiMessageBox.ShowDialogAsync(); + + + if (result == Wpf.Ui.Controls.MessageBoxResult.Primary) { + WebpageWindow win = new() + { + Title = "日志分析", + Width = 800, + Height = 600, + Owner = Application.Current.MainWindow, + WindowStartupLocation = WindowStartupLocation.CenterOwner + }; + string rangeValue = ((dynamic)rangeComboBox.SelectedItem).Value; + string dayRangeValue = ((dynamic)dayRangeComboBox.SelectedItem).Value; + + + List<(string FileName, string Date)> fs = LogParse.LogParse.GetLogFiles(LogPath); + if (dayRangeValue != "All") { + int n = int.Parse(dayRangeValue); + if (n < fs.Count) + { + fs = fs.GetRange(fs.Count - n, n); + } + } + + + var configGroupEntities = LogParse.LogParse.ParseFile(fs); + if (rangeValue == "CurrentConfig") { + Toast.Success(_selectedScriptGroup.Name); + configGroupEntities =configGroupEntities.Where(item => _selectedScriptGroup.Name == item.Name).ToList(); + } + if (configGroupEntities.Count == 0) + { + Toast.Warning("未解析出日志记录!"); + } + else { + configGroupEntities.Reverse(); + win.NavigateToHtml(LogParse.LogParse.GenerHtmlByConfigGroupEntity(configGroupEntities)); + win.ShowDialog(); + } + + } + + + } private void UpdateTasks() { //PromptDialog.Prompt From 653df2f7cca377a171576c333126c0fca02c8c62 Mon Sep 17 00:00:00 2001 From: zjl Date: Mon, 6 Jan 2025 14:22:34 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs index 70e8386b..f4f704a0 100644 --- a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs @@ -195,7 +195,7 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware var configGroupEntities = LogParse.LogParse.ParseFile(fs); if (rangeValue == "CurrentConfig") { - Toast.Success(_selectedScriptGroup.Name); + //Toast.Success(_selectedScriptGroup.Name); configGroupEntities =configGroupEntities.Where(item => _selectedScriptGroup.Name == item.Name).ToList(); } if (configGroupEntities.Count == 0) From 30827b2ff471bd62d8a58feb95c58abb0b8b1e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Tue, 7 Jan 2025 00:14:39 +0800 Subject: [PATCH 11/11] fix conflicts --- .../GameTask/AutoPathing/PathExecutor.cs | 94 +++++++------------ 1 file changed, 36 insertions(+), 58 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 0ebf2399..8c528b94 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -144,7 +144,7 @@ public class PathExecutor return; } - + try { InitializePathing(task); @@ -242,34 +242,14 @@ public class PathExecutor // 不管咋样,松开所有按键 Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); Simulation.SendInput.Mouse.RightButtonUp(); - } } - catch (RetryException retryException) - { - StartSkipOtherOperations(); - Logger.LogWarning(retryException.Message); - } - catch (RetryNoCountException retryException) - { - //特殊情况下,重试不消耗次数 - i--; - StartSkipOtherOperations(); - Logger.LogWarning(retryException.Message); - } - finally - { - // 不管咋样,松开所有按键 - Simulation.SendInput.SimulateAction(GIActions.MoveForward, KeyType.KeyUp); - Simulation.SendInput.SimulateAction(GIActions.SprintMouse, KeyType.KeyUp); - } } } finally { _unknownInterfaceCheckingTask = false; } - } private async Task SwitchPartyBefore(PathingTask task) @@ -315,52 +295,51 @@ public class PathExecutor return true; } + bool _unknownInterfaceCheckingTask = false; + private void UnknownInterfaceCheckingTaskStart() { - /*if (_partyConfig.Enabled && _partyConfig.CloseUnknownInterfaceCheck) {*/ - _unknownInterfaceCheckingTask = true; - Task.Run(async () => + _unknownInterfaceCheckingTask = true; + Task.Run(async () => + { + Logger.LogInformation("开始未知界面检查"); + while (_unknownInterfaceCheckingTask && !ct.IsCancellationRequested) { + ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); - Logger.LogInformation("开始未知界面检查"); - while (_unknownInterfaceCheckingTask && !ct.IsCancellationRequested) + var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); + if (cookRa.IsExist()) { - ImageRegion imageRegion = TaskTriggerDispatcher.Instance().CaptureToRectArea(); - - var cookRa = imageRegion.Find(AutoSkipAssets.Instance.CookRo); - if (cookRa.IsExist()) - { - Logger.LogInformation("检测到烹饪界面,使用ESC关闭界面"); - Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); - } - var mainRa2 = imageRegion.Find(AutoSkipAssets.Instance.PageCloseMainRo); - if (mainRa2.IsExist()) - { - - Logger.LogInformation("检测到主界面,使用ESC关闭界面"); - Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); - } - - - for (int i = 0; i < 5; i++) - { - if (!_unknownInterfaceCheckingTask || ct.IsCancellationRequested) - { - break; - } - await Task.Delay(1000,ct); - } - + Logger.LogInformation("检测到烹饪界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); } - Logger.LogInformation("关闭未知界面检查"); - - },ct); - /*} */ - } + var mainRa2 = imageRegion.Find(AutoSkipAssets.Instance.PageCloseMainRo); + if (mainRa2.IsExist()) + { + Logger.LogInformation("检测到主界面,使用ESC关闭界面"); + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + } + + + for (int i = 0; i < 5; i++) + { + if (!_unknownInterfaceCheckingTask || ct.IsCancellationRequested) + { + break; + } + + await Task.Delay(1000, ct); + } + } + + Logger.LogInformation("关闭未知界面检查"); + }, ct); + /*} */ + } private void InitializePathing(PathingTask task) @@ -997,7 +976,6 @@ public class PathExecutor // 判断是否进入剧情 await AutoSkip(); } - } private async Task AutoSkip()