修改自动幽境危战的战斗终止检测,解决可能存在的误识别场景

This commit is contained in:
辉鸭蛋
2025-12-26 01:16:42 +08:00
parent c3871e0286
commit ed61c9dfe7
2 changed files with 32 additions and 5 deletions

View File

@@ -31,6 +31,7 @@ using BetterGenshinImpact.GameTask.AutoDomain;
using static BetterGenshinImpact.GameTask.Common.TaskControl;
using static Vanara.PInvoke.User32;
using BetterGenshinImpact.GameTask.AutoFight;
using OpenCvSharp;
namespace BetterGenshinImpact.GameTask.AutoStygianOnslaught;
@@ -260,6 +261,7 @@ public class AutoStygianOnslaughtTask : ISoloTask
// 重新执行从打开活动界面开始的流程
await TpToDomain(page, isRetry: true);
}
return;
}
@@ -400,7 +402,33 @@ public class AutoStygianOnslaughtTask : ISoloTask
{
try
{
await Bv.WaitUntilFound(ElementAssets.Instance.BtnWhiteCancel, cts.Token, 300, 1000);
var captureRect = TaskContext.Instance().SystemInfo.ScaleMax1080PCaptureRect;
var assetScale = TaskContext.Instance().SystemInfo.AssetScale;
RecognitionObject whiteCancelRo = new RecognitionObject
{
Name = "BtnWhiteCancel",
RecognitionType = RecognitionTypes.TemplateMatch,
TemplateImageMat = ElementAssets.Instance.BtnWhiteCancel.TemplateImageMat,
RegionOfInterest = new Rect(captureRect.Width / 3, captureRect.Height - (int)(captureRect.Height * 0.22), captureRect.Width / 3, (int)(captureRect.Height * 0.22)),
Use3Channels = true
}.InitTemplate();
await NewRetry.WaitForAction(() =>
{
using var ra = CaptureToRectArea();
using var ret = ra.Find(whiteCancelRo);
if (ret.IsExist())
{
// OCR 保证识别不出错
var list = ra.FindMulti(RecognitionObject.Ocr(ret.X + 40 * assetScale, ret.Y - 20 * assetScale, 270 * assetScale, ret.Height * 2));
if (list.Any(o => o.Text.Contains("返回")))
{
return true;
}
}
return false;
}, cts.Token, 300, 1000);
_logger.LogInformation("检测到战斗结束,结束战斗操作线程");
await cts.CancelAsync();
}
@@ -721,10 +749,9 @@ public class AutoStygianOnslaughtTask : ISoloTask
private async Task ExitDomain(BvPage page)
{
var exitDoor = await NewRetry.WaitForElementAppear(
ElementAssets.Instance.BtnExitDoor.Value,
() => Simulation.SendInput.Keyboard.KeyPress(VK.VK_ESCAPE),// 点击队伍选择按钮
() => Simulation.SendInput.Keyboard.KeyPress(VK.VK_ESCAPE), // 点击队伍选择按钮
_ct,
4,
1000

View File

@@ -20,7 +20,7 @@ public static partial class Bv
/// <returns></returns>
public static async Task<bool> WaitUntilFound(RecognitionObject ro, CancellationToken ct, int retryTimes = 5, int delayMs = 1000)
{
return await NewRetry.WaitForAction(() => TaskControl.CaptureToRectArea().Find(ro).IsExist(), ct, retryTimes);
return await NewRetry.WaitForAction(() => TaskControl.CaptureToRectArea().Find(ro).IsExist(), ct, retryTimes, delayMs);
}
/// <summary>
@@ -44,7 +44,7 @@ public static partial class Bv
}
return false;
}, ct, retryTimes);
}, ct, retryTimes, delayMs);
}