public void FaceUnit(WowPlayer player, WowPosition positionToFace) { float angle = BotMath.GetFacingAngle(player.Position, positionToFace); TrashMem.Write(player.BaseAddress + OffsetList.OffsetPlayerRotation, angle); SendKey(new IntPtr(0x41), 0, 0); // the "S" key to go a bit backwards TODO: find better method 0x53 }
private void UpdatePath() { WowPosition myPosition = StateMachine.WowDataAdapter.ActivePlayerPosition; Vector3 myPosAsVector = new Vector3(myPosition.x, myPosition.y, myPosition.z); Vector3 targetPosAsVector = new Vector3(UnitToFollow.Position.x, UnitToFollow.Position.y, UnitToFollow.Position.z); List <Vector3> waypoints = new List <Vector3> { targetPosAsVector }; if (StateMachine.PathfindingClient != null) { waypoints = StateMachine.PathfindingClient.GetPath(myPosAsVector, targetPosAsVector, StateMachine.WowDataAdapter.MapId); AmeisenBotLogger.Instance.Log($"[{StateMachine.WowActionExecutor.ProcessId.ToString("X", CultureInfo.InvariantCulture.NumberFormat)}]\tFound Path with {waypoints.Count} nodes", LogLevel.Verbose); } foreach (Vector3 pos in waypoints) { WowPosition wpos = new WowPosition(pos); if (pos.X != myPosAsVector.X && pos.Y != myPosAsVector.Y && pos.Z != myPosAsVector.Z && CurrentPath != null && !CurrentPath.Contains(wpos)) { CurrentPath.Enqueue(wpos); } } if (targetPosAsVector.X != myPosAsVector.X && targetPosAsVector.Y != myPosAsVector.Y && targetPosAsVector.Z != myPosAsVector.Z) { CurrentPath.Enqueue(new WowPosition(targetPosAsVector)); } }
public void MoveToPosition(WowPosition targetPosition, ClickToMoveType clickToMoveType = ClickToMoveType.Move, float distance = 1.5f) { TrashMem.Write(OffsetList.StaticClickToMoveX, targetPosition.x); TrashMem.Write(OffsetList.StaticClickToMoveY, targetPosition.y); TrashMem.Write(OffsetList.StaticClickToMoveZ, targetPosition.z); TrashMem.Write(OffsetList.StaticClickToMoveDistance, distance); TrashMem.Write(OffsetList.StaticClickToMoveAction, (int)clickToMoveType); }
public void IsFacingTest() { WowPosition a = new WowPosition() { x = 0, y = 0, z = 0, r = 1 }; WowPosition b = new WowPosition() { x = 10, y = 10, z = 10, r = 1 }; Assert.IsTrue(BotMath.IsFacing(a, b)); }
public void GetDistanceTest() { WowPosition a = new WowPosition() { x = 0, y = 0, z = 0 }; WowPosition b = new WowPosition() { x = 1, y = 0, z = 0 }; Assert.AreEqual(1, BotMath.GetDistance(a, b)); }
public bool IsUnitInFollowRange(WowUnit unitToFollow) { WowUnit wowPlayer = (WowUnit)ObjectManager.GetWowObjectByGuid(WowDataAdapter.PlayerGuid); if (wowPlayer != null && unitToFollow != null) { WowPosition myPosition = wowPlayer.Position; return(BotMath.GetDistance(myPosition, unitToFollow.Position) >= UnitFollowThreshold); } else { return(false); } }
public void GetFacingAngleTest() { WowPosition a = new WowPosition() { x = 0, y = 0, z = 0, r = 2 }; WowPosition b = new WowPosition() { x = 10, y = 10, z = 10, r = 1 }; double angle = BotMath.GetFacingAngle(a, b); Assert.AreEqual(0.79, Math.Round(angle, 2)); }
public static float GetFacingAngle(WowPosition position, WowPosition targetPosition) { float angle = (float)Math.Atan2(targetPosition.y - position.y, targetPosition.x - position.x); if (angle < 0.0f) { angle += (float)Math.PI * 2.0f; } else if (angle > (float)Math.PI * 2) { angle -= (float)Math.PI * 2.0f; } return(angle); }
public void Execute() { if (!IsUnitValid(ActiveTarget)) { ActiveTarget = SelectNewTarget(); AmeisenBotLogger.Instance.Log($"[{WowActionExecutor?.ProcessId.ToString("X" , CultureInfo.InvariantCulture.NumberFormat)}]\tNew ActiveTarget is: {ActiveTarget?.Name}"); return; } WowPosition positionToMoveTo = MovementProvider?.GetPositionToMoveTo(WowDataAdapter.ActivePlayerPosition, WowDataAdapter.GetPosition(ActiveTarget.BaseAddress)) ?? new WowPosition(); WowActionExecutor.MoveToPosition(positionToMoveTo); WowUnit player = (WowUnit)WowDataAdapter.ObjectManager.GetWowObjectByGuid(WowDataAdapter.PlayerGuid); if (ActiveTarget?.Guid != 0 && player.TargetGuid != ActiveTarget.Guid) { WowActionExecutor.TargetGuid(ActiveTarget.Guid); } WowActionExecutor.AttackUnit(ActiveTarget); /*SpellStrategy?.GetSpellToCast(player, ActiveTarget);*/ }
public Vector3(WowPosition pos) : this() { X = pos.x; Y = pos.y; Z = pos.z; }
public static bool IsFacing(WowPosition position, WowPosition targetPosition, double minRotation = 0.7, double maxRotation = 1.3) { float f = GetFacingAngle(position, targetPosition); return((f >= (position.r * minRotation)) && (f <= (position.r * maxRotation))); }
public static double GetDistance(WowPosition a, WowPosition b) => Math.Sqrt(((a.x - b.x) * (a.x - b.x)) + ((a.y - b.y) * (a.y - b.y)) + ((a.z - b.z) * (a.z - b.z)));
public void FaceUnit(WowPlayer player, WowPosition positionToFace) { // Empty for tests }
public void MoveToPosition(WowPosition targetPosition, ClickToMoveType clickToMoveType = ClickToMoveType.Move, float distance = 1.5F) { // Empty for tests }
public override void Execute() { if (StateMachine.IsMeInCombat() || StateMachine.IsPartyInCombat()) { StateMachine.SwitchState(typeof(BotStateCombat)); return; } WowUnit player = ((WowUnit)StateMachine.ObjectManager.GetWowObjectByGuid(StateMachine.WowDataAdapter.PlayerGuid)); if (UnitToFollow == null || UnitToFollow == player || !StateMachine.IsUnitInFollowRange(UnitToFollow)) { StateMachine.SwitchState(typeof(BotStateIdle)); return; } if (CurrentPath.Count == 0) { UpdatePath(); if (CurrentPath.Count == 0) { return; } } ActiveTargetPosition = CurrentPath.Peek(); StateMachine.WowActionExecutor?.MoveToPosition(new WowPosition() { x = ActiveTargetPosition.x, //+ XOffset, y = ActiveTargetPosition.y, //+ YOffset, z = ActiveTargetPosition.z }); // get position directly from memory WowPosition myPosition = StateMachine.WowDataAdapter.ActivePlayerPosition; if (BotMath.GetDistance(myPosition, CurrentPath.Peek()) < 6) { CurrentPath.Dequeue(); } double distanceTraveled = BotMath.GetDistance(myPosition, LastPosition); AmeisenBotLogger.Instance.Log($"[{StateMachine.WowActionExecutor.ProcessId.ToString("X", CultureInfo.InvariantCulture.NumberFormat)}]\tDistance traveled {distanceTraveled}m", LogLevel.Verbose); if (distanceTraveled > 0 && distanceTraveled < 0.1) { AmeisenBotLogger.Instance.Log($"[{StateMachine.WowActionExecutor.ProcessId.ToString("X", CultureInfo.InvariantCulture.NumberFormat)}]\tTrying to unstuck", LogLevel.Verbose); float newX = (float)Math.Cos(myPosition.r + (Math.PI / 2)) + 4 + myPosition.x; float newY = (float)Math.Sin(myPosition.r + (Math.PI / 2)) + 4 + myPosition.y; StateMachine.WowActionExecutor?.MoveToPosition(new WowPosition() { x = newX, y = newY, z = myPosition.z }); } else if (distanceTraveled > 0 && distanceTraveled < 0.2) { AmeisenBotLogger.Instance.Log($"[{StateMachine.WowActionExecutor.ProcessId.ToString("X", CultureInfo.InvariantCulture.NumberFormat)}]\tTrying to jump", LogLevel.Verbose); StateMachine.WowActionExecutor?.Jump(); } LastPosition = myPosition; }
public WowPosition GetPositionToMoveTo(WowPosition currentPosition, WowPosition targetPosition, List <WowUnit> unitsToStayAwayFrom) { return(targetPosition); }
public WowPosition GetPositionToMoveTo(WowPosition currentPosition, WowPosition targetPosition) { return(targetPosition); }