public static void Settings(string[] args) { if (args.Length < 2) { Console.WriteLine("Error: Invalid syntax"); return; } var section = args[1].Split('.')[0]; var field = args[1].Split('.')[1]; var settings = new Settings(Platform.SupportDir + "settings.yaml", Arguments.Empty); var result = settings.Sections[section].GetType().GetField(field).GetValue(settings.Sections[section]); Console.WriteLine(result); }
public static void ServerMain(ModData modData, Settings settings, string map) { Log.AddChannel("server", "server.log"); isInitialPing = true; Server.masterServerUrl = settings.Server.MasterServer; isInternetServer = settings.Server.AdvertiseOnline; listener = new TcpListener(IPAddress.Any, settings.Server.ListenPort); Name = settings.Server.Name; ExternalPort = settings.Server.ExternalPort; randomSeed = (int)DateTime.Now.ToBinary(); ModData = modData; lobbyInfo = new Session(); lobbyInfo.GlobalSettings.Mods = settings.Game.Mods; lobbyInfo.GlobalSettings.RandomSeed = randomSeed; lobbyInfo.GlobalSettings.Map = map; lobbyInfo.GlobalSettings.AllowCheats = settings.Server.AllowCheats; LoadMap(); // populates the Session's slots, too. Log.Write("server", "Initial mods: "); foreach( var m in lobbyInfo.GlobalSettings.Mods ) Log.Write("server","- {0}", m); Log.Write("server", "Initial map: {0}",lobbyInfo.GlobalSettings.Map); try { listener.Start(); } catch (Exception) { throw new InvalidOperationException( "Unable to start server: port is already in use" ); } new Thread( _ => { for( ; ; ) { var checkRead = new ArrayList(); checkRead.Add( listener.Server ); foreach( var c in conns ) checkRead.Add( c.socket ); Socket.Select( checkRead, null, null, MasterPingInterval * 10000 ); foreach( Socket s in checkRead ) if( s == listener.Server ) AcceptConnection(); else conns.Single( c => c.socket == s ).ReadData(); if (Environment.TickCount - lastPing > MasterPingInterval * 1000) PingMasterServer(); else lock (masterServerMessages) while (masterServerMessages.Count > 0) SendChat(null, masterServerMessages.Dequeue()); if (conns.Count() == 0) { listener.Stop(); GameStarted = false; break; } } } ) { IsBackground = true }.Start(); }
public static void Settings(string[] args) { if (args.Length < 3) { Console.WriteLine("Error: Invalid syntax"); return; } var section = args[2].Split('.')[0]; var field = args[2].Split('.')[1]; string expandedPath = args[1].Replace("~", Environment.GetFolderPath(Environment.SpecialFolder.Personal)); var settings = new Settings(Path.Combine(expandedPath,"settings.yaml"), Arguments.Empty); var result = settings.Sections[section].GetType().GetField(field).GetValue(settings.Sections[section]); Console.WriteLine(result); }
public Server(ModData modData, Settings settings, string map) { Log.AddChannel("server", "server.log"); listener = new TcpListener(IPAddress.Any, settings.Server.ListenPort); Name = settings.Server.Name; randomSeed = (int)DateTime.Now.ToBinary(); ModData = modData; foreach (var trait in modData.Manifest.ServerTraits) ServerTraits.Add( modData.ObjectCreator.CreateObject<ServerTrait>(trait) ); lobbyInfo = new Session( settings.Game.Mods ); lobbyInfo.GlobalSettings.RandomSeed = randomSeed; lobbyInfo.GlobalSettings.Map = map; lobbyInfo.GlobalSettings.ServerName = settings.Server.Name; foreach (var t in ServerTraits.WithInterface<INotifyServerStart>()) t.ServerStarted(this); Log.Write("server", "Initial mods: "); foreach( var m in lobbyInfo.GlobalSettings.Mods ) Log.Write("server","- {0}", m); Log.Write("server", "Initial map: {0}",lobbyInfo.GlobalSettings.Map); try { listener.Start(); } catch (Exception) { throw new InvalidOperationException( "Unable to start server: port is already in use" ); } new Thread( _ => { var timeout = ServerTraits.WithInterface<ITick>().Min(t => t.TickTimeout); for( ; ; ) { var checkRead = new ArrayList(); checkRead.Add( listener.Server ); foreach( var c in conns ) checkRead.Add( c.socket ); foreach( var c in preConns ) checkRead.Add( c.socket ); Socket.Select( checkRead, null, null, timeout ); foreach( Socket s in checkRead ) if( s == listener.Server ) AcceptConnection(); else if (preConns.Count > 0) { var p = preConns.SingleOrDefault( c => c.socket == s ); if (p != null) p.ReadData( this ); } else if (conns.Count > 0) conns.Single( c => c.socket == s ).ReadData( this ); foreach (var t in ServerTraits.WithInterface<ITick>()) t.Tick(this); if (shutdown) break; } GameStarted = false; foreach (var t in ServerTraits.WithInterface<INotifyServerShutdown>()) t.ServerShutdown(this); preConns.Clear(); conns.Clear(); try { listener.Stop(); } catch { } } ) { IsBackground = true }.Start(); }