private static bool YSFHandle_13_RemoveAircraft(Client ThisClient, Packets.GenericPacket InPacket) { ThisClient.SendPacket(InPacket); Packets.Packet_13_RemoveAirplane RemoveAirplane = new Packets.Packet_13_RemoveAirplane(InPacket); lock (Vehicles.List) Vehicles.List.RemoveAll(x => x.ID == RemoveAirplane.ID); if (Clients.YSFClients[0] == ThisClient) { if (Settings.Flight.LeaveFlightNotification) { Console.WriteLine("&3" + "Aircraft ID " + RemoveAirplane.ID + " Removed"); } } //Console.WriteLine("REMOVED VEHICLE. TOTAL VEHICLES IS NOW: " + Server.Info.Vehicles.Count.ToString()); return(true); }
public static bool OpenYS_Command_Flight_Kill_Method(Client ThisClient, CommandReader Command) { if (Command._CmdArguments.Count() < 1) { ThisClient.SendMessage("&eSpecify a Vehicle ID to kill.\n\nUse &a/ListUsers&e to get the ID."); return(false); } uint output = 0; if (!UInt32.TryParse(Command._CmdArguments[0], out output)) { //didn't get a number... try and find a client with that name? Client MatchingClient = Clients.FindByUserName(Command._CmdRawArguments); if (MatchingClient != Clients.NoClient) { //did match a client name! if (MatchingClient.Vehicle != Vehicles.NoVehicle) { //client has a vehicle! output = MatchingClient.Vehicle.ID; goto Kill; } else { ThisClient.SendMessage("&eThat client isn't flying..."); return(false); } } ThisClient.SendMessage("&eFormat incorrect: Be sure you are using an integer value!"); return(false); } if (Vehicles.List.Where(x => x.ID == output).Count() == 0) { ThisClient.SendMessage("&eThat Vehicle doesn't exist!"); return(false); } Kill: Packets.Packet_13_RemoveAirplane KillID = new Packets.Packet_13_RemoveAirplane(output); Clients.AllClients.SendPacket(KillID); ThisClient.SendMessage("&eKilled &c" + output.ToString() + "&e."); Clients.AllClients.Exclude(ThisClient).SendMessage("&e" + ThisClient.Username + " Killed VehicleID &c" + output.ToString() + "&e."); return(true); }
public bool StopReplay() { Playing = false; CurrentTime = 0; Loaded = false; #region despawn the aircraft foreach (uint ThisID in AircraftIDs) { Packets.Packet_13_RemoveAirplane ThisRemoveAirplane = new Packets.Packet_13_RemoveAirplane(ThisID); lock (Vehicles.List) Vehicles.List.RemoveAll(x => x.ID == ThisRemoveAirplane.ID); foreach (Client ThisClient in Clients.YSFClients) { Packets.Packet_06_Acknowledgement AcknowledgeLeave = new Packets.Packet_06_Acknowledgement(2, ThisRemoveAirplane.ID); //ThisClient.SendPacketGetPacket(ThisRemoveAirplane, AcknowledgeLeave); ThisClient.SendPacket(ThisRemoveAirplane); } continue; } #endregion return(true); }
public bool SendUpdate() { if (!Loaded) { return(false); } if (Playing) { CurrentTime += 0.1; } #region GetCurrentPackets List <Packets.GenericPacket> PacketsToSend = ( from ThisPacketEvent in Records where ThisPacketEvent.TimeStamp >= PreviousTime where ThisPacketEvent.TimeStamp < CurrentTime select ThisPacketEvent.Packet ).ToList(); if (PacketsToSend.Count == 0) { return(false); } List <Packets.Packet_11_FlightData> FlightDataPacketsToSend = ( from ThisFlightDataPacket in PacketsToSend where ThisFlightDataPacket.Type == 11 select new Packets.Packet_11_FlightData(ThisFlightDataPacket) ).OrderByDescending(x => x.TimeStamp).ToList(); #endregion List <Client> CurrentClients = Clients.LoggedIn; foreach (uint ThisACID in AircraftIDs) { #region GetFlightDataFromThisAircraft List <Packets.Packet_11_FlightData> ThisAircraftFlightData = ( from ThisFlightDataPacket in FlightDataPacketsToSend where ThisFlightDataPacket.ID == ThisACID select ThisFlightDataPacket ).ToList(); #endregion if (ThisAircraftFlightData.Count < 1) { continue; } #region GetLatestFlightData Packets.Packet_11_FlightData NewesetFlightData = (from ThisFlightDataPacket in FlightDataPacketsToSend where ThisFlightDataPacket.ID == ThisACID select ThisFlightDataPacket).ToArray().Last(); #endregion #region UpdateFlightData foreach (Vehicle ThisVehicle in Vehicles.List.Where(x => x.ID == ThisACID)) { ThisVehicle.Update(NewesetFlightData); } #endregion float difference = (float)(NewesetFlightData.TimeStamp - PreviousTime); foreach (Client ThisClient in CurrentClients) { #region SetTimeToNow NewesetFlightData.TimeStamp = (float)((DateTime.Now - OpenYS.TimeStarted).TotalSeconds - (CurrentTime - PreviousTime) + difference); #endregion //Debug.WriteLine(NewesetFlightData.TimeStamp + " Ready to send to " + ThisClient.Username); ThisClient.SendPacket(NewesetFlightData); //Debug.WriteLine(NewesetFlightData.TimeStamp + " Send Flight Data."); } continue; } foreach (Packets.GenericPacket ThisPacket in PacketsToSend) { if (ThisPacket.Type == 11) { continue; } #region Join Data if (ThisPacket.Type == 05) { Packets.Packet_05_EntityJoined ThisJoinData = new Packets.Packet_05_EntityJoined(ThisPacket); #region Create Vehicle Vehicle ThisVehicle = new Vehicle(); ThisVehicle.Update(ThisJoinData); //ThisJoinData = ThisVehicle.GetJoinPacket(false); #endregion #region Add Vehicle to Vehicles List Vehicles.List.Add(ThisVehicle); VehiclesHistory.List.Add(ThisVehicle); #endregion foreach (Client ThisClient in CurrentClients) { Packets.Packet_06_Acknowledgement Acknowledgement; if (ThisJoinData.IsAircraft) { Acknowledgement = new Packets.Packet_06_Acknowledgement(0, ThisJoinData.ID); } else { Acknowledgement = new Packets.Packet_06_Acknowledgement(1, 0); } //ThisClient.SendPacketGetPacket(ThisJoinData, Acknowledgement); ThisClient.SendPacket(ThisJoinData); } continue; } #endregion #region Leave Data if (ThisPacket.Type == 13) { Packets.Packet_13_RemoveAirplane ThisRemoveAirplane = new Packets.Packet_13_RemoveAirplane(ThisPacket); lock (Vehicles.List) Vehicles.List.RemoveAll(x => x.ID == ThisRemoveAirplane.ID); foreach (Client ThisClient in CurrentClients) { Packets.Packet_06_Acknowledgement AcknowledgeLeave = new Packets.Packet_06_Acknowledgement(2, ThisRemoveAirplane.ID); //ThisClient.SendPacketGetPacket(ThisRemoveAirplane, AcknowledgeLeave); ThisClient.SendPacket(ThisRemoveAirplane); } continue; } #endregion CurrentClients.SendPacket(ThisPacket); } if (Playing) { PreviousTime = CurrentTime; } return(true); }
public bool LoadReplay(string FileName) { #region Deny if already loading! if (Loading) { Debug.WriteLine("Failure to load YSFlight Replay (Already Loading! Can't Dual Process!)"); return(false); } #endregion #region Deny if already loaded! if (Loaded) { Debug.WriteLine("Failure to load YSFlight Replay (Already Loaded! Can't OverWrite!)"); return(false); } #endregion #region Deny if file not found! if (!Files.FileExists(FileName)) { Debug.WriteLine("Failure to load YSFlight Replay (File Not Found):\n " + FileName); return(false); } #endregion #region load records to buffer string[] Contents = Files.FileReadAllLines(FileName); #endregion #region clear the records, ready to write to. CurrentTime = 0; Records.Clear(); #endregion Console.WriteLine("&eLoading Replay..."); Loading = true; Threads.Add(() => { string Mode = "NONE"; #region Aircraft Data string CurrentAC_Identify = "NULL"; uint CurrentAC_ID = 0; uint CurrentAC_IFF = 0; float CurrentAC_Fuel = 100; string CurrentAC_Tag = "Replay"; #endregion for (int CurrentLineNumber = 0; CurrentLineNumber < Contents.Length; CurrentLineNumber++) { #region prepare variables string ThisLine = Contents[CurrentLineNumber]; string Keyword = ThisLine; string Arguments = ""; if (Keyword.Contains(' ')) { Arguments = Keyword.Split(new char[] { ' ' }, 2)[1]; Keyword = Keyword.Split(' ')[0].ToUpperInvariant(); } #endregion #region No Aircraft at the moment. if (Mode == "NONE") { if (Keyword == "AIRPLANE") { Mode = "AIRPLANE"; CurrentAC_ID = World.Objects.GetNextID() | 256 * 256; AircraftIDs.Add(CurrentAC_ID); if (ThisLine.Contains(' ')) { CurrentAC_Identify = ThisLine.Split(' ')[1]; } continue; } } #endregion #region Working on an aircraft. if (Mode == "AIRPLANE") { #region get IFF if (Keyword == "IDENTIFY") { UInt32.TryParse(Arguments, out CurrentAC_IFF); continue; } #endregion #region get Tag if (Keyword == "IDANDTAG") { if (Arguments.Contains(' ')) { CurrentAC_Tag = Arguments.Split(new char[] { ' ' }, 2)[1]; if (CurrentAC_Tag == "\"\"") { CurrentAC_Tag = "Replay"; } continue; } } #endregion #region get airpcmnd if (Keyword == "AIRPCMND") { if (Arguments.Contains(' ')) { string[] SubArguments = Arguments.Split(' '); #region get fuel if (SubArguments.Length > 1) { try { if (SubArguments[0].ToUpperInvariant() == "INITFUEL") { try { CurrentAC_Fuel = (float)MetaData._Aircraft.FindByName(CurrentAC_Identify).Cache().WEIGFUEL; } catch { Debug.WriteLine("Failed to set default fuel!"); } try { CurrentAC_Fuel = CurrentAC_Fuel / 100 * UInt32.Parse(SubArguments[1].Split('%')[0]); } catch { Debug.WriteLine("Failed to load fuel: " + ThisLine); } } } catch { Debug.WriteLine("Failed to process AIRPCMND: " + ThisLine); } } #endregion continue; } } #endregion #region process flight records. if (Keyword == "NUMRECOR") { int RecordsCount = 0; if (Arguments.Contains(' ')) { Int32.TryParse(Arguments.Split(' ')[0], out RecordsCount); } CurrentLineNumber++; List <Packets.Packet_11_FlightData> ThisAircraftFlightDataRecords = new List <Packets.Packet_11_FlightData>(); for (int i = 0; i < RecordsCount; i++) { string[] RecordContents = new string[4]; try { RecordContents[0] = Contents[CurrentLineNumber]; RecordContents[1] = Contents[CurrentLineNumber + 1]; RecordContents[2] = Contents[CurrentLineNumber + 2]; RecordContents[3] = Contents[CurrentLineNumber + 3]; } catch { Debug.WriteLine("Error reading lines for YSF Record!"); continue; } CurrentLineNumber += 4; PacketEvent ThisPacketEvent = ProcessYSFlightAircraftRecord(RecordContents, CurrentAC_ID); Packets.Packet_11_FlightData FlightData = new Packets.Packet_11_FlightData(ThisPacketEvent.Packet); FlightData.Weight_Fuel = CurrentAC_Fuel; FlightData.Weight_SmokeOil = 100; FlightData.Weight_Payload = 0; #region spawn the aircraft if (i == 0) { //first event, need to add a creation packet! Packets.Packet_05_EntityJoined EntityJoined = new Packets.Packet_05_EntityJoined(); EntityJoined.ID = CurrentAC_ID; EntityJoined.IFF = CurrentAC_IFF; EntityJoined.PosX = FlightData.PosX; EntityJoined.PosY = FlightData.PosY; EntityJoined.PosZ = FlightData.PosZ; EntityJoined.RotX = (float)(FlightData.HdgX / 32767 * Math.PI); EntityJoined.RotY = (float)(FlightData.HdgY / 32767 * Math.PI); EntityJoined.RotZ = (float)(FlightData.HdgZ / 32767 * Math.PI); EntityJoined.Identify = CurrentAC_Identify; EntityJoined.OwnerName = CurrentAC_Tag; EntityJoined.IsOwnedByThisPlayer = false; EntityJoined.IsOwnedByOtherPlayer = true; EntityJoined.IsAircraft = true; Records.Add(new PacketEvent(FlightData.TimeStamp, EntityJoined)); } #endregion if (i > 0) { Packets.Packet_11_FlightData PrevFlightData = ThisAircraftFlightDataRecords.ToArray()[i - 1]; float TimeDifference = FlightData.TimeStamp - PrevFlightData.TimeStamp; float ScalingFactor = 1f / TimeDifference; //short _X_Left = (ushort)FlightData.HdgX - (ushort)ThisAircraftFlightDataRecords.ToArray()[i - 1].HdgX; //350-010 = 340; //010-350 = -340 //short _X_Right = (ushort)ThisAircraftFlightDataRecords.ToArray()[i - 1].HdgX - (ushort)FlightData.HdgX; // float ChangeYDeg = Numbers.AngleAcuteDifference(FlightData.HdgX.ToDegrees(), PrevFlightData.HdgX.ToDegrees()); float ChangeXDeg = Numbers.AngleAcuteDifference(FlightData.HdgY.ToDegrees(), PrevFlightData.HdgY.ToDegrees()); float ChangeZDeg = Numbers.AngleAcuteDifference(FlightData.HdgZ.ToDegrees(), PrevFlightData.HdgZ.ToDegrees()); //FlightData.V_HdgX = (float)(ChangeXDeg * ScalingFactor / 180 * Math.PI); //FlightData.V_HdgY = (float)(ChangeYDeg * ScalingFactor / 180 * Math.PI); //FlightData.V_HdgZ = (float)(ChangeZDeg * ScalingFactor / 180 * Math.PI); //FlightData.V_HdgX = 0; //FlightData.V_HdgY = 2; //FlightData.V_HdgZ = 0; FlightData.V_PosX = (short)((FlightData.PosX - PrevFlightData.PosX) * ScalingFactor * 10); FlightData.V_PosY = (short)((FlightData.PosY - PrevFlightData.PosY) * ScalingFactor * 10); FlightData.V_PosZ = (short)((FlightData.PosZ - PrevFlightData.PosZ) * ScalingFactor * 10); } ThisPacketEvent.Packet = FlightData; Records.Add(ThisPacketEvent); ThisAircraftFlightDataRecords.Add(FlightData); #region despawn the aircraft if (i == RecordsCount - 1) { //Last record, need to destory the aircraft now! Packets.Packet_13_RemoveAirplane RemoveACPacket = new Packets.Packet_13_RemoveAirplane(CurrentAC_ID); Records.Add(new PacketEvent(FlightData.TimeStamp, RemoveACPacket)); } continue; #endregion } Mode = "NONE"; CurrentLineNumber--; } #endregion } #endregion } Loaded = true; Loading = false; Console.WriteLine("&aLoaded Replay."); }, "Replay Loader: " + FileName); return(true); }
public bool Disconnect(string Reason) { lock (this) { if (IsDisconnecting()) { return(false); } if (IsDisconnected()) { return(false); } //Console.WriteLine(ConsoleColor.Red, Utilities.GetSourceCodePosition(1)); if (IsFakeClient()) { return(true); } if (IsDisconnecting()) { Log.Warning("Disconnect() Called for Client: " + Username + ". Disconnecting Flag is Currently ON, A duplicate has occured and will be ignored."); return(false); } if (IsDisconnected()) { Log.Warning("Disconnect() Called for Client: " + Username + ". Disconnect Flag is Currently ON, A duplicate has occured and will be ignored."); return(false); } try { if (YSFClient.Socket.Connected || (!YSFClient.Socket.Poll(1000, SelectMode.SelectRead) && YSFClient.Socket.Available != 0)) { //The socket still exists! //DO NOT DISCONNECT! Log.Warning("Client " + Username + " Socket told to disconnect when it should not be disconnected? (Data Still Available?)"); } } catch (Exception e) { Debug.WriteLine(e.ToString()); } Log.Warning("Disconnect() Called for Client: " + Username + ". Disconnect Flag is Currently OFF, Setting to ON. (This is completely normal...)"); Log.Warning("Disconnect() Reason: " + Reason); SetDisconnecting(); #region Despawn Vehicle if (Vehicle != Vehicles.NoVehicle) { //Need to tell all the other clients the vehicle is removed! Packets.Packet_13_RemoveAirplane RemoveAirplane = new Packets.Packet_13_RemoveAirplane(Vehicle.ID); Packets.Packet_06_Acknowledgement AcknowledgeLeave = new Packets.Packet_06_Acknowledgement(2, RemoveAirplane.ID); foreach (Client OtherClient in Clients.AllClients.Exclude(this)) { OtherClient.SendPacket(RemoveAirplane); //OtherClient.GetPacket(AcknowledgeLeave); } if (Vehicle.VirtualCarrierObject_ID != 0) { Packets.Packet_19_RemoveGround RemoveVCO = new Packets.Packet_19_RemoveGround(Vehicle.VirtualCarrierObject_ID); Clients.AllClients.Exclude(this).SendPacket(RemoveVCO); } Vehicles.List.RemoveAll(x => x == Vehicle); } #endregion Clients.RemoveClient(this); //remove self from the client list. #region Inform Players if ((this.Username == "nameless" & !this.ClientType.HasFlag(Client.FlagsClientType.YSFlightClient)) | this.IsBot()) { if (this.Username == "nameless") { if (Settings.Loading.BotPingMessages) { Console.WriteLine(ConsoleColor.Magenta, "Server was pinged by an unknown service."); } } else if (this.IsBot()) { if (Settings.Loading.BotPingMessages) { Console.WriteLine(ConsoleColor.Magenta, "Server was pinged by a serverlist."); } } } else { foreach (Client OtherClient in Clients.AllClients.Exclude(this).ToArray()) { OtherClient.SendMessage("&c" + Username + " left the server."); } } #endregion #region Kill Client. try { //lock (YSFClient.PacketWaiters) //{ // foreach (Connection.PacketWaiter ThisPacketWaiter in YSFClient.PacketWaiters.ToArray()) // { // //force all listener threads to invalidate and cancel. // ThisPacketWaiter.Signal.Set(); // ThisPacketWaiter.Signal.Dispose(); // } //} //YSFClient.Disconnect(); } catch (Exception e) { Log.Error(e); } #endregion #region Kill Server. try { //YSFServer.ReceiveThread.Abort(); //foreach (Connection.PacketWaiter ThisPacketWaiter in YSFServer.PacketWaiters.ToArray()) //{ // //force all listener threads to invalidate and cancel. // ThisPacketWaiter.Signal.Set(); // ThisPacketWaiter.Signal.Dispose(); //} //YSFServer.Disconnect(); } catch (Exception e) { Log.Error(e); } #endregion //YSFClient.PacketLog.Log(); StateConnection = Client.FlagsStateConnection.Disconnected; return(true); } }
public static bool MicroTick() { #region DoWeather if (AdvancedWeatherOptions._Weather_Variable) { Packets.Packet_33_Weather TempWeather = AdvancedWeatherOptions.GetUpdatedWeather(); TempWeather.Control_BlackOut = false; TempWeather.Control_Collisions = false; TempWeather.Control_LandEverywhere = false; Clients.AllClients.SendPacket(TempWeather); } #endregion #region DoHeartbeatMonitor Clients.DoHeartbeatMonitor(); #endregion #region DoOnTickUpdateEvent lock (Events_OnMicroTickUpdate) { foreach (OnMicroTickUpdateEvent ThisMethod in Events_OnMicroTickUpdate) { ThisMethod(); } } #endregion #region CountThreads Thread[] _ThreadsArray; lock (Threads.List) _ThreadsArray = Threads.List.ToArray(); foreach (Thread ThisThread in _ThreadsArray) { if (!ThisThread.IsAlive) { //Log.Error("Thread killed as part of maintenance: " + ThisThread.Name); Threads.List.RemoveAll(x => x == ThisThread); } } #endregion #region ManageVehicles Vehicle[] _VehiclesArray; lock (Vehicles.List) _VehiclesArray = Vehicles.List.ToArray(); foreach (Vehicle ThisVehicle in _VehiclesArray) { if (Clients.Flying.Where(x => x.Vehicle == ThisVehicle).Count() < 1 & !ThisVehicle.IsVirtualVehicle) { Vehicles.List.RemoveAll(x => x == ThisVehicle); Packets.Packet_13_RemoveAirplane RemoveAirplane = new Packets.Packet_13_RemoveAirplane(ThisVehicle.ID); foreach (Client OtherClient in Clients.AllClients) { Packets.Packet_06_Acknowledgement AcknowledgeLeave = new Packets.Packet_06_Acknowledgement(2, RemoveAirplane.ID); //OtherClient.SendPacketGetPacket(RemoveAirplane, AcknowledgeLeave); OtherClient.SendPacket(RemoveAirplane); } Console.WriteLine("&3Found a lost Vehicle... Cleaned it up!"); continue; } if (ThisVehicle.Invincible) { Clients.LoggedIn.SendPacket(new Packets.Packet_30_AirCommand(ThisVehicle.ID, "STRENGTH", "255")); } } #endregion return(true); }