public static void ServerLoop() { Main.players[255].whoAmi = 255; NetPlay.serverIP = IPAddress.Parse(serverSIP); NetPlay.serverListenIP = NetPlay.serverIP; NetPlay.disconnect = false; // for (int i = 0; i < 256; i++) // { //// Netplay.slots[i] = new ServerSlot(); // Netplay.slots[i].whoAmI = i; // Netplay.slots[i].Reset(); // } Init(); NetPlay.tcpListener = new TcpListener(NetPlay.serverListenIP, NetPlay.serverPort); try { NetPlay.tcpListener.Start(); } catch (Exception exception) { ProgramLog.Error.Log("Error Starting the Server: {0}", exception); NetPlay.disconnect = true; } if (!NetPlay.disconnect) { if (!Program.updateThread.IsAlive) { Program.updateThread.Start(); } ProgramLog.Admin.Log("{0} {1}:{2}", Language.Languages.ServerStartedOn, serverSIP, serverPort); // ProgramLog.Log("Loading Plugins..."); // PluginManager.LoadAllPlugins(); // ProgramLog.Log("Plugins Loaded: " + PluginManager.Plugins.Count.ToString()); //Statics.serverStarted = true; } else { return; } SlotManager.Initialize(Program.properties.MaxPlayers, Program.properties.OverlimitSlots); ServerUp = true; var serverSock = NetPlay.tcpListener.Server; try { while (!NetPlay.disconnect) { NetPlay.anyClients = Networking.ClientConnection.All.Count > 0; //clientList.Count > 0; serverSock.Poll(500000, SelectMode.SelectRead); if (NetPlay.disconnect) { break; } // Accept new clients while (NetPlay.tcpListener.Pending()) { var client = NetPlay.tcpListener.AcceptSocket(); var accepted = AcceptClient(client); if (accepted) { NetPlay.anyClients = true; } } } } catch (Exception e) { ProgramLog.Log(e, "ServerLoop terminated with exception"); } NetPlay.anyClients = false; try { tcpListener.Stop(); } catch (SocketException) { } lock (Networking.ClientConnection.All) { var conns = Networking.ClientConnection.All.ToArray(); foreach (var conn in conns) { conn.Kick("Server is shutting down."); } } for (int i = 0; i < 255; i++) { try { slots[i].Kick("Server is shutting down."); } catch { } } Thread.Sleep(1000); for (int i = 0; i < 255; i++) { try { slots[i].Reset(); } catch { } } if (!WorldIO.SaveWorld(World.SavePath, true)) { ProgramLog.Error.Log("Saving failed. Quitting without saving."); } ServerUp = false; }