public void SetPosition(Position pos) { X = pos.X; Y = pos.Y; Z = pos.Z; O = pos.O; }
public static Position operator -(Position a, Position b) { if (a.MapID != INVALID_MAP_ID && b.MapID != INVALID_MAP_ID && a.MapID != b.MapID) return new Position(); var result = new Position(a.X - b.X, a.Y - b.Y, a.Z - b.Z, 0.0f, a.MapID); result.O = result.CalculateOrientation(); return result; }
public BotGame(string hostname, int port, string username, string password, int realmId, int character, BotBehaviorSettings behavior) : base(hostname, port, username, password, realmId, character) { this.Behavior = behavior; #region AutoResurrect if (Behavior.AutoResurrect) { // Resurrect if bot reaches 0 hp AddTrigger(new Trigger(new[] { new UpdateFieldTriggerAction((int)UnitField.UNIT_FIELD_HEALTH, 0) }, () => { CancelActionsByFlag(ActionFlag.Movement); Resurrect(); })); // Resurrect sequence AddTrigger(new Trigger(new TriggerAction[] { new UpdateFieldTriggerAction((int)PlayerField.PLAYER_FLAGS, (uint)PlayerFlags.PLAYER_FLAGS_GHOST, () => { OutPacket corpseQuery = new OutPacket(WorldCommand.MSG_CORPSE_QUERY); SendPacket(corpseQuery); }), new OpcodeTriggerAction(WorldCommand.MSG_CORPSE_QUERY, packet => { var inPacket = packet as InPacket; if (inPacket == null) return false; bool found = inPacket.ReadByte() != 0; if (found) { var mapId = inPacket.ReadInt32(); var corpsePosition = new Position(inPacket.ReadSingle(), inPacket.ReadSingle(), inPacket.ReadSingle(), 0.0f, inPacket.ReadInt32()); Player.CorpsePosition = corpsePosition.GetPosition(); if (mapId == corpsePosition.MapID) { MoveTo(corpsePosition); return true; } } return false; }), new CustomTriggerAction(TriggerActionType.DestinationReached, (inputs) => { if (Player.IsGhost && (Player.CorpsePosition - Player).Length <= 39f) { if (DateTime.Now > CorpseReclaim) return true; else ScheduleAction(() => HandleTriggerInput(TriggerActionType.DestinationReached, inputs), CorpseReclaim.AddSeconds(1)); } return false; },() => { OutPacket reclaimCorpse = new OutPacket(WorldCommand.CMSG_RECLAIM_CORPSE); reclaimCorpse.Write(Player.GUID); SendPacket(reclaimCorpse); }) }, null)); } #endregion }
public override void Start() { base.Start(); // Anti-kick for being afk ScheduleAction(() => DoTextEmote(TextEmote.Yawn), DateTime.Now.AddMinutes(5), new TimeSpan(0, 5, 0)); #region Begger if (Behavior.Begger) { PushStrategicAI(new BeggerAI()); } #endregion #region FollowGroupLeader if (Behavior.FollowGroupLeader) { PushStrategicAI(new FollowGroupLeaderAI()); } #endregion #region Explorer if (Behavior.Explorer) { AchievementExploreLocation targetLocation = null; List<AchievementExploreLocation> missingLocations = null; Position currentPosition = new Position(); ScheduleAction(() => { if (!Player.IsAlive) return; if (targetLocation != null) { if (!HasExploreCriteria(targetLocation.CriteriaID) && (currentPosition - Player).Length > MovementEpsilon) { currentPosition = Player.GetPosition(); return; } targetLocation = null; } currentPosition = Player.GetPosition(); if (missingLocations == null) missingLocations = DBCStores.GetAchievementExploreLocations(Player.X, Player.Y, Player.Z, Player.MapID); missingLocations = missingLocations.Where(loc => !HasExploreCriteria(loc.CriteriaID)).ToList(); if (missingLocations.Count == 0) { CancelActionsByFlag(ActionFlag.Movement); return; } float closestDistance = float.MaxValue; var playerPosition = new Point(Player.X, Player.Y, Player.Z); foreach (var missingLoc in missingLocations) { float distance = (missingLoc.Location - playerPosition).Length; if (distance < closestDistance) { closestDistance = distance; targetLocation = missingLoc; } } MoveTo(new Position(targetLocation.Location.X, targetLocation.Location.Y, targetLocation.Location.Z, 0f, Player.MapID)); }, DateTime.Now.AddSeconds(30), new TimeSpan(0, 0, 5)); } #endregion }
public void MoveTo(Position destination) { CancelActionsByFlag(ActionFlag.Movement, false); if (destination.MapID != Player.MapID) { Log("Trying to move to another map", Client.UI.LogLevel.Warning); HandleTriggerInput(TriggerActionType.DestinationReached, false); return; } Path path = null; using(var detour = new DetourCLI.Detour()) { List<MapCLI.Point> resultPath; var pathResult = detour.FindPath(Player.X, Player.Y, Player.Z, destination.X, destination.Y, destination.Z, Player.MapID, out resultPath); if (pathResult != PathType.Complete) { Log($"Cannot reach destination, FindPath() returned {pathResult} : {destination.ToString()}", Client.UI.LogLevel.Warning); HandleTriggerInput(TriggerActionType.DestinationReached, false); return; } path = new Path(resultPath, Player.Speed, Player.MapID); var destinationPoint = path.Destination; destination.SetPosition(destinationPoint.X, destinationPoint.Y, destinationPoint.Z); } var remaining = destination - Player.GetPosition(); // check if we even need to move if (remaining.Length < MovementEpsilon) { HandleTriggerInput(TriggerActionType.DestinationReached, true); return; } var direction = remaining.Direction; var facing = new MovementPacket(WorldCommand.MSG_MOVE_SET_FACING) { GUID = Player.GUID, flags = MovementFlags.MOVEMENTFLAG_FORWARD, X = Player.X, Y = Player.Y, Z = Player.Z, O = path.CurrentOrientation }; SendPacket(facing); Player.SetPosition(facing.GetPosition()); var startMoving = new MovementPacket(WorldCommand.MSG_MOVE_START_FORWARD) { GUID = Player.GUID, flags = MovementFlags.MOVEMENTFLAG_FORWARD, X = Player.X, Y = Player.Y, Z = Player.Z, O = path.CurrentOrientation }; SendPacket(startMoving); var previousMovingTime = DateTime.Now; var oldRemaining = remaining; ScheduleAction(() => { Point progressPosition = path.MoveAlongPath((float)(DateTime.Now - previousMovingTime).TotalSeconds); Player.SetPosition(progressPosition.X, progressPosition.Y, progressPosition.Z); previousMovingTime = DateTime.Now; remaining = destination - Player.GetPosition(); if (remaining.Length > MovementEpsilon) { oldRemaining = remaining; var heartbeat = new MovementPacket(WorldCommand.MSG_MOVE_HEARTBEAT) { GUID = Player.GUID, flags = MovementFlags.MOVEMENTFLAG_FORWARD, X = Player.X, Y = Player.Y, Z = Player.Z, O = path.CurrentOrientation }; SendPacket(heartbeat); } else { var stopMoving = new MovementPacket(WorldCommand.MSG_MOVE_STOP) { GUID = Player.GUID, X = Player.X, Y = Player.Y, Z = Player.Z, O = path.CurrentOrientation }; SendPacket(stopMoving); Player.SetPosition(stopMoving.GetPosition()); CancelActionsByFlag(ActionFlag.Movement, false); HandleTriggerInput(TriggerActionType.DestinationReached, true); } }, new TimeSpan(0, 0, 0, 0, 100), ActionFlag.Movement, () => { var stopMoving = new MovementPacket(WorldCommand.MSG_MOVE_STOP) { GUID = Player.GUID, X = Player.X, Y = Player.Y, Z = Player.Z, O = path.CurrentOrientation }; SendPacket(stopMoving); }); }
public override void Start() { base.Start(); // Anti-kick for being afk ScheduleAction(() => DoTextEmote(TextEmote.Yawn), DateTime.Now.AddMinutes(5), new TimeSpan(0, 5, 0)); #region Begger if (Behavior.Begger) { // Follow player trigger // - find closest player and follow him begging for money with chat messages (unless its a bot) ScheduleAction(() => { if (TraderGUID != 0) return; CancelActionsByFlag(ActionFlag.Movement); var target = FindClosestNonBotPlayer(obj => !TradedGUIDs.Contains(obj.GUID)); if (target != null) { DoSayChat("Please " + GetPlayerName(target) + ", give me some money"); Follow(target); } }, DateTime.Now.AddSeconds(30), new TimeSpan(0, 0, 30)); } #endregion #region FollowGroupLeader if (Behavior.FollowGroupLeader) { ScheduleAction(() => { if (!Player.IsAlive) return; // Check if we are in a party and follow the party leader if (GroupLeaderGuid == 0) return; WorldObject groupLeader; if (Objects.TryGetValue(GroupLeaderGuid, out groupLeader)) { CancelActionsByFlag(ActionFlag.Movement); Follow(groupLeader); } }, DateTime.Now.AddSeconds(30), new TimeSpan(0, 0, 30)); } #endregion #region Explorer if (Behavior.Explorer) { AchievementExploreLocation targetLocation = null; List<AchievementExploreLocation> missingLocations = null; Position currentPosition = new Position(); ScheduleAction(() => { if (!Player.IsAlive) return; if (targetLocation != null) { if (!HasExploreCriteria(targetLocation.CriteriaID) && (currentPosition - Player).Length > MovementEpsilon) { currentPosition = Player.GetPosition(); return; } targetLocation = null; } CancelActionsByFlag(ActionFlag.Movement); currentPosition = Player.GetPosition(); if (missingLocations == null) missingLocations = DBCStores.GetAchievementExploreLocations(Player.X, Player.Y, Player.Z, Player.MapID); missingLocations = missingLocations.Where(loc => !HasExploreCriteria(loc.CriteriaID)).ToList(); if (missingLocations.Count == 0) return; float closestDistance = float.MaxValue; var playerPosition = new Point(Player.X, Player.Y, Player.Z); foreach (var missingLoc in missingLocations) { float distance = (missingLoc.Location - playerPosition).Length; if (distance < closestDistance) { closestDistance = distance; targetLocation = missingLoc; } } MoveTo(new Position(targetLocation.Location.X, targetLocation.Location.Y, targetLocation.Location.Z, 0f, Player.MapID)); }, DateTime.Now.AddSeconds(30), new TimeSpan(0, 0, 5)); } #endregion }