diff --git a/BetterGenshinImpact/BetterGenshinImpact.csproj b/BetterGenshinImpact/BetterGenshinImpact.csproj index 25dd7dc7..5cde23ce 100644 --- a/BetterGenshinImpact/BetterGenshinImpact.csproj +++ b/BetterGenshinImpact/BetterGenshinImpact.csproj @@ -136,6 +136,7 @@ + diff --git a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs index bf5b5651..8e144fb1 100644 --- a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs +++ b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs @@ -16,6 +16,7 @@ using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; +using BetterGenshinImpact.GameTask.Common.Exceptions; using Vanara.PInvoke; using static BetterGenshinImpact.GameTask.Common.TaskControl; @@ -106,6 +107,13 @@ public class TpTask(CancellationTokenSource cts) { return await TpOnce(tpX, tpY, force); } + catch (TpPointNotActivate) + { + // 传送点未激活或不存在 按ESC回到大地图界面 + Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE); + await Delay(300, cts); + throw; + } catch (Exception e) { Logger.LogError(e, "传送失败,重试 {I} 次", i + 1); @@ -363,33 +371,35 @@ public class TpTask(CancellationTokenSource cts) // 1.判断是否在地图界面 if (Bv.IsInBigMapUi(imageRegion)) { - // 2. 判断是否有传送按钮 - var hasTeleportButton = CheckTeleportButton(imageRegion); - - if (!hasTeleportButton) + // 2. 存在地图关闭按钮,说明已经点出界面 + var mapCloseRa1 = imageRegion.Find(_assets.MapCloseButtonRo); + if (!mapCloseRa1.IsEmpty()) { - // 存在地图关闭按钮,说明未选中传送点,直接返回 - var mapCloseRa = imageRegion.Find(_assets.MapCloseButtonRo); - if (!mapCloseRa.IsEmpty()) + // 3.此时不存在传送图标,一定不是传送点 + if (!CheckTeleportButton(imageRegion)) { - return; + throw new TpPointNotActivate("传送点未激活或不存在"); } - - // 存在地图选择按钮,说明未选中传送点,直接返回 - var mapChooseRa = imageRegion.Find(_assets.MapChooseRo); - if (!mapChooseRa.IsEmpty()) - { - return; - } - - // 3. 循环判断选项列表是否有传送点 + } + else + { + // 3. 循环判断选项列表是否有传送点(未激活点位也在里面) var hasMapChooseIcon = CheckMapChooseIcon(imageRegion); if (hasMapChooseIcon) { var time = TaskContext.Instance().Config.QuickTeleportConfig.WaitTeleportPanelDelay; time = time < 100 ? 100 : time; await Delay(time, cts); - CheckTeleportButton(CaptureToRectArea()); + if (!CheckTeleportButton(CaptureToRectArea())) + { + // 没传送确认图标说明点开的是未激活传送锚点 + throw new TpPointNotActivate("传送点未激活或不存在"); + } + } + else + { + // 没有传送点说明不是传送点 + throw new TpPointNotActivate("传送点未激活或不存在"); } } } diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/MapAssets.cs b/BetterGenshinImpact/GameTask/Common/Element/Assets/MapAssets.cs index 62322e67..4e7cd8ae 100644 --- a/BetterGenshinImpact/GameTask/Common/Element/Assets/MapAssets.cs +++ b/BetterGenshinImpact/GameTask/Common/Element/Assets/MapAssets.cs @@ -36,6 +36,6 @@ public class MapAssets : BaseAssets public MapAssets() { var json = File.ReadAllText(Global.Absolute(@"GameTask\AutoTrackPath\Assets\tp.json")); - TpPositions = JsonSerializer.Deserialize>(json, ConfigService.JsonOptions) ?? throw new Exception("tp.json deserialize failed"); + TpPositions = JsonSerializer.Deserialize>(json, ConfigService.JsonOptions) ?? throw new System.Exception("tp.json deserialize failed"); } } diff --git a/BetterGenshinImpact/GameTask/Common/Exception/NormalEndException.cs b/BetterGenshinImpact/GameTask/Common/Exceptions/NormalEndException.cs similarity index 100% rename from BetterGenshinImpact/GameTask/Common/Exception/NormalEndException.cs rename to BetterGenshinImpact/GameTask/Common/Exceptions/NormalEndException.cs diff --git a/BetterGenshinImpact/GameTask/Common/Exception/RetryException.cs b/BetterGenshinImpact/GameTask/Common/Exceptions/RetryException.cs similarity index 100% rename from BetterGenshinImpact/GameTask/Common/Exception/RetryException.cs rename to BetterGenshinImpact/GameTask/Common/Exceptions/RetryException.cs diff --git a/BetterGenshinImpact/GameTask/Common/Exceptions/TpPointNotActivate.cs b/BetterGenshinImpact/GameTask/Common/Exceptions/TpPointNotActivate.cs new file mode 100644 index 00000000..e71f89ed --- /dev/null +++ b/BetterGenshinImpact/GameTask/Common/Exceptions/TpPointNotActivate.cs @@ -0,0 +1,5 @@ +namespace BetterGenshinImpact.GameTask.Common.Exceptions; + +public class TpPointNotActivate(string message) : System.Exception(message) +{ +} diff --git a/BetterGenshinImpact/GameTask/Common/NewRetry.cs b/BetterGenshinImpact/GameTask/Common/NewRetry.cs index 113c61f3..dd0088c4 100644 --- a/BetterGenshinImpact/GameTask/Common/NewRetry.cs +++ b/BetterGenshinImpact/GameTask/Common/NewRetry.cs @@ -22,7 +22,7 @@ public static class NewRetry public static T Do(Func action, TimeSpan retryInterval, int maxAttemptCount = 3) { - List exceptions = []; + List exceptions = []; for (int attempted = 0; attempted < maxAttemptCount; attempted++) { diff --git a/BetterGenshinImpact/GameTask/Common/TaskControl.cs b/BetterGenshinImpact/GameTask/Common/TaskControl.cs index 635af949..63af1e68 100644 --- a/BetterGenshinImpact/GameTask/Common/TaskControl.cs +++ b/BetterGenshinImpact/GameTask/Common/TaskControl.cs @@ -131,7 +131,7 @@ public class TaskControl Sleep(30); } - throw new Exception("尝试多次后,截图失败!"); + throw new System.Exception("尝试多次后,截图失败!"); } else {