/// <summary> /// Finds the desired MetaObject by name. If no meta object is found, NoMetaAircraft is returned. /// </summary> /// <param name="Name">Aircraft name to search for.</param> /// <returns> /// Match: Last Matching MetaAircraft Object /// Else: "NoMetaAircraft" Psuedo-Object. /// </returns> public static IMetaDataAircraft FindByName(string Name) { IMetaDataAircraft Output = None; if (Name == null) { return(Output); } foreach (IMetaDataAircraft ThisMetaAircraft in List) { if (ThisMetaAircraft == null) { continue; } if (ThisMetaAircraft.Identify == null) { continue; } if (System.String.Equals( ThisMetaAircraft.Identify.ToUpperInvariant().ResizeOnRight(32), Name.ToUpperInvariant().ResizeOnRight(32))) { Output = ThisMetaAircraft; } } if (Output == None) { //Log.Warning("Failed to find MetaData for aircraft: " + Name + "."); } return(Output); }
private static bool Process_Type_08_JoinRequest(IConnection thisConnection, IPacket_08_JoinRequest packet) { #region Join Request Pending if (thisConnection.JoinRequestPending) { Logger.Debug.AddWarningMessage("Join Request already pending for " + thisConnection.User.UserName.ToInternallyFormattedSystemString() + "."); thisConnection.SendMessage("Issue with last join request. Cancelling last join request..."); IPacket_10_JoinRequestDenied JoinDenied = ObjectFactory.CreatePacket10JoinRequestDenied(); thisConnection.Send(JoinDenied); thisConnection.JoinRequestPending = false; return(true); } thisConnection.JoinRequestPending = true; #endregion #region Convert To JoinRequest IPacket_08_JoinRequest JoinRequest = ObjectFactory.CreatePacket08JoinRequest(); JoinRequest.Data = packet.Data; #endregion #region Deny Requests if server is join locked! if (Settings.Flight.Join.Lock) { //Reject the join request - don't have the start position requested! IPacket_10_JoinRequestDenied JoinDenied = ObjectFactory.CreatePacket10JoinRequestDenied(); thisConnection.Send(JoinDenied); thisConnection.SendMessage("Join request denied - Server is join locked!"); thisConnection.JoinRequestPending = false; return(false); } #endregion #region Acknowledge Join Request //Acknowledge Join Request. IPacket_06_Acknowledgement AcknowledgeRequest = ObjectFactory.CreatePacket06Acknowledgement(); AcknowledgeRequest.Arguments = new uint[] { 5, 0 }; thisConnection.Send(AcknowledgeRequest); #endregion #region Check For Requested STP //Check if Server has STP - deny if it doesn't! if (!World.AllStartPositions.Select(x => x.Identify).Contains(JoinRequest.StartPositionIdentify)) { //Reject the join request - don't have the start position requested! IPacket_10_JoinRequestDenied JoinDenied = ObjectFactory.CreatePacket10JoinRequestDenied(); thisConnection.Send(JoinDenied); thisConnection.SendMessage("Join request denied - Server does not have that start position installed!"); thisConnection.JoinRequestPending = false; return(false); } IWorldStartPosition StartPosition = World.AllStartPositions.First(x => x.Identify == JoinRequest.StartPositionIdentify); #endregion #region Check For Requested Aircraft IMetaDataAircraft MetaAircraft = MetaData.Aircraft.FindByName(JoinRequest.AircraftIdentify); if (MetaAircraft == MetaData.Aircraft.None) { //Reject the join request - don't have the aircraft requested! IPacket_10_JoinRequestDenied JoinDenied = ObjectFactory.CreatePacket10JoinRequestDenied(); thisConnection.Send(JoinDenied); thisConnection.SendMessage("Join request denied - Server does not have that aircraft installed!"); thisConnection.JoinRequestPending = false; return(false); } //TODO : Cache Aircraft! //CachedData.Aircraft CachedAircraft = MetaAircraft.Cache(); #endregion #region Build EntityJoined(05) IPacket_05_AddVehicle EntityJoined = ObjectFactory.CreatePacket05AddVehicle(); EntityJoined.VehicleType = Packet_05VehicleType.Aircraft; EntityJoined.Version = 0; EntityJoined.ID = World.GetNextID() | 256 * 256; EntityJoined.IFF = JoinRequest.IFF; EntityJoined.PosX = StartPosition.Position.X; EntityJoined.PosY = StartPosition.Position.Y; EntityJoined.PosZ = StartPosition.Position.Z; EntityJoined.HdgH = StartPosition.Attitude.H; EntityJoined.HdgP = StartPosition.Attitude.P; EntityJoined.HdgB = StartPosition.Attitude.B; EntityJoined.Identify = JoinRequest.AircraftIdentify; EntityJoined.OwnerName = thisConnection.User.UserName.ToUnformattedSystemString(); EntityJoined.OwnerType = Packet_05OwnerType.Self; #endregion #region Build Flight Data Packet IPacket_11_FlightData FlightData = ObjectFactory.CreatePacket11FlightData(3); FlightData.ID = EntityJoined.ID; IDATFile CachedAircraft = ObjectFactory.CreateDATFileReference(Settings.YSFlight.Directory + MetaAircraft.Path_0_PropertiesFile); CachedAircraft.Load(); FlightData.WeightFuel = (CachedAircraft.CachedData.WeightOfFuel.ToKiloGrams().RawValue *(JoinRequest.FuelPercent)).KiloGrams(); FlightData.WeightSmokeOil = 100.KiloGrams(); FlightData.AmmoGUN = CachedAircraft.CachedData.AmmoGun; if (!Settings.Options.AllowUnguidedWeapons) { FlightData.AmmoGUN = 0; } FlightData.Strength = CachedAircraft.CachedData.Strength; FlightData.AnimThrottle = StartPosition.Throttle; if (StartPosition.GearDown) { FlightData.AnimGear = 1.0f; } FlightData.Timestamp = 0.Seconds().ToTime(); FlightData.PosX = EntityJoined.PosX; FlightData.PosY = EntityJoined.PosY; FlightData.PosZ = EntityJoined.PosZ; if (FlightData.PosY.ToMeters().RawValue < 1) { FlightData.PosY = 1.Meters(); } FlightData.HdgH = EntityJoined.HdgH; FlightData.HdgP = EntityJoined.HdgP; FlightData.HdgB = EntityJoined.HdgB; FlightData.V_PosX = ((Math.Sin(-StartPosition.Attitude.H.ToRadians().RawValue) * (StartPosition.Speed.ToMetersPerSecond().RawValue))).MetersPerSecond(); FlightData.V_PosZ = ((Math.Cos(-StartPosition.Attitude.H.ToRadians().RawValue) * (StartPosition.Speed.ToMetersPerSecond().RawValue))).MetersPerSecond(); #region Turn on the brakes if Velocity == 0 if (FlightData.V_PosX.ToMetersPerSecond().RawValue == 0 && FlightData.V_PosZ.ToMetersPerSecond().RawValue == 0 && Settings.Flight.Join.UseWheelChocks) { FlightData.AnimBrake = 100; } #endregion #endregion #region Prepare Acknolwedgement Reponse. IPacketWaiter PacketWaiter_AcknowledgeJoinPacket = thisConnection.CreatePacketWaiter(6); if (EntityJoined.VehicleType == Packet_05VehicleType.Aircraft) { PacketWaiter_AcknowledgeJoinPacket.Require(4, EntityJoined.ID); } else { PacketWaiter_AcknowledgeJoinPacket.Require(0, 1); } PacketWaiter_AcknowledgeJoinPacket.StartListening(); #endregion #region Assign Vehicle thisConnection.Vehicle = ObjectFactory.CreateVehicle(); thisConnection.Vehicle.Owner = thisConnection.User; thisConnection.Vehicle.MetaData = MetaAircraft; #endregion #region Send Owner Join Data thisConnection.Vehicle.Update(EntityJoined); thisConnection.Vehicle.CreateVehicle(); thisConnection.Send(EntityJoined); if (!thisConnection.GetResponseOrResend(PacketWaiter_AcknowledgeJoinPacket, EntityJoined)) { thisConnection.SendMessage("Expected an acknowledge Join Data Reply and didn't get an answer. Disconnecting..."); foreach (var thisConnectionLast5Packet in thisConnection.Last5Packets) { Logger.Debug.AddDetailMessage("&aIn Packet (" + thisConnectionLast5Packet.Type + ")\n" + thisConnectionLast5Packet.Serialise().ToHexString() + "\n" + thisConnectionLast5Packet.Serialise().ToSystemString()); } //thisConnection.Disconnect(); //return false; } thisConnection.Vehicle.Update(FlightData); thisConnection.Send(FlightData); #endregion #region Send Owner Join Approved IPacket_09_JoinRequestApproved JoinApproved = ObjectFactory.CreatePacket09JoinRequestApproved(); #region Prepare Acknowledgement Reponse. IPacketWaiter PacketWaiter_AcknowledgeJoinApproved = thisConnection.CreatePacketWaiter(6); PacketWaiter_AcknowledgeJoinApproved.Require(0, 6); PacketWaiter_AcknowledgeJoinApproved.StartListening(); #endregion //thisConnection.SendGetPacket(JoinApproved, AcknowledgeJoinApproved); thisConnection.Send(JoinApproved); if (!thisConnection.GetResponseOrResend(PacketWaiter_AcknowledgeJoinApproved, JoinApproved)) { thisConnection.SendMessage("Expected an acknowledge Join Approval and didn't get an answer. Disconnecting..."); //thisConnection.Disconnect(); //return false; } thisConnection.JoinRequestPending = false; #endregion #region Send Others Join Data if (Settings.Flight.Join.Notification) { Logger.Console.AddInformationMessage("&b" + thisConnection.User.UserName.ToInternallyFormattedSystemString() + "&b took off (" + EntityJoined.Identify + ")"); } foreach (IConnection OtherClient in Connections.AllConnections.Exclude(thisConnection).ToArray()) { if (Settings.Flight.Join.Notification) { OtherClient.SendMessage(thisConnection.User.UserName.ToUnformattedSystemString() + " took off (" + EntityJoined.Identify + ")"); } IPacket_05_AddVehicle OtherJoinPacket = ObjectFactory.CreatePacket05AddVehicle(); OtherJoinPacket.Data = EntityJoined.Data; OtherJoinPacket.OwnerType = Packet_05OwnerType.Other; IPacketWaiter PacketWaiter_AcknowledgeOtherJoinPacket = thisConnection.CreatePacketWaiter(6); if (EntityJoined.VehicleType == Packet_05VehicleType.Aircraft) { PacketWaiter_AcknowledgeOtherJoinPacket.Require(4, EntityJoined.ID); } else { PacketWaiter_AcknowledgeOtherJoinPacket.Require(0, 1); } PacketWaiter_AcknowledgeOtherJoinPacket.StartListening(); Logger.Console.AddInformationMessage("Sending Join Notification."); OtherClient.Send(OtherJoinPacket); if (!OtherClient.GetResponseOrResend(PacketWaiter_AcknowledgeOtherJoinPacket, OtherJoinPacket)) { thisConnection.SendMessage("Expected a Other Entity Join Acknowldge for ID " + OtherJoinPacket.ID + " and didn't get an answer."); //thisConnection.Disconnect(); //return false; } Logger.Console.AddInformationMessage("Sent Join Notification."); } #endregion return(true); }