Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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);
     }
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
 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;
     }
 }