using Mir2Assistant.Common.Models; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; namespace Mir2Assistant.Common.Functions { public static class NpcFunction { /// /// 提取对话命令 /// /// /// public static List GetTalkCmds(string dialog) { var ret = new List(); if (string.IsNullOrEmpty(dialog)) { return ret; } var regex = new Regex(@"\<(.*?)\/(.*?)\>"); Match match = regex.Match(dialog); while (match.Success) { if (match.Value.Contains("/@")) { ret.Add(match.Value.TrimStart('<').TrimEnd('>')); } match = match.NextMatch(); } return ret; } private static async Task Talk(MirGameInstanceModel gameInstance, Action act) { var memoryUtil = gameInstance!.MemoryUtils!; var addr1 = memoryUtil.GetMemoryAddress(gameInstance.MirConfig["对话框基址"], 0); var addr2 = memoryUtil.GetMemoryAddress(addr1, 0x11c, 0); act(); nint addr = 0; if (!await TaskWrapper.Wait(() => { addr = memoryUtil.GetMemoryAddress(addr1, 0x11c, 0); return addr2 != addr; })) { return ""; } var length = memoryUtil.ReadToInt(memoryUtil.GetMemoryAddress(addr1, 0x20)) * 3; var str = memoryUtil.ReadToString(addr, length); gameInstance.TalkCmds = GetTalkCmds(str); return str; } /// /// 点NPC /// /// /// /// public static async Task ClickNPC(MirGameInstanceModel gameInstance, MonsterModel NPC) { return await Talk(gameInstance, () => { var npcId = gameInstance.MemoryUtils!.ReadToInt(NPC.Addr + 4); SendMirCall.Send(gameInstance, 3001, [npcId, gameInstance!.MirConfig["寻路参数"], gameInstance!.MirConfig["点NPCCALL地址"]]); }); } public static async Task ClickNPC(MirGameInstanceModel gameInstance, string NpcName) { MonsterModel? npc = null; if (!await TaskWrapper.Wait(() => { npc = gameInstance.Monsters.Values.FirstOrDefault(o => o.TypeStr == "NPC" && o.Name == NpcName); return npc != null; })) { return ""; } return await ClickNPC(gameInstance, npc!); } /// /// 二级对话 /// /// /// public static async Task Talk2(MirGameInstanceModel gameInstance, string cmd) { return await Talk(gameInstance, () => { SendMirCall.Send(gameInstance, 3002, new nint[] { gameInstance!.MirConfig["买物参数"], gameInstance!.MirConfig["小退参数"], gameInstance!.MirConfig["二级对话CALL地址"] ,cmd.Length}.Concat(SendMirCall.String2NIntArray(cmd)).ToArray()); }); } public static async Task Talk2Text(MirGameInstanceModel gameInstance, string text) { string? cmd = null; if (!await TaskWrapper.Wait(() => { cmd = gameInstance.TalkCmds.FirstOrDefault(o => o.Split("/")[0] == text); return cmd != null; })) { return ""; } return await Talk2(gameInstance, cmd!.Split("/")[1]); } /// /// 等NPC出现 /// /// /// /// public static async Task WaitNPC(MirGameInstanceModel gameInstance, string npcName, int timeout = 50) { return await TaskWrapper.Wait(() => gameInstance.Monsters.Values.Any(o => o.TypeStr == "NPC" && o.Name == npcName), timeout); } } }