public bool IsBot(WorldObject obj) { if (factoryGame.Player.GUID == obj.GUID) return true; return bots.FirstOrDefault(bot => bot.Player.GUID == obj.GUID) != null; }
public void Follow(WorldObject target) { if (target == null) return; Path path = null; bool moving = false; Position pathEndPosition = target.GetPosition(); DateTime previousMovingTime = DateTime.MinValue; ScheduleAction(() => { if (!target.IsValid) return; if (target.MapID != Player.MapID) { Log("Trying to follow a target on another map", Client.UI.LogLevel.Warning); CancelActionsByFlag(ActionFlag.Movement); return; } var distance = target - Player.GetPosition(); // check if we even need to move if (distance.Length < FollowMovementEpsilon) { if (path != null) { var stopMoving = new MovementPacket(WorldCommand.MSG_MOVE_STOP) { GUID = Player.GUID, X = Player.X, Y = Player.Y, Z = Player.Z, O = Player.O }; SendPacket(stopMoving); Player.SetPosition(stopMoving.GetPosition()); moving = false; path = null; HandleTriggerInput(TriggerActionType.DestinationReached, true); } return; } float targetMovement = (target - pathEndPosition).Length; if (targetMovement > FollowTargetRecalculatePathEpsilon) path = null; else if (distance.Length >= FollowMovementEpsilon && distance.Length <= FollowTargetRecalculatePathEpsilon) path = null; if (path == null) { using (var detour = new DetourCLI.Detour()) { List<MapCLI.Point> resultPath; var findPathResult = detour.FindPath(Player.X, Player.Y, Player.Z, target.X, target.Y, target.Z, Player.MapID, out resultPath); if (findPathResult != PathType.Complete) { HandleTriggerInput(TriggerActionType.DestinationReached, false); CancelActionsByFlag(ActionFlag.Movement); return; } path = new Path(resultPath, Player.Speed, Player.MapID); pathEndPosition = target.GetPosition(); } } if (!moving) { moving = true; 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); previousMovingTime = DateTime.Now; return; } Point progressPosition = path.MoveAlongPath((float)(DateTime.Now - previousMovingTime).TotalSeconds); Player.SetPosition(progressPosition.X, progressPosition.Y, progressPosition.Z); previousMovingTime = DateTime.Now; 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); }, new TimeSpan(0, 0, 0, 0, 100), flags: ActionFlag.Movement); }
public string GetPlayerName(WorldObject obj) { return GetPlayerName(obj.GUID); }
private void HandleUpdateData() { if (guid == game.Player.GUID) { foreach (var pair in updateFields) game.Player[pair.Key] = pair.Value; } else { switch (updateType) { case ObjectUpdateType.UPDATETYPE_VALUES: { WorldObject worldObject = game.Objects[guid]; foreach (var pair in updateFields) worldObject[pair.Key] = pair.Value; break; } case ObjectUpdateType.UPDATETYPE_MOVEMENT: { if (movementInfo != null) { WorldObject worldObject = game.Objects[guid]; worldObject.Set(movementInfo.Position); worldObject.O = movementInfo.O; } break; } case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT: case ObjectUpdateType.UPDATETYPE_CREATE_OBJECT2: { WorldObject worldObject = new WorldObject(); worldObject.GUID = guid; if (movementInfo != null) { worldObject.Set(movementInfo.Position); worldObject.O = movementInfo.O; } worldObject.MapID = game.Player.MapID; foreach (var pair in updateFields) worldObject[pair.Key] = pair.Value; #if DEBUG if (game.Objects.ContainsKey(guid)) game.Log($"{updateType} called with guid 0x{guid:X} already added", LogLevel.Error); #endif game.Objects[guid] = worldObject; if (worldObject.IsType(HighGuid.Player)) { OutPacket nameQuery = new OutPacket(WorldCommand.CMSG_NAME_QUERY); nameQuery.Write(guid); game.SendPacket(nameQuery); } break; } default: break; } } foreach (var outOfRangeGuid in outOfRangeGuids) { WorldObject worldObject; if (game.Objects.TryGetValue(outOfRangeGuid, out worldObject)) { worldObject.ResetPosition(); game.Objects.Remove(outOfRangeGuid); } } }
protected string GetPlayerName(WorldObject obj) { return GetPlayerName(obj.GUID); }
public UpdateFieldEventArg(int Index, uint NewValue, WorldObject Object) { this.Index = Index; this.NewValue = NewValue; this.Object = Object; }