Ejemplo n.º 1
0
        public void Execute()
        {
            Combat();

            if (WowInterface.ObjectManager.Vehicle == null)
            {
                WowGameobject VehicleNode = WowInterface.ObjectManager.WowObjects
                                            .OfType <WowGameobject>()
                                            .Where(x => Enum.IsDefined(typeof(Vehicle), x.DisplayId) &&
                                                   x.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < 20)
                                            .OrderBy(x => x.Position.GetDistance(WowInterface.ObjectManager.Player.Position))
                                            .FirstOrDefault();

                if (VehicleNode != null)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, VehicleNode.Position);

                    if (WowInterface.ObjectManager.Player.Position.GetDistance(VehicleNode.Position) <= 4)
                    {
                        WowInterface.MovementEngine.StopMovement();

                        WowInterface.HookManager.WowObjectRightClick(VehicleNode);
                    }
                }
            }
            else
            {
                Vector3 currentNode = PathRight[0];
                WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
            }
        }
Ejemplo n.º 2
0
 public override void Execute()
 {
     if (BattlegroundEngine.BattlegroundProfile.BattlegroundType == BattlegroundType.CaptureTheFlag)
     {
         IEnumerable <WowGameobject> flags = BattlegroundEngine.GetBattlegroundFlags(false);
         if (flags.Count() > 0)
         {
             if (!((ICtfBattlegroundProfile)BattlegroundEngine.BattlegroundProfile).IsMeFlagCarrier)
             {
                 WowGameobject flagObject = flags.First();
                 if (flagObject != null && flagObject.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < 8)
                 {
                     WowInterface.HookManager.WowObjectOnRightClick(flagObject);
                 }
                 else
                 {
                     WowInterface.MovementEngine.SetState(MovementEngineState.Moving, flagObject.Position);
                     WowInterface.MovementEngine.Execute();
                 }
             }
             else
             {
                 BattlegroundEngine.SetState(BattlegroundState.MoveToOwnBase);
             }
         }
         else
         {
             BattlegroundEngine.SetState(BattlegroundState.DefendMyself);
         }
     }
 }
Ejemplo n.º 3
0
        private void FollowNodePath(double completionDistance)
        {
            if (CurrentNodes.TryPeek(out DungeonNode node))
            {
                if (WowInterface.ObjectManager.Player.Position.GetDistance(node.Position) > completionDistance)
                {
                    WowInterface.MovementEngine.SetState(MovementEngineState.Moving, node.Position);
                    WowInterface.MovementEngine.Execute();
                }
                else
                {
                    DungeonNode dungeonNode = node;

                    if (dungeonNode.Type == Enums.DungeonNodeType.Door ||
                        dungeonNode.Type == Enums.DungeonNodeType.Collect ||
                        dungeonNode.Type == Enums.DungeonNodeType.Use)
                    {
                        WowGameobject obj = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                            .OrderBy(e => e.Position.GetDistance(dungeonNode.Position))
                                            .FirstOrDefault();

                        if (obj != null && obj.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < completionDistance)
                        {
                            WowInterface.HookManager.WowObjectOnRightClick(obj);
                        }
                    }

                    if (CurrentNodes.TryDequeue(out DungeonNode completedNode))
                    {
                        CompletedNodes.Add(completedNode);
                        Progress = Math.Round(CompletedNodes.Count / (double)TotalNodes * 100.0);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public bool Enter()
        {
            SatDown = false;

            // get the center from where to cal the distance, this is needed
            // to prevent going out of the follow trigger radius, which
            // would cause a suspicous loop of running around
            Vector3 originPos = StateMachine.GetState <StateIdle>().IsUnitToFollowThere(out WowUnit unit, false) ? unit.Position : WowInterface.Player.Position;

            WowGameobject seat = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                 .OrderBy(e => e.Position.GetDistance(originPos))
                                 .FirstOrDefault(e => e.GameobjectType == WowGameobjectType.Chair
                                                 // make sure no one sits on the chair besides ourself
                                                 && !WowInterface.ObjectManager.WowObjects.OfType <WowUnit>()
                                                 .Where(e => e.Guid != WowInterface.PlayerGuid)
                                                 .Any(x => e.Position.GetDistance(x.Position) < 0.6f) &&
                                                 e.Position.GetDistance(originPos) < MaxDistance - 0.2f);

            if (seat != null)
            {
                CurrentSeat = seat;
                return(true);
            }

            return(false);
        }
Ejemplo n.º 5
0
        public bool ExecuteTactic(CombatClassRole role, bool isMelee, out bool preventMovement, out bool allowAttacking)
        {
            if (role == CombatClassRole.Dps)
            {
                WowUnit       wowUnit = WowInterface.ObjectManager.GetClosestWowUnitByDisplayId(DragonDisplayId, false);
                WowGameobject portal  = NearestPortal;

                if (wowUnit != null)
                {
                    if (portal != null && WowInterface.ObjectManager.Player.HealthPercentage > 80.0)
                    {
                        preventMovement = true;
                        allowAttacking  = false;

                        UsePortal(portal);

                        return(true);
                    }
                }
                else if (portal != null && WowInterface.ObjectManager.Player.HealthPercentage < 25.0)
                {
                    preventMovement = true;
                    allowAttacking  = false;

                    UsePortal(portal);

                    return(true);
                }
            }

            preventMovement = false;
            allowAttacking  = true;
            return(false);
        }
Ejemplo n.º 6
0
        public void WowGameobjectSizeTest()
        {
            // >> WowObject : WowGameobject
            int rawWowObjectSize     = Marshal.SizeOf(typeof(RawWowObject));
            int rawWowGameobjectSize = Marshal.SizeOf(typeof(RawWowGameobject));

            _ = new WowGameobject(IntPtr.Zero, WowObjectType.Gameobject);

            Assert.AreEqual(RawWowObject.EndOffset + RawWowGameobject.EndOffset, rawWowObjectSize + rawWowGameobjectSize);
        }
Ejemplo n.º 7
0
 private void UsePortal(WowGameobject portal)
 {
     if (!WowInterface.ObjectManager.Player.IsInRange(portal, 3.0f))
     {
         WowInterface.MovementEngine.SetMovementAction(Movement.Enums.MovementAction.Move, portal.Position);
     }
     else if (PortalClickEvent.Run())
     {
         WowInterface.HookManager.WowObjectRightClick(portal);
     }
 }
Ejemplo n.º 8
0
        private void RenderHerbs(int halfWidth, int halfHeight, Graphics graphics, double scale, Vector3 playerPosition, double playerRotation)
        {
            IEnumerable <WowGameobject> herbNodes = AmeisenBot.WowInterface.ObjectManager.WowObjects
                                                    .ToList()
                                                    .OfType <WowGameobject>()
                                                    .Where(e => Enum.IsDefined(typeof(HerbNode), e.DisplayId));

            for (int i = 0; i < herbNodes.Count(); ++i)
            {
                WowGameobject gameobject    = herbNodes.ElementAt(i);
                Point         positionOnMap = GetRelativePosition(playerPosition, gameobject.Position, playerRotation, halfWidth, halfHeight, scale);
                RenderGameobject(positionOnMap.X, positionOnMap.Y, ((HerbNode)gameobject.DisplayId).ToString(), HerbBrush, TextBrush, TextFont, graphics);
            }
        }
Ejemplo n.º 9
0
        private void RenderOres(int halfWidth, int halfHeight, Graphics graphics, float scale, Vector3 playerPosition, float playerRotation)
        {
            List <WowGameobject> oreNodes = AmeisenBot.WowInterface.ObjectManager.WowObjects
                                            .ToList()
                                            .OfType <WowGameobject>()
                                            .Where(e => Enum.IsDefined(typeof(WowOreId), e.DisplayId))
                                            .ToList();

            for (int i = 0; i < oreNodes.Count; ++i)
            {
                WowGameobject gameobject    = oreNodes[i];
                Point         positionOnMap = GetRelativePosition(playerPosition, gameobject.Position, playerRotation, halfWidth, halfHeight, scale);
                RenderGameobject(positionOnMap.X, positionOnMap.Y, ((WowOreId)gameobject.DisplayId).ToString(), OreBrush, TextBrush, TextFont, graphics);
            }
        }
Ejemplo n.º 10
0
        private WowGameobject ReadWowGameobject(IntPtr activeObject, WowObjectType wowObjectType)
        {
            if (WowInterface.XMemory.Read(IntPtr.Add(activeObject, WowInterface.OffsetList.WowObjectDescriptor.ToInt32()), out IntPtr descriptorAddress) &&
                WowInterface.XMemory.ReadStruct(IntPtr.Add(activeObject, WowInterface.OffsetList.WowGameobjectPosition.ToInt32()), out Vector3 position))
            {
                WowGameobject dynObject = new WowGameobject(activeObject, wowObjectType)
                {
                    DescriptorAddress = descriptorAddress,
                    Position          = position
                };

                return(dynObject.UpdateRawWowGameobject(WowInterface.XMemory));
            }

            return(null);
        }
Ejemplo n.º 11
0
        public override void Execute()
        {
            WowInterface.ObjectManager.UpdateObject(PlayerToFollow);

            Vector3 posToGoTo = default;

            // handle nearby portals, if our groupleader enters a portal, we follow
            WowGameobject nearestPortal = WowInterface.ObjectManager.WowObjects
                                          .OfType <WowGameobject>()
                                          .Where(e => e.DisplayId == (int)GameobjectDisplayId.DungeonPortalNormal || e.DisplayId == (int)GameobjectDisplayId.DungeonPortalHeroic)
                                          .FirstOrDefault(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < Config.GhostPortalScanThreshold);

            if (nearestPortal != null)
            {
                double distanceToPortal = PlayerToFollow.Position.GetDistance(nearestPortal.Position);

                if (distanceToPortal < 4.0)
                {
                    // move into portal, MoveAhead is used to go beyond the portals entry point to make sure enter it
                    posToGoTo = BotUtils.MoveAhead(BotMath.GetFacingAngle2D(WowInterface.ObjectManager.Player.Position, nearestPortal.Position), nearestPortal.Position, 6);
                }
            }

            // if no portal position was found, follow the player
            if (posToGoTo == default)
            {
                posToGoTo = PlayerToFollow.Position;
            }

            double distance = PlayerToFollow.Position.GetDistance(posToGoTo);

            if (distance < Config.MinFollowDistance || distance > Config.MaxFollowDistance)
            {
                StateMachine.SetState(BotState.Idle);
            }

            if (WowInterface.ObjectManager.Player.IsCasting)
            {
                return;
            }

            WowInterface.MovementEngine.SetState(MovementEngineState.Following, posToGoTo);
            WowInterface.MovementEngine.Execute();
        }
Ejemplo n.º 12
0
        private BehaviorTreeStatus MoveToNearestBuff(CtfBlackboard blackboard)
        {
            WowGameobject buffObject = WowInterface.ObjectManager.GetClosestWowGameobjectByDisplayId(new List <int>()
            {
                5991, 5995, 5931
            });

            if (buffObject != null &&
                buffObject.Position.GetDistance(WowInterface.ObjectManager.Player.Position) > 3.0)
            {
                WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, buffObject.Position);
            }
            else
            {
                return(BehaviorTreeStatus.Failed);
            }

            return(BehaviorTreeStatus.Ongoing);
        }
Ejemplo n.º 13
0
        private bool IsGateOpen()
        {
            if (WowInterface.ObjectManager.Player.IsAlliance())
            {
                WowGameobject obj = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                    .Where(e => e.GameobjectType == WowGameobjectType.Door && e.DisplayId == 411)
                                    .FirstOrDefault();

                return(obj == null || obj.Bytes0 == 0);
            }
            else
            {
                WowGameobject obj = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                    .Where(e => e.GameobjectType == WowGameobjectType.Door && e.DisplayId == 850)
                                    .FirstOrDefault();

                return(obj == null || obj.Bytes0 == 0);
            }
        }
Ejemplo n.º 14
0
        private void SendItemMails(List <string> items, string receiver, WowGameobject mailbox)
        {
            if (!MailboxMode)
            {
                foreach (string item in items)
                {
                    MailboxItemQueue.Enqueue(item);
                }

                MailboxMode = true;
                AmeisenLogger.Instance.Log("JobEngine", $"Entering MailboxMode", LogLevel.Verbose);
            }

            // open mailbox
            WowInterface.HookManager.WowObjectOnRightClick(mailbox);
            Task.Delay(1000).GetAwaiter().GetResult();
            AmeisenLogger.Instance.Log("JobEngine", $"Rightclicked Mailbox", LogLevel.Verbose);

            JobEngineStatus = JobEngineStatus.Sending;

            // send stuff to character
            WowInterface.HookManager.SendItemMailToCharacter(MailboxItemQueue.Peek(), receiver);
            Task.Delay(1000).GetAwaiter().GetResult();
            AmeisenLogger.Instance.Log("JobEngine", $"Sent Mail with \"{MailboxItemQueue.Peek()}\" to \"{receiver}\"", LogLevel.Verbose);

            // remove item from mail list if we have no units left in our bags
            WowInterface.CharacterManager.Inventory.Update();
            if (!WowInterface.CharacterManager.Inventory.Items.Any(e => e.Name.ToUpper() == MailboxItemQueue.Peek().ToUpper()))
            {
                AmeisenLogger.Instance.Log("JobEngine", $"Finished sending \"{MailboxItemQueue.Peek()}\"", LogLevel.Verbose);
                MailboxItemQueue.Dequeue();
            }

            // continue if ther are no item left to be checked
            MailboxMode = MailboxItemQueue.Count > 0;

            if (!MailboxMode)
            {
                AmeisenLogger.Instance.Log("JobEngine", $"Leaving MailboxMode", LogLevel.Verbose);
            }
        }
        public void Execute()
        {
            if (Finished)
            {
                return;
            }

            WowGameobject lootableObject = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                           .Where(e => e.DisplayId == ObjectDisplayId)
                                           .OrderBy(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position))
                                           .FirstOrDefault();

            if (lootableObject != null)
            {
                if (lootableObject.Position.GetDistance(WowInterface.ObjectManager.Player.Position) > 3.0)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Moving, lootableObject.Position);
                }
                else
                {
                    if (RightClickEvent.Run())
                    {
                        WowInterface.MovementEngine.Reset();
                        WowInterface.HookManager.WowStopClickToMove();
                        WowInterface.HookManager.WowObjectRightClick(lootableObject);
                    }
                }
            }
            else
            {
                AreaNode selectedArea = Area
                                        .OrderBy(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position))
                                        .FirstOrDefault(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < e.Radius);

                if (selectedArea != null)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Moving, selectedArea.Position);
                }
            }
        }
Ejemplo n.º 16
0
        public void Execute()
        {
            if (PlacedCampfire && SatDown)
            {
                return;
            }

            WowGameobject nearCampfire = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                         .FirstOrDefault(e => e.DisplayId == (int)WowGameobjectDisplayId.CookingCampfire && WowInterface.ObjectManager.PartymemberGuids.Contains(e.CreatedBy));

            if (nearCampfire != null && !SatDown)
            {
                WowInterface.HookManager.WowFacePosition(WowInterface.Player, nearCampfire.Position);
                WowInterface.HookManager.LuaSendChatMessage(Rnd.Next(0, 2) == 1 ? "/sit" : "/sleep");
                SatDown = true;
            }
            else if (!PlacedCampfire)
            {
                WowInterface.HookManager.LuaCastSpell("Basic Campfire");
                PlacedCampfire = true;
            }
        }
        public void Execute()
        {
            if (!CheckedMails)
            {
                if (CurrentMailbox.GetDistance(WowInterface.I.ObjectManager.Player.Position) > 3.5f)
                {
                    WowInterface.I.MovementEngine.SetMovementAction(MovementAction.Moving, CurrentMailbox);
                }
                else
                {
                    WowInterface.I.MovementEngine.StopMovement();

                    WowGameobject mailbox = WowInterface.I.ObjectManager.WowObjects.OfType <WowGameobject>()
                                            .FirstOrDefault(e => e.GameobjectType == WowGameobjectType.Mailbox && e.Position.GetDistance(CurrentMailbox) < 1.0f);

                    if (mailbox != null)
                    {
                        WowInterface.I.HookManager.WowObjectRightClick(mailbox);
                        WowInterface.I.HookManager.LuaDoString("for i=1,GetInboxNumItems()do AutoLootMailItem(i)end");
                    }

                    CheckedMails     = true;
                    MailboxCheckTime = DateTime.UtcNow + TimeSpan.FromSeconds(Rnd.Next(7, 16));
                }
            }
            else if (!ReturnedToOrigin && MailboxCheckTime < DateTime.UtcNow)
            {
                if (CurrentMailbox.GetDistance(OriginPosition) > 8.0f)
                {
                    WowInterface.I.MovementEngine.SetMovementAction(MovementAction.Moving, OriginPosition);
                }
                else
                {
                    WowInterface.I.MovementEngine.StopMovement();
                    ReturnedToOrigin = true;
                }
            }
        }
Ejemplo n.º 18
0
        private BehaviorTreeStatus UseNearestFlag(CtfBlackboard blackboard)
        {
            WowGameobject nearestFlag = JBgBlackboard.NearFlags.OrderBy(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position)).FirstOrDefault();

            if (nearestFlag != null)
            {
                double distance = WowInterface.ObjectManager.Player.Position.GetDistance(nearestFlag.Position);

                if (distance > 4.0)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, nearestFlag.Position);
                }
                else if (ActionEvent.Run())
                {
                    WowInterface.HookManager.WowObjectRightClick(nearestFlag);
                }
            }
            else
            {
                return(BehaviorTreeStatus.Failed);
            }

            return(BehaviorTreeStatus.Ongoing);
        }
Ejemplo n.º 19
0
        public void Execute()
        {
            Combat();

            WowGameobject FlagNode = WowInterface.ObjectManager.WowObjects
                                     .OfType <WowGameobject>()
                                     .Where(x => Enum.IsDefined(typeof(Flags), x.DisplayId) &&
                                            x.Position.GetDistance(WowInterface.Player.Position) < 15)
                                     .OrderBy(x => x.Position.GetDistance(WowInterface.Player.Position))
                                     .FirstOrDefault();

            if (FlagNode != null)
            {
                WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, FlagNode.Position);

                if (WowInterface.Player.Position.GetDistance(FlagNode.Position) <= 4)
                {
                    WowInterface.MovementEngine.StopMovement();

                    if (CaptureFlagEvent.Run())
                    {
                        WowInterface.HookManager.WowObjectRightClick(FlagNode);
                    }
                }
                else
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, FlagNode.Position);
                }
            }
            else
            {
                if (WowInterface.HookManager.WowExecuteLuaAndRead(BotUtils.ObfuscateLua("{v:0}=\"\" for i = 1, GetNumMapLandmarks(), 1 do base, status = GetMapLandmarkInfo(i) {v:0}= {v:0}..base..\":\"..status..\";\" end"), out string result))
                {
                    Vector3  currentNode = PathBase[CurrentNodeCounter];
                    string[] AllBaseList = result.Split(';');

                    if (WowInterface.Player.HasBuffById(34976))
                    {
                        if (AllBaseList[CurrentNodeCounter].Contains(factionFlagState))
                        {
                            WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                        }
                        else
                        {
                            ++CurrentNodeCounter;
                            if (CurrentNodeCounter >= PathBase.Count)
                            {
                                CurrentNodeCounter = 0;
                            }
                        }
                    }
                    else
                    {
                        if (AllBaseList[CurrentNodeCounter].Contains("Uncontrolled") ||
                            AllBaseList[CurrentNodeCounter].Contains("In Conflict") ||
                            AllBaseList[CurrentNodeCounter].Contains(factionFlagState))
                        {
                            WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                        }

                        if (WowInterface.Player.Position.GetDistance(currentNode) < 10.0f)
                        {
                            ++CurrentNodeCounter;

                            if (CurrentNodeCounter >= PathBase.Count)
                            {
                                CurrentNodeCounter = 0;
                            }
                        }
                        else if (factionFlagState != null && AllBaseList[CurrentNodeCounter].Contains(factionFlagState))
                        {
                            ++CurrentNodeCounter;
                            if (CurrentNodeCounter >= PathBase.Count)
                            {
                                CurrentNodeCounter = 0;
                            }
                        }
                        else if (FlagNode != null)
                        {
                            IEnumerable <WowPlayer> enemiesNearFlag   = WowInterface.ObjectManager.GetNearEnemies <WowPlayer>(FlagNode.Position, 40);
                            IEnumerable <WowPlayer> friendsNearFlag   = WowInterface.ObjectManager.GetNearFriends <WowPlayer>(FlagNode.Position, 40);
                            IEnumerable <WowPlayer> friendsNearPlayer = WowInterface.ObjectManager.GetNearFriends <WowPlayer>(WowInterface.Player.Position, 20);

                            if (enemiesNearFlag != null)
                            {
                                if (enemiesNearFlag.Count() >= 2)
                                {
                                    if (friendsNearFlag != null && (friendsNearFlag.Count() >= 1 || friendsNearPlayer.Count() >= 1))
                                    {
                                        WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                                        return;
                                    }
                                }
                                else
                                {
                                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                                    return;
                                }
                            }
                        }
                        else
                        {
                            WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                        }
                    }
                }
            }
        }
Ejemplo n.º 20
0
        private void ExecuteMining(IMiningProfile miningProfile)
        {
            if (WowInterface.ObjectManager.Player.IsCasting)
            {
                return;
            }

            if (CheckForPathRecovering)
            {
                Vector3 closestNode = miningProfile.Path.OrderBy(e => e.GetDistance(WowInterface.ObjectManager.Player.Position)).First();
                CurrentNodeCounter     = miningProfile.Path.IndexOf(closestNode) + 1;
                CheckForPathRecovering = false;
                NodeTryCounter         = 0;
            }

            if (WowInterface.CharacterManager.Inventory.FreeBagSlots < 3 && SellActionsNeeded == 0)
            {
                SellActionsNeeded      = (int)Math.Ceiling(WowInterface.CharacterManager.Inventory.Items.Count / 12.0); // 12 items per mail
                CheckForPathRecovering = true;
            }

            if (SellActionsNeeded > 0)
            {
                WowGameobject mailboxNode = WowInterface.ObjectManager.WowObjects
                                            .OfType <WowGameobject>()
                                            .Where(x => Enum.IsDefined(typeof(MailBox), x.DisplayId) &&
                                                   x.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < 15)
                                            .OrderBy(x => x.Position.GetDistance(WowInterface.ObjectManager.Player.Position))
                                            .FirstOrDefault();

                if (mailboxNode != null)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, mailboxNode.Position);

                    if (WowInterface.ObjectManager.Player.Position.GetDistance(mailboxNode.Position) <= 4)
                    {
                        WowInterface.MovementEngine.StopMovement();

                        if (MailSentEvent.Run())
                        {
                            WowInterface.HookManager.WowObjectRightClick(mailboxNode);
                            WowInterface.HookManager.LuaDoString("MailFrameTab2:Click();");

                            int usedItems = 0;
                            foreach (IWowItem item in WowInterface.CharacterManager.Inventory.Items)
                            {
                                if (Config.ItemSellBlacklist.Contains(item.Name) || item.Name.Contains("Mining Pick", StringComparison.OrdinalIgnoreCase))
                                {
                                    continue;
                                }

                                WowInterface.HookManager.LuaUseContainerItem(item.BagId, item.BagSlot);
                                ++usedItems;
                            }

                            if (usedItems > 0)
                            {
                                WowInterface.HookManager.LuaDoString($"SendMail('{Config.JobEngineMailReceiver}', '{Config.JobEngineMailHeader}', '{Config.JobEngineMailText}')");
                                --SellActionsNeeded;
                            }
                            else
                            {
                                SellActionsNeeded = 0;
                            }
                        }
                    }
                    else
                    {
                        WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, mailboxNode.Position);
                    }
                }
                else
                {
                    Vector3 currentNode = miningProfile.MailboxNodes.OrderBy(x => x.GetDistance(WowInterface.ObjectManager.Player.Position)).FirstOrDefault();
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);
                }

                return;
            }

            if (SelectedPosition == default)
            {
                // search for nodes
                int miningSkill = WowInterface.CharacterManager.Skills.ContainsKey("Mining") ? WowInterface.CharacterManager.Skills["Mining"].Item1 : 0;

                WowGameobject nearestNode = WowInterface.ObjectManager.WowObjects
                                            .OfType <WowGameobject>()
                                            .Where(e => !NodeBlacklist.Contains(e.Guid) &&
                                                   Enum.IsDefined(typeof(OreNode), e.DisplayId) &&
                                                   miningProfile.OreTypes.Contains((OreNode)e.DisplayId) &&
                                                   (((OreNode)e.DisplayId) == OreNode.Copper ||
                                                    (((OreNode)e.DisplayId) == OreNode.Tin && miningSkill >= 65) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Silver && miningSkill >= 75) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Iron && miningSkill >= 125) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Gold && miningSkill >= 155) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Mithril && miningSkill >= 175) ||
                                                    (((OreNode)e.DisplayId) == OreNode.DarkIron && miningSkill >= 230) ||
                                                    (((OreNode)e.DisplayId) == OreNode.SmallThorium && miningSkill >= 245) ||
                                                    (((OreNode)e.DisplayId) == OreNode.RichThorium && miningSkill >= 275) ||
                                                    (((OreNode)e.DisplayId) == OreNode.FelIron && miningSkill >= 300) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Adamantite && miningSkill >= 325) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Cobalt && miningSkill >= 350) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Khorium && miningSkill >= 375) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Saronite && miningSkill >= 400) ||
                                                    (((OreNode)e.DisplayId) == OreNode.Titanium && miningSkill >= 450)))
                                            .OrderBy(x => x.Position.GetDistance(WowInterface.ObjectManager.Player.Position))
                                            .FirstOrDefault();

                if (nearestNode != null)
                {
                    // select node and try to find it
                    SelectedPosition = nearestNode.Position;
                    SelectedGuid     = nearestNode.Guid;
                }
                else
                {
                    // if no node was found, follow the path
                    GeneratedPathToNode = false;

                    Vector3 currentNode = miningProfile.Path[CurrentNodeCounter];
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, currentNode);

                    if (WowInterface.Player.Position.GetDistance(currentNode) < 3.0f)
                    {
                        ++CurrentNodeCounter;

                        if (CurrentNodeCounter >= miningProfile.Path.Count)
                        {
                            if (!miningProfile.IsCirclePath)
                            {
                                miningProfile.Path.Reverse();
                            }

                            CurrentNodeCounter = 0;
                        }
                    }
                }
            }
            else
            {
                // move to the node
                double        distanceToNode = WowInterface.ObjectManager.Player.Position.GetDistance(SelectedPosition);
                WowGameobject node           = WowInterface.ObjectManager.GetWowObjectByGuid <WowGameobject>(SelectedGuid);

                if (distanceToNode < 3)
                {
                    if (WowInterface.ObjectManager.Player.IsMounted)
                    {
                        WowInterface.HookManager.LuaDismissCompanion();
                        return;
                    }

                    WowInterface.MovementEngine.StopMovement();

                    if (MiningEvent.Run()) // limit the executions
                    {
                        if (WowInterface.XMemory.Read(WowInterface.OffsetList.LootWindowOpen, out byte lootOpen) &&
                            lootOpen > 0)
                        {
                            WowInterface.HookManager.LuaLootEveryThing();
                        }
                        else
                        {
                            WowInterface.HookManager.WowObjectRightClick(node);
                        }
                    }

                    CheckForPathRecovering = true;
                    NodeTryCounter         = 0;
                }
                else if (distanceToNode < 20.0 && node == null)
                {
                    // if we are 20m or less near the node and its still not loaded, we can ignore it
                    SelectedPosition = default;
                    SelectedGuid     = 0;
                }
                else
                {
                    if (GeneratedPathToNode && BlacklistEvent.Run())
                    {
                        if (!WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, node.Position))
                        {
                            if (NodeTryCounter > 2)
                            {
                                NodeBlacklist.Add(node.Guid);
                                NodeTryCounter = 0;
                            }

                            ++NodeTryCounter;
                        }
                        else
                        {
                            GeneratedPathToNode = true;
                        }
                    }
                }
            }
        }
        public void Execute()
        {
            if ((CurrentSpot == default || SpotSelected + SpotDuration <= DateTime.UtcNow) &&
                !WowInterface.I.ObjectManager.Player.IsCasting &&
                WowInterface.I.Db.TryGetPointsOfInterest(WowInterface.I.ObjectManager.MapId, Data.Db.Enums.PoiType.FishingSpot, WowInterface.I.ObjectManager.Player.Position, 256.0, out IEnumerable <Vector3> pois))
            {
                CurrentSpot  = pois.ElementAt(Rnd.Next(0, pois.Count() - 1));
                SpotSelected = DateTime.UtcNow;
                SpotDuration = TimeSpan.FromSeconds(new Random().Next(MinDuration, MaxDuration));
            }

            if (CurrentSpot != default)
            {
                if (WowInterface.I.ObjectManager.Player.Position.GetDistance(CurrentSpot) > 3.5f)
                {
                    WowInterface.I.MovementEngine.SetMovementAction(MovementAction.Moving, CurrentSpot);
                    return;
                }
                else if (WowInterface.I.HookManager.WowIsClickToMoveActive())
                {
                    WowInterface.I.MovementEngine.StopMovement();
                    return;
                }

                if (!BotMath.IsFacing(WowInterface.I.ObjectManager.Player.Position, WowInterface.I.ObjectManager.Player.Rotation, CurrentSpot))
                {
                    WowInterface.I.HookManager.WowFacePosition(WowInterface.I.ObjectManager.Player, CurrentSpot);
                    return;
                }
            }

            if (!IsFishingRodEquipped())
            {
                IWowItem fishingRod = WowInterface.I.CharacterManager.Inventory.Items.OfType <WowWeapon>()
                                      .FirstOrDefault(e => e.WeaponType == WeaponType.FISHING_POLES);

                if (fishingRod != null)
                {
                    WowInterface.I.HookManager.LuaEquipItem(fishingRod);
                }
            }

            WowGameobject fishingBobber = WowInterface.I.ObjectManager.WowObjects.OfType <WowGameobject>()
                                          .FirstOrDefault(e => e.GameobjectType == WowGameobjectType.FishingBobber && e.CreatedBy == WowInterface.I.ObjectManager.Player.Guid);

            if (!Started)
            {
                Started       = true;
                CooldownStart = DateTime.UtcNow;
                Duration      = TimeSpan.FromSeconds(Rnd.Next(MinDuration, MaxDuration));
            }
            else if (CooldownStart + Duration <= DateTime.UtcNow)
            {
                Started       = false;
                CooldownStart = default;
                Duration      = default;
                CurrentSpot   = default;
                return;
            }

            if (!WowInterface.I.ObjectManager.Player.IsCasting || fishingBobber == null)
            {
                WowInterface.I.HookManager.LuaCastSpell("Fishing");
            }
            else if (fishingBobber.Flags[(int)WowGameobjectFlags.DoesNotDespawn])
            {
                WowInterface.I.HookManager.WowObjectRightClick(fishingBobber);
                WowInterface.I.HookManager.LuaLootEveryThing();
            }
        }
Ejemplo n.º 22
0
        public void ExecuteGathering()
        {
            IGatheringProfile gatheringProfile = (IGatheringProfile)JobProfile;

            if (gatheringProfile.Path.Count > 0)
            {
                // check wether we gather something
                if (WowInterface.ObjectManager.Player.IsCasting)
                {
                    return;
                }

                if ((gatheringProfile.MailboxPosition != Vector3.Zero &&
                     gatheringProfile.MailItems != null &&
                     gatheringProfile.MailItems.Count > 0 &&
                     gatheringProfile.MailReceiver.Length > 0 &&
                     WowInterface.HookManager.GetFreeBagSlotCount() == 0) ||
                    MailboxMode)
                {
                    JobEngineStatus = JobEngineStatus.Mailbox;

                    if (gatheringProfile.MailboxPosition.GetDistance(WowInterface.ObjectManager.Player.Position) > 6)
                    {
                        // move towards mailbox
                        WowInterface.MovementEngine.SetState(MovementEngineState.Moving, gatheringProfile.MailboxPosition);
                        WowInterface.MovementEngine.Execute();
                    }
                    else
                    {
                        // get the mailbox
                        WowGameobject mailbox = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                                .FirstOrDefault(e => e.GameobjectType == WowGameobjectType.Mailbox);

                        if (mailbox != null)
                        {
                            SendItemMails(gatheringProfile.MailItems, gatheringProfile.MailReceiver, mailbox);
                        }
                    }

                    // mailbox has priority
                    return;
                }

                // return to start when end of path reached
                if (CurrentNodeAt > gatheringProfile.Path.Count - 1)
                {
                    CurrentNodeAt = 0;
                    AmeisenLogger.Instance.Log("JobEngine", $"End of path reached, moving to start", LogLevel.Verbose);
                }

                // scan for nearby nodes
                IEnumerable <WowGameobject> nearNodes = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                                        .Where(e => gatheringProfile.DisplayIds.Contains(e.DisplayId));

                if (nearNodes.Count() > 0)
                {
                    JobEngineStatus = JobEngineStatus.Found;

                    // select the nearest node
                    WowGameobject selectedNode = nearNodes.OrderBy(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position)).First();

                    if (selectedNode.Position.GetDistance(WowInterface.ObjectManager.Player.Position) > 6)
                    {
                        // move to it until we are close enough
                        WowInterface.MovementEngine.SetState(MovementEngineState.Moving, gatheringProfile.Path[CurrentNodeAt]);
                        WowInterface.MovementEngine.Execute();
                    }
                    else
                    {
                        JobEngineStatus = JobEngineStatus.Gathering;

                        // gather it
                        WowInterface.HookManager.WowObjectOnRightClick(selectedNode);
                        AmeisenLogger.Instance.Log("JobEngine", $"Trying to gather gObject with GUID: {selectedNode.Guid}", LogLevel.Verbose);
                    }
                }
                else
                {
                    JobEngineStatus = JobEngineStatus.Searching;

                    if (gatheringProfile.Path[CurrentNodeAt].GetDistance(WowInterface.ObjectManager.Player.Position) > 6)
                    {
                        // move towards next node
                        WowInterface.MovementEngine.SetState(MovementEngineState.Moving, gatheringProfile.Path[CurrentNodeAt]);
                        WowInterface.MovementEngine.Execute();
                    }
                    else
                    {
                        // next node
                        CurrentNodeAt++;
                        AmeisenLogger.Instance.Log("JobEngine", $"Moving to next Node", LogLevel.Verbose);
                    }
                }
            }
        }
Ejemplo n.º 23
0
        public override void Execute()
        {
            if (WowInterface.ObjectManager.Player.Health > 1)
            {
                StateMachine.SetState(BotState.Idle);
            }

            // first step, determine our corpse/portal position
            if (StateMachine.IsBattlegroundMap(WowInterface.ObjectManager.MapId))
            {
                // we are on a battleground just wait for the mass ress
                return;
            }
            else if (StateMachine.IsDungeonMap(StateMachine.LastDiedMap) && !StateMachine.IsDungeonMap(WowInterface.ObjectManager.MapId))
            {
                // we died inside a dungeon but are no longer on a dungeon map, we need to go to its portal

                if (PortalSearchEvent.Run())
                {
                    // search for nearby portals
                    WowGameobject nearestPortal = WowInterface.ObjectManager.WowObjects
                                                  .OfType <WowGameobject>()
                                                  .Where(e => e.DisplayId == (int)GameobjectDisplayId.DungeonPortalNormal || e.DisplayId == (int)GameobjectDisplayId.DungeonPortalHeroic)
                                                  .FirstOrDefault(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < Config.GhostPortalScanThreshold);

                    if (nearestPortal != null)
                    {
                        CorpsePosition    = nearestPortal.Position;
                        NeedToEnterPortal = true;
                    }
                    else
                    {
                        CorpsePosition    = StateMachine.LastDiedPosition;
                        NeedToEnterPortal = false;
                    }
                }
            }
            else
            {
                WowInterface.XMemory.ReadStruct(WowInterface.OffsetList.CorpsePosition, out Vector3 corpsePosition);
                CorpsePosition = corpsePosition;
            }

            // step two, move to the corpse/portal
            if (WowInterface.ObjectManager.Player.Position.GetDistance(CorpsePosition) > Config.GhostResurrectThreshold)
            {
                WowInterface.MovementEngine.SetState(MovementEngineState.Moving, CorpsePosition);
                WowInterface.MovementEngine.Execute();
            }
            else
            {
                if (NeedToEnterPortal)
                {
                    // move into portal, MoveAhead is used to go beyond the portals entry point to make sure enter it
                    CorpsePosition = BotUtils.MoveAhead(BotMath.GetFacingAngle2D(WowInterface.ObjectManager.Player.Position, CorpsePosition), CorpsePosition, 6);
                    WowInterface.MovementEngine.SetState(MovementEngineState.Moving, CorpsePosition);
                    WowInterface.MovementEngine.Execute();
                }
                else
                {
                    // if we died normally, just resurrect
                    WowInterface.HookManager.RetrieveCorpse();
                }
            }
        }
Ejemplo n.º 24
0
        public override void Execute()
        {
            // dont follow when casting, or player is dead/ghost
            if (WowInterface.ObjectManager.Player.IsCasting ||
                (PlayerToFollow != null &&
                 (PlayerToFollow.IsDead ||
                  PlayerToFollow.Health == 1)))
            {
                return;
            }

            if (PlayerToFollow == null)
            {
                // handle nearby portals, if our groupleader enters a portal, we follow
                WowGameobject nearestPortal = WowInterface.ObjectManager.WowObjects
                                              .OfType <WowGameobject>()
                                              .Where(e => e.DisplayId == (int)GameobjectDisplayId.UtgardeKeepDungeonPortalNormal ||
                                                     e.DisplayId == (int)GameobjectDisplayId.UtgardeKeepDungeonPortalHeroic)
                                              .FirstOrDefault(e => e.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < 12.0);

                if (nearestPortal != null)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.DirectMove, BotUtils.MoveAhead(WowInterface.ObjectManager.Player.Position, nearestPortal.Position, 6f));
                }
                else
                {
                    StateMachine.SetState(BotState.Idle);
                }

                return;
            }

            Vector3 posToGoTo;

            if (Config.FollowPositionDynamic)
            {
                posToGoTo = PlayerToFollow.Position + Offset;
            }
            else
            {
                posToGoTo = PlayerToFollow.Position;
            }

            double distance = WowInterface.ObjectManager.Player.Position.GetDistance(posToGoTo);

            if (distance < Config.MinFollowDistance || distance > Config.MaxFollowDistance)
            {
                StateMachine.SetState(BotState.Idle);
                return;
            }

            if (Config.UseMountsInParty &&
                WowInterface.CharacterManager.Mounts?.Count > 0 &&
                PlayerToFollow != null &&
                PlayerToFollow.IsMounted && !WowInterface.ObjectManager.Player.IsMounted)
            {
                if (CastMountEvent.Run())
                {
                    List <WowMount> filteredMounts;

                    if (Config.UseOnlySpecificMounts)
                    {
                        filteredMounts = WowInterface.CharacterManager.Mounts.Where(e => Config.Mounts.Split(",", StringSplitOptions.RemoveEmptyEntries).Contains(e.Name)).ToList();
                    }
                    else
                    {
                        filteredMounts = WowInterface.CharacterManager.Mounts;
                    }

                    if (filteredMounts != null && filteredMounts.Count >= 0)
                    {
                        WowMount mount = filteredMounts[new Random().Next(0, filteredMounts.Count)];
                        WowInterface.MovementEngine.StopMovement();
                        WowInterface.HookManager.LuaCallCompanion(mount.Index);
                    }
                }

                return;
            }

            double zDiff = posToGoTo.Z - WowInterface.ObjectManager.Player.Position.Z;

            if (LosCheckEvent.Run())
            {
                if (WowInterface.HookManager.WowIsInLineOfSight(WowInterface.ObjectManager.Player.Position, posToGoTo, 2f))
                {
                    InLos = true;
                }
                else
                {
                    InLos = false;
                }
            }

            if (zDiff < -4.0 && InLos) // target is below us and in line of sight, just run down
            {
                WowInterface.MovementEngine.SetMovementAction(MovementAction.DirectMove, posToGoTo);
            }
            else
            {
                WowInterface.MovementEngine.SetMovementAction(MovementAction.Following, posToGoTo);
            }
        }
Ejemplo n.º 25
0
        public void Execute()
        {
            if (!HasFinishedDungeon && DungeonProfile != null && CurrentNodes.Count > 0)
            {
                // we are fighting
                if ((WowInterface.ObjectManager.Player.IsInCombat && StateMachine.IsAnyPartymemberInCombat()) ||
                    WowInterface.ObjectManager.Player.IsCasting)
                {
                    return;
                }

                if (Progress == 100.0)
                {
                    // exit dungeon
                    HasFinishedDungeon = true;
                    return;
                }

                // wait for all players to arrive
                if (!AllPlayersArrived)
                {
                    AllPlayersArrived = AreAllPlayersPresent();
                }
                else
                {
                    if (!ShouldWaitForGroup())
                    {
                        if (WowInterface.ObjectManager.Player.Position.GetDistance(CurrentNodes.Peek().Position) > 5)
                        {
                            WowInterface.MovementEngine.SetState(MovementEngineState.Moving, CurrentNodes.Peek().Position);
                            WowInterface.MovementEngine.Execute();
                            return;
                        }
                        else
                        {
                            DungeonNode dungeonNode = CurrentNodes.Peek();

                            if (dungeonNode.Type == Enums.DungeonNodeType.Door ||
                                dungeonNode.Type == Enums.DungeonNodeType.Collect ||
                                dungeonNode.Type == Enums.DungeonNodeType.Use)
                            {
                                WowGameobject obj = WowInterface.ObjectManager.WowObjects.OfType <WowGameobject>()
                                                    .OrderBy(e => e.Position.GetDistance(dungeonNode.Position))
                                                    .FirstOrDefault();

                                if (obj != null && obj.Position.GetDistance(WowInterface.ObjectManager.Player.Position) < 5)
                                {
                                    WowInterface.CharacterManager.InteractWithObject(obj);
                                }
                            }

                            CompletedNodes.Add(CurrentNodes.Dequeue());
                            Progress           = ((double)CompletedNodes.Count / (double)TotalNodes) * 100;
                            HasFinishedDungeon = Progress >= 100.0;
                        }
                    }
                }
            }
            else if (!HasFinishedDungeon && DungeonProfile == null && CurrentNodes.Count == 0)
            {
                LoadProfile(TryLoadProfile());
            }
            else
            {
                // find a way to exit the dungeon, maybe hearthstone
            }
        }