using Mir2Assistant.Common.Models;
using Mir2Assistant.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Mir2Assistant.Common.Functions;
///
/// 走路、跑路、寻路
///
public static class GoRunFunction
{
///
/// 走路跑路
///
///
/// 1走路,2跑路,3骑黑马跑
/// 当前x
/// 当前y
/// 方向,小键盘数字
/// 搜索 8B00 8B4C24 20获取
///
public static void GoRun(MirGameInstanceModel gameInstance, int x, int y, byte direct, byte type)
{
int dir = 0;
switch (direct)
{
case 1:
dir = 5;
x -= type;
y += type;
break;
case 2:
dir = 4;
y += type;
break;
case 3:
dir = 3;
x += type;
y += type;
break;
case 4:
dir = 6;
x -= type;
break;
case 6:
dir = 2;
x += type;
break;
case 7:
dir = 7;
x -= type;
y -= type;
break;
case 8:
dir = 0;
y -= type;
break;
case 9:
dir = 1;
x += type;
y -= type;
break;
}
int typePara = 0;
switch (type)
{
case 2:
typePara = 0xbc5;
break;
case 3:
typePara = 0x19100c;
break;
default:
typePara = 0xbc3;
break;
}
SendMirCall.Send(gameInstance, 1001, new nint[] { x, y, dir, typePara, gameInstance!.MirConfig["角色基址"], gameInstance!.MirConfig["走路CALL地址"] });
//AsmUtils.Init(gameInstance.MirPid)
// .Push68(y)
// .Push6A(dir)
// .Push6A(0)
// .Push6A(0)
// .Push6A(0)
// .Push6A(0)
// .Push6A(0)
// .Mov_EAX((int)gameInstance!.MirConfig["角色基址"])
// .Mov_EAX_DWORD_Ptr_EAX()
// .Mov_EAX_DWORD_Ptr_EAX()
// .Mov_ECX(x)
// .Mov_EDX(typePara)
// .Mov_EBX((int)gameInstance!.MirConfig["走路CALL地址"])
// .Call_EBX()
// .Run();
}
///
/// 寻路
///
/// 要去的坐标x
/// 要去的坐标y
///
///
public static void FindPath(MirGameInstanceModel gameInstance, int x, int y)
{
SendMirCall.Send(gameInstance, 1002, new nint[] { x, y, gameInstance!.MirConfig["寻路参数"], gameInstance!.MirConfig["寻路CALL地址"] });
}
public static async Task WaitFindPath(MirGameInstanceModel gameInstance, string map, int x, int y)
{
var success = true;
await Task.Run(() =>
{
while (Math.Abs(x - gameInstance.CharacterStatus!.X.GetValueOrDefault()) > 2 && Math.Abs(y - gameInstance.CharacterStatus!.Y.GetValueOrDefault()) > 2)
{
if (map != gameInstance.CharacterStatus!.MapName)
{
success = false;
return;
}
FindPath(gameInstance, x, y);
Task.Delay(5000).Wait();
}
});
return success;
}
public static async Task FlyCY(MirGameInstanceModel gameInstance)
{
SendMirCall.Send(gameInstance, 1010, new nint[] { gameInstance!.MirConfig["通用参数"], gameInstance!.MirConfig["对话CALL地址"] });
return await NpcFunction.WaitNPC(gameInstance, "天虹法师");
}
///
/// 等转到地图
///
///
///
///
public static async Task WaitMap(MirGameInstanceModel gameInstance, string mapName, int timeout = 50)
{
return await TaskWrapper.Wait(() => gameInstance.CharacterStatus!.MapName == mapName, timeout);
}
///
/// 回土城
///
///
///
public static async Task BackTu(MirGameInstanceModel gameInstance)
{
await GoRunFunction.FlyCY(gameInstance!);
await NpcFunction.ClickNPC(gameInstance!, "天虹法师");
await NpcFunction.Talk2Text(gameInstance!, "哦!好的!让我试试!");
await NpcFunction.Talk2Text(gameInstance!, "去魔龙城");
await NpcFunction.ClickNPC(gameInstance!, "魔龙城老兵");
await NpcFunction.Talk2Text(gameInstance!, "去魔龙城");
await NpcFunction.Talk2Text(gameInstance!, "想去盟重");
return await NpcFunction.WaitNPC(gameInstance!, "盟重老兵");
}
///
/// 去玄武
///
///
///
public static async Task GoXuanWu(MirGameInstanceModel gameInstance)
{
if ((gameInstance.CharacterStatus?.GradeZS ?? 0) >= 50)
{
await GoRunFunction.FlyCY(gameInstance!);
await NpcFunction.ClickNPC(gameInstance!, "天虹法师");
await NpcFunction.Talk2Text(gameInstance, "听说您有事找我?");
await NpcFunction.Talk2Text(gameInstance, "请您带我去见狐人族长老");
await NpcFunction.WaitNPC(gameInstance!, "狐人族长老");
await NpcFunction.ClickNPC(gameInstance!, "狐人族长老");
await NpcFunction.Talk2Text(gameInstance, "返回玄武岛");
return await NpcFunction.WaitNPC(gameInstance!, "玄武老兵");
}
else
{
if (gameInstance!.CharacterStatus!.MapName != "玄武岛")
{
await GoRunFunction.FlyCY(gameInstance!);
await NpcFunction.ClickNPC(gameInstance!, "天虹法师");
await NpcFunction.Talk2Text(gameInstance, "我要去玄武岛");
}
await WaitFindPath(gameInstance, "玄武岛", 210, 249);
}
return true;
}
}