diff --git a/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxModel.cs b/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxModel.cs
index 0182b56c..d87369fa 100644
--- a/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxModel.cs
+++ b/BetterGenshinImpact/Core/Recognition/ONNX/BgiOnnxModel.cs
@@ -55,6 +55,12 @@ public class BgiOnnxModel
public static readonly BgiOnnxModel BgiAvatarSide =
Register("BgiAvatarSide", @"Assets\Model\Common\avatar_side_classify_sim.onnx");
+ ///
+ /// Q技能冷却分类模型
+ ///
+ public static readonly BgiOnnxModel BgiQClassify =
+ Register("BgiQClassify", @"Assets\Model\Common\q_classify_sim.onnx");
+
///
/// paddleOCR V4 检测模型
///
@@ -144,4 +150,4 @@ public class BgiOnnxModel
RegisteredModels.Add(model);
return model;
}
-}
\ No newline at end of file
+}
diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs
index 06db3d6a..14a4bb35 100644
--- a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs
+++ b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs
@@ -1,4 +1,4 @@
-using BetterGenshinImpact.Core.Recognition.OCR;
+using BetterGenshinImpact.Core.Recognition.OCR;
using BetterGenshinImpact.Core.Recognition.OpenCv;
using BetterGenshinImpact.Core.Script.Dependence;
using BetterGenshinImpact.Core.Simulator;
@@ -24,6 +24,10 @@ using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
using BetterGenshinImpact.GameTask.AutoPathing;
using BetterGenshinImpact.GameTask.AutoPathing.Model;
using BetterGenshinImpact.GameTask.AutoPathing.Model.Enum;
+using BetterGenshinImpact.Core.Recognition.ONNX;
+using Compunet.YoloSharp;
+using Compunet.YoloSharp.Data;
+using Microsoft.Extensions.DependencyInjection;
namespace BetterGenshinImpact.GameTask.AutoFight.Model;
@@ -99,7 +103,10 @@ public class Avatar
};
private static readonly Random UnstuckRandom = new();
-
+
+ private static readonly Lazy QBurstClassifierLazy = new(() =>
+ App.ServiceProvider.GetRequiredService().CreateYoloPredictor(BgiOnnxModel.BgiQClassify));
+
public Avatar(CombatScenes combatScenes, string name, int index, Rect nameRect, double manualSkillCd = -1)
{
@@ -591,6 +598,13 @@ public class Avatar
///
public void UseBurst()
{
+ // CD 中立即返回,其余场景尝试释放
+ using var region1 = CaptureToRectArea();
+ if (IsBurstReadyByClassify(region1) == BurstReadyState.Cooldown)
+ {
+ return;
+ }
+
for (var i = 0; i < 10; i++)
{
if (Ct is { IsCancellationRequested: true })
@@ -610,9 +624,46 @@ public class Avatar
Sleep(1500, Ct);
return;
}
+ else
+ {
+ // 找到编号块判断是否进入了CD,四星角色没有大招动画
+ if (IsBurstReadyByClassify(region) == BurstReadyState.Cooldown)
+ {
+ Sleep(1500, Ct);
+ return;
+ }
+ }
}
}
+ private static BurstReadyState IsBurstReadyByClassify(ImageRegion imageRegion)
+ {
+ using var qRa = imageRegion.DeriveCrop(AutoFightAssets.Instance.QRect);
+ var result = QBurstClassifierLazy.Value.Predictor.Classify(qRa.CacheImage);
+ var topClass = result.GetTopClass();
+ var topClassName = topClass.Name.Name;
+
+ // 置信度不足时,直接返回未知,避免误判导致漏放/乱放
+ if (topClass.Confidence <= 0.7)
+ {
+ Logger.LogDebug("Q技能冷却分类置信度不足:{Confidence:F2},类别:{ClassName}", topClass.Confidence, topClassName);
+ return BurstReadyState.Unknown;
+ }
+
+ if (topClassName.Contains("cd_1", StringComparison.OrdinalIgnoreCase))
+ {
+ return BurstReadyState.Cooldown;
+ }
+
+ if (topClassName.Contains("cd_0", StringComparison.OrdinalIgnoreCase))
+ {
+ return BurstReadyState.Ready;
+ }
+
+ Logger.LogDebug("Q技能冷却分类出现未知类别:{ClassName},置信度:{Confidence:F2}", topClassName, topClass.Confidence);
+ return BurstReadyState.Unknown;
+ }
+
// ///
// /// 元素爆发是否正在CD中
// /// 右下 157x165
@@ -1098,4 +1149,4 @@ public class Avatar
return null;
}
-}
\ No newline at end of file
+}
diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/BurstReadyState.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/BurstReadyState.cs
new file mode 100644
index 00000000..75f2d0fc
--- /dev/null
+++ b/BetterGenshinImpact/GameTask/AutoFight/Model/BurstReadyState.cs
@@ -0,0 +1,9 @@
+namespace BetterGenshinImpact.GameTask.AutoFight.Model;
+
+public enum BurstReadyState
+{
+ Ready,
+ Cooldown,
+ Unknown
+}
+