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); } } } }
public void Reset() { Entered = false; AllPlayersArrived = false; DidAllDie = false; DungeonProfile = null; CurrentNodes = new ConcurrentQueue <DungeonNode>(); CompletedNodes.Clear(); Progress = 0.0; TotalNodes = 0; AllPlayerPresentDistance = 48; }
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); } } }
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 } }