using Mir2Assistant.Common.Models; using Mir2Assistant.Common.Utils; using Mir2Assistant.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Mir2Assistant.Common.Functions; /// /// 读怪、砍怪 /// public static class MonsterFunction { /// /// 读怪 /// public static void ReadMonster(MirGameInstanceModel gameInstance) { Task.Run(() => { if (gameInstance.IsReadingMonsters) { return; } gameInstance.IsReadingMonsters = true; //var Monsters = new List(); var memoryUtils = gameInstance!.MemoryUtils!; var monstersAddr = memoryUtils.ReadToInt(memoryUtils.GetMemoryAddress(gameInstance.MirConfig["角色基址"], -0x4, 0x3528)); var monsterCount = memoryUtils.ReadToInt(monstersAddr + 0x8); var monsterArrayAddr = memoryUtils.ReadToInt(monstersAddr + 0x4); byte flag = 0; ++gameInstance.MonstersUpdateId; for (int i = 0; i < monsterCount; i++) { bool isNew = false; var monsterAddr = memoryUtils.ReadToInt(monsterArrayAddr + i * 0x4); var id = memoryUtils.ReadToInt(monsterAddr + 0x4); gameInstance.Monsters.TryGetValue(id, out MonsterModel? monster); if (monster == null) { monster = new MonsterModel(); isNew = true; } monster.UpdateId = gameInstance.MonstersUpdateId; monster.Id = id; monster.Type = monster.Type ?? memoryUtils.ReadToShort(monsterAddr + 0x20); monster.Addr = monsterAddr; monster.Name = monster.Name ?? memoryUtils.ReadToString(memoryUtils.GetMemoryAddress(monsterAddr + 0x48, 0), 24); if (monster.TypeStr != "NPC" || monster.X == null) { monster.X = memoryUtils.ReadToShort(monsterAddr + 8); monster.Y = memoryUtils.ReadToShort(monsterAddr + 10); } //MonsterModel.Guild = memoryUtils.ReadToString(memoryUtils.GetMemoryAddress(monsterAddr + 0x44, 0)); monster.Flag = flag; if (monster.Name == gameInstance.CharacterStatus!.Name) { monster.Flag = 1; flag = 2; } if (isNew) { gameInstance.Monsters.TryAdd(id, monster); } } foreach (var item in gameInstance.Monsters.Values.Where(o => o.UpdateId != gameInstance.MonstersUpdateId)) { gameInstance.Monsters.TryRemove(item.Id, out MonsterModel? m); } gameInstance.IsReadingMonsters = false; }); } /// /// 锁定怪物,相当物游戏中鼠标指向某个怪 /// public static void LockMonster(MirGameInstanceModel gameInstance, int monsterAddr) { var memoryUtils = gameInstance!.MemoryUtils!; memoryUtils.WriteInt(gameInstance.MirConfig["存怪参数"], monsterAddr); } /// /// 砍怪 /// /// /// public static void SlayingMonster(MirGameInstanceModel gameInstance, int monsterAddr) { var memoryUtils = gameInstance!.MemoryUtils!; memoryUtils.WriteInt(memoryUtils.GetMemoryAddress(gameInstance.MirConfig["打怪基址"], -0xc), monsterAddr); } }