mirror of
https://github.com/babalae/better-genshin-impact
synced 2025-01-07 03:17:16 +08:00
code cleanup
This commit is contained in:
parent
78ec9d31e8
commit
c490d29aa1
@ -20,7 +20,6 @@ using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using Wpf.Ui;
|
||||
|
||||
namespace BetterGenshinImpact;
|
||||
|
@ -1,4 +1,5 @@
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using BetterGenshinImpact.GameTask.AutoCook;
|
||||
using BetterGenshinImpact.GameTask.AutoDomain;
|
||||
using BetterGenshinImpact.GameTask.AutoFight;
|
||||
using BetterGenshinImpact.GameTask.AutoFishing;
|
||||
@ -13,7 +14,6 @@ using Fischless.GameCapture;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Text.Json.Serialization;
|
||||
using BetterGenshinImpact.GameTask.AutoCook;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Config;
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
using BetterGenshinImpact.Core.Recorder;
|
||||
using SharpDX.DirectInput;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
@ -4,10 +4,8 @@ using Sdcb.PaddleInference;
|
||||
using Sdcb.PaddleOCR;
|
||||
using Sdcb.PaddleOCR.Models;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recognition.OCR;
|
||||
|
||||
|
@ -1,16 +1,12 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using Microsoft.ML.OnnxRuntime;
|
||||
using Microsoft.ML.OnnxRuntime.Tensors;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv.Model;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Features2D;
|
||||
using OpenCvSharp.XFeatures2D;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using OpenCvSharp.Features2D;
|
||||
using System.Linq;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recognition.OpenCv.FeatureMatch;
|
||||
@ -415,7 +415,7 @@ public class FeatureMatcher
|
||||
var matches = flnMatcher.KnnMatch(queryDescriptors, _trainDescriptors, k: 2);
|
||||
|
||||
// 应用比例测试来过滤匹配点
|
||||
List<DMatch> goodMatches = new List<DMatch>();
|
||||
List<DMatch> goodMatches = [];
|
||||
foreach (var match in matches)
|
||||
{
|
||||
if (match.Length == 2 && match[0].Distance < 0.75 * match[1].Distance)
|
||||
|
@ -155,7 +155,7 @@ public class MatchTemplateHelper
|
||||
/// <returns></returns>
|
||||
public static List<Rect> MatchMultiPicForOnePic(Mat srcMat, List<Mat> imgSubList, double threshold = 0.8)
|
||||
{
|
||||
List<Rect> list = new();
|
||||
List<Rect> list = [];
|
||||
foreach (var sub in imgSubList)
|
||||
while (true)
|
||||
{
|
||||
@ -185,7 +185,7 @@ public class MatchTemplateHelper
|
||||
/// <returns></returns>
|
||||
public static List<Rect> MatchOnePicForOnePic(Mat srcMat, Mat dstMat, Mat? maskMat = null, double threshold = 0.8)
|
||||
{
|
||||
List<Rect> list = new();
|
||||
List<Rect> list = [];
|
||||
|
||||
while (true)
|
||||
{
|
||||
@ -217,7 +217,7 @@ public class MatchTemplateHelper
|
||||
/// <returns></returns>
|
||||
public static List<Rect> MatchOnePicForOnePic(Mat srcMat, Mat dstMat, TemplateMatchModes matchMode, Mat? maskMat, double threshold, int maxCount = -1)
|
||||
{
|
||||
List<Rect> list = new();
|
||||
List<Rect> list = [];
|
||||
|
||||
if (maxCount < 0)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recognition.OpenCv.Model;
|
||||
|
||||
@ -9,7 +9,7 @@ namespace BetterGenshinImpact.Core.Recognition.OpenCv.Model;
|
||||
/// </summary>
|
||||
public class KeyPointFeatureBlock
|
||||
{
|
||||
public List<KeyPoint> KeyPointList { get; set; } = new();
|
||||
public List<KeyPoint> KeyPointList { get; set; } = [];
|
||||
|
||||
private KeyPoint[]? keyPointArray;
|
||||
|
||||
@ -25,7 +25,7 @@ public class KeyPointFeatureBlock
|
||||
/// <summary>
|
||||
/// 在完整 KeyPoint[] 中的下标
|
||||
/// </summary>
|
||||
public List<int> KeyPointIndexList { get; set; } = new();
|
||||
public List<int> KeyPointIndexList { get; set; } = [];
|
||||
|
||||
public Mat? Descriptor;
|
||||
|
||||
|
@ -123,26 +123,26 @@ public class RecognitionObject
|
||||
/// <summary>
|
||||
/// 部分文字识别结果不准确,进行替换。可选。
|
||||
/// </summary>
|
||||
public Dictionary<string, string[]> ReplaceDictionary { get; set; } = new();
|
||||
public Dictionary<string, string[]> ReplaceDictionary { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 包含匹配
|
||||
/// 多个值全匹配的情况下才算成功
|
||||
/// 复杂情况请用下面的正则匹配
|
||||
/// </summary>
|
||||
public List<string> AllContainMatchText { get; set; } = new();
|
||||
public List<string> AllContainMatchText { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 包含匹配
|
||||
/// 一个值匹配就算成功
|
||||
/// </summary>
|
||||
public List<string> OneContainMatchText { get; set; } = new();
|
||||
public List<string> OneContainMatchText { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 正则匹配
|
||||
/// 多个值全匹配的情况下才算成功
|
||||
/// </summary>
|
||||
public List<string> RegexMatchText { get; set; } = new();
|
||||
public List<string> RegexMatchText { get; set; } = [];
|
||||
|
||||
#endregion OCR文字识别
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ public class GlobalKeyMouseRecord : Singleton<GlobalKeyMouseRecord>
|
||||
|
||||
private KeyMouseRecorder? _recorder;
|
||||
|
||||
private readonly Dictionary<Keys, bool> _keyDownState = new();
|
||||
private readonly Dictionary<Keys, bool> _keyDownState = [];
|
||||
|
||||
private DirectInputMonitor? _directInputMonitor;
|
||||
|
||||
@ -147,7 +147,7 @@ public class GlobalKeyMouseRecord : Singleton<GlobalKeyMouseRecord>
|
||||
return;
|
||||
}
|
||||
|
||||
if (_keyDownState.ContainsKey(e.KeyCode) && _keyDownState[e.KeyCode])
|
||||
if (_keyDownState.TryGetValue(e.KeyCode, out bool state) && state)
|
||||
{
|
||||
// Debug.WriteLine($"KeyUp: {e.KeyCode}");
|
||||
_keyDownState[e.KeyCode] = false;
|
||||
|
@ -1,6 +1,10 @@
|
||||
using BetterGenshinImpact.Core.Recorder.Model;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
@ -8,10 +12,6 @@ using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Vanara.PInvoke;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recorder;
|
||||
|
@ -1,14 +1,14 @@
|
||||
using BetterGenshinImpact.Core.Recorder.Model;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using Gma.System.MouseKeyHook;
|
||||
using SharpDX.DirectInput;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Windows.Forms;
|
||||
using SharpDX.DirectInput;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Recorder;
|
||||
|
||||
|
@ -1,9 +1,6 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model;
|
||||
using BetterGenshinImpact.GameTask;
|
||||
using Microsoft.ClearScript;
|
||||
using Microsoft.ClearScript.V8;
|
||||
using System;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script.Dependence;
|
||||
|
||||
@ -18,7 +15,7 @@ public class Dispatcher
|
||||
var realtimeTimer = timer;
|
||||
if (realtimeTimer == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(RealtimeTimer), "实时任务对象不能为空");
|
||||
throw new ArgumentNullException(nameof(realtimeTimer), "实时任务对象不能为空");
|
||||
}
|
||||
if (string.IsNullOrEmpty(realtimeTimer.Name))
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script.Dependence;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Core.Script.Utils;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.Core.Script.Utils;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script.Dependence;
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
using BetterGenshinImpact.Core.Script.Dependence;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model;
|
||||
using Microsoft.ClearScript;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script;
|
||||
|
@ -1,9 +1,9 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using BetterGenshinImpact.Service;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Specialized;
|
||||
using System.Text.Json;
|
||||
using BetterGenshinImpact.Service;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script.Group;
|
||||
|
||||
|
@ -1,9 +1,8 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Service;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Windows.Documents;
|
||||
using BetterGenshinImpact.Service;
|
||||
|
||||
namespace BetterGenshinImpact.Core.Script.Project;
|
||||
|
||||
|
@ -125,7 +125,7 @@ public class PostMessageSimulator
|
||||
//User32.PostMessage(_hWnd, User32.WindowMessage.WM_ACTIVATE, 1, 0);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYDOWN, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_CHAR, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -134,7 +134,7 @@ public class PostMessageSimulator
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYDOWN, (nint)vk, 0x1e0001);
|
||||
Thread.Sleep(ms);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_CHAR, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -143,7 +143,7 @@ public class PostMessageSimulator
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYDOWN, (nint)vk, 0x1e0001);
|
||||
Thread.Sleep(1000);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_CHAR, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -155,7 +155,7 @@ public class PostMessageSimulator
|
||||
|
||||
public PostMessageSimulator KeyUp(User32.VK vk)
|
||||
{
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ public class PostMessageSimulator
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_ACTIVATE, 1, 0);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYDOWN, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_CHAR, (nint)vk, 0x1e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -178,7 +178,7 @@ public class PostMessageSimulator
|
||||
public PostMessageSimulator KeyUpBackground(User32.VK vk)
|
||||
{
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_ACTIVATE, 1, 0);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001);
|
||||
User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, unchecked((nint)0xc01e0001));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,6 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using static Vanara.PInvoke.User32;
|
||||
|
||||
@ -306,7 +305,7 @@ public class AutoDomainTask
|
||||
|
||||
private Task StartFight(CombatScenes combatScenes, List<CombatCommand> combatCommands)
|
||||
{
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
CancellationTokenSource cts = new();
|
||||
_taskParam.Cts.Token.Register(cts.Cancel);
|
||||
combatScenes.BeforeTask(cts);
|
||||
// 战斗操作
|
||||
@ -412,7 +411,7 @@ public class AutoDomainTask
|
||||
/// </summary>
|
||||
private Task FindPetrifiedTree()
|
||||
{
|
||||
CancellationTokenSource treeCts = new CancellationTokenSource();
|
||||
CancellationTokenSource treeCts = new();
|
||||
_taskParam.Cts.Token.Register(treeCts.Cancel);
|
||||
// 中键回正视角
|
||||
Simulation.SendInput.Mouse.MiddleButtonClick();
|
||||
|
@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using OpenCvSharp;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Assets;
|
||||
|
||||
|
@ -1,9 +1,5 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight;
|
||||
|
||||
|
@ -1,10 +1,5 @@
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight;
|
||||
|
||||
|
@ -44,6 +44,6 @@ public class CombatAvatar
|
||||
/// <summary>
|
||||
/// 别名
|
||||
/// </summary>
|
||||
public List<string> Alias { get; set; } = new();
|
||||
public List<string> Alias { get; set; } = [];
|
||||
|
||||
}
|
@ -27,12 +27,7 @@ public class DefaultAutoFightConfig
|
||||
|
||||
public static string AvatarAliasToStandardName(string alias)
|
||||
{
|
||||
var avatar = CombatAvatars.Find(x => x.Alias.Contains(alias));
|
||||
if (avatar == null)
|
||||
{
|
||||
throw new Exception($"角色名称校验失败:{alias}");
|
||||
}
|
||||
|
||||
var avatar = CombatAvatars.Find(x => x.Alias.Contains(alias)) ?? throw new Exception($"角色名称校验失败:{alias}");
|
||||
return avatar.Name;
|
||||
}
|
||||
}
|
||||
|
@ -1,19 +1,16 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Config;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using Vanara.PInvoke;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using static Vanara.PInvoke.User32;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
|
||||
@ -218,7 +215,7 @@ public class Avatar
|
||||
if (contours.Length > 0)
|
||||
{
|
||||
var boxes = contours.Select(Cv2.BoundingRect).Where(w => w.Width >= 20 * assetScale && w.Height >= 18 * assetScale).OrderByDescending(w => w.Width).ToList();
|
||||
if (boxes.Any())
|
||||
if (boxes.Count is not 0)
|
||||
{
|
||||
IndexRect = boxes.First();
|
||||
return false;
|
||||
|
@ -1,9 +1,10 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Recognition.ONNX;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Assets;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Config;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using Compunet.YoloV8;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@ -18,8 +19,6 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.Core.Recognition.ONNX;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
@ -34,7 +33,7 @@ public class CombatScenes : IDisposable
|
||||
/// </summary>
|
||||
public Avatar[] Avatars { get; set; } = new Avatar[1];
|
||||
|
||||
public Dictionary<string, Avatar> AvatarMap { get; set; } = new();
|
||||
public Dictionary<string, Avatar> AvatarMap { get; set; } = [];
|
||||
|
||||
public int AvatarCount { get; set; }
|
||||
|
||||
@ -70,9 +69,9 @@ public class CombatScenes : IDisposable
|
||||
if (!string.IsNullOrEmpty(pair.Item2))
|
||||
{
|
||||
var costumeName = pair.Item2;
|
||||
if (AutoFightAssets.Instance.AvatarCostumeMap.ContainsKey(costumeName))
|
||||
if (AutoFightAssets.Instance.AvatarCostumeMap.TryGetValue(costumeName, out string? name))
|
||||
{
|
||||
costumeName = AutoFightAssets.Instance.AvatarCostumeMap[costumeName];
|
||||
costumeName = name;
|
||||
}
|
||||
|
||||
displayNames[i] = $"{pair.Item1}({costumeName})";
|
||||
@ -83,7 +82,7 @@ public class CombatScenes : IDisposable
|
||||
}
|
||||
}
|
||||
Logger.LogInformation("识别到的队伍角色:{Text}", string.Join(",", displayNames));
|
||||
Avatars = BuildAvatars(names.ToList());
|
||||
Avatars = BuildAvatars([.. names]);
|
||||
AvatarMap = Avatars.ToDictionary(x => x.Name);
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -145,7 +144,7 @@ public class CombatScenes : IDisposable
|
||||
|
||||
private void InitializeTeamFromConfig(string teamNames)
|
||||
{
|
||||
var names = teamNames.Split(new[] { ",", "," }, StringSplitOptions.TrimEntries);
|
||||
var names = teamNames.Split([",", ","], StringSplitOptions.TrimEntries);
|
||||
if (names.Length != 4)
|
||||
{
|
||||
throw new Exception($"强制指定队伍角色数量不正确,必须是4个,当前{names.Length}个");
|
||||
@ -159,7 +158,7 @@ public class CombatScenes : IDisposable
|
||||
|
||||
Logger.LogInformation("强制指定队伍角色:{Text}", string.Join(",", names));
|
||||
TaskContext.Instance().Config.AutoFightConfig.TeamNames = string.Join(",", names);
|
||||
Avatars = BuildAvatars(names.ToList());
|
||||
Avatars = BuildAvatars([.. names]);
|
||||
AvatarMap = Avatars.ToDictionary(x => x.Name);
|
||||
}
|
||||
|
||||
@ -232,8 +231,8 @@ public class CombatScenes : IDisposable
|
||||
[Obsolete]
|
||||
private void ParseTeamOcrResult(PaddleOcrResult result, ImageRegion rectArea)
|
||||
{
|
||||
List<string> names = new();
|
||||
List<Rect> nameRects = new();
|
||||
List<string> names = [];
|
||||
List<Rect> nameRects = [];
|
||||
foreach (var item in result.Regions)
|
||||
{
|
||||
var name = StringUtils.ExtractChinese(item.Text);
|
||||
|
@ -1,18 +1,18 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Script;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.Model;
|
||||
using BetterGenshinImpact.Service;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
using BetterGenshinImpact.Model;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using System.Threading.Tasks;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Script;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.Service;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight;
|
||||
|
||||
@ -193,7 +193,7 @@ public class OneKeyFightTask : Singleton<OneKeyFightTask>
|
||||
var avatarMacros = JsonSerializer.Deserialize<List<AvatarMacro>>(json, ConfigService.JsonOptions);
|
||||
if (avatarMacros == null)
|
||||
{
|
||||
return new Dictionary<string, List<CombatCommand>>();
|
||||
return [];
|
||||
}
|
||||
var result = new Dictionary<string, List<CombatCommand>>();
|
||||
foreach (var avatarMacro in avatarMacros)
|
||||
|
@ -2,7 +2,6 @@
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Input;
|
||||
using TimeSpan = System.TimeSpan;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Script;
|
||||
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
using System.Collections.Generic;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Model;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Script;
|
||||
|
@ -50,7 +50,7 @@ public class CombatScriptParser
|
||||
public static CombatScript Parse(string path)
|
||||
{
|
||||
var script = File.ReadAllText(path);
|
||||
var lines = script.Split(new[] { "\r\n", "\r", "\n", ";" }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var lines = script.Split(["\r\n", "\r", "\n", ";"], StringSplitOptions.RemoveEmptyEntries);
|
||||
var result = new List<string>();
|
||||
foreach (var line in lines)
|
||||
{
|
||||
@ -58,7 +58,7 @@ public class CombatScriptParser
|
||||
.Replace("(", "(")
|
||||
.Replace(")", ")")
|
||||
.Replace(",", ",");
|
||||
if (l.StartsWith("//") || l.StartsWith("#") || string.IsNullOrEmpty(l))
|
||||
if (l.StartsWith("//") || l.StartsWith('#') || string.IsNullOrEmpty(l))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -74,8 +74,8 @@ public class CombatScriptParser
|
||||
|
||||
public static CombatScript Parse(List<string> lines)
|
||||
{
|
||||
List<CombatCommand> combatCommands = new();
|
||||
HashSet<string> combatAvatarNames = new();
|
||||
List<CombatCommand> combatCommands = [];
|
||||
HashSet<string> combatAvatarNames = [];
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var oneLineCombatCommands = ParseLine(line, combatAvatarNames);
|
||||
@ -120,7 +120,7 @@ public class CombatScriptParser
|
||||
continue;
|
||||
}
|
||||
|
||||
if (command.Contains("(") && !command.Contains(")"))
|
||||
if (command.Contains('(') && !command.Contains(')'))
|
||||
{
|
||||
var j = i + 1;
|
||||
// 括号被逗号分隔,需要合并
|
||||
@ -133,7 +133,7 @@ public class CombatScriptParser
|
||||
throw new Exception("战斗脚本格式错误,指令括号无法配对");
|
||||
}
|
||||
|
||||
if (command.Contains(")"))
|
||||
if (command.Contains(')'))
|
||||
{
|
||||
i = j;
|
||||
break;
|
||||
@ -142,7 +142,7 @@ public class CombatScriptParser
|
||||
j++;
|
||||
}
|
||||
|
||||
if (!(command.Contains("(") && command.Contains(")")))
|
||||
if (!(command.Contains('(') && command.Contains(')')))
|
||||
{
|
||||
Logger.LogError("战斗脚本格式错误,指令 {Cmd} 括号不完整", command);
|
||||
throw new Exception("战斗脚本格式错误,指令括号不完整");
|
||||
|
@ -1,36 +1,36 @@
|
||||
using System;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFight.Script;
|
||||
|
||||
public class Method
|
||||
{
|
||||
public static readonly Method Skill = new(new() { "skill", "e" });
|
||||
public static readonly Method Burst = new(new() { "burst", "q" });
|
||||
public static readonly Method Attack = new(new() { "attack", "普攻", "普通攻击" });
|
||||
public static readonly Method Charge = new(new() { "charge", "重击" });
|
||||
public static readonly Method Wait = new(new() { "wait", "after", "等待" });
|
||||
public static readonly Method Skill = new(["skill", "e"]);
|
||||
public static readonly Method Burst = new(["burst", "q"]);
|
||||
public static readonly Method Attack = new(["attack", "普攻", "普通攻击"]);
|
||||
public static readonly Method Charge = new(["charge", "重击"]);
|
||||
public static readonly Method Wait = new(["wait", "after", "等待"]);
|
||||
|
||||
public static readonly Method Walk = new(new() { "walk", "行走" });
|
||||
public static readonly Method W = new(new() { "w" });
|
||||
public static readonly Method A = new(new() { "a" });
|
||||
public static readonly Method S = new(new() { "s" });
|
||||
public static readonly Method D = new(new() { "d" });
|
||||
public static readonly Method Walk = new(["walk", "行走"]);
|
||||
public static readonly Method W = new(["w"]);
|
||||
public static readonly Method A = new(["a"]);
|
||||
public static readonly Method S = new(["s"]);
|
||||
public static readonly Method D = new(["d"]);
|
||||
|
||||
public static readonly Method Aim = new(new() { "aim", "r", "瞄准" });
|
||||
public static readonly Method Dash = new(new() { "dash", "冲刺" });
|
||||
public static readonly Method Jump = new(new() { "jump", "j", "跳跃" });
|
||||
public static readonly Method Aim = new(["aim", "r", "瞄准"]);
|
||||
public static readonly Method Dash = new(["dash", "冲刺"]);
|
||||
public static readonly Method Jump = new(["jump", "j", "跳跃"]);
|
||||
|
||||
// 宏
|
||||
public static readonly Method MouseDown = new(new() { "mousedown" });
|
||||
public static readonly Method MouseUp = new(new() { "mouseup" });
|
||||
public static readonly Method Click = new(new() { "click" });
|
||||
public static readonly Method MoveBy = new(new() { "moveby" });
|
||||
public static readonly Method KeyDown = new(new() { "keydown" });
|
||||
public static readonly Method KeyUp = new(new() { "keyup" });
|
||||
public static readonly Method KeyPress = new(new() { "keypress" });
|
||||
public static readonly Method MouseDown = new(["mousedown"]);
|
||||
public static readonly Method MouseUp = new(["mouseup"]);
|
||||
public static readonly Method Click = new(["click"]);
|
||||
public static readonly Method MoveBy = new(["moveby"]);
|
||||
public static readonly Method KeyDown = new(["keydown"]);
|
||||
public static readonly Method KeyUp = new(["keyup"]);
|
||||
public static readonly Method KeyPress = new(["keypress"]);
|
||||
|
||||
public static IEnumerable<Method> Values
|
||||
{
|
||||
|
@ -1,6 +1,5 @@
|
||||
using OpenCvSharp;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using System;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing;
|
||||
|
||||
|
@ -2,18 +2,16 @@
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Recognition.ONNX;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.AutoFishing.Assets;
|
||||
using BetterGenshinImpact.GameTask.AutoFishing.Model;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using BetterGenshinImpact.Model;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using Compunet.YoloV8;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
@ -23,8 +21,6 @@ using System.Diagnostics;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using static Vanara.PInvoke.User32;
|
||||
using Color = System.Drawing.Color;
|
||||
using Pen = System.Drawing.Pen;
|
||||
|
@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing.Model;
|
||||
|
||||
|
@ -44,7 +44,7 @@ public class FishType
|
||||
public static readonly FishType MaintenanceMekPlatinumCollection = new("maintenance mek- platinum collection", "flashing maintenance mek bait", "维护机关·白金典藏型");
|
||||
public static readonly FishType MaintenanceMekSituationController = new("maintenance mek- situation controller", "flashing maintenance mek bait", "维护机关·态势控制者");
|
||||
public static readonly FishType MaintenanceMekWaterBodyCleaner = new("maintenance mek- water body cleaner", "flashing maintenance mek bait", "维护机关·水域清理者");
|
||||
public static readonly FishType MaintenanceMekWaterGoldLeader = new ("maintenance mek- gold leader", "flashing maintenance mek bait", "维护机关·澄金领队型");
|
||||
public static readonly FishType MaintenanceMekWaterGoldLeader = new("maintenance mek- gold leader", "flashing maintenance mek bait", "维护机关·澄金领队型");
|
||||
|
||||
|
||||
public static IEnumerable<FishType> Values
|
||||
|
@ -1,10 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using Compunet.YoloV8.Data;
|
||||
using OpenCvSharp;
|
||||
using static OpenCvSharp.Cv2;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing.Model;
|
||||
|
||||
@ -23,7 +22,7 @@ public class Fishpond
|
||||
/// <summary>
|
||||
/// 鱼池中的鱼
|
||||
/// </summary>
|
||||
public List<OneFish> Fishes { get; set; } = new();
|
||||
public List<OneFish> Fishes { get; set; } = [];
|
||||
|
||||
public Fishpond(DetectionResult result)
|
||||
{
|
||||
@ -45,7 +44,7 @@ public class Fishpond
|
||||
}
|
||||
|
||||
// 可信度最高的鱼放在最前面
|
||||
Fishes = Fishes.OrderByDescending(fish => fish.Confidence).ToList();
|
||||
Fishes = [.. Fishes.OrderByDescending(fish => fish.Confidence)];
|
||||
|
||||
FishpondRect = CalculateFishpondRect();
|
||||
}
|
||||
@ -98,7 +97,7 @@ public class Fishpond
|
||||
/// <returns></returns>
|
||||
public List<OneFish> FilterByBaitName(string baitName)
|
||||
{
|
||||
return Fishes.Where(fish => fish.FishType.BaitName == baitName).OrderByDescending(fish => fish.Confidence).ToList();
|
||||
return [.. Fishes.Where(fish => fish.FishType.BaitName == baitName).OrderByDescending(fish => fish.Confidence)];
|
||||
}
|
||||
|
||||
public OneFish? FilterByBaitNameAndRecently(string baitName, Rect prevTargetFishRect)
|
||||
@ -132,10 +131,10 @@ public class Fishpond
|
||||
/// <returns></returns>
|
||||
public string MostMatchBait()
|
||||
{
|
||||
Dictionary<string, int> dict = new();
|
||||
Dictionary<string, int> dict = [];
|
||||
foreach (var fish in Fishes)
|
||||
{
|
||||
if (dict.ContainsKey(fish.FishType.BaitName))
|
||||
if (dict.TryGetValue(fish.FishType.BaitName, out _))
|
||||
{
|
||||
dict[fish.FishType.BaitName]++;
|
||||
}
|
||||
|
@ -1,20 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing;
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing;
|
||||
|
||||
public record RodInput
|
||||
{
|
||||
public double rod_x1;
|
||||
public double rod_x2;
|
||||
public double rod_y1;
|
||||
public double rod_y2;
|
||||
public double fish_x1;
|
||||
public double fish_x2;
|
||||
public double fish_y1;
|
||||
public double fish_y2;
|
||||
public int fish_label;
|
||||
public double rod_x1;
|
||||
public double rod_x2;
|
||||
public double rod_y1;
|
||||
public double rod_y2;
|
||||
public double fish_x1;
|
||||
public double fish_x2;
|
||||
public double fish_y1;
|
||||
public double fish_y2;
|
||||
public int fish_label;
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoFishing;
|
||||
|
||||
@ -11,10 +11,10 @@ public class RodNet
|
||||
{
|
||||
const double alpha = 1734.34 / 2.5;
|
||||
|
||||
static readonly double[] dz = { 0.561117562965, 0.637026851288, 0.705579317577,
|
||||
static readonly double[] dz = [ 0.561117562965, 0.637026851288, 0.705579317577,
|
||||
1.062734463845, 0.949307580751, 1.015620474332,
|
||||
1.797904203405, 1.513476738412, 1.013873007495,
|
||||
1.159949954831, 1.353650974146, 1.302893195071 };
|
||||
1.159949954831, 1.353650974146, 1.302893195071 ];
|
||||
|
||||
static readonly double[,] theta = {
|
||||
{-0.262674397633, 0.317025388945, -0.457150765450, 0.174522158281,
|
||||
@ -31,10 +31,10 @@ public class RodNet
|
||||
-1.285988918494}
|
||||
};
|
||||
|
||||
static readonly double[] B = { 1.241950004386, 3.051113640564, -3.848898190087 };
|
||||
static readonly double[] B = [1.241950004386, 3.051113640564, -3.848898190087];
|
||||
|
||||
static readonly double[] offset = { 0.4, 0.2, 0.4, 0, 0.3, 0.3,
|
||||
0.3, 0.15, 0.5, 0.5, 0.5, 0.5 };
|
||||
static readonly double[] offset = [ 0.4, 0.2, 0.4, 0, 0.3, 0.3,
|
||||
0.3, 0.15, 0.5, 0.5, 0.5, 0.5 ];
|
||||
|
||||
static void F(double[] dst, double[] x, double[] y)
|
||||
{
|
||||
@ -124,9 +124,7 @@ public class RodNet
|
||||
|
||||
if (a < b)
|
||||
{
|
||||
double temp = a;
|
||||
a = b;
|
||||
b = temp;
|
||||
(b, a) = (a, b);
|
||||
}
|
||||
|
||||
v0 = (288 - (input.rod_y1 + input.rod_y2) / 2) / alpha;
|
||||
@ -135,8 +133,8 @@ public class RodNet
|
||||
v = (288 - (input.fish_y1 + input.fish_y2) / 2) / alpha;
|
||||
|
||||
double[] y0z0t = new double[3];
|
||||
double[] abv0 = { a, b, v0 };
|
||||
double[] init = { 30, 15, 1 };
|
||||
double[] abv0 = [a, b, v0];
|
||||
double[] init = [30, 15, 1];
|
||||
|
||||
bool solveSuccess = NewtonRaphson(F, DfInv, y0z0t, abv0, init, 3, 1000, 1e-6);
|
||||
|
||||
@ -166,7 +164,7 @@ public class RodNet
|
||||
|
||||
public static int GetRodState(Rect rod, Rect fish, int fishTypeIndex)
|
||||
{
|
||||
RodInput input = new RodInput
|
||||
RodInput input = new()
|
||||
{
|
||||
rod_x1 = rod.Left,
|
||||
rod_x2 = rod.Right,
|
||||
|
@ -1,11 +1,7 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OpenCvSharp;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
|
||||
@ -19,12 +15,12 @@ public partial class AutoGeniusInvokationConfig : ObservableObject
|
||||
|
||||
[ObservableProperty] private int _sleepDelay = 0;
|
||||
|
||||
public List<Rect> DefaultCharacterCardRects { get; set; } = new()
|
||||
{
|
||||
public List<Rect> DefaultCharacterCardRects { get; set; } =
|
||||
[
|
||||
new(667, 632, 165, 282),
|
||||
new(877, 632, 165, 282),
|
||||
new(1088, 632, 165, 282)
|
||||
};
|
||||
];
|
||||
|
||||
|
||||
/// <summary>
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
using static Vanara.PInvoke.Gdi32;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
|
||||
@ -16,6 +10,6 @@ public class AutoGeniusInvokationTask
|
||||
// 读取策略信息
|
||||
var duel = ScriptParser.Parse(taskParam.StrategyContent);
|
||||
SystemControl.ActivateWindow();
|
||||
duel.RunAsync(taskParam);
|
||||
duel.RunAsync(taskParam).SafeForget();
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Config;
|
||||
|
||||
@ -47,12 +47,12 @@ public class SkillsItem
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public List<string> SkillTag { get; set; } = new();
|
||||
public List<string> SkillTag { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public List<CostItem> Cost { get; set; } = new();
|
||||
public List<CostItem> Cost { get; set; } = [];
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
@ -101,7 +101,7 @@ public class CharacterCard
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public List<SkillsItem> Skills { get; set; } = new();
|
||||
public List<SkillsItem> Skills { get; set; } = [];
|
||||
|
||||
public static void CopyCardProperty(Character source, CharacterCard characterCard)
|
||||
{
|
||||
|
@ -5,6 +5,8 @@ using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
@ -12,12 +14,10 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using Point = OpenCvSharp.Point;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using Point = OpenCvSharp.Point;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
|
||||
@ -1041,7 +1041,7 @@ public class GeniusInvokationControl
|
||||
var srcMat = CaptureGameMat();
|
||||
|
||||
int halfHeight = srcMat.Height / 2;
|
||||
Mat bottomMat = new Mat(srcMat, new Rect(0, halfHeight, srcMat.Width, srcMat.Height - halfHeight));
|
||||
Mat bottomMat = new(srcMat, new Rect(0, halfHeight, srcMat.Width, srcMat.Height - halfHeight));
|
||||
|
||||
var lowPurple = new Scalar(239, 239, 239);
|
||||
var highPurple = new Scalar(255, 255, 255);
|
||||
@ -1056,10 +1056,11 @@ public class GeniusInvokationControl
|
||||
if (contours.Length > 0)
|
||||
{
|
||||
// .Where(w => w.Width > 1 && w.Height >= 5)
|
||||
var rects = contours.Select(Cv2.BoundingRect).ToList();
|
||||
|
||||
// 按照Y轴高度排序
|
||||
rects = rects.OrderBy(r => r.Y).ToList();
|
||||
var rects = contours
|
||||
.Select(Cv2.BoundingRect)
|
||||
// 按照Y轴高度排序
|
||||
.OrderBy(r => r.Y)
|
||||
.ToList();
|
||||
|
||||
// 第一个和角色卡重叠的矩形
|
||||
foreach (var rect in rects)
|
||||
@ -1142,7 +1143,7 @@ public class GeniusInvokationControl
|
||||
if (!string.IsNullOrWhiteSpace(text))
|
||||
{
|
||||
var hp = -2;
|
||||
if (Regex.IsMatch(text, @"^[0-9]+$"))
|
||||
if (RegexHelper.FullNumberRegex().IsMatch(text))
|
||||
{
|
||||
hp = int.Parse(text);
|
||||
}
|
||||
@ -1223,7 +1224,7 @@ public class GeniusInvokationControl
|
||||
#endif
|
||||
return -10;
|
||||
}
|
||||
else if (Regex.IsMatch(text, @"^[0-9]+$"))
|
||||
else if (RegexHelper.FullNumberRegex().IsMatch(text))
|
||||
{
|
||||
_logger.LogInformation("通过OCR识别当前骰子数量: {Text}", text);
|
||||
return int.Parse(text);
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
|
||||
|
@ -7,7 +7,7 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
/// <summary>
|
||||
/// 角色
|
||||
/// </summary>
|
||||
public Character Character { get; set; }
|
||||
public Character Character { get; set; } = default!;
|
||||
|
||||
public ActionEnum Action { get; set; }
|
||||
|
||||
@ -16,7 +16,7 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
/// </summary>
|
||||
public int TargetIndex { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
public override string? ToString()
|
||||
{
|
||||
if (Action == ActionEnum.UseSkill)
|
||||
{
|
||||
|
@ -12,34 +12,24 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
public static ActionEnum ChineseToActionEnum(this string type)
|
||||
{
|
||||
type = type.ToLower();
|
||||
switch (type)
|
||||
return type switch
|
||||
{
|
||||
case "出战":
|
||||
//return ActionEnum.ChooseFirst;
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
case "切换":
|
||||
//return ActionEnum.SwitchLater;
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
case "使用":
|
||||
return ActionEnum.UseSkill;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
"出战" => /* ActionEnum.ChooseFirst, */ throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
"切换" => /* ActionEnum.SwitchLater, */ throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
"使用" => ActionEnum.UseSkill,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
};
|
||||
}
|
||||
|
||||
public static string ToChinese(this ActionEnum type)
|
||||
{
|
||||
switch (type)
|
||||
return type switch
|
||||
{
|
||||
case ActionEnum.ChooseFirst:
|
||||
return "出战";
|
||||
case ActionEnum.SwitchLater:
|
||||
return "切换";
|
||||
case ActionEnum.UseSkill:
|
||||
return "使用";
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
ActionEnum.ChooseFirst => "出战",
|
||||
ActionEnum.SwitchLater => "切换",
|
||||
ActionEnum.UseSkill => "使用",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
{
|
||||
@ -16,9 +16,9 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
/// </summary>
|
||||
public int Index { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
public string Name { get; set; } = default!;
|
||||
public ElementalType Element { get; set; }
|
||||
public Skill[] Skills { get; set; }
|
||||
public Skill[] Skills { get; set; } = default!;
|
||||
|
||||
|
||||
/// <summary>
|
||||
@ -46,7 +46,7 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
/// <summary>
|
||||
/// 角色身上的负面状态
|
||||
/// </summary>
|
||||
public List<CharacterStatusEnum> StatusList { get; set; } = new List<CharacterStatusEnum>();
|
||||
public List<CharacterStatusEnum> StatusList { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 角色区域
|
||||
@ -60,7 +60,7 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringBuilder sb = new();
|
||||
sb.Append($"角色{Index},");
|
||||
if (Hp != -2)
|
||||
{
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
public enum CharacterStatusEnum
|
||||
{
|
||||
Frozen,
|
||||
Frozen,
|
||||
Dizziness
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@ -22,13 +21,13 @@ public class Duel
|
||||
{
|
||||
private readonly ILogger<Duel> _logger = App.GetLogger<Duel>();
|
||||
|
||||
public Character CurrentCharacter { get; set; }
|
||||
public Character CurrentCharacter { get; set; } = default!;
|
||||
public Character[] Characters { get; set; } = new Character[4];
|
||||
|
||||
/// <summary>
|
||||
/// 行动指令队列
|
||||
/// </summary>
|
||||
public List<ActionCommand> ActionCommandQueue { get; set; } = new List<ActionCommand>();
|
||||
public List<ActionCommand> ActionCommandQueue { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 当前回合数
|
||||
@ -38,7 +37,7 @@ public class Duel
|
||||
/// <summary>
|
||||
/// 角色牌位置
|
||||
/// </summary>
|
||||
public List<Rect> CharacterCardRects { get; set; }
|
||||
public List<Rect> CharacterCardRects { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 手牌数量
|
||||
@ -50,7 +49,7 @@ public class Duel
|
||||
/// </summary>
|
||||
public int CurrentDiceCount { get; set; } = 0;
|
||||
|
||||
public CancellationTokenSource Cts { get; set; }
|
||||
public CancellationTokenSource Cts { get; set; } = default!;
|
||||
|
||||
private int _keqingECount = 0;
|
||||
|
||||
@ -95,7 +94,7 @@ public class Duel
|
||||
|
||||
if (CharacterCardRects is not { Count: 3 })
|
||||
{
|
||||
CharacterCardRects = new List<Rect>();
|
||||
CharacterCardRects = [];
|
||||
var defaultCharacterCardRects = TaskContext.Instance().Config.AutoGeniusInvokationConfig.DefaultCharacterCardRects;
|
||||
var assetScale = TaskContext.Instance().SystemInfo.AssetScale;
|
||||
for (var i = 0; i < defaultCharacterCardRects.Count; i++)
|
||||
@ -135,7 +134,7 @@ public class Duel
|
||||
var elementSet = PredictionDiceType();
|
||||
|
||||
// 0 投骰子
|
||||
GeniusInvokationControl.GetInstance().ReRollDice(elementSet.ToArray());
|
||||
GeniusInvokationControl.GetInstance().ReRollDice([.. elementSet]);
|
||||
|
||||
// 等待到我的回合 // 投骰子动画时间是不确定的 // 可能是对方先手
|
||||
GeniusInvokationControl.GetInstance().WaitForMyTurn(this, 1000);
|
||||
@ -429,7 +428,7 @@ public class Duel
|
||||
/// <returns></returns>
|
||||
public List<int> GetCharacterSwitchOrder()
|
||||
{
|
||||
List<int> orderList = new List<int>();
|
||||
List<int> orderList = [];
|
||||
for (var i = 0; i < ActionCommandQueue.Count; i++)
|
||||
{
|
||||
if (!orderList.Contains(ActionCommandQueue[i].Character.Index))
|
||||
|
@ -19,83 +19,56 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
public static ElementalType ToElementalType(this string type)
|
||||
{
|
||||
type = type.ToLower();
|
||||
switch (type)
|
||||
return type switch
|
||||
{
|
||||
case "omni":
|
||||
return ElementalType.Omni;
|
||||
case "cryo":
|
||||
return ElementalType.Cryo;
|
||||
case "hydro":
|
||||
return ElementalType.Hydro;
|
||||
case "pyro":
|
||||
return ElementalType.Pyro;
|
||||
case "electro":
|
||||
return ElementalType.Electro;
|
||||
case "dendro":
|
||||
return ElementalType.Dendro;
|
||||
case "anemo":
|
||||
return ElementalType.Anemo;
|
||||
case "geo":
|
||||
return ElementalType.Geo;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
"omni" => ElementalType.Omni,
|
||||
"cryo" => ElementalType.Cryo,
|
||||
"hydro" => ElementalType.Hydro,
|
||||
"pyro" => ElementalType.Pyro,
|
||||
"electro" => ElementalType.Electro,
|
||||
"dendro" => ElementalType.Dendro,
|
||||
"anemo" => ElementalType.Anemo,
|
||||
"geo" => ElementalType.Geo,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
};
|
||||
}
|
||||
|
||||
public static ElementalType ChineseToElementalType(this string type)
|
||||
{
|
||||
type = type.ToLower();
|
||||
switch (type)
|
||||
return type switch
|
||||
{
|
||||
case "全":
|
||||
return ElementalType.Omni;
|
||||
case "冰":
|
||||
return ElementalType.Cryo;
|
||||
case "水":
|
||||
return ElementalType.Hydro;
|
||||
case "火":
|
||||
return ElementalType.Pyro;
|
||||
case "雷":
|
||||
return ElementalType.Electro;
|
||||
case "草":
|
||||
return ElementalType.Dendro;
|
||||
case "风":
|
||||
return ElementalType.Anemo;
|
||||
case "岩":
|
||||
return ElementalType.Geo;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
"全" => ElementalType.Omni,
|
||||
"冰" => ElementalType.Cryo,
|
||||
"水" => ElementalType.Hydro,
|
||||
"火" => ElementalType.Pyro,
|
||||
"雷" => ElementalType.Electro,
|
||||
"草" => ElementalType.Dendro,
|
||||
"风" => ElementalType.Anemo,
|
||||
"岩" => ElementalType.Geo,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
};
|
||||
}
|
||||
|
||||
public static string ToChinese(this ElementalType type)
|
||||
{
|
||||
switch (type)
|
||||
return type switch
|
||||
{
|
||||
case ElementalType.Omni:
|
||||
return "全";
|
||||
case ElementalType.Cryo:
|
||||
return "冰";
|
||||
case ElementalType.Hydro:
|
||||
return "水";
|
||||
case ElementalType.Pyro:
|
||||
return "火";
|
||||
case ElementalType.Electro:
|
||||
return "雷";
|
||||
case ElementalType.Dendro:
|
||||
return "草";
|
||||
case ElementalType.Anemo:
|
||||
return "风";
|
||||
case ElementalType.Geo:
|
||||
return "岩";
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
ElementalType.Omni => "全",
|
||||
ElementalType.Cryo => "冰",
|
||||
ElementalType.Hydro => "水",
|
||||
ElementalType.Pyro => "火",
|
||||
ElementalType.Electro => "雷",
|
||||
ElementalType.Dendro => "草",
|
||||
ElementalType.Anemo => "风",
|
||||
ElementalType.Geo => "岩",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null),
|
||||
};
|
||||
}
|
||||
|
||||
public static string ToLowerString(this ElementalType type)
|
||||
{
|
||||
return type.ToString().ToLower();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -13,7 +13,7 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model
|
||||
/// 元素类型
|
||||
/// </summary>
|
||||
public ElementalType Type { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 中心点位置
|
||||
/// </summary>
|
||||
|
@ -6,19 +6,19 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
[Obsolete]
|
||||
public class RoundStrategy
|
||||
{
|
||||
public List<string> RawCommandList { get; set; } = new List<string>();
|
||||
public List<string> RawCommandList { get; set; } = [];
|
||||
|
||||
public List<ActionCommand> ActionCommands { get; set; } = new List<ActionCommand>();
|
||||
public List<ActionCommand> ActionCommands { get; set; } = [];
|
||||
|
||||
public List<ElementalType> MaybeNeedElement(Duel duel)
|
||||
{
|
||||
List<ElementalType> result = new List<ElementalType>();
|
||||
List<ElementalType> result = [];
|
||||
|
||||
for (int i = 0; i < ActionCommands.Count; i++)
|
||||
{
|
||||
if (ActionCommands[i].Action == ActionEnum.SwitchLater
|
||||
&& i != ActionCommands.Count-1
|
||||
&& ActionCommands[i+1].Action == ActionEnum.UseSkill)
|
||||
if (ActionCommands[i].Action == ActionEnum.SwitchLater
|
||||
&& i != ActionCommands.Count - 1
|
||||
&& ActionCommands[i + 1].Action == ActionEnum.UseSkill)
|
||||
{
|
||||
result.Add(duel.Characters[ActionCommands[i].TargetIndex].Element);
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Config;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Config;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Config;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
|
||||
@ -16,7 +16,7 @@ public class ScriptParser
|
||||
|
||||
public static Duel Parse(string script)
|
||||
{
|
||||
var lines = script.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
|
||||
var lines = script.Split(["\r\n", "\r", "\n"], StringSplitOptions.None);
|
||||
var result = new List<string>();
|
||||
foreach (var line in lines)
|
||||
{
|
||||
@ -29,7 +29,7 @@ public class ScriptParser
|
||||
|
||||
public static Duel Parse(List<string> lines)
|
||||
{
|
||||
Duel duel = new Duel();
|
||||
Duel duel = new();
|
||||
string stage = "";
|
||||
|
||||
int i = 0;
|
||||
@ -38,7 +38,7 @@ public class ScriptParser
|
||||
for (i = 0; i < lines.Count; i++)
|
||||
{
|
||||
var line = lines[i];
|
||||
if (line.Contains(":"))
|
||||
if (line.Contains(':'))
|
||||
{
|
||||
stage = line;
|
||||
continue;
|
||||
@ -58,7 +58,7 @@ public class ScriptParser
|
||||
{
|
||||
MyAssert(duel.Characters[3] != null, "角色未定义");
|
||||
|
||||
string[] actionParts = line.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] actionParts = line.Split(" ", StringSplitOptions.RemoveEmptyEntries);
|
||||
MyAssert(actionParts.Length == 3, "策略中的行动命令解析错误");
|
||||
MyAssert(actionParts[1] == "使用", "策略中的行动命令解析错误");
|
||||
|
||||
@ -79,7 +79,7 @@ public class ScriptParser
|
||||
|
||||
MyAssert(j <= 3, "策略中的行动命令解析错误:角色名称无法从角色定义中匹配到");
|
||||
|
||||
int skillNum = int.Parse(Regex.Replace(actionParts[2], @"[^0-9]+", ""));
|
||||
int skillNum = int.Parse(RegexHelper.ExcludeNumberRegex().Replace(actionParts[2], ""));
|
||||
MyAssert(skillNum < 5, "策略中的行动命令解析错误:技能编号错误");
|
||||
actionCommand.TargetIndex = skillNum;
|
||||
duel.ActionCommandQueue.Add(actionCommand);
|
||||
@ -96,7 +96,7 @@ public class ScriptParser
|
||||
{
|
||||
MyLogger.LogError($"解析脚本错误,行号:{i + 1},错误信息:{ex}");
|
||||
MessageBox.Show($"解析脚本错误,行号:{i + 1},错误信息:{ex}", "策略解析失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return null;
|
||||
return default!;
|
||||
}
|
||||
|
||||
return duel;
|
||||
@ -117,14 +117,14 @@ public class ScriptParser
|
||||
var characterAndSkill = line.Split('{');
|
||||
|
||||
var parts = characterAndSkill[0].Split('=');
|
||||
character.Index = int.Parse(Regex.Replace(parts[0], @"[^0-9]+", ""));
|
||||
character.Index = int.Parse(RegexHelper.ExcludeNumberRegex().Replace(parts[0], ""));
|
||||
MyAssert(character.Index >= 1 && character.Index <= 3, "角色序号必须在1-3之间");
|
||||
|
||||
if (parts[1].Contains("|"))
|
||||
if (parts[1].Contains('|'))
|
||||
{
|
||||
var nameAndElement = parts[1].Split('|');
|
||||
character.Name = nameAndElement[0];
|
||||
character.Element = nameAndElement[1].Substring(0, 1).ChineseToElementalType();
|
||||
character.Element = nameAndElement[1][..1].ChineseToElementalType();
|
||||
|
||||
// 技能
|
||||
string skillStr = characterAndSkill[1].Replace("}", "");
|
||||
@ -136,7 +136,7 @@ public class ScriptParser
|
||||
skills[skill.Index] = skill;
|
||||
}
|
||||
|
||||
character.Skills = skills.ToArray();
|
||||
character.Skills = [.. skills];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -172,16 +172,16 @@ public class ScriptParser
|
||||
{
|
||||
var skill = new Skill();
|
||||
var parts = oneSkillStr.Split('=');
|
||||
skill.Index = short.Parse(Regex.Replace(parts[0], @"[^0-9]+", ""));
|
||||
skill.Index = short.Parse(RegexHelper.ExcludeNumberRegex().Replace(parts[0], ""));
|
||||
MyAssert(skill.Index >= 1 && skill.Index <= 5, "技能序号必须在1-5之间");
|
||||
var costStr = parts[1];
|
||||
var costParts = costStr.Split('+');
|
||||
skill.SpecificElementCost = int.Parse(costParts[0].Substring(0, 1));
|
||||
skill.SpecificElementCost = int.Parse(costParts[0][..1]);
|
||||
skill.Type = costParts[0].Substring(1, 1).ChineseToElementalType();
|
||||
// 杂色骰子在+号右边
|
||||
if (costParts.Length > 1)
|
||||
{
|
||||
skill.AnyElementCost = int.Parse(costParts[1].Substring(0, 1));
|
||||
skill.AnyElementCost = int.Parse(costParts[1][..1]);
|
||||
}
|
||||
|
||||
skill.AllCost = skill.SpecificElementCost + skill.AnyElementCost;
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoMusicGame;
|
||||
|
||||
|
@ -1,7 +1,9 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Recognition.ONNX.SVTR;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model.TimerConfig;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.AutoPick.Assets;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
@ -14,14 +16,11 @@ using System.Diagnostics;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using Vanara.PInvoke;
|
||||
using System.Windows.Input;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model.TimerConfig;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoPick;
|
||||
|
||||
public class AutoPickTrigger : ITaskTrigger
|
||||
public partial class AutoPickTrigger : ITaskTrigger
|
||||
{
|
||||
private readonly ILogger<AutoPickTrigger> _logger = App.GetLogger<AutoPickTrigger>();
|
||||
private readonly ITextInference _pickTextInference = TextInferenceFactory.Pick;
|
||||
@ -36,12 +35,12 @@ public class AutoPickTrigger : ITaskTrigger
|
||||
/// <summary>
|
||||
/// 拾取黑名单
|
||||
/// </summary>
|
||||
private List<string> _blackList = new();
|
||||
private List<string> _blackList = [];
|
||||
|
||||
/// <summary>
|
||||
/// 拾取白名单
|
||||
/// </summary>
|
||||
private List<string> _whiteList = new();
|
||||
private List<string> _whiteList = [];
|
||||
|
||||
// 自定义拾取按键
|
||||
private string _pickKeyName = "F";
|
||||
@ -200,7 +199,7 @@ public class AutoPickTrigger : ITaskTrigger
|
||||
speedTimer.Record("文字识别");
|
||||
if (!string.IsNullOrEmpty(text))
|
||||
{
|
||||
text = Regex.Replace(text, @"^[\p{P} ]+|[\p{P} ]+$", "");
|
||||
text = PunctuationAndSpacesRegex().Replace(text, "");
|
||||
// 唯一一个动态拾取项,特殊处理,不拾取
|
||||
if (text.Contains("生长时间"))
|
||||
{
|
||||
@ -273,4 +272,7 @@ public class AutoPickTrigger : ITaskTrigger
|
||||
_lastText = text;
|
||||
_prevClickFrameIndex = content.FrameIndex;
|
||||
}
|
||||
|
||||
[GeneratedRegex(@"^[\p{P} ]+|[\p{P} ]+$")]
|
||||
private static partial Regex PunctuationAndSpacesRegex();
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Model;
|
||||
using BetterGenshinImpact.Service;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Service;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoSkip.Assets;
|
||||
|
||||
|
@ -29,7 +29,7 @@ namespace BetterGenshinImpact.GameTask.AutoSkip;
|
||||
/// <summary>
|
||||
/// 自动剧情有选项点击
|
||||
/// </summary>
|
||||
public class AutoSkipTrigger : ITaskTrigger
|
||||
public partial class AutoSkipTrigger : ITaskTrigger
|
||||
{
|
||||
private readonly ILogger<AutoSkipTrigger> _logger = App.GetLogger<AutoSkipTrigger>();
|
||||
|
||||
@ -47,17 +47,17 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
/// <summary>
|
||||
/// 不自动点击的选项,优先级低于橙色文字点击
|
||||
/// </summary>
|
||||
private List<string> _defaultPauseList = new();
|
||||
private List<string> _defaultPauseList = [];
|
||||
|
||||
/// <summary>
|
||||
/// 不自动点击的选项
|
||||
/// </summary>
|
||||
private List<string> _pauseList = new();
|
||||
private List<string> _pauseList = [];
|
||||
|
||||
/// <summary>
|
||||
/// 优先自动点击的选项
|
||||
/// </summary>
|
||||
private List<string> _selectList = new();
|
||||
private List<string> _selectList = [];
|
||||
|
||||
private PostMessageSimulator? _postMessageSimulator;
|
||||
|
||||
@ -78,7 +78,7 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
var defaultPauseListJson = Global.ReadAllTextIfExist(@"User\AutoSkip\default_pause_options.json");
|
||||
if (!string.IsNullOrEmpty(defaultPauseListJson))
|
||||
{
|
||||
_defaultPauseList = JsonSerializer.Deserialize<List<string>>(defaultPauseListJson, ConfigService.JsonOptions) ?? new List<string>();
|
||||
_defaultPauseList = JsonSerializer.Deserialize<List<string>>(defaultPauseListJson, ConfigService.JsonOptions) ?? [];
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -92,7 +92,7 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
var pauseListJson = Global.ReadAllTextIfExist(@"User\AutoSkip\pause_options.json");
|
||||
if (!string.IsNullOrEmpty(pauseListJson))
|
||||
{
|
||||
_pauseList = JsonSerializer.Deserialize<List<string>>(pauseListJson, ConfigService.JsonOptions) ?? new List<string>();
|
||||
_pauseList = JsonSerializer.Deserialize<List<string>>(pauseListJson, ConfigService.JsonOptions) ?? [];
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -106,7 +106,7 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
var selectListJson = Global.ReadAllTextIfExist(@"User\AutoSkip\select_options.json");
|
||||
if (!string.IsNullOrEmpty(selectListJson))
|
||||
{
|
||||
_selectList = JsonSerializer.Deserialize<List<string>>(selectListJson, ConfigService.JsonOptions) ?? new List<string>();
|
||||
_selectList = JsonSerializer.Deserialize<List<string>>(selectListJson, ConfigService.JsonOptions) ?? [];
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -390,7 +390,8 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
});
|
||||
}
|
||||
|
||||
private readonly Regex _enOrNumRegex = new(@"^[a-zA-Z0-9]+$");
|
||||
[GeneratedRegex(@"^[a-zA-Z0-9]+$")]
|
||||
private static partial Regex EnOrNumRegex();
|
||||
|
||||
/// <summary>
|
||||
/// 新的对话选项选择
|
||||
@ -420,7 +421,7 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
if (chatOptionResultList.Count > 0)
|
||||
{
|
||||
// 第一个元素就是最下面的
|
||||
chatOptionResultList = chatOptionResultList.OrderByDescending(r => r.Y).ToList();
|
||||
chatOptionResultList = [.. chatOptionResultList.OrderByDescending(r => r.Y)];
|
||||
|
||||
// 通过最下面的气泡框来文字识别
|
||||
var lowest = chatOptionResultList[0];
|
||||
@ -438,11 +439,11 @@ public class AutoSkipTrigger : ITaskTrigger
|
||||
// 删除为空的结果 和 纯英文的结果
|
||||
var rs = new List<Region>();
|
||||
// 按照y坐标排序
|
||||
ocrResList = ocrResList.OrderBy(r => r.Y).ToList();
|
||||
ocrResList = [.. ocrResList.OrderBy(r => r.Y)];
|
||||
for (var i = 0; i < ocrResList.Count; i++)
|
||||
{
|
||||
var item = ocrResList[i];
|
||||
if (string.IsNullOrEmpty(item.Text) || (item.Text.Length < 5 && _enOrNumRegex.IsMatch(item.Text)))
|
||||
if (string.IsNullOrEmpty(item.Text) || (item.Text.Length < 5 && EnOrNumRegex().IsMatch(item.Text)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -4,25 +4,23 @@ using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.AutoSkip.Model;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.GameTask.QuickTeleport.Assets;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.Service.Notification;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using BetterGenshinImpact.ViewModel.Pages;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.ViewModel.Pages;
|
||||
using Vanara.PInvoke;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using WinRT;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoSkip;
|
||||
|
||||
@ -285,7 +283,7 @@ public class AutoTrackTask(AutoTrackParam param) : BaseIndependentTask
|
||||
|
||||
foreach (var textRa in textRaList)
|
||||
{
|
||||
if (textRa.Text.Length < 8 && (textRa.Text.Contains("m") || textRa.Text.Contains("M")))
|
||||
if (textRa.Text.Length < 8 && textRa.Text.Contains('m', StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_missionDistanceRect = textRa.ConvertSelfPositionToGameCaptureRegion();
|
||||
return StringUtils.TryExtractPositiveInt(textRa.Text);
|
||||
|
@ -4,7 +4,6 @@ using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
using Sdcb.PaddleOCR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -23,7 +22,7 @@ namespace BetterGenshinImpact.GameTask.AutoSkip;
|
||||
[Obsolete]
|
||||
public class ExpeditionTask
|
||||
{
|
||||
private static readonly List<string> ExpeditionCharacterList = new();
|
||||
private static readonly List<string> ExpeditionCharacterList = [];
|
||||
|
||||
private int _expeditionCount = 0;
|
||||
|
||||
@ -129,12 +128,7 @@ public class ExpeditionTask
|
||||
var cards = GetCharacterCards(result);
|
||||
if (cards.Count > 0)
|
||||
{
|
||||
var card = cards.FirstOrDefault(c => c.Idle && c.Name != null && ExpeditionCharacterList.Contains(c.Name));
|
||||
if (card == null)
|
||||
{
|
||||
card = cards.First(c => c.Idle);
|
||||
}
|
||||
|
||||
var card = cards.FirstOrDefault(c => c.Idle && c.Name != null && ExpeditionCharacterList.Contains(c.Name)) ?? cards.First(c => c.Idle);
|
||||
var rect = card.Rects.First();
|
||||
|
||||
using var ra = content.CaptureRectArea.Derive(rect);
|
||||
@ -158,9 +152,12 @@ public class ExpeditionTask
|
||||
var captureRect = TaskContext.Instance().SystemInfo.CaptureAreaRect;
|
||||
var assetScale = TaskContext.Instance().SystemInfo.AssetScale;
|
||||
|
||||
var ocrResultRects = result.Regions.Select(x => x.ToOcrResultRect()).ToList();
|
||||
ocrResultRects = ocrResultRects.Where(r => r.Rect.X + r.Rect.Width < captureRect.Width / 2)
|
||||
.OrderBy(r => r.Rect.Y).ThenBy(r => r.Rect.X).ToList();
|
||||
var ocrResultRects = result.Regions
|
||||
.Select(x => x.ToOcrResultRect())
|
||||
.Where(r => r.Rect.X + r.Rect.Width < captureRect.Width / 2)
|
||||
.OrderBy(r => r.Rect.Y)
|
||||
.ThenBy(r => r.Rect.X)
|
||||
.ToList();
|
||||
|
||||
var cards = new List<ExpeditionCharacterCard>();
|
||||
foreach (var ocrResultRect in ocrResultRects)
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoSkip.Model;
|
||||
|
||||
|
@ -12,7 +12,7 @@ public class ExpeditionCharacterCard
|
||||
public string? Addition { get; set; }
|
||||
|
||||
|
||||
public List<Rect> Rects { get; set; } = new();
|
||||
public List<Rect> Rects { get; set; } = [];
|
||||
|
||||
//public ExpeditionCharacterCard(string name,string addition, bool idle)
|
||||
//{
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
|
||||
|
@ -1,16 +1,15 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath.Model;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.GameTask.QuickTeleport.Assets;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using BetterGenshinImpact.Service;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using BetterGenshinImpact.ViewModel.Pages;
|
||||
@ -21,16 +20,11 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Vanara.PInvoke;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
using static Vanara.PInvoke.Gdi32;
|
||||
using Point = OpenCvSharp.Point;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
|
||||
@ -122,11 +116,7 @@ public class AutoTrackPathTask
|
||||
NewRetry.Do((Action)(() =>
|
||||
{
|
||||
var ra = TaskControl.CaptureToRectArea();
|
||||
var miniMapMat = GetMiniMapMat(ra);
|
||||
if (miniMapMat == null)
|
||||
{
|
||||
throw new RetryException("等待传送完成");
|
||||
}
|
||||
var miniMapMat = GetMiniMapMat(ra) ?? throw new RetryException("等待传送完成");
|
||||
}), TimeSpan.FromSeconds(1), 100);
|
||||
Logger.LogInformation("传送完成");
|
||||
Sleep(1000);
|
||||
@ -218,11 +208,7 @@ public class AutoTrackPathTask
|
||||
while (!_taskParam.Cts.IsCancellationRequested)
|
||||
{
|
||||
var ra = CaptureToRectArea();
|
||||
var miniMapMat = GetMiniMapMat(ra);
|
||||
if (miniMapMat == null)
|
||||
{
|
||||
throw new InvalidOperationException("当前不在主界面");
|
||||
}
|
||||
var miniMapMat = GetMiniMapMat(ra) ?? throw new InvalidOperationException("当前不在主界面");
|
||||
|
||||
// 注意游戏坐标系的角度是顺时针的
|
||||
var currMapImageAvatarPos = EntireMap.Instance.GetMiniMapPositionByFeatureMatch(miniMapMat);
|
||||
@ -356,12 +342,7 @@ public class AutoTrackPathTask
|
||||
public int GetCharacterOrientationAngle()
|
||||
{
|
||||
var ra = CaptureToRectArea();
|
||||
var miniMapMat = GetMiniMapMat(ra);
|
||||
if (miniMapMat == null)
|
||||
{
|
||||
throw new InvalidOperationException("当前不在主界面");
|
||||
}
|
||||
|
||||
var miniMapMat = GetMiniMapMat(ra) ?? throw new InvalidOperationException("当前不在主界面");
|
||||
var angle = CharacterOrientation.Compute(miniMapMat);
|
||||
Logger.LogInformation("当前角度:{Angle}", angle);
|
||||
// CameraOrientation.DrawDirection(ra, angle);
|
||||
|
@ -1,15 +1,15 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoTrackPath.Model;
|
||||
|
||||
[Serializable]
|
||||
public class GiPath
|
||||
{
|
||||
public List<GiPathPoint> WayPointList { get; set; } = new();
|
||||
public List<GiPathPoint> WayPointList { get; set; } = [];
|
||||
|
||||
public void AddPoint(Point2f point)
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoTrackPath.Model;
|
||||
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath.Model;
|
||||
@ -16,6 +10,12 @@ using BetterGenshinImpact.Model;
|
||||
using BetterGenshinImpact.Service;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
|
@ -6,6 +6,7 @@ using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.GameTask.QuickTeleport.Assets;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
@ -13,7 +14,6 @@ using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Vanara.PInvoke;
|
||||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||||
|
||||
@ -24,8 +24,6 @@ namespace BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
/// </summary>
|
||||
public class TpTask(CancellationTokenSource cts)
|
||||
{
|
||||
private static readonly Random _rd = new Random();
|
||||
|
||||
private readonly QuickTeleportAssets _assets = QuickTeleportAssets.Instance;
|
||||
|
||||
/// <summary>
|
||||
@ -145,7 +143,7 @@ public class TpTask(CancellationTokenSource cts)
|
||||
public async Task MouseMoveMapX(int dx)
|
||||
{
|
||||
var moveUnit = dx > 0 ? 20 : -20;
|
||||
GameCaptureRegion.GameRegionMove((rect, _) => (rect.Width / 2d + _rd.Next(-rect.Width / 6, rect.Width / 6), rect.Height / 2d + _rd.Next(-rect.Height / 6, rect.Height / 6)));
|
||||
GameCaptureRegion.GameRegionMove((rect, _) => (rect.Width / 2d + Random.Shared.Next(-rect.Width / 6, rect.Width / 6), rect.Height / 2d + Random.Shared.Next(-rect.Height / 6, rect.Height / 6)));
|
||||
Simulation.SendInput.Mouse.LeftButtonDown();
|
||||
await Delay(200, cts);
|
||||
for (var i = 0; i < dx / moveUnit; i++)
|
||||
@ -160,7 +158,7 @@ public class TpTask(CancellationTokenSource cts)
|
||||
public async Task MouseMoveMapY(int dy)
|
||||
{
|
||||
var moveUnit = dy > 0 ? 20 : -20;
|
||||
GameCaptureRegion.GameRegionMove((rect, _) => (rect.Width / 2d + _rd.Next(-rect.Width / 6, rect.Width / 6), rect.Height / 2d + _rd.Next(-rect.Height / 6, rect.Height / 6)));
|
||||
GameCaptureRegion.GameRegionMove((rect, _) => (rect.Width / 2d + Random.Shared.Next(-rect.Width / 6, rect.Width / 6), rect.Height / 2d + Random.Shared.Next(-rect.Height / 6, rect.Height / 6)));
|
||||
Simulation.SendInput.Mouse.LeftButtonDown();
|
||||
await Delay(200, cts);
|
||||
// 原神地图在小范围内移动是无效的,所以先随便移动一下,所以肯定少移动一次
|
||||
@ -365,7 +363,7 @@ public class TpTask(CancellationTokenSource cts)
|
||||
// 按高度排序
|
||||
if (rResultList.Count > 0)
|
||||
{
|
||||
rResultList = rResultList.OrderBy(x => x.Y).ToList();
|
||||
rResultList = [.. rResultList.OrderBy(x => x.Y)];
|
||||
// 点击最高的
|
||||
foreach (var iconRect in rResultList)
|
||||
{
|
||||
|
@ -16,7 +16,7 @@ public class AutoWoodAssets : BaseAssets<AutoWoodAssets>
|
||||
|
||||
// 木头数量
|
||||
public Rect WoodCountUpperRect;
|
||||
|
||||
|
||||
private AutoWoodAssets()
|
||||
{
|
||||
|
||||
|
@ -151,8 +151,8 @@ public partial class AutoWoodTask
|
||||
|
||||
private bool _firstWoodOcr = true;
|
||||
private string _firstWoodOcrText = "";
|
||||
private readonly Dictionary<string, int> _woodMetricsDict = new();
|
||||
private readonly Dictionary<string, bool> _woodNotPrintDict = new();
|
||||
private readonly Dictionary<string, int> _woodMetricsDict = [];
|
||||
private readonly Dictionary<string, bool> _woodNotPrintDict = [];
|
||||
|
||||
// from:https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/home/content/list?app_sn=ys_obc&channel_id=13
|
||||
private static readonly List<string> ExistWoods =
|
||||
|
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.AutoWood;
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
|
@ -1,11 +1,9 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv.FeatureMatch;
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using BetterGenshinImpact.Model;
|
||||
using OpenCvSharp;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common.Map;
|
||||
|
||||
|
@ -104,17 +104,14 @@ public class CameraOrientation
|
||||
// };
|
||||
// VisionContext.Instance().DrawContent.PutLine("camera", line);
|
||||
|
||||
if (pen == null)
|
||||
{
|
||||
pen = new Pen(Color.Yellow, 1);
|
||||
}
|
||||
pen ??= new Pen(Color.Yellow, 1);
|
||||
|
||||
region.DrawLine(center.X, center.Y, (int)x1, (int)y1, name, pen);
|
||||
}
|
||||
|
||||
static List<int> FindPeaks(float[] data)
|
||||
{
|
||||
List<int> peakIndices = new List<int>();
|
||||
List<int> peakIndices = [];
|
||||
|
||||
for (int i = 1; i < data.Length - 1; i++)
|
||||
{
|
||||
|
@ -1,14 +1,9 @@
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv.FeatureMatch;
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv.FeatureMatch;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using BetterGenshinImpact.Model;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using BetterGenshinImpact.Helpers.Extensions;
|
||||
using Point = OpenCvSharp.Point;
|
||||
using Size = OpenCvSharp.Size;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common.Map;
|
||||
@ -19,7 +14,7 @@ public class EntireMap : Singleton<EntireMap>
|
||||
public static readonly Size TemplateSize = new(240, 135);
|
||||
|
||||
// 对无用部分进行裁剪(左160,上80,下96)
|
||||
public static readonly Rect TemplateSizeRoi = new Rect(20, 10, TemplateSize.Width - 20, TemplateSize.Height - 22);
|
||||
public static readonly Rect TemplateSizeRoi = new(20, 10, TemplateSize.Width - 20, TemplateSize.Height - 22);
|
||||
|
||||
/// <summary>
|
||||
/// 主要地图缩小1024的模板
|
||||
|
@ -1,8 +1,8 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common;
|
||||
|
||||
|
@ -1,12 +1,11 @@
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using Fischless.GameCapture;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common;
|
||||
|
||||
|
@ -1,9 +1,4 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Model;
|
||||
using Compunet.YoloV8;
|
||||
using System;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Common;
|
||||
namespace BetterGenshinImpact.GameTask.Common;
|
||||
|
||||
// [Obsolete]
|
||||
// public class YoloManager : Singleton<YoloManager>, IDisposable
|
||||
|
@ -1,11 +1,5 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using OpenCvSharp;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using BetterGenshinImpact.Core.Script.Dependence.Model.TimerConfig;
|
||||
using BetterGenshinImpact.GameTask.AutoFight.Assets;
|
||||
using BetterGenshinImpact.GameTask.AutoFishing.Assets;
|
||||
@ -20,7 +14,13 @@ using BetterGenshinImpact.GameTask.Placeholder;
|
||||
using BetterGenshinImpact.GameTask.QuickSereniteaPot.Assets;
|
||||
using BetterGenshinImpact.GameTask.QuickTeleport.Assets;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using OpenCvSharp;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask;
|
||||
|
||||
@ -63,7 +63,7 @@ internal class GameTaskManager
|
||||
loadedTriggers.ForEach(i => i.IsEnabled = true);
|
||||
}
|
||||
|
||||
loadedTriggers = loadedTriggers.OrderByDescending(i => i.Priority).ToList();
|
||||
loadedTriggers = [.. loadedTriggers.OrderByDescending(i => i.Priority)];
|
||||
return loadedTriggers;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Model.Area.Converter;
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Threading;
|
||||
|
@ -1,6 +1,5 @@
|
||||
using BetterGenshinImpact.Model;
|
||||
using OpenCvSharp;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Model;
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using Vanara.PInvoke;
|
||||
using Vanara.PInvoke;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Model;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Model;
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using OpenCvSharp;
|
||||
using Vanara.PInvoke;
|
||||
using Size = System.Drawing.Size;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using System.Threading;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.Model;
|
||||
|
||||
|
@ -1,16 +1,8 @@
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.GameTask.Common.Map;
|
||||
using BetterGenshinImpact.View.Drawable;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.GameTask.Common.BgiVision;
|
||||
using BetterGenshinImpact.GameTask.Common.Element.Assets;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
using Point = OpenCvSharp.Point;
|
||||
using Size = OpenCvSharp.Size;
|
||||
|
||||
@ -313,7 +305,7 @@ public class TestTrigger : ITaskTrigger
|
||||
|
||||
static List<int> FindPeaks(float[] data)
|
||||
{
|
||||
List<int> peakIndices = new List<int>();
|
||||
List<int> peakIndices = [];
|
||||
|
||||
for (int i = 1; i < data.Length - 1; i++)
|
||||
{
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.QuickForge
|
||||
namespace BetterGenshinImpact.GameTask.QuickForge
|
||||
{
|
||||
internal class QuickForgeTask
|
||||
{
|
||||
|
@ -25,8 +25,8 @@ public class QuickTeleportAssets : BaseAssets<QuickTeleportAssets>
|
||||
(int)(100 * AssetScale),
|
||||
(int)(50 * AssetScale),
|
||||
CaptureRect.Height - (int)(200 * AssetScale));
|
||||
MapChooseIconRoList = new List<RecognitionObject>
|
||||
{
|
||||
MapChooseIconRoList =
|
||||
[
|
||||
BuildMapChooseIconRo("TeleportWaypoint.png"),
|
||||
BuildMapChooseIconRo("StatueOfTheSeven.png"),
|
||||
BuildMapChooseIconRo("Domain.png"),
|
||||
@ -34,7 +34,7 @@ public class QuickTeleportAssets : BaseAssets<QuickTeleportAssets>
|
||||
BuildMapChooseIconRo("PortableWaypoint.png"),
|
||||
BuildMapChooseIconRo("Mansion.png"),
|
||||
BuildMapChooseIconRo("SubSpaceWaypoint.png"),
|
||||
};
|
||||
];
|
||||
MapChooseIconGreyMatList = MapChooseIconRoList.ConvertAll(x => x.TemplateImageGreyMat ?? new Mat());
|
||||
|
||||
// 传送按钮宽泛的识别区域
|
||||
|
@ -1,16 +1,15 @@
|
||||
using BetterGenshinImpact.Core.Recognition.OCR;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.Core.Recognition.OpenCv;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.GameTask.QuickTeleport.Assets;
|
||||
using BetterGenshinImpact.Model;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Model;
|
||||
using System.Windows.Forms;
|
||||
using BetterGenshinImpact.Core.Recognition;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.QuickTeleport;
|
||||
|
||||
@ -129,7 +128,7 @@ internal class QuickTeleportTrigger : ITaskTrigger
|
||||
// 按高度排序
|
||||
if (rResultList.Count > 0)
|
||||
{
|
||||
rResultList = rResultList.OrderBy(x => x.Y).ToList();
|
||||
rResultList = [.. rResultList.OrderBy(x => x.Y)];
|
||||
// 点击最高的
|
||||
foreach (var iconRect in rResultList)
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Vanara.PInvoke;
|
||||
|
||||
@ -62,7 +61,7 @@ public class SystemControl
|
||||
foreach (var name in names)
|
||||
{
|
||||
var pros = Process.GetProcessesByName(name);
|
||||
if (pros.Any())
|
||||
if (pros.Length is not 0)
|
||||
{
|
||||
return pros[0].MainWindowHandle;
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
using BetterGenshinImpact.Core.Config;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.Genshin.Settings;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.Service;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask
|
||||
{
|
||||
|
@ -2,10 +2,15 @@
|
||||
using BetterGenshinImpact.GameTask.AutoDomain;
|
||||
using BetterGenshinImpact.GameTask.AutoFight;
|
||||
using BetterGenshinImpact.GameTask.AutoGeniusInvokation;
|
||||
using BetterGenshinImpact.GameTask.AutoMusicGame;
|
||||
using BetterGenshinImpact.GameTask.AutoSkip;
|
||||
using BetterGenshinImpact.GameTask.AutoSkip.Model;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
using BetterGenshinImpact.GameTask.AutoWood;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Model;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
using BetterGenshinImpact.GameTask.Model.Enum;
|
||||
using BetterGenshinImpact.Genshin.Settings;
|
||||
using BetterGenshinImpact.Helpers;
|
||||
using BetterGenshinImpact.View;
|
||||
using Fischless.GameCapture;
|
||||
@ -21,13 +26,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.GameTask.AutoSkip;
|
||||
using BetterGenshinImpact.GameTask.AutoSkip.Model;
|
||||
using Vanara.PInvoke;
|
||||
using BetterGenshinImpact.GameTask.AutoMusicGame;
|
||||
using BetterGenshinImpact.GameTask.AutoTrackPath;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using BetterGenshinImpact.GameTask.Model.Area;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask
|
||||
{
|
||||
@ -65,9 +64,9 @@ namespace BetterGenshinImpact.GameTask
|
||||
private static readonly object _bitmapLocker = new();
|
||||
private static readonly object _triggerListLocker = new();
|
||||
|
||||
public event EventHandler UiTaskStopTickEvent;
|
||||
public event EventHandler? UiTaskStopTickEvent;
|
||||
|
||||
public event EventHandler UiTaskStartTickEvent;
|
||||
public event EventHandler? UiTaskStartTickEvent;
|
||||
|
||||
public TaskTriggerDispatcher()
|
||||
{
|
||||
@ -229,7 +228,10 @@ namespace BetterGenshinImpact.GameTask
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose() => Stop();
|
||||
public void Dispose()
|
||||
{
|
||||
Stop();
|
||||
}
|
||||
|
||||
public void Tick(object? sender, EventArgs e)
|
||||
{
|
||||
@ -256,7 +258,7 @@ namespace BetterGenshinImpact.GameTask
|
||||
_logger.LogInformation("游戏已退出,BetterGI 自动停止截图器");
|
||||
}
|
||||
|
||||
UiTaskStopTickEvent.Invoke(sender, e);
|
||||
UiTaskStopTickEvent?.Invoke(sender, e);
|
||||
maskWindow.Invoke(maskWindow.Hide);
|
||||
return;
|
||||
}
|
||||
@ -270,7 +272,7 @@ namespace BetterGenshinImpact.GameTask
|
||||
if (TaskContext.Instance().SystemInfo.GameProcess.HasExited)
|
||||
{
|
||||
_logger.LogInformation("游戏已退出,BetterGI 自动停止截图器");
|
||||
UiTaskStopTickEvent.Invoke(sender, e);
|
||||
UiTaskStopTickEvent?.Invoke(sender, e);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -426,8 +428,8 @@ namespace BetterGenshinImpact.GameTask
|
||||
&& !SizeIsZero(_gameRect) && !SizeIsZero(currentRect))
|
||||
{
|
||||
_logger.LogError("► 游戏窗口大小发生变化 {W}x{H}->{CW}x{CH}, 自动重启截图器中...", _gameRect.Width, _gameRect.Height, currentRect.Width, currentRect.Height);
|
||||
UiTaskStopTickEvent.Invoke(null, EventArgs.Empty);
|
||||
UiTaskStartTickEvent.Invoke(null, EventArgs.Empty);
|
||||
UiTaskStopTickEvent?.Invoke(null, EventArgs.Empty);
|
||||
UiTaskStartTickEvent?.Invoke(null, EventArgs.Empty);
|
||||
_logger.LogInformation("► 游戏窗口大小发生变化,截图器重启完成!");
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace BetterGenshinImpact.GameTask.UseActiveCode
|
||||
namespace BetterGenshinImpact.GameTask.UseActiveCode
|
||||
{
|
||||
internal class UseActiveCodeTask
|
||||
{
|
||||
|
@ -1,26 +1,29 @@
|
||||
using System;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.Frozen;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BetterGenshinImpact.Genshin.Paths;
|
||||
|
||||
internal class GameExePath
|
||||
internal partial class GameExePath
|
||||
{
|
||||
public static readonly FrozenSet<string> GameRegistryPaths = FrozenSet.ToFrozenSet(
|
||||
[
|
||||
@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神",
|
||||
@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Genshin Impact",
|
||||
// @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\云·原神",
|
||||
]);
|
||||
|
||||
/// <summary>
|
||||
/// 游戏路径(云原神除外)
|
||||
/// </summary>
|
||||
public static string? GetWithoutCloud()
|
||||
{
|
||||
return new[]
|
||||
{
|
||||
@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神",
|
||||
@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Genshin Impact",
|
||||
// @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\云·原神",
|
||||
}.Select(regKey => GetGameExePathFromRegistry(regKey, false)).FirstOrDefault(exePath => !string.IsNullOrEmpty(exePath));
|
||||
return GameRegistryPaths.Select(regKey => GetGameExePathFromRegistry(regKey, false)).FirstOrDefault(exePath => !string.IsNullOrEmpty(exePath));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -49,8 +52,8 @@ internal class GameExePath
|
||||
if (File.Exists(configPath))
|
||||
{
|
||||
var str = File.ReadAllText(configPath);
|
||||
var installPath = Regex.Match(str, @"game_install_path=(.+)").Groups[1].Value.Trim();
|
||||
var exeName = Regex.Match(str, @"game_start_name=(.+)").Groups[1].Value.Trim();
|
||||
var installPath = GameInstallPathRegex().Match(str).Groups[1].Value.Trim();
|
||||
var exeName = GameStartNameRegex().Match(str).Groups[1].Value.Trim();
|
||||
var exePath = Path.GetFullPath(exeName, installPath);
|
||||
if (File.Exists(exePath))
|
||||
{
|
||||
@ -66,4 +69,10 @@ internal class GameExePath
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
[GeneratedRegex(@"game_install_path=(.+)")]
|
||||
private static partial Regex GameInstallPathRegex();
|
||||
|
||||
[GeneratedRegex(@"game_start_name=(.+)")]
|
||||
private static partial Regex GameStartNameRegex();
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
using Microsoft.Win32;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using BetterGenshinImpact.GameTask.Common;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BetterGenshinImpact.Genshin.Settings;
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
using BetterGenshinImpact.Service;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Specialized;
|
||||
@ -83,7 +82,7 @@ public class JsonCrudHelper<T> : ICrudHelper<T> where T : class
|
||||
{
|
||||
if (!File.Exists(_filePath))
|
||||
{
|
||||
return new ObservableCollection<T>();
|
||||
return [];
|
||||
}
|
||||
|
||||
var json = File.ReadAllText(_filePath);
|
||||
|
@ -1,8 +1,7 @@
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using OpenCvSharp;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Media.Imaging;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace BetterGenshinImpact.Helpers.Extensions
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
using BetterGenshinImpact.Core.Simulator;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using Fischless.WindowsInput;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace BetterGenshinImpact.Helpers.Extensions;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user