public WowUnitReaction GetUnitReaction(WowUnit wowUnitA, WowUnit wowUnitB) { WowUnitReaction reaction = WowUnitReaction.Unknown; if (wowUnitA == null || wowUnitB == null) { return(reaction); } if (BotCache.TryGetReaction(wowUnitA.FactionTemplate, wowUnitB.FactionTemplate, out WowUnitReaction cachedReaction)) { return(cachedReaction); } // integer to save the reaction XMemory.AllocateMemory(4, out IntPtr memAlloc); XMemory.Write(memAlloc, 0); string[] asm = new string[] { $"PUSH {wowUnitA.BaseAddress}", $"MOV ECX, {wowUnitB.BaseAddress}", $"CALL {OffsetList.FunctionGetUnitReaction}", $"MOV [{memAlloc}], EAX", "RETN", }; // we need this, to be very accurate, otherwise wow will crash if (XMemory.ReadStruct(IntPtr.Add(wowUnitA.DescriptorAddress, OffsetList.DescriptorUnitFlags.ToInt32()), out BitVector32 unitFlagsA) && XMemory.ReadStruct(IntPtr.Add(wowUnitB.DescriptorAddress, OffsetList.DescriptorUnitFlags.ToInt32()), out BitVector32 unitFlagsB)) { wowUnitA.UnitFlags = unitFlagsA; wowUnitB.UnitFlags = unitFlagsB; } else { return(reaction); } if (wowUnitA.IsDead || wowUnitB.IsDead) { return(reaction); } try { InjectAndExecute(asm, true); XMemory.Read(memAlloc, out reaction); BotCache.CacheReaction(wowUnitA.FactionTemplate, wowUnitB.FactionTemplate, reaction); } finally { XMemory.FreeMemory(memAlloc); } return(reaction); }
public bool TryGetReaction(int a, int b, out WowUnitReaction reaction) { if (Reactions.ContainsKey(a) && Reactions[a].ContainsKey(b)) { reaction = Reactions[a][b]; return(true); } reaction = WowUnitReaction.Unknown; return(false); }
public WowUnitReaction GetReaction(IWowUnit a, IWowUnit b) { if (Reactions.ContainsKey(a.FactionTemplate) && Reactions[a.FactionTemplate].ContainsKey(b.FactionTemplate)) { return(Reactions[a.FactionTemplate][b.FactionTemplate]); } else { WowUnitReaction reaction = Wow.GetReaction(a.BaseAddress, b.BaseAddress); CacheReaction(a.FactionTemplate, b.FactionTemplate, reaction); return(reaction); } }
public WowUnitReaction GetUnitReaction(WowUnit wowUnitA, WowUnit wowUnitB) { WowUnitReaction reaction = WowUnitReaction.Unknown; if (wowUnitA == null || wowUnitB == null) { return(reaction); } if (WowInterface.BotCache.TryGetReaction(wowUnitA.FactionTemplate, wowUnitB.FactionTemplate, out WowUnitReaction cachedReaction)) { return(cachedReaction); } // integer to save the reaction WowInterface.XMemory.AllocateMemory(4, out IntPtr memAlloc); WowInterface.XMemory.Write(memAlloc, 0); // TODO: refactor this string[] asm = new string[] { $"PUSH {wowUnitA.BaseAddress}", $"MOV ECX, {wowUnitB.BaseAddress}", $"CALL {WowInterface.OffsetList.FunctionUnitGetReaction}", $"MOV [{memAlloc}], EAX", "RETN", }; if (wowUnitA.IsDead || wowUnitB.IsDead) { return(reaction); } try { InjectAndExecute(asm, true); WowInterface.XMemory.Read(memAlloc, out reaction); WowInterface.BotCache.CacheReaction(wowUnitA.FactionTemplate, wowUnitB.FactionTemplate, reaction); } finally { WowInterface.XMemory.FreeMemory(memAlloc); } return(reaction); }
public void CacheReaction(int a, int b, WowUnitReaction reaction) { if (!Reactions.ContainsKey(a)) { Reactions.TryAdd(a, new Dictionary <int, WowUnitReaction>() { { b, reaction } }); } else if (!Reactions[a].ContainsKey(b)) { Reactions[a].Add(b, reaction); } else { Reactions[a][b] = reaction; } }