public static void ServerLoop(object threadContext)
{
Netplay.ResetNetDiag();
if (Main.rand == null)
{
Main.rand = new UnifiedRandom((int)DateTime.Now.Ticks);
}
Main.myPlayer = (int)byte.MaxValue;
Netplay.ServerIP = IPAddress.Any;
Main.menuMode = 14;
Main.statusText = Lang.menu[8].Value;
Main.netMode = 2;
Netplay.disconnect = false;
for (int index = 0; index < 256; ++index)
{
Netplay.Clients[index] = new RemoteClient();
Netplay.Clients[index].Reset();
Netplay.Clients[index].Id = index;
Netplay.Clients[index].ReadBuffer = new byte[1024];
}
Netplay.TcpListener = (ISocket) new TcpSocket();
if (!Netplay.disconnect)
{
if (!Netplay.StartListening())
{
Main.menuMode = 15;
Main.statusText = Language.GetTextValue("Error.TriedToRunServerTwice");
Netplay.disconnect = true;
}
Main.statusText = Language.GetTextValue("CLI.ServerStarted");
}
if (Netplay.UseUPNP)
{
try
{
Netplay.OpenPort();
}
catch
{
}
}
int num1 = 0;
while (!Netplay.disconnect)
{
if (!Netplay.IsListening)
{
int num2 = -1;
for (int index = 0; index < Main.maxNetPlayers; ++index)
{
if (!Netplay.Clients[index].IsConnected())
{
num2 = index;
break;
}
}
if (num2 >= 0)
{
if (Main.ignoreErrors)
{
try
{
Netplay.StartListening();
Netplay.IsListening = true;
}
catch
{
}
}
else
{
Netplay.StartListening();
Netplay.IsListening = true;
}
}
}
int num3 = 0;
for (int index = 0; index < 256; ++index)
{
if (NetMessage.buffer[index].checkBytes)
{
NetMessage.CheckBytes(index);
}
if (Netplay.Clients[index].PendingTermination)
{
Netplay.Clients[index].Reset();
NetMessage.SyncDisconnectedPlayer(index);
}
else if (Netplay.Clients[index].IsConnected())
{
if (!Netplay.Clients[index].IsActive)
{
Netplay.Clients[index].State = 0;
}
Netplay.Clients[index].IsActive = true;
++num3;
if (!Netplay.Clients[index].IsReading)
{
try
{
if (Netplay.Clients[index].Socket.IsDataAvailable())
{
Netplay.Clients[index].IsReading = true;
Netplay.Clients[index].Socket.AsyncReceive(Netplay.Clients[index].ReadBuffer, 0, Netplay.Clients[index].ReadBuffer.Length, new SocketReceiveCallback(Netplay.Clients[index].ServerReadCallBack), (object)null);
}
}
catch
{
Netplay.Clients[index].PendingTermination = true;
}
}
if (Netplay.Clients[index].StatusMax > 0 && Netplay.Clients[index].StatusText2 != "")
{
if (Netplay.Clients[index].StatusCount >= Netplay.Clients[index].StatusMax)
{
Netplay.Clients[index].StatusText = Language.GetTextValue("Net.ClientStatusComplete", (object)Netplay.Clients[index].Socket.GetRemoteAddress(), (object)Netplay.Clients[index].Name, (object)Netplay.Clients[index].StatusText2);
Netplay.Clients[index].StatusText2 = "";
Netplay.Clients[index].StatusMax = 0;
Netplay.Clients[index].StatusCount = 0;
}
else
{
Netplay.Clients[index].StatusText = "(" + (object)Netplay.Clients[index].Socket.GetRemoteAddress() + ") " + Netplay.Clients[index].Name + " " + Netplay.Clients[index].StatusText2 + ": " + (object)(int)((double)Netplay.Clients[index].StatusCount / (double)Netplay.Clients[index].StatusMax * 100.0) + "%";
}
}
else if (Netplay.Clients[index].State == 0)
{
Netplay.Clients[index].StatusText = Language.GetTextValue("Net.ClientConnecting", (object)string.Format("({0}) {1}", (object)Netplay.Clients[index].Socket.GetRemoteAddress(), (object)Netplay.Clients[index].Name));
}
else if (Netplay.Clients[index].State == 1)
{
Netplay.Clients[index].StatusText = Language.GetTextValue("Net.ClientSendingData", (object)Netplay.Clients[index].Socket.GetRemoteAddress(), (object)Netplay.Clients[index].Name);
}
else if (Netplay.Clients[index].State == 2)
{
Netplay.Clients[index].StatusText = Language.GetTextValue("Net.ClientRequestedWorldInfo", (object)Netplay.Clients[index].Socket.GetRemoteAddress(), (object)Netplay.Clients[index].Name);
}
else if (Netplay.Clients[index].State != 3)
{
if (Netplay.Clients[index].State == 10)
{
try
{
Netplay.Clients[index].StatusText = Language.GetTextValue("Net.ClientPlaying", (object)Netplay.Clients[index].Socket.GetRemoteAddress(), (object)Netplay.Clients[index].Name);
}
catch (Exception ex)
{
Netplay.Clients[index].PendingTermination = true;
}
}
}
}
else if (Netplay.Clients[index].IsActive)
{
Netplay.Clients[index].PendingTermination = true;
}
else
{
Netplay.Clients[index].StatusText2 = "";
if (index < (int)byte.MaxValue)
{
int num2 = Main.player[index].active ? 1 : 0;
Main.player[index].active = false;
if (num2 != 0)
{
Player.Hooks.PlayerDisconnect(index);
}
}
}
}
++num1;
if (num1 > 10)
{
Thread.Sleep(1);
num1 = 0;
}
else
{
Thread.Sleep(0);
}
if (!WorldGen.saveLock && !Main.dedServ)
{
Main.statusText = num3 != 0 ? Language.GetTextValue("Net.ClientsConnected", (object)num3) : Language.GetTextValue("Net.WaitingForClients");
}
Netplay.anyClients = num3 != 0;
Netplay.IsServerRunning = true;
}
Netplay.StopListening();
try
{
Netplay.closePort();
}
catch
{
}
for (int index = 0; index < 256; ++index)
{
Netplay.Clients[index].Reset();
}
if (Main.menuMode != 15)
{
Main.netMode = 0;
Main.menuMode = 10;
WorldFile.saveWorld();
do
{
;
}while (WorldGen.saveLock);
Main.menuMode = 0;
}
else
{
Main.netMode = 0;
}
Main.myPlayer = 0;
}