void GameThread() { if (needLoadData) { FLLog.Info("Server", "Loading Game Data..."); GameData.LoadData(); FLLog.Info("Server", "Finished Loading Game Data"); } if (!string.IsNullOrWhiteSpace(DbConnectionString)) { Database = new ServerDatabase(DbConnectionString); } Listener?.Start(); Stopwatch sw = Stopwatch.StartNew(); double lastTime = 0; while (running) { while (!localPackets.IsEmpty && localPackets.TryDequeue(out var local)) { LocalPlayer.ProcessPacket(local); } Action a; if (worldRequests.Count > 0 && worldRequests.TryDequeue(out a)) { a(); } //Start Loop var time = sw.Elapsed.TotalMilliseconds; var elapsed = (time - lastTime); if (elapsed < 2) { continue; } elapsed /= 1000f; lastTime = time; //Update LocalPlayer?.UpdateMissionRuntime(TimeSpan.FromSeconds(elapsed)); foreach (var world in worlds.Values) { world.Update(TimeSpan.FromSeconds(elapsed)); } //Sleep Thread.Sleep(0); } Listener?.Stop(); }
void GameThread() { if (needLoadData) { FLLog.Info("Server", "Loading Game Data..."); GameData.LoadData(null); FLLog.Info("Server", "Finished Loading Game Data"); } InitBaselinePrices(); Database = new ServerDatabase(this); Listener?.Start(); double lastTime = 0; processingLoop = new ServerLoop(Process); processingLoop.Start(); Listener?.Stop(); }
void NetThread() { FLLog.Info("Server", "Loading Game Data..."); GameData.LoadData(); FLLog.Info("Server", "Finished Loading Game Data"); Database = new ServerDatabase(DbConnectionString); var netconf = new NetPeerConfiguration(AppIdentifier); netconf.EnableMessageType(NetIncomingMessageType.DiscoveryRequest); netconf.EnableMessageType(NetIncomingMessageType.ConnectionApproval); netconf.EnableMessageType(NetIncomingMessageType.UnconnectedData); netconf.Port = Port; netconf.MaximumConnections = 200; NetServer = new NetServer(netconf); NetServer.Start(); FLLog.Info("Server", "Listening on port " + Port); NetIncomingMessage im; while (running) { while ((im = NetServer.ReadMessage()) != null) { switch (im.MessageType) { case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.ErrorMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.VerboseDebugMessage: FLLog.Info("Lidgren", im.ReadString()); NetServer.Recycle(im); break; case NetIncomingMessageType.ConnectionApproval: //Ban IP? im.SenderConnection.Approve(); NetServer.Recycle(im); break; case NetIncomingMessageType.DiscoveryRequest: NetOutgoingMessage dresp = NetServer.CreateMessage(); //Include Server Data dresp.Write(ServerName); dresp.Write(ServerDescription); dresp.Write(GameData.DataVersion); dresp.Write(NetServer.ConnectionsCount); dresp.Write(NetServer.Configuration.MaximumConnections); //Send off NetServer.SendDiscoveryResponse(dresp, im.SenderEndPoint); NetServer.Recycle(im); break; case NetIncomingMessageType.UnconnectedData: //Respond to pings try { if (im.ReadUInt32() == NetConstants.PING_MAGIC) { var om = NetServer.CreateMessage(); om.Write(NetConstants.PING_MAGIC); NetServer.SendUnconnectedMessage(om, im.SenderEndPoint); } } catch (Exception) { } break; case NetIncomingMessageType.StatusChanged: NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); string reason = im.ReadString(); FLLog.Info("Lidgren", NetUtility.ToHexString(im.SenderConnection.RemoteUniqueIdentifier) + " " + status + ": " + reason); if (status == NetConnectionStatus.Connected) { FLLog.Info("Lidgren", "Remote hail: " + im.SenderConnection.RemoteHailMessage.ReadString()); BeginAuthentication(NetServer, im.SenderConnection); } else if (status == NetConnectionStatus.Disconnected) { FLLog.Info("Lidgren", im.SenderEndPoint.ToString() + " disconnected"); if (im.SenderConnection.Tag is NetPlayer) { ((NetPlayer)im.SenderConnection.Tag).Disconnected(); } } NetServer.Recycle(im); break; case NetIncomingMessageType.Data: var pkt = im.ReadPacket(); if (im.SenderConnection.Tag == TagConnecting) { if (pkt is AuthenticationReplyPacket) { var auth = (AuthenticationReplyPacket)pkt; //im.SenderConnection.Disconnect("boilerplate reason from server"); /* * var authkind = (AuthenticationKind)im.ReadByte(); * var guid = new Guid(im.ReadBytes(16)); * if (guid == Guid.Empty) im.SenderConnection.Disconnect("Invalid UUID"); * FLLog.Info("Lidgren", "GUID for " + im.SenderEndPoint + " = " + guid.ToString()); * var p = new NetPlayer(im.SenderConnection, this, guid); * im.SenderConnection.Tag = p; * AsyncManager.RunTask(() => p.DoAuthSuccess());*/ var p = new NetPlayer(im.SenderConnection, this, auth.Guid); im.SenderConnection.Tag = p; AsyncManager.RunTask(() => p.DoAuthSuccess()); } else { im.SenderConnection.Disconnect("Invalid Packet"); } NetServer.Recycle(im); } else { var player = (NetPlayer)im.SenderConnection.Tag; AsyncManager.RunTask(() => player.ProcessPacket(pkt)); NetServer.Recycle(im); } break; } } Thread.Sleep(0); //Reduce CPU load } NetServer.Shutdown("Shutdown"); Database.Dispose(); }
void NetThread() { FLLog.Info("Server", "Loading Game Data..."); GameData.LoadData(); FLLog.Info("Server", "Finished Loading Game Data"); Database = new ServerDatabase(DbConnectionString, GameData); var netconf = new NetPeerConfiguration(AppIdentifier); netconf.EnableMessageType(NetIncomingMessageType.DiscoveryRequest); netconf.EnableMessageType(NetIncomingMessageType.ConnectionApproval); netconf.Port = Port; netconf.MaximumConnections = 200; NetServer = new NetServer(netconf); NetServer.Start(); FLLog.Info("Server", "Listening on port " + Port); NetIncomingMessage im; while (running) { while ((im = NetServer.ReadMessage()) != null) { switch (im.MessageType) { case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.ErrorMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.VerboseDebugMessage: FLLog.Info("Lidgren", im.ReadString()); NetServer.Recycle(im); break; case NetIncomingMessageType.ConnectionApproval: //Ban IP? im.SenderConnection.Approve(); NetServer.Recycle(im); break; case NetIncomingMessageType.DiscoveryRequest: NetOutgoingMessage dresp = NetServer.CreateMessage(); //Include Server Data dresp.Write(ServerName); dresp.Write(ServerDescription); dresp.Write(NetServer.ConnectionsCount); dresp.Write(NetServer.Configuration.MaximumConnections); //Send off NetServer.SendDiscoveryResponse(dresp, im.SenderEndPoint); NetServer.Recycle(im); break; case NetIncomingMessageType.StatusChanged: NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); string reason = im.ReadString(); FLLog.Info("Lidgren", NetUtility.ToHexString(im.SenderConnection.RemoteUniqueIdentifier) + " " + status + ": " + reason); if (status == NetConnectionStatus.Connected) { FLLog.Info("Lidgren", "Remote hail: " + im.SenderConnection.RemoteHailMessage.ReadString()); BeginAuthentication(NetServer, im.SenderConnection); } NetServer.Recycle(im); break; case NetIncomingMessageType.Data: var kind = (PacketKind)im.ReadByte(); if (im.SenderConnection.Tag == TagConnecting) { if (kind == PacketKind.Authentication) { var authkind = (AuthenticationKind)im.ReadByte(); var guid = new Guid(im.ReadBytes(16)); if (guid == Guid.Empty) { im.SenderConnection.Disconnect("Invalid UUID"); } FLLog.Info("Lidgren", "GUID for " + im.SenderEndPoint + " = " + guid.ToString()); var p = new NetPlayer(im.SenderConnection, this, guid); im.SenderConnection.Tag = p; AsyncManager.RunTask(() => p.DoAuthSuccess()); } else { im.SenderConnection.Disconnect("Invalid Packet"); } } else { var player = (NetPlayer)im.SenderConnection.Tag; AsyncManager.RunTask(() => player.ProcessPacket(im, kind)); } break; } } Thread.Sleep(1); //Reduce CPU load } Database.Dispose(); }
void GameThread() { if (needLoadData) { FLLog.Info("Server", "Loading Game Data..."); GameData.LoadData(); FLLog.Info("Server", "Finished Loading Game Data"); } Database = new ServerDatabase(this); Listener?.Start(); Stopwatch sw = Stopwatch.StartNew(); double lastTime = 0; while (running) { while (!localPackets.IsEmpty && localPackets.TryDequeue(out var local)) { LocalPlayer.ProcessPacket(local); } Action a; if (worldRequests.Count > 0 && worldRequests.TryDequeue(out a)) { a(); } //Start Loop var time = sw.Elapsed.TotalMilliseconds; var elapsed = (time - lastTime); if (elapsed < 2) { continue; } elapsed /= 1000f; lastTime = time; //Update LocalPlayer?.UpdateMissionRuntime(TimeSpan.FromSeconds(elapsed)); ConcurrentBag <StarSystem> toSpinDown = new ConcurrentBag <StarSystem>(); Parallel.ForEach(worlds, (world) => { if (!world.Value.Update(TimeSpan.FromSeconds(elapsed))) { toSpinDown.Add(world.Key); } }); //Remove if (toSpinDown.Count > 0) { lock (availableWorlds) { foreach (var w in toSpinDown) { if (worlds[w].PlayerCount <= 0) { worlds[w].Finish(); availableWorlds.Remove(w); worlds.Remove(w); FLLog.Info("Server", $"Shut down world {w.Nickname} ({w.Name})"); } } } } //Sleep Thread.Sleep(0); } Listener?.Stop(); }