diff --git a/BetterGenshinImpact/BetterGenshinImpact.csproj b/BetterGenshinImpact/BetterGenshinImpact.csproj index f1b0e8fb..998a5675 100644 --- a/BetterGenshinImpact/BetterGenshinImpact.csproj +++ b/BetterGenshinImpact/BetterGenshinImpact.csproj @@ -41,6 +41,7 @@ + diff --git a/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs b/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs index e0f749b2..2dcfc9ea 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/Navigation.cs @@ -4,6 +4,8 @@ using BetterGenshinImpact.GameTask.Model.Area; using OpenCvSharp; using System; using BetterGenshinImpact.GameTask.Common; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.Extensions.Logging; namespace BetterGenshinImpact.GameTask.AutoPathing; @@ -20,7 +22,11 @@ internal class Navigation internal static Point2f GetPosition(ImageRegion imageRegion) { var greyMat = new Mat(imageRegion.SrcGreyMat, new Rect(62, 19, 212, 212)); - return EntireMap.Instance.GetMiniMapPositionByFeatureMatch(greyMat); + var p = EntireMap.Instance.GetMiniMapPositionByFeatureMatch(greyMat); + + WeakReferenceMessenger.Default.Send(new PropertyChangedMessage(typeof(Navigation), + "SendCurrentPosition", new object(), p)); + return p; } internal static int GetTargetOrientation(Waypoint waypoint, Point2f position) diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index dead4f60..0173fc4f 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -1,10 +1,13 @@ using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoPathing.Model; +using BetterGenshinImpact.GameTask.AutoPathing.Model.Enum; using BetterGenshinImpact.GameTask.AutoTrackPath; using BetterGenshinImpact.GameTask.Common; using BetterGenshinImpact.GameTask.Common.BgiVision; using BetterGenshinImpact.GameTask.Common.Map; using BetterGenshinImpact.GameTask.Model.Area; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.Extensions.Logging; using OpenCvSharp; using System; @@ -12,10 +15,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using BetterGenshinImpact.GameTask.AutoPathing.Model.Enum; -using BetterGenshinImpact.Helpers; using Vanara.PInvoke; -using Wpf.Ui.Violeta.Controls; using static BetterGenshinImpact.GameTask.Common.TaskControl; namespace BetterGenshinImpact.GameTask.AutoPathing; @@ -32,7 +32,9 @@ public class PathExecutor(CancellationTokenSource cts) task.Positions.First().Type = WaypointType.Teleport.Code; - // 这里应该判断一下自动拾取是否处于工作状态,但好像没有什么方便的读取办法 + // 初始化查看地图 + WeakReferenceMessenger.Default.Send(new PropertyChangedMessage(this, + "UpdateCurrentPathing", new object(), task)); // TODO:大地图传送的时候使用游戏坐标,追踪的时候应该使用2048地图图像坐标,这里临时做转换,后续改进 var waypoints = new List(); @@ -61,7 +63,9 @@ public class PathExecutor(CancellationTokenSource cts) if (waypoint.Type == WaypointType.Teleport.Code) { Logger.LogInformation("正在传送到{x},{y}", waypoint.X, waypoint.Y); - await new TpTask(cts).Tp(waypoint.X, waypoint.Y); + var (tpX, tpY) = await new TpTask(cts).Tp(waypoint.X, waypoint.Y); + var (tprX, tprY) = MapCoordinate.GameToMain2048(tpX, tpY); + EntireMap.Instance.SetPrevPosition((float)tprX, (float)tprY); // 通过上一个位置直接进行局部特征匹配 continue; } @@ -230,6 +234,8 @@ public class PathExecutor(CancellationTokenSource cts) { Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); } + // 不管咋样,抬起w键 + Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_W); } private int RotateTo(int targetOrientation, ImageRegion imageRegion, int controlRatio = 1) @@ -241,6 +247,7 @@ public class PathExecutor(CancellationTokenSource cts) { return diff; } + // 平滑的旋转视角 if (Math.Abs(diff) > 90) { controlRatio = 5; diff --git a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs index 555caab6..3b8de85d 100644 --- a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs +++ b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs @@ -33,7 +33,7 @@ public class TpTask(CancellationTokenSource cts) /// /// /// - public async Task Tp(double tpX, double tpY) + public async Task<(double, double)> Tp(double tpX, double tpY) { // 获取最近的传送点位置 var (x, y) = GetRecentlyTpPoint(tpX, tpY); @@ -88,6 +88,7 @@ public class TpTask(CancellationTokenSource cts) } Logger.LogInformation("传送完成"); + return (x, y); } /// @@ -201,7 +202,7 @@ public class TpTask(CancellationTokenSource cts) { throw new RetryException("当前不在地图界面"); } - }, TimeSpan.FromMilliseconds(500), 5); + }, TimeSpan.FromMilliseconds(500), 10); if (rect == Rect.Empty) { diff --git a/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs b/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs index 654b01c2..ae23a509 100644 --- a/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs +++ b/BetterGenshinImpact/GameTask/Common/Map/EntireMap.cs @@ -33,6 +33,11 @@ public class EntireMap : Singleton private int _failCnt = 0; + public void SetPrevPosition(float x, float y) + { + (_prevX, _prevY) = (x, y); + } + /// /// 基于特征匹配获取地图位置 /// 移动匹配 diff --git a/BetterGenshinImpact/View/Pages/CommonSettingsPage.xaml b/BetterGenshinImpact/View/Pages/CommonSettingsPage.xaml index 172b992a..e18beac8 100644 --- a/BetterGenshinImpact/View/Pages/CommonSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/CommonSettingsPage.xaml @@ -422,7 +422,7 @@ - @@ -447,7 +447,7 @@ - + -->