From 8dcf563b31d0c4ff65f4e9be18042cc683467aa7 Mon Sep 17 00:00:00 2001 From: kaedelcb <57870068+kaedelcb@users.noreply.github.com> Date: Fri, 10 Oct 2025 02:51:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=88=98=E6=96=97=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=B8=B8=E6=B3=B3=E6=A3=80=E6=B5=8B=20(#2315)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Config/PathingConditionConfig.cs | 4 ++ .../GameTask/AutoFight/AutoFightConfig.cs | 2 + .../GameTask/AutoFight/AutoFightParam.cs | 3 + .../GameTask/AutoFight/AutoFightTask.cs | 4 ++ .../GameTask/AutoFight/Model/Avatar.cs | 65 +++++++++++++++++ .../GameTask/AutoPathing/PathExecutor.cs | 4 ++ .../View/Pages/TaskSettingsPage.xaml | 31 ++++++-- .../Pages/View/ScriptGroupConfigView.xaml | 72 ++++++++++++------- 8 files changed, 153 insertions(+), 32 deletions(-) diff --git a/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs b/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs index 591c796d..d7b7261b 100644 --- a/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingConditionConfig.cs @@ -6,6 +6,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.Linq; +using BetterGenshinImpact.GameTask; +using BetterGenshinImpact.GameTask.AutoPathing.Model; +using BetterGenshinImpact.GameTask.Common; +using Microsoft.Extensions.Logging; namespace BetterGenshinImpact.Core.Config; diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs index dba89cff..0f2ab667 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs @@ -131,6 +131,8 @@ public partial class AutoFightConfig : ObservableObject [ObservableProperty] private string _kazuhaPartyName = ""; + [ObservableProperty] + private bool _swimmingEnabled = false; /// /// 战斗超时,单位秒 diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs index 60b496fd..4d6aac22 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs @@ -50,6 +50,7 @@ public class AutoFightParam : BaseTaskParam GuardianCombatSkip = autoFightConfig.GuardianCombatSkip; SkipModel = autoFightConfig.SkipModel; GuardianAvatarHold = autoFightConfig.GuardianAvatarHold; + SwimmingEnabled = autoFightConfig.SwimmingEnabled; } public FightFinishDetectConfig FinishDetectConfig { get; set; } = new(); @@ -70,6 +71,7 @@ public class AutoFightParam : BaseTaskParam public bool GuardianCombatSkip { get; set; } = false; public bool SkipModel = false; public bool GuardianAvatarHold = false; + public static bool SwimmingEnabled { get; set; } = false; public AutoFightParam(string? strategyName = null) : base(null, null) { @@ -124,5 +126,6 @@ public class AutoFightParam : BaseTaskParam GuardianCombatSkip = autoFightConfig.GuardianCombatSkip; SkipModel = autoFightConfig.SkipModel; GuardianAvatarHold = autoFightConfig.GuardianAvatarHold; + SwimmingEnabled = autoFightConfig.SwimmingEnabled; } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs index 228fd69a..0e18d322 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs @@ -20,6 +20,7 @@ using OpenCvSharp; using BetterGenshinImpact.Helpers; using Vanara; using Microsoft.Extensions.DependencyInjection; +using BetterGenshinImpact.GameTask.AutoPathing.Model; namespace BetterGenshinImpact.GameTask.AutoFight; @@ -43,6 +44,9 @@ public class AutoFightTask : ISoloTask public static bool FightStatusFlag { get; set; } = false; + // 战斗点位 + public static WaypointForTrack? FightWaypoint {get; set;} = null; + private class TaskFightFinishDetectConfig { public int DelayTime = 1500; diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs index 536e176c..9cc5e3ad 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs @@ -20,6 +20,10 @@ using static BetterGenshinImpact.GameTask.Common.TaskControl; using BetterGenshinImpact.Core.Config; using BetterGenshinImpact.GameTask.AutoFight.Assets; using BetterGenshinImpact.ViewModel.Pages; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; +using BetterGenshinImpact.GameTask.AutoPathing; +using BetterGenshinImpact.GameTask.AutoPathing.Model; +using BetterGenshinImpact.GameTask.AutoPathing.Model.Enum; namespace BetterGenshinImpact.GameTask.AutoFight.Model; @@ -113,6 +117,67 @@ public class Avatar Sleep(600, ct); TpForRecover(ct, new RetryException("检测到复苏界面,存在角色被击败,前往七天神像复活")); } + else if(AutoFightParam.SwimmingEnabled && AutoFightTask.FightStatusFlag && SwimmingConfirm(region)) + { + if (AutoFightTask.FightWaypoint is not null) + { + if (!SwimmingConfirm(CaptureToRectArea())) //二次确认 + { + return; + } + + Logger.LogInformation("游泳检测:尝试回到战斗地点"); + var pathExecutor = new PathExecutor(ct); + try + { + pathExecutor.FaceTo(AutoFightTask.FightWaypoint).Wait(2000, ct); + AutoFightTask.FightWaypoint.MoveMode = MoveModeEnum.Fly.Code;//改为跳飞 + Simulation.SendInput.Mouse.RightButtonDown(); + pathExecutor.MoveTo(AutoFightTask.FightWaypoint).Wait(15000, ct); + AutoFightTask.FightWaypoint = null;//执行后清空,即每次战斗只执行一次,第二次直接去七天神像 + Simulation.SendInput.Mouse.RightButtonUp(); + } + catch (Exception ex) + { + Logger.LogWarning(ex, "游泳检测:回到战斗地点异常"); + } + + Simulation.ReleaseAllKey(); + + if (!SwimmingConfirm(CaptureToRectArea())) + { + Logger.LogInformation("游泳检测:游泳脱困成功"); + return; + } + + Logger.LogWarning("游泳检测:回到战斗地点失败"); + } + + Logger.LogWarning("战斗过程检测到游泳,前往七天神像重试"); + TpForRecover(ct, new RetryException("战斗过程检测到游泳,前往七天神像重试")); + } + } + + /// + /// 游泳检测(色块连通性检测) + /// 游泳时右下角会出现鼠标图标,带有黄色色块,不受改按键影响 + /// + private static bool SwimmingConfirm(Region region) + { + var mask = OpenCvCommonHelper.Threshold(region.ToImageRegion().DeriveCrop(1819, 1025, 9, 11).SrcMat, + new Scalar(242, 223, 39),new Scalar(255, 233, 44)); + var labels = new Mat(); + var stats = new Mat(); + var centroids = new Mat(); + + var numLabels = Cv2.ConnectedComponentsWithStats(mask, labels, stats, centroids, + connectivity: PixelConnectivity.Connectivity4, ltype: MatType.CV_32S); + + labels.Dispose(); + stats.Dispose(); + centroids.Dispose(); + + return numLabels > 1; } /// diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 5ca0b9c6..69129be8 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -37,6 +37,7 @@ using BetterGenshinImpact.GameTask.AutoPathing; using BetterGenshinImpact.GameTask.Common.Element.Assets; using BetterGenshinImpact.GameTask.Common.Exceptions; using BetterGenshinImpact.GameTask.Common.Map.Maps; +using BetterGenshinImpact.GameTask.AutoFight; namespace BetterGenshinImpact.GameTask.AutoPathing; @@ -213,6 +214,9 @@ public class PathExecutor if ((!string.IsNullOrEmpty(waypoint.Action) && !_skipOtherOperations) || waypoint.Action == ActionEnum.CombatScript.Code) { + //战斗前的节点记录,用于游泳检测回到战斗节点 + AutoFightTask.FightWaypoint = waypoint.Action == ActionEnum.Fight.Code ? waypoint : null; + // 执行 action await AfterMoveToTarget(waypoint); } diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 5826afc3..fdba3765 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -971,32 +971,51 @@ Margin="0,0,36,0" IsChecked="{Binding Config.AutoFightConfig.KazuhaPickupEnabled, Mode=TwoWay}" /> - + + + + Margin="10,0,20,0" + MinWidth="50" + Text="{Binding Config.AutoFightConfig.Timeout}"/> + + + + diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 35d989f7..b6d76b42 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -1447,32 +1447,52 @@ Margin="0,0,36,0" Text="{Binding PathingConfig.AutoFightConfig.KazuhaPartyName}" /> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +