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); } }
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); } } }
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 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); }
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); }
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); }
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); } }
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); } }
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); } }
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); }
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(); }
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); }
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); } }
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); } } }
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; } } }
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); }
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); } } } } }
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(); } }
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); } } } }
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(); } } }
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); } }
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 } }