public static void ServerLoop(object threadContext)
{
Netplay.ResetNetDiag();
if (Main.rand == null)
Main.rand = new Random((int)DateTime.Now.Ticks);
if (WorldGen.genRand == null)
WorldGen.genRand = new Random((int)DateTime.Now.Ticks);
Main.myPlayer = (int)byte.MaxValue;
Netplay.ServerIP = IPAddress.Any;
Main.menuMode = 14;
Main.statusText = "Starting server...";
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 = "Tried to run two servers on the same PC";
Netplay.disconnect = true;
}
Main.statusText = "Server started";
}
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].Socket.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 bufferIndex = 0; bufferIndex < 256; ++bufferIndex)
{
if (NetMessage.buffer[bufferIndex].checkBytes)
NetMessage.CheckBytes(bufferIndex);
if (Netplay.Clients[bufferIndex].PendingTermination)
{
Netplay.Clients[bufferIndex].Reset();
NetMessage.syncPlayers();
}
else if (Netplay.Clients[bufferIndex].Socket.IsConnected())
{
if (!Netplay.Clients[bufferIndex].IsActive)
Netplay.Clients[bufferIndex].State = 0;
Netplay.Clients[bufferIndex].IsActive = true;
++num3;
if (!Netplay.Clients[bufferIndex].IsReading)
{
try
{
if (Netplay.Clients[bufferIndex].Socket.IsDataAvailable())
{
Netplay.Clients[bufferIndex].IsReading = true;
Netplay.Clients[bufferIndex].Socket.AsyncReceive(Netplay.Clients[bufferIndex].ReadBuffer, 0, Netplay.Clients[bufferIndex].ReadBuffer.Length, new SocketReceiveCallback(Netplay.Clients[bufferIndex].ServerReadCallBack), (object)null);
}
}
catch
{
Netplay.Clients[bufferIndex].PendingTermination = true;
}
}
if (Netplay.Clients[bufferIndex].StatusMax > 0 && Netplay.Clients[bufferIndex].StatusText2 != "")
{
if (Netplay.Clients[bufferIndex].StatusCount >= Netplay.Clients[bufferIndex].StatusMax)
{
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " " + Netplay.Clients[bufferIndex].StatusText2 + ": Complete!";
Netplay.Clients[bufferIndex].StatusText2 = "";
Netplay.Clients[bufferIndex].StatusMax = 0;
Netplay.Clients[bufferIndex].StatusCount = 0;
}
else
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " " + Netplay.Clients[bufferIndex].StatusText2 + ": " + (string)(object)(int)((double)Netplay.Clients[bufferIndex].StatusCount / (double)Netplay.Clients[bufferIndex].StatusMax * 100.0) + "%";
}
else if (Netplay.Clients[bufferIndex].State == 0)
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " is connecting...";
else if (Netplay.Clients[bufferIndex].State == 1)
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " is sending player data...";
else if (Netplay.Clients[bufferIndex].State == 2)
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " requested world information";
else if (Netplay.Clients[bufferIndex].State != 3)
{
if (Netplay.Clients[bufferIndex].State == 10)
{
try
{
Netplay.Clients[bufferIndex].StatusText = "(" + (object)Netplay.Clients[bufferIndex].Socket.GetRemoteAddress() + ") " + Netplay.Clients[bufferIndex].Name + " is playing";
}
catch
{
Netplay.Clients[bufferIndex].PendingTermination = true;
}
}
}
}
else if (Netplay.Clients[bufferIndex].IsActive)
{
Netplay.Clients[bufferIndex].PendingTermination = true;
}
else
{
Netplay.Clients[bufferIndex].StatusText2 = "";
if (bufferIndex < (int)byte.MaxValue)
Main.player[bufferIndex].active = false;
}
}
++num1;
if (num1 > 10)
{
Thread.Sleep(1);
num1 = 0;
}
else
Thread.Sleep(0);
if (!WorldGen.saveLock && !Main.dedServ)
Main.statusText = num3 != 0 ? (string)(object)num3 + (object)" clients connected" : "Waiting for clients...";
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();
while (WorldGen.saveLock);
Main.menuMode = 0;
}
else
Main.netMode = 0;
Main.myPlayer = 0;
}