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 = 255;
Netplay.serverIP = IPAddress.Any;
Netplay.serverListenIP = Netplay.serverIP;
Main.menuMode = 14;
Main.statusText = "Starting server...";
Main.netMode = 2;
Netplay.disconnect = false;
for (int i = 0; i < 256; i++)
{
Netplay.serverSock[i] = new ServerSock();
Netplay.serverSock[i].Reset();
Netplay.serverSock[i].whoAmI = i;
Netplay.serverSock[i].tcpClient = new TcpClient();
Netplay.serverSock[i].tcpClient.NoDelay = true;
Netplay.serverSock[i].readBuffer = new byte[1024];
Netplay.serverSock[i].writeBuffer = new byte[1024];
}
Netplay.tcpListener = new TcpListener(Netplay.serverListenIP, Netplay.serverPort);
try
{
Netplay.tcpListener.Start();
}
catch (Exception ex)
{
Main.menuMode = 15;
Main.statusText = ex.ToString();
Netplay.disconnect = true;
}
if (!Netplay.disconnect)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
Main.statusText = "Server started";
}
if (Netplay.uPNP)
{
try
{
Netplay.openPort();
}
catch
{
}
}
int num = 0;
while (!Netplay.disconnect)
{
if (Netplay.stopListen)
{
int num2 = -1;
for (int j = 0; j < Main.maxNetPlayers; j++)
{
if (!Netplay.serverSock[j].tcpClient.Connected)
{
num2 = j;
break;
}
}
if (num2 >= 0)
{
if (Main.ignoreErrors)
{
try
{
Netplay.tcpListener.Start();
Netplay.stopListen = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
goto IL_219;
}
catch
{
goto IL_219;
}
}
Netplay.tcpListener.Start();
Netplay.stopListen = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
}
}
IL_219:
int num3 = 0;
for (int k = 0; k < 256; k++)
{
if (NetMessage.buffer[k].checkBytes)
{
NetMessage.CheckBytes(k);
}
if (Netplay.serverSock[k].kill)
{
Netplay.serverSock[k].Reset();
NetMessage.syncPlayers();
}
else
{
if (Netplay.serverSock[k].tcpClient.Connected)
{
if (!Netplay.serverSock[k].active)
{
Netplay.serverSock[k].state = 0;
}
Netplay.serverSock[k].active = true;
num3++;
if (!Netplay.serverSock[k].locked)
{
try
{
Netplay.serverSock[k].networkStream = Netplay.serverSock[k].tcpClient.GetStream();
if (Netplay.serverSock[k].networkStream.DataAvailable)
{
Netplay.serverSock[k].locked = true;
Netplay.serverSock[k].networkStream.BeginRead(Netplay.serverSock[k].readBuffer, 0, Netplay.serverSock[k].readBuffer.Length, new AsyncCallback(Netplay.serverSock[k].ServerReadCallBack), Netplay.serverSock[k].networkStream);
}
}
catch
{
Netplay.serverSock[k].kill = true;
}
}
if (Netplay.serverSock[k].statusMax > 0 && Netplay.serverSock[k].statusText2 != "")
{
if (Netplay.serverSock[k].statusCount >= Netplay.serverSock[k].statusMax)
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" ",
Netplay.serverSock[k].statusText2,
": Complete!"
});
Netplay.serverSock[k].statusText2 = "";
Netplay.serverSock[k].statusMax = 0;
Netplay.serverSock[k].statusCount = 0;
}
else
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" ",
Netplay.serverSock[k].statusText2,
": ",
(int)((float)Netplay.serverSock[k].statusCount / (float)Netplay.serverSock[k].statusMax * 100f),
"%"
});
}
}
else
{
if (Netplay.serverSock[k].state == 0)
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" is connecting..."
});
}
else
{
if (Netplay.serverSock[k].state == 1)
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" is sending player data..."
});
}
else
{
if (Netplay.serverSock[k].state == 2)
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" requested world information"
});
}
else
{
if (Netplay.serverSock[k].state != 3 && Netplay.serverSock[k].state == 10)
{
Netplay.serverSock[k].statusText = string.Concat(new object[]
{
"(",
Netplay.serverSock[k].tcpClient.Client.RemoteEndPoint,
") ",
Netplay.serverSock[k].name,
" is playing"
});
}
}
}
}
}
}
else
{
if (Netplay.serverSock[k].active)
{
Netplay.serverSock[k].kill = true;
}
else
{
Netplay.serverSock[k].statusText2 = "";
if (k < 255)
{
Main.player[k].active = false;
}
}
}
}
}
num++;
if (num > 10)
{
Thread.Sleep(1);
num = 0;
}
else
{
Thread.Sleep(0);
}
if (!WorldGen.saveLock && !Main.dedServ)
{
if (num3 == 0)
{
Main.statusText = "Waiting for clients...";
}
else
{
Main.statusText = num3 + " clients connected";
}
}
if (num3 == 0)
{
Netplay.anyClients = false;
}
else
{
Netplay.anyClients = true;
}
Netplay.ServerUp = true;
}
Netplay.tcpListener.Stop();
try
{
Netplay.closePort();
}
catch
{
}
for (int l = 0; l < 256; l++)
{
Netplay.serverSock[l].Reset();
}
if (Main.menuMode != 15)
{
Main.netMode = 0;
Main.menuMode = 10;
WorldGen.saveWorld(false);
while (WorldGen.saveLock)
{
}
Main.menuMode = 0;
}
else
{
Main.netMode = 0;
}
Main.myPlayer = 0;
}