public static List <GameObject> GetGameObjects(ProcessMemoryReader reader, int objectManagerPointer) { int rootNode = reader.ReadInt(objectManagerPointer + Offsets.ObjectMapRoot); Queue <int> nodesToVisit = new Queue <int>(); HashSet <int> visitedNodes = new HashSet <int>(); List <int> pointers = new List <int>(); nodesToVisit.Enqueue(rootNode); while (nodesToVisit.Count > 0) { var node = nodesToVisit.Dequeue(); if (visitedNodes.Contains(node)) { continue; } visitedNodes.Add(node); nodesToVisit.Enqueue(reader.ReadInt(node)); nodesToVisit.Enqueue(reader.ReadInt(node + 4)); nodesToVisit.Enqueue(reader.ReadInt(node + 8)); uint netId = reader.ReadUint(node + Offsets.ObjectMapNodeId); if (netId - 0x40000000 > 0x100000) { continue; } var pointer = reader.ReadInt(node + Offsets.ObjectMapNodeObject); if (pointer != 0) { pointers.Add(pointer); } } return(pointers.Select(p => new GameObject(reader, p)).ToList()); }
public GameObject(ProcessMemoryReader reader, int memoryAddress) { this.reader = reader; MemoryAddress = memoryAddress; float x = reader.ReadFloat(memoryAddress + Offsets.ObjPos); float y = reader.ReadFloat(memoryAddress + Offsets.ObjPos + 4); float z = reader.ReadFloat(memoryAddress + Offsets.ObjPos + 8); Position = new Vector3(x, y, z); Health = reader.ReadFloat(memoryAddress + Offsets.ObjHealth); Team = reader.ReadInt(memoryAddress + Offsets.ObjTeam); int name = reader.ReadInt(memoryAddress + Offsets.ObjName); if (name != 0) { Name = reader.ReadCString(name, 256); } int missilePointer = reader.ReadInt(MemoryAddress + Offsets.MissileSpellInfo); if (missilePointer == 0) { SpellName = null; return; } int spellPointer = reader.ReadInt(missilePointer + Offsets.SpellInfoSpellData); if (spellPointer == 0) { SpellName = null; return; } int spellName = reader.ReadInt(spellPointer + Offsets.SpellDataMissileName); if (spellName == 0) { SpellName = null; return; } SpellName = reader.ReadCString(spellName, 256); }
public void ReadBuffs() { ActiveBuffs.Clear(); int beginPtr = reader.ReadInt(MemoryAddress + Offsets.ObjBuffManager + Offsets.BuffManagerEntriesArray); int endPtr = reader.ReadInt(MemoryAddress + Offsets.ObjBuffManager + Offsets.BuffManagerEntriesArray + 0x4); if (beginPtr > endPtr || beginPtr <= 0 || endPtr <= 0 || endPtr - beginPtr > 1000) { return; } for (int i = beginPtr; i < endPtr; i += 0x4) { int buffPtr = reader.ReadInt(i); if (buffPtr == 0) { continue; } ActiveBuffs.Add(new Buff(reader, buffPtr)); } }
public void StartCharmBot() { var process = Process.GetProcesses().Where(p => p.ProcessName.ToLower().Contains("league of legends")).FirstOrDefault(); var reader = new ProcessMemoryReader() { Process = process }; reader.Open(); dispatcher.BeginInvoke((Action)(() => { MemoryReaderStatusChanged?.Invoke(true); })); try { GameObject localPlayer = new GameObject(reader, reader.ReadInt(reader.ModuleBaseAddr + Offsets.LocalPlayer)); int objectManagerPointer = reader.ReadInt(reader.ModuleBaseAddr + Offsets.ObjectManager); float charmEffectSeenAt = -1; var seenCharm = false; while (true) { process = Process.GetProcesses().Where(p => p.ProcessName.ToLower().Contains("league of legends")).FirstOrDefault(); if (process == null) { break; } var gameObjects = GameObject.GetGameObjects(reader, objectManagerPointer); var enemyChampions = gameObjects.Where(g => g.Team != localPlayer.Team && isChampion(g.Name) || (g.Name?.ToLower()?.Contains("dummy") ?? false)).ToList(); var ahriCharm = gameObjects.Where(c => c.SpellName == "AhriSeduceMissile").FirstOrDefault(); var gameTime = reader.ReadFloat(reader.ModuleBaseAddr + Offsets.GameTime); foreach (var champ in enemyChampions) { champ.ReadBuffs(); var ahriCharmBuff = champ.ActiveBuffs.FirstOrDefault(b => b.Name == "AhriSeduce" && gameTime < b.EndTime && charmEffectSeenAt < b.StartTime); if (ahriCharmBuff != null) { if (!seenCharm) { CharmBotCharmCast?.Invoke(gameTime); } CharmBotCharmHit?.Invoke(gameTime, champ.Name); charmEffectSeenAt = ahriCharmBuff.StartTime; } } if (ahriCharm != null) { if (!seenCharm) { CharmBotCharmCast?.Invoke(gameTime); } seenCharm = true; } else { seenCharm = false; } Thread.Sleep(10); } } catch (Exception) { } finally { dispatcher.BeginInvoke((Action)(() => { MemoryReaderStatusChanged?.Invoke(false); })); reader.Close(); } }