Ejemplo n.º 1
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.º 2
0
        public void Reset()
        {
            Entered           = false;
            AllPlayersArrived = false;
            DidAllDie         = false;

            DungeonProfile = null;

            CurrentNodes = new ConcurrentQueue <DungeonNode>();
            CompletedNodes.Clear();

            Progress   = 0.0;
            TotalNodes = 0;

            AllPlayerPresentDistance = 48;
        }
Ejemplo n.º 3
0
        private bool MoveToGroupLeader()
        {
            WowUnit partyLeader = WowInterface.ObjectManager.GetWowObjectByGuid <WowUnit>(WowInterface.ObjectManager.PartyleaderGuid);

            double distance = partyLeader != null?partyLeader.Position.GetDistance(WowInterface.ObjectManager.Player.Position) : 0;

            if (distance > 0 && distance < 8)
            {
                return(false);
            }
            else
            {
                if (distance > 0 && distance < 48)
                {
                    WowInterface.MovementEngine.SetState(MovementEngineState.Moving, partyLeader.Position);
                    WowInterface.MovementEngine.Execute();
                    return(true);
                }
                else
                {
                    if (partyLeader != null)
                    {
                        DungeonNode closestDungeonNodeLeader = DungeonProfile.Path.OrderBy(e => e.Position.GetDistance(partyLeader.Position)).FirstOrDefault();
                        int         nodeIndex      = DungeonProfile.Path.IndexOf(closestDungeonNodeLeader);
                        int         completedNodes = CompletedNodes.Count();

                        if (nodeIndex <= completedNodes)
                        {
                            return(false);
                        }
                    }

                    if (CurrentNodes?.Count == 0)
                    {
                        LoadNodes();
                    }

                    FollowNodePath(WowInterface.MovementSettings.WaypointCheckThreshold);
                    return(true);
                }
            }
        }
Ejemplo n.º 4
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
            }
        }