diff --git a/BetterGenshinImpact/GameTask/AutoPick/Assets/AutoPickAssets.cs b/BetterGenshinImpact/GameTask/AutoPick/Assets/AutoPickAssets.cs index 78928191..04bbc0f2 100644 --- a/BetterGenshinImpact/GameTask/AutoPick/Assets/AutoPickAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoPick/Assets/AutoPickAssets.cs @@ -12,6 +12,7 @@ namespace BetterGenshinImpact.GameTask.AutoPick.Assets public class AutoPickAssets { public RecognitionObject FRo; + public RecognitionObject OptionButtonRo; public AutoPickAssets() { @@ -27,6 +28,14 @@ namespace BetterGenshinImpact.GameTask.AutoPick.Assets info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 3), DrawOnWindow = false }.InitTemplate(); + + OptionButtonRo = new RecognitionObject + { + Name = "OptionButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoSkip", "option.png"), + DrawOnWindow = false + }.InitTemplate(); } } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoPick/AutoPickConfig.cs b/BetterGenshinImpact/GameTask/AutoPick/AutoPickConfig.cs index 91bd17ad..66a8ebe9 100644 --- a/BetterGenshinImpact/GameTask/AutoPick/AutoPickConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoPick/AutoPickConfig.cs @@ -18,13 +18,17 @@ namespace BetterGenshinImpact.GameTask.AutoPick /// [ObservableProperty] private bool _enabled = true; + /// + /// 1080p下拾取文字左边的起始偏移 + /// + [ObservableProperty] private int _itemIconLeftOffset = 60; /// /// 1080p下拾取文字的起始偏移 /// - [ObservableProperty] private int _fLeftOffset = 115; + [ObservableProperty] private int _itemTextLeftOffset = 115; /// /// 1080p下拾取文字的终止偏移 /// - [ObservableProperty] private int _fRightOffset = 400; + [ObservableProperty] private int _itemTextRightOffset = 400; } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoPick/AutoPickTrigger.cs b/BetterGenshinImpact/GameTask/AutoPick/AutoPickTrigger.cs index 2fee0558..d241f121 100644 --- a/BetterGenshinImpact/GameTask/AutoPick/AutoPickTrigger.cs +++ b/BetterGenshinImpact/GameTask/AutoPick/AutoPickTrigger.cs @@ -5,6 +5,7 @@ using BetterGenshinImpact.Core.Config; using BetterGenshinImpact.Core.Recognition.ONNX.SVTR; using BetterGenshinImpact.Core.Recognition.OpenCv; using BetterGenshinImpact.GameTask.AutoPick.Assets; +using BetterGenshinImpact.GameTask.Model; using Microsoft.Extensions.Logging; using OpenCvSharp; using WindowsInput; @@ -60,13 +61,24 @@ public class AutoPickTrigger : ITaskTrigger { content.CaptureRectArea.Find(_autoPickAssets.FRo, foundRectArea => { - // 这类文字识别比较特殊,都是针对某个场景的文字识别,所以暂时未抽象到识别对象中 var scale = TaskContext.Instance().SystemInfo.AssetScale; var config = TaskContext.Instance().Config.AutoPickConfig; + + // 识别到F键,开始识别物品图标 + bool isChatIcon = false; + _autoPickAssets.OptionButtonRo.RegionOfInterest = new Rect(foundRectArea.X + (int)(config.ItemIconLeftOffset * scale), foundRectArea.Y, (int)((config.ItemTextLeftOffset - config.ItemIconLeftOffset) * scale), foundRectArea.Height); + var iconRa = content.CaptureRectArea.Find(_autoPickAssets.OptionButtonRo); + if (!iconRa.IsEmpty()) + { + // 物品图标是聊天气泡,一般是NPC对话,文字不在白名单不拾取 + isChatIcon = true; + } + + // 这类文字识别比较特殊,都是针对某个场景的文字识别,所以暂时未抽象到识别对象中 // 计算出文字区域 - var textRect = new Rect(foundRectArea.X + (int)(config.FLeftOffset * scale), foundRectArea.Y, - (int)((config.FRightOffset - config.FLeftOffset) * scale), foundRectArea.Height); - if (textRect.X + textRect.Width > content.CaptureRectArea.SrcGreyMat.Width + var textRect = new Rect(foundRectArea.X + (int)(config.ItemTextLeftOffset * scale), foundRectArea.Y, + (int)((config.ItemTextRightOffset - config.ItemTextLeftOffset) * scale), foundRectArea.Height); + if (textRect.X + textRect.Width > content.CaptureRectArea.SrcGreyMat.Width || textRect.Y + textRect.Height > content.CaptureRectArea.SrcGreyMat.Height) { Debug.WriteLine("AutoPickTrigger: 文字区域 out of range"); @@ -86,6 +98,12 @@ public class AutoPickTrigger : ITaskTrigger return; } + if (isChatIcon) + { + //Debug.WriteLine("AutoPickTrigger: 物品图标是聊天气泡,一般是NPC对话,不拾取"); + return; + } + if (_blackList.Contains(text)) { return; diff --git a/BetterGenshinImpact/GameTask/GameTaskManager.cs b/BetterGenshinImpact/GameTask/GameTaskManager.cs index e898c5b8..99dd6842 100644 --- a/BetterGenshinImpact/GameTask/GameTaskManager.cs +++ b/BetterGenshinImpact/GameTask/GameTaskManager.cs @@ -38,6 +38,11 @@ namespace BetterGenshinImpact.GameTask if (TriggerDictionary is { Count: > 0 }) { TriggerDictionary["AutoPick"].IsEnabled = TaskContext.Instance().Config.AutoPickConfig.Enabled; + // 用于刷新AutoPick的黑白名单 + if (TriggerDictionary["AutoPick"].IsEnabled == false) + { + TriggerDictionary["AutoPick"] = new AutoPick.AutoPickTrigger(); + } TriggerDictionary["AutoSkip"].IsEnabled = TaskContext.Instance().Config.AutoSkipConfig.Enabled; TriggerDictionary["AutoFishing"].IsEnabled = TaskContext.Instance().Config.AutoFishingConfig.Enabled; // 钓鱼有很多变量要初始化,直接重新new