mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-04-15 21:03:42 +08:00
92 lines
2.6 KiB
C#
92 lines
2.6 KiB
C#
using System;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using BetterGenshinImpact.Core.Config;
|
||
using BetterGenshinImpact.Core.Simulator;
|
||
using BetterGenshinImpact.GameTask.AutoPathing.Model;
|
||
using BetterGenshinImpact.Helpers;
|
||
using Microsoft.Extensions.Logging;
|
||
using Vanara.PInvoke;
|
||
using static BetterGenshinImpact.GameTask.Common.TaskControl;
|
||
|
||
namespace BetterGenshinImpact.GameTask.AutoPathing.Handler;
|
||
|
||
/// <summary>
|
||
/// 使用纳西妲长按E技能进行收集,360°球形无死角扫码,`type = target`的情况才有效
|
||
/// </summary>
|
||
public class NahidaCollectHandler : IActionHandler
|
||
{
|
||
private DateTime lastETime = DateTime.MinValue;
|
||
|
||
public async Task RunAsync(CancellationToken ct, WaypointForTrack? waypointForTrack = null, object? config = null)
|
||
{
|
||
Logger.LogInformation("执行 {Nhd} 长按E转圈拾取", "纳西妲");
|
||
|
||
var combatScenes = await RunnerContext.Instance.GetCombatScenes(ct);
|
||
if (combatScenes == null)
|
||
{
|
||
Logger.LogError("队伍识别未初始化成功!");
|
||
return;
|
||
}
|
||
|
||
// 切人
|
||
if (combatScenes.AvatarMap.TryGetValue("纳西妲", out var nahida))
|
||
{
|
||
nahida.TrySwitch();
|
||
}
|
||
else
|
||
{
|
||
Logger.LogError("队伍中未找到纳西妲角色!");
|
||
return;
|
||
}
|
||
|
||
var cd = DateTime.Now - lastETime;
|
||
if (cd < TimeSpan.FromSeconds(10))
|
||
{
|
||
await Delay((int)((6 - cd.TotalSeconds + 0.5) * 1000), ct);
|
||
}
|
||
|
||
var dpi = TaskContext.Instance().DpiScale;
|
||
|
||
int x = (int)(400 * dpi), y = (int)(-30 * dpi);
|
||
int i = 60;
|
||
// 视角拉到最下面
|
||
Simulation.SendInput.Mouse.MoveMouseBy(0, 10000);
|
||
await Delay(200, ct);
|
||
|
||
// 按住E技能 无死角扫码
|
||
Simulation.SendInput.Keyboard.KeyDown(User32.VK.VK_E);
|
||
await Delay(200, ct);
|
||
|
||
// 先地面来一圈
|
||
for (int j = 0; j < 15; j++)
|
||
{
|
||
Simulation.SendInput.Mouse.MoveMouseBy(x, 500);
|
||
await Delay(30, ct);
|
||
}
|
||
|
||
// 然后抬斜向转圈
|
||
while (!ct.IsCancellationRequested && i > 0)
|
||
{
|
||
i--;
|
||
if (i == 40)
|
||
{
|
||
y -= (int)(20 * dpi);
|
||
}
|
||
|
||
Simulation.SendInput.Mouse.MoveMouseBy(x, y);
|
||
await Delay(30, ct);
|
||
}
|
||
Simulation.SendInput.Keyboard.KeyUp(User32.VK.VK_E);
|
||
|
||
lastETime = DateTime.Now;
|
||
|
||
await Delay(1000, ct);
|
||
|
||
// 恢复视角
|
||
Simulation.SendInput.Mouse.MiddleButtonClick();
|
||
|
||
await Delay(1000, ct);
|
||
}
|
||
}
|