コード例 #1
0
 private static void UpdateClient()
 {
     if (Main.netMode == 1 && Connection.Socket.IsConnected() && NetMessage.buffer[256].checkBytes)
     {
         NetMessage.CheckBytes();
     }
 }
コード例 #2
0
ファイル: Netplay.cs プロジェクト: Neubulae/Sources
 private static void UpdateClient()
 {
     if (Main.netMode != 1 || !Netplay.Connection.Socket.IsConnected() || !NetMessage.buffer[256].checkBytes)
     {
         return;
     }
     NetMessage.CheckBytes(256);
 }
コード例 #3
0
 private static void UpdateServer()
 {
     for (int i = 0; i < 256; i++)
     {
         if (NetMessage.buffer[i].checkBytes)
         {
             NetMessage.CheckBytes(i);
         }
     }
 }
コード例 #4
0
ファイル: Netplay.cs プロジェクト: Neubulae/Sources
 private static void UpdateServer()
 {
     for (int bufferIndex = 0; bufferIndex < 256; ++bufferIndex)
     {
         if (NetMessage.buffer[bufferIndex].checkBytes)
         {
             NetMessage.CheckBytes(bufferIndex);
         }
     }
 }
コード例 #5
0
ファイル: Netplay.cs プロジェクト: woodcrafter123/Sources
        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)
                        {
                            bool active = Main.player[index].active;
                            Main.player[index].active = false;
                            if (active)
                            {
                                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;
        }
コード例 #6
0
ファイル: Netplay.cs プロジェクト: woodcrafter123/Sources
 private static void InnerClientLoop()
 {
     try
     {
         NetMessage.buffer[256].Reset();
         int num1 = -1;
         while (!Netplay.disconnect)
         {
             if (Netplay.Connection.Socket.IsConnected())
             {
                 if (NetMessage.buffer[256].checkBytes)
                 {
                     NetMessage.CheckBytes(256);
                 }
                 Netplay.Connection.IsActive = true;
                 if (Netplay.Connection.State == 0)
                 {
                     Main.statusText          = Language.GetTextValue("Net.FoundServer");
                     Netplay.Connection.State = 1;
                     NetMessage.SendData(1, -1, -1, (NetworkText)null, 0, 0.0f, 0.0f, 0.0f, 0, 0, 0);
                 }
                 if (Netplay.Connection.State == 2 && num1 != Netplay.Connection.State)
                 {
                     Main.statusText = Language.GetTextValue("Net.SendingPlayerData");
                 }
                 if (Netplay.Connection.State == 3 && num1 != Netplay.Connection.State)
                 {
                     Main.statusText = Language.GetTextValue("Net.RequestingWorldInformation");
                 }
                 if (Netplay.Connection.State == 4)
                 {
                     WorldGen.worldCleared    = false;
                     Netplay.Connection.State = 5;
                     Main.cloudBGAlpha        = (double)Main.cloudBGActive < 1.0 ? 0.0f : 1f;
                     Main.windSpeed           = Main.windSpeedSet;
                     Cloud.resetClouds();
                     Main.cloudAlpha = Main.maxRaining;
                     WorldGen.clearWorld();
                     if (Main.mapEnabled)
                     {
                         Main.Map.Load();
                     }
                 }
                 if (Netplay.Connection.State == 5 && Main.loadMapLock)
                 {
                     float num2 = (float)Main.loadMapLastX / (float)Main.maxTilesX;
                     Main.statusText = Lang.gen[68].Value + " " + (object)(int)((double)num2 * 100.0 + 1.0) + "%";
                 }
                 else if (Netplay.Connection.State == 5 && WorldGen.worldCleared)
                 {
                     Netplay.Connection.State = 6;
                     Main.player[Main.myPlayer].FindSpawn();
                     NetMessage.SendData(8, -1, -1, (NetworkText)null, Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0.0f, 0.0f, 0, 0, 0);
                 }
                 if (Netplay.Connection.State == 6 && num1 != Netplay.Connection.State)
                 {
                     Main.statusText = Language.GetTextValue("Net.RequestingTileData");
                 }
                 if (!Netplay.Connection.IsReading && !Netplay.disconnect && Netplay.Connection.Socket.IsDataAvailable())
                 {
                     Netplay.Connection.IsReading = true;
                     Netplay.Connection.Socket.AsyncReceive(Netplay.Connection.ReadBuffer, 0, Netplay.Connection.ReadBuffer.Length, new SocketReceiveCallback(Netplay.Connection.ClientReadCallBack), (object)null);
                 }
                 if (Netplay.Connection.StatusMax > 0 && Netplay.Connection.StatusText != "")
                 {
                     if (Netplay.Connection.StatusCount >= Netplay.Connection.StatusMax)
                     {
                         Main.statusText = Language.GetTextValue("Net.StatusComplete", (object)Netplay.Connection.StatusText);
                         Netplay.Connection.StatusText  = "";
                         Netplay.Connection.StatusMax   = 0;
                         Netplay.Connection.StatusCount = 0;
                     }
                     else
                     {
                         Main.statusText = Netplay.Connection.StatusText + ": " + (object)(int)((double)Netplay.Connection.StatusCount / (double)Netplay.Connection.StatusMax * 100.0) + "%";
                     }
                 }
                 Thread.Sleep(1);
             }
             else if (Netplay.Connection.IsActive)
             {
                 Main.statusText    = Language.GetTextValue("Net.LostConnection");
                 Netplay.disconnect = true;
             }
             num1 = Netplay.Connection.State;
         }
         try
         {
             Netplay.Connection.Socket.Close();
         }
         catch
         {
         }
         if (!Main.gameMenu)
         {
             Main.SwitchNetMode(0);
             Player.SavePlayer(Main.ActivePlayerFileData, false);
             Main.ActivePlayerFileData.StopPlayTimer();
             Main.gameMenu = true;
             Main.StopTrackedSounds();
             Main.menuMode = 14;
         }
         NetMessage.buffer[256].Reset();
         if (Main.menuMode == 15 && Main.statusText == Language.GetTextValue("Net.LostConnection"))
         {
             Main.menuMode = 14;
         }
         if (Netplay.Connection.StatusText != "" && Netplay.Connection.StatusText != null)
         {
             Main.statusText = Language.GetTextValue("Net.LostConnection");
         }
         Netplay.Connection.StatusCount = 0;
         Netplay.Connection.StatusMax   = 0;
         Netplay.Connection.StatusText  = "";
         Main.SwitchNetMode(0);
     }
     catch (Exception ex)
     {
         try
         {
             using (StreamWriter streamWriter = new StreamWriter("client-crashlog.txt", true))
             {
                 streamWriter.WriteLine((object)DateTime.Now);
                 streamWriter.WriteLine((object)ex);
                 streamWriter.WriteLine("");
             }
         }
         catch
         {
         }
         Netplay.disconnect = true;
     }
     if (Netplay.OnDisconnect == null)
     {
         return;
     }
     Netplay.OnDisconnect();
 }
コード例 #7
0
ファイル: Netplay.cs プロジェクト: carbonfyre/TerrariaAPI
 public static void ServerLoop(object threadContext)
 {
     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   = 8;
     serverIP        = IPAddress.Any;
     serverListenIP  = serverIP;
     Main.menuMode   = 14;
     Main.statusText = "Starting server...";
     Main.netMode    = 2;
     disconnect      = false;
     for (int i = 0; i < 9; i++)
     {
         serverSock[i] = new ServerSock();
         serverSock[i].Reset();
         serverSock[i].whoAmI            = i;
         serverSock[i].tcpClient         = new TcpClient();
         serverSock[i].tcpClient.NoDelay = true;
         serverSock[i].readBuffer        = new byte[0x400];
         serverSock[i].writeBuffer       = new byte[0x400];
     }
     tcpListener = new TcpListener(serverListenIP, serverPort);
     try
     {
         tcpListener.Start();
     }
     catch (Exception exception)
     {
         Main.menuMode   = 15;
         Main.statusText = exception.ToString();
         disconnect      = true;
     }
     if (!disconnect)
     {
         ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
         Main.statusText = "Server started";
     }
     while (!disconnect)
     {
         if (stopListen)
         {
             int num2 = -1;
             for (int m = 0; m < 8; m++)
             {
                 if (!serverSock[m].tcpClient.Connected)
                 {
                     num2 = m;
                     break;
                 }
             }
             if (num2 >= 0)
             {
                 tcpListener.Start();
                 stopListen = false;
                 ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
             }
         }
         int num4 = 0;
         for (int k = 0; k < 9; k++)
         {
             if (NetMessage.buffer[k].checkBytes)
             {
                 NetMessage.CheckBytes(k);
             }
             if (serverSock[k].kill)
             {
                 serverSock[k].Reset();
                 NetMessage.syncPlayers();
             }
             else if (serverSock[k].tcpClient.Connected)
             {
                 if (!serverSock[k].active)
                 {
                     serverSock[k].state = 0;
                 }
                 serverSock[k].active = true;
                 num4++;
                 if (!serverSock[k].locked)
                 {
                     try
                     {
                         serverSock[k].networkStream = serverSock[k].tcpClient.GetStream();
                         if (serverSock[k].networkStream.DataAvailable)
                         {
                             serverSock[k].locked = true;
                             serverSock[k].networkStream.BeginRead(serverSock[k].readBuffer, 0, serverSock[k].readBuffer.Length, new AsyncCallback(serverSock[k].ServerReadCallBack), serverSock[k].networkStream);
                         }
                     }
                     catch
                     {
                         serverSock[k].kill = true;
                     }
                 }
                 if ((serverSock[k].statusMax > 0) && (serverSock[k].statusText2 != ""))
                 {
                     if (serverSock[k].statusCount >= serverSock[k].statusMax)
                     {
                         serverSock[k].statusText  = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " ", serverSock[k].statusText2, ": Complete!" });
                         serverSock[k].statusText2 = "";
                         serverSock[k].statusMax   = 0;
                         serverSock[k].statusCount = 0;
                     }
                     else
                     {
                         serverSock[k].statusText = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " ", serverSock[k].statusText2, ": ", (int)((((float)serverSock[k].statusCount) / ((float)serverSock[k].statusMax)) * 100f), "%" });
                     }
                 }
                 else if (serverSock[k].state == 0)
                 {
                     serverSock[k].statusText = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " is connecting..." });
                 }
                 else if (serverSock[k].state == 1)
                 {
                     serverSock[k].statusText = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " is sending player data..." });
                 }
                 else if (serverSock[k].state == 2)
                 {
                     serverSock[k].statusText = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " requested world information" });
                 }
                 else if ((serverSock[k].state != 3) && (serverSock[k].state == 10))
                 {
                     serverSock[k].statusText = string.Concat(new object[] { "(", serverSock[k].tcpClient.Client.RemoteEndPoint, ") ", serverSock[k].name, " is playing" });
                 }
             }
             else if (serverSock[k].active)
             {
                 serverSock[k].kill = true;
             }
             else
             {
                 serverSock[k].statusText2 = "";
                 if (k < 8)
                 {
                     Main.player[k].active = false;
                 }
             }
             Thread.Sleep(1);
         }
         if (!WorldGen.saveLock)
         {
             if (num4 == 0)
             {
                 Main.statusText = "Waiting for clients...";
             }
             else
             {
                 Main.statusText = num4 + " clients connected";
             }
         }
     }
     tcpListener.Stop();
     for (int j = 0; j < 9; j++)
     {
         serverSock[j].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;
 }
コード例 #8
0
ファイル: Netplay.cs プロジェクト: carbonfyre/TerrariaAPI
 public static void ClientLoop(object threadContext)
 {
     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.player[Main.myPlayer].hostile = false;
     Main.clientPlayer            = (Player)Main.player[Main.myPlayer].clientClone();
     Main.menuMode                = 10;
     Main.menuMode                = 14;
     Main.statusText              = "Connecting to " + serverIP;
     Main.netMode                 = 1;
     disconnect                   = false;
     clientSock                   = new ClientSock();
     clientSock.tcpClient.NoDelay = true;
     clientSock.readBuffer        = new byte[0x400];
     clientSock.writeBuffer       = new byte[0x400];
     try
     {
         clientSock.tcpClient.Connect(serverIP, serverPort);
         clientSock.networkStream = clientSock.tcpClient.GetStream();
     }
     catch (Exception exception)
     {
         if (!disconnect && Main.gameMenu)
         {
             Main.menuMode   = 15;
             Main.statusText = exception.ToString();
             disconnect      = true;
         }
     }
     NetMessage.buffer[9].Reset();
     for (int i = -1; !disconnect; i = clientSock.state)
     {
         if (clientSock.tcpClient.Connected)
         {
             if (NetMessage.buffer[9].checkBytes)
             {
                 NetMessage.CheckBytes(9);
             }
             clientSock.active = true;
             if (clientSock.state == 0)
             {
                 Main.statusText  = "Found server";
                 clientSock.state = 1;
                 NetMessage.SendData(1, -1, -1, "", 0, 0f, 0f, 0f);
             }
             if ((clientSock.state == 2) && (i != clientSock.state))
             {
                 Main.statusText = "Sending player data...";
             }
             if ((clientSock.state == 3) && (i != clientSock.state))
             {
                 Main.statusText = "Requesting world information";
             }
             if (clientSock.state == 4)
             {
                 WorldGen.worldCleared = false;
                 clientSock.state      = 5;
                 WorldGen.clearWorld();
             }
             if ((clientSock.state == 5) && WorldGen.worldCleared)
             {
                 clientSock.state = 6;
                 Main.player[Main.myPlayer].FindSpawn();
                 NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0f, 0f);
             }
             if ((clientSock.state == 6) && (i != clientSock.state))
             {
                 Main.statusText = "Requesting tile data";
             }
             if ((!clientSock.locked && !disconnect) && clientSock.networkStream.DataAvailable)
             {
                 clientSock.locked = true;
                 clientSock.networkStream.BeginRead(clientSock.readBuffer, 0, clientSock.readBuffer.Length, new AsyncCallback(clientSock.ClientReadCallBack), clientSock.networkStream);
             }
             if ((clientSock.statusMax > 0) && (clientSock.statusText != ""))
             {
                 if (clientSock.statusCount >= clientSock.statusMax)
                 {
                     Main.statusText        = clientSock.statusText + ": Complete!";
                     clientSock.statusText  = "";
                     clientSock.statusMax   = 0;
                     clientSock.statusCount = 0;
                 }
                 else
                 {
                     Main.statusText = string.Concat(new object[] { clientSock.statusText, ": ", (int)((((float)clientSock.statusCount) / ((float)clientSock.statusMax)) * 100f), "%" });
                 }
             }
             Thread.Sleep(1);
         }
         else if (clientSock.active)
         {
             Main.statusText = "Lost connection";
             disconnect      = true;
         }
     }
     try
     {
         clientSock.networkStream.Close();
         clientSock.networkStream = clientSock.tcpClient.GetStream();
     }
     catch
     {
     }
     if (!Main.gameMenu)
     {
         Main.netMode = 0;
         Player.SavePlayer(Main.player[Main.myPlayer], Main.playerPathName);
         Main.gameMenu = true;
         Main.menuMode = 14;
     }
     NetMessage.buffer[9].Reset();
     if ((Main.menuMode == 15) && (Main.statusText == "Lost connection"))
     {
         Main.menuMode = 14;
     }
     if ((clientSock.statusText != "") && (clientSock.statusText != null))
     {
         Main.statusText = "Lost connection";
     }
     clientSock.statusCount = 0;
     clientSock.statusMax   = 0;
     clientSock.statusText  = "";
     Main.netMode           = 0;
 }
コード例 #9
0
        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;
            Main.menuMode      = 14;
            Main.statusText    = "Starting server...";
            Main.netMode       = 2;
            Netplay.disconnect = false;
            for (int i = 0; i < 256; i++)
            {
                Netplay.Clients[i] = new RemoteClient();
                Netplay.Clients[i].Reset();
                Netplay.Clients[i].Id         = i;
                Netplay.Clients[i].ReadBuffer = new byte[1024];
            }
            Netplay.TcpListener = 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";
            }
            int num = 0;

            while (!Netplay.disconnect)
            {
                if (!Netplay.IsListening)
                {
                    int num2 = -1;
                    for (int j = 0; j < Main.maxNetPlayers; j++)
                    {
                        if (!Netplay.Clients[j].Socket.IsConnected())
                        {
                            num2 = j;
                            break;
                        }
                    }
                    if (num2 >= 0)
                    {
                        if (Main.ignoreErrors)
                        {
                            try
                            {
                                Netplay.StartListening();
                                Netplay.IsListening = true;
                                goto IL_16A;
                            }
                            catch
                            {
                                goto IL_16A;
                            }
                        }
                        Netplay.StartListening();
                        Netplay.IsListening = true;
                    }
                }
IL_16A:
                int num3 = 0;
                for (int k = 0; k < 256; k++)
                {
                    if (NetMessage.buffer[k].checkBytes)
                    {
                        NetMessage.CheckBytes(k);
                    }
                    if (Netplay.Clients[k].PendingTermination)
                    {
                        ServerApi.Hooks.InvokeServerLeave(Netplay.Clients[k].Id);
                        Netplay.Clients[k].Reset();
                        NetMessage.syncPlayers(sendInventory: false, sendPlayerInfo: false);
                    }
                    else
                    {
                        if (Netplay.Clients[k].Socket.IsConnected())
                        {
                            if (!Netplay.Clients[k].IsActive)
                            {
                                Netplay.Clients[k].State = 0;
                            }
                            Netplay.Clients[k].IsActive = true;
                            num3++;
                            if (!Netplay.Clients[k].IsReading)
                            {
                                try
                                {
                                    if (Netplay.Clients[k].Socket.IsDataAvailable())
                                    {
                                        Netplay.Clients[k].IsReading = true;
                                        Netplay.Clients[k].Socket.AsyncReceive(Netplay.Clients[k].ReadBuffer, 0, Netplay.Clients[k].ReadBuffer.Length, new SocketReceiveCallback(Netplay.Clients[k].ServerReadCallBack), null);
                                    }
                                }
                                catch
                                {
                                    Netplay.Clients[k].PendingTermination = true;
                                }
                            }
                            if (Netplay.Clients[k].StatusMax > 0 && Netplay.Clients[k].StatusText2 != "")
                            {
                                if (Netplay.Clients[k].StatusCount >= Netplay.Clients[k].StatusMax)
                                {
                                    Netplay.Clients[k].StatusText = string.Concat(new object[]
                                    {
                                        "(",
                                        Netplay.Clients[k].Socket.GetRemoteAddress(),
                                        ") ",
                                        Netplay.Clients[k].Name,
                                        " ",
                                        Netplay.Clients[k].StatusText2,
                                        ": Complete!"
                                    });
                                    Netplay.Clients[k].StatusText2 = "";
                                    Netplay.Clients[k].StatusMax   = 0;
                                    Netplay.Clients[k].StatusCount = 0;
                                    continue;
                                }
                                Netplay.Clients[k].StatusText = string.Concat(new object[]
                                {
                                    "(",
                                    Netplay.Clients[k].Socket.GetRemoteAddress(),
                                    ") ",
                                    Netplay.Clients[k].Name,
                                    " ",
                                    Netplay.Clients[k].StatusText2,
                                    ": ",
                                    (int)((float)Netplay.Clients[k].StatusCount / (float)Netplay.Clients[k].StatusMax * 100f),
                                    "%"
                                });
                                continue;
                            }
                            else
                            {
                                if (Netplay.Clients[k].State == 0)
                                {
                                    Netplay.Clients[k].StatusText = string.Concat(new object[]
                                    {
                                        "(",
                                        Netplay.Clients[k].Socket.GetRemoteAddress(),
                                        ") ",
                                        Netplay.Clients[k].Name,
                                        " is connecting..."
                                    });
                                    continue;
                                }
                                if (Netplay.Clients[k].State == 1)
                                {
                                    Netplay.Clients[k].StatusText = string.Concat(new object[]
                                    {
                                        "(",
                                        Netplay.Clients[k].Socket.GetRemoteAddress(),
                                        ") ",
                                        Netplay.Clients[k].Name,
                                        " is sending player data..."
                                    });
                                    continue;
                                }
                                if (Netplay.Clients[k].State == 2)
                                {
                                    Netplay.Clients[k].StatusText = string.Concat(new object[]
                                    {
                                        "(",
                                        Netplay.Clients[k].Socket.GetRemoteAddress(),
                                        ") ",
                                        Netplay.Clients[k].Name,
                                        " requested world information"
                                    });
                                    continue;
                                }
                                if (Netplay.Clients[k].State == 3 || Netplay.Clients[k].State != 10)
                                {
                                    continue;
                                }
                                try
                                {
                                    Netplay.Clients[k].StatusText = string.Concat(new object[]
                                    {
                                        "(",
                                        Netplay.Clients[k].Socket.GetRemoteAddress(),
                                        ") ",
                                        Netplay.Clients[k].Name,
                                        " is playing"
                                    });
                                    continue;
                                }
                                catch
                                {
                                    Netplay.Clients[k].PendingTermination = true;
                                    continue;
                                }
                            }
                        }
                        if (Netplay.Clients[k].IsActive)
                        {
                            Netplay.Clients[k].PendingTermination = true;
                        }
                        else
                        {
                            Netplay.Clients[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.IsServerRunning = true;
            }
            Netplay.StopListening();
            for (int l = 0; l < 256; l++)
            {
                Netplay.Clients[l].Reset();
            }
            if (Main.menuMode != 15)
            {
                Main.netMode  = 0;
                Main.menuMode = 10;
                WorldFile.saveWorld();
                //blocks until world saves?
                while (WorldGen.saveLock)
                {
                }
                Main.menuMode = 0;
            }
            else
            {
                Main.netMode = 0;
            }
            Main.myPlayer = 0;
        }
コード例 #10
0
ファイル: Netplay.cs プロジェクト: menfeng/terraria
        public static void ClientLoop(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.player[Main.myPlayer].hostile = false;
            Main.clientPlayer = (Player)Main.player[Main.myPlayer].clientClone();
            for (int i = 0; i < 255; i++)
            {
                if (i != Main.myPlayer)
                {
                    Main.player[i] = new Player();
                }
            }
            Main.menuMode = 10;
            Main.menuMode = 14;
            if (!Main.autoPass)
            {
                Main.statusText = "正在连接到 " + Netplay.serverIP;
            }
            Main.netMode       = 1;
            Netplay.disconnect = false;
            Netplay.clientSock = new ClientSock();
            Netplay.clientSock.tcpClient.NoDelay = true;
            Netplay.clientSock.readBuffer        = new byte[1024];
            Netplay.clientSock.writeBuffer       = new byte[1024];
            bool flag = true;

            while (flag)
            {
                flag = false;
                try
                {
                    Netplay.clientSock.tcpClient.Connect(Netplay.serverIP, Netplay.serverPort);
                    Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
                    flag = false;
                }
                catch
                {
                    if (!Netplay.disconnect && Main.gameMenu)
                    {
                        flag = true;
                    }
                }
            }
            NetMessage.buffer[256].Reset();
            int num = -1;

            while (!Netplay.disconnect)
            {
                if (Netplay.clientSock.tcpClient.Connected)
                {
                    if (NetMessage.buffer[256].checkBytes)
                    {
                        NetMessage.CheckBytes(256);
                    }
                    Netplay.clientSock.active = true;
                    if (Netplay.clientSock.state == 0)
                    {
                        Main.statusText          = "连接到服务器";
                        Netplay.clientSock.state = 1;
                        NetMessage.SendData(1, -1, -1, "", 0, 0f, 0f, 0f, 0);
                    }
                    if (Netplay.clientSock.state == 2 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "发送角色数据...";
                    }
                    if (Netplay.clientSock.state == 3 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "向服务器请求世界信息";
                    }
                    if (Netplay.clientSock.state == 4)
                    {
                        WorldGen.worldCleared    = false;
                        Netplay.clientSock.state = 5;
                        WorldGen.clearWorld();
                    }
                    if (Netplay.clientSock.state == 5 && WorldGen.worldCleared)
                    {
                        Netplay.clientSock.state = 6;
                        Main.player[Main.myPlayer].FindSpawn();
                        NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0f, 0f, 0);
                    }
                    if (Netplay.clientSock.state == 6 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "向服务器请求物块数据";
                    }
                    if (!Netplay.clientSock.locked && !Netplay.disconnect && Netplay.clientSock.networkStream.DataAvailable)
                    {
                        Netplay.clientSock.locked = true;
                        Netplay.clientSock.networkStream.BeginRead(Netplay.clientSock.readBuffer, 0, Netplay.clientSock.readBuffer.Length, new AsyncCallback(Netplay.clientSock.ClientReadCallBack), Netplay.clientSock.networkStream);
                    }
                    if (Netplay.clientSock.statusMax > 0 && Netplay.clientSock.statusText != "")
                    {
                        if (Netplay.clientSock.statusCount >= Netplay.clientSock.statusMax)
                        {
                            Main.statusText = Netplay.clientSock.statusText + ": 完成!";
                            Netplay.clientSock.statusText  = "";
                            Netplay.clientSock.statusMax   = 0;
                            Netplay.clientSock.statusCount = 0;
                        }
                        else
                        {
                            Main.statusText = string.Concat(new object[]
                            {
                                Netplay.clientSock.statusText,
                                ": ",
                                (int)((float)Netplay.clientSock.statusCount / (float)Netplay.clientSock.statusMax * 100f),
                                "%"
                            });
                        }
                    }
                    Thread.Sleep(1);
                }
                else if (Netplay.clientSock.active)
                {
                    Main.statusText    = "失去连接";
                    Netplay.disconnect = true;
                }
                num = Netplay.clientSock.state;
            }
            try
            {
                Netplay.clientSock.networkStream.Close();
                Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
            }
            catch
            {
            }
            if (!Main.gameMenu)
            {
                Main.netMode = 0;
                Player.SavePlayer(Main.player[Main.myPlayer], Main.playerPathName);
                Main.gameMenu = true;
                Main.menuMode = 14;
            }
            NetMessage.buffer[256].Reset();
            if (Main.menuMode == 15 && Main.statusText == "失去连接")
            {
                Main.menuMode = 14;
            }
            if (Netplay.clientSock.statusText != "" && Netplay.clientSock.statusText != null)
            {
                Main.statusText = "失去连接";
            }
            Netplay.clientSock.statusCount = 0;
            Netplay.clientSock.statusMax   = 0;
            Netplay.clientSock.statusText  = "";
            Main.netMode = 0;
        }
コード例 #11
0
        public static void ServerLoop(object threadContext)
        {
            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   = 16;
            ServerIP        = IPAddress.Any;
            Main.menuMode   = 14;
            Main.statusText = Lang.menu[8].Value;
            Main.netMode    = 2;
            disconnect      = false;
            for (int i = 0; i < 17; i++)
            {
                Clients[i] = new RemoteClient();
                Clients[i].Reset();
                Clients[i].Id         = i;
                Clients[i].ReadBuffer = new byte[1024];
            }
            TcpListener = new TcpSocket();
            if (!disconnect)
            {
                if (!StartListening())
                {
                    Main.menuMode   = 15;
                    Main.statusText = Language.GetTextValue("Net.TriedToRunServerTwice");
                    disconnect      = true;
                }
                Main.statusText = Language.GetTextValue("CLI.ServerStarted");
            }
            if (UseUPNP)
            {
                try
                {
                    OpenPort();
                }
                catch
                {
                }
            }
            StartBroadCasting();
            int num = 0;

            while (!disconnect)
            {
                if (!IsListening)
                {
                    int num2 = -1;
                    for (int j = 0; j < Main.maxNetPlayers; j++)
                    {
                        if (!Clients[j].IsConnected())
                        {
                            num2 = j;
                            break;
                        }
                    }
                    if (num2 >= 0)
                    {
                        if (Main.ignoreErrors)
                        {
                            try
                            {
                                StartListening();
                                IsListening = true;
                            }
                            catch
                            {
                            }
                        }
                        else
                        {
                            StartListening();
                            IsListening = true;
                        }
                    }
                }
                int num3 = 0;
                for (int k = 0; k < 17; k++)
                {
                    if (NetMessage.buffer[k].checkBytes)
                    {
                        NetMessage.CheckBytes(k);
                    }
                    if (Clients[k].PendingTermination)
                    {
                        Clients[k].Reset();
                        NetMessage.syncPlayers();
                    }
                    else if (Clients[k].IsConnected())
                    {
                        if (!Clients[k].IsActive)
                        {
                            Clients[k].State = 0;
                        }
                        Clients[k].IsActive = true;
                        num3++;
                        if (!Clients[k].IsReading)
                        {
                            try
                            {
                                if (Clients[k].Socket.IsDataAvailable())
                                {
                                    Clients[k].IsReading = true;
                                    Clients[k].Socket.AsyncReceive(Clients[k].ReadBuffer, 0, Clients[k].ReadBuffer.Length, Clients[k].ServerReadCallBack);
                                }
                            }
                            catch
                            {
                                Clients[k].PendingTermination = true;
                            }
                        }
                        if (Clients[k].StatusMax > 0 && Clients[k].StatusText2 != "")
                        {
                            if (Clients[k].StatusCount >= Clients[k].StatusMax)
                            {
                                Clients[k].StatusText  = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " ", Clients[k].StatusText2, ": Complete!");
                                Clients[k].StatusText2 = "";
                                Clients[k].StatusMax   = 0;
                                Clients[k].StatusCount = 0;
                            }
                            else
                            {
                                Clients[k].StatusText = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " ", Clients[k].StatusText2, ": ", (int)((float)Clients[k].StatusCount / (float)Clients[k].StatusMax * 100f), "%");
                            }
                        }
                        else if (Clients[k].State == 0)
                        {
                            Clients[k].StatusText = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " is connecting...");
                        }
                        else if (Clients[k].State == 1)
                        {
                            Clients[k].StatusText = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " is sending player data...");
                        }
                        else if (Clients[k].State == 2)
                        {
                            Clients[k].StatusText = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " requested world information");
                        }
                        else if (Clients[k].State != 3 && Clients[k].State == 10)
                        {
                            try
                            {
                                Clients[k].StatusText = string.Concat("(", Clients[k].Socket.GetRemoteAddress(), ") ", Clients[k].Name, " is playing");
                            }
                            catch (Exception)
                            {
                                Clients[k].PendingTermination = true;
                            }
                        }
                    }
                    else if (Clients[k].IsActive)
                    {
                        Clients[k].PendingTermination = true;
                    }
                    else
                    {
                        Clients[k].StatusText2 = "";
                        if (k < 16)
                        {
                            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)
                {
                    anyClients = false;
                }
                else
                {
                    anyClients = true;
                }
                IsServerRunning = true;
            }
            StopBroadCasting();
            StopListening();
            try
            {
                closePort();
            }
            catch
            {
            }
            for (int l = 0; l < 17; l++)
            {
                Clients[l].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;
        }
コード例 #12
0
 private static void InnerClientLoop()
 {
     try
     {
         NetMessage.buffer[17].Reset();
         int num = -1;
         while (!disconnect)
         {
             if (Connection.Socket.IsConnected())
             {
                 if (NetMessage.buffer[17].checkBytes)
                 {
                     NetMessage.CheckBytes();
                 }
                 Connection.IsActive = true;
                 if (Connection.State == 0)
                 {
                     Main.statusText  = Language.GetTextValue("Net.FoundServer");
                     Connection.State = 1;
                     NetMessage.SendData(1);
                 }
                 if (Connection.State == 2 && num != Connection.State)
                 {
                     num             = Connection.State;
                     Main.statusText = Language.GetTextValue("Net.SendingPlayerData");
                 }
                 if (Connection.State == 3 && num != Connection.State)
                 {
                     num             = Connection.State;
                     Main.statusText = Language.GetTextValue("Net.RequestingWorldInformation");
                 }
                 if (Connection.State == 4)
                 {
                     WorldGen.worldCleared = false;
                     Connection.State      = 5;
                     if (Main.cloudBGActive >= 1f)
                     {
                         Main.cloudBGAlpha = 1f;
                     }
                     else
                     {
                         Main.cloudBGAlpha = 0f;
                     }
                     Main.windSpeed = Main.windSpeedSet;
                     Cloud.resetClouds();
                     Main.cloudAlpha = Main.maxRaining;
                     WorldGen.clearWorld();
                     if (Main.mapEnabled)
                     {
                         Main.Map.Load();
                     }
                 }
                 if (Connection.State == 5 && Main.loadMapLock)
                 {
                     float num2 = (float)Main.loadMapLastX / (float)Main.maxTilesX;
                     Main.statusText = string.Concat(Lang.gen[68], " ", (int)(num2 * 100f + 1f), "%");
                 }
                 else if (Connection.State == 5 && WorldGen.worldCleared)
                 {
                     Connection.State = 6;
                     Main.player[Main.myPlayer].FindSpawn();
                     NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, Main.player[Main.myPlayer].SpawnY);
                 }
                 if (Connection.State == 6 && num != Connection.State)
                 {
                     Main.statusText = Language.GetTextValue("Net.RequestingTileData");
                 }
                 if (!Connection.IsReading && !disconnect && Connection.Socket.IsDataAvailable())
                 {
                     Connection.IsReading = true;
                     Connection.Socket.AsyncReceive(Connection.ReadBuffer, 0, Connection.ReadBuffer.Length, Connection.ClientReadCallBack);
                 }
                 if (Connection.StatusMax > 0 && Connection.StatusText != "")
                 {
                     if (Connection.StatusCount >= Connection.StatusMax)
                     {
                         Main.statusText        = Language.GetTextValue("Net.StatusComplete", Connection.StatusText);
                         Connection.StatusText  = "";
                         Connection.StatusMax   = 0;
                         Connection.StatusCount = 0;
                     }
                     else
                     {
                         Main.statusText = Connection.StatusText + ": " + (int)((float)Connection.StatusCount / (float)Connection.StatusMax * 100f) + "%";
                     }
                 }
                 Thread.Sleep(1);
             }
             else if (Connection.IsActive)
             {
                 Main.statusText = Language.GetTextValue("Net.LostConnection");
                 disconnect      = true;
             }
             num = Connection.State;
         }
         try
         {
             Connection.Socket.Close();
         }
         catch
         {
         }
         if (!Main.gameMenu)
         {
             Main.SwitchNetMode(0);
             Player.SavePlayer(Main.ActivePlayerFileData);
             Main.ActivePlayerFileData.StopPlayTimer();
             Main.gameMenu = true;
             Main.menuMode = 14;
         }
         NetMessage.buffer[17].Reset();
         if (Main.menuMode == 15 && Main.statusText == Language.GetTextValue("Net.LostConnection"))
         {
             Main.menuMode = 14;
         }
         if (Connection.StatusText != "" && Connection.StatusText != null)
         {
             Main.statusText = Language.GetTextValue("Net.LostConnection");
         }
         Connection.StatusCount = 0;
         Connection.StatusMax   = 0;
         Connection.StatusText  = "";
         Main.SwitchNetMode(0);
     }
     catch (Exception value)
     {
         try
         {
             using (StreamWriter streamWriter = new StreamWriter("client-crashlog.txt", true))
             {
                 streamWriter.WriteLine(DateTime.Now);
                 streamWriter.WriteLine(value);
                 streamWriter.WriteLine("");
             }
         }
         catch
         {
         }
         disconnect = true;
     }
     if (Netplay.OnDisconnect != null)
     {
         Netplay.OnDisconnect();
     }
 }
コード例 #13
0
        private static void InnerClientLoop()
        {
            NetMessage.buffer[256].Reset();
            int num = -1;

            while (!Netplay.disconnect)
            {
                if (Netplay.Connection.Socket.IsConnected())
                {
                    if (NetMessage.buffer[256].checkBytes)
                    {
                        NetMessage.CheckBytes(256);
                    }
                    Netplay.Connection.IsActive = true;
                    if (Netplay.Connection.State == 0)
                    {
                        Main.statusText          = "Found server";
                        Netplay.Connection.State = 1;
                        NetMessage.SendData(1, -1, -1, "", 0, 0f, 0f, 0f, 0, 0, 0);
                    }
                    if (Netplay.Connection.State == 2 && num != Netplay.Connection.State)
                    {
                        Main.statusText = "Sending player data...";
                    }
                    if (Netplay.Connection.State == 3 && num != Netplay.Connection.State)
                    {
                        Main.statusText = "Requesting world information";
                    }
                    if (Netplay.Connection.State == 4)
                    {
                        WorldGen.worldCleared    = false;
                        Netplay.Connection.State = 5;
                        if (Main.cloudBGActive >= 1f)
                        {
                            Main.cloudBGAlpha = 1f;
                        }
                        else
                        {
                            Main.cloudBGAlpha = 0f;
                        }
                        Main.windSpeed = Main.windSpeedSet;
                        Cloud.resetClouds();
                        Main.cloudAlpha = Main.maxRaining;
                        WorldGen.clearWorld();
                        if (Main.mapEnabled)
                        {
                            Main.Map.Load();
                        }
                    }
                    if (Netplay.Connection.State == 5 && Main.loadMapLock)
                    {
                        float num2 = (float)Main.loadMapLastX / (float)Main.maxTilesX;
                        Main.statusText = string.Concat(new object[]
                        {
                            Lang.gen[68],
                            " ",
                            (int)(num2 * 100f + 1f),
                            "%"
                        });
                    }
                    else if (Netplay.Connection.State == 5 && WorldGen.worldCleared)
                    {
                        Netplay.Connection.State = 6;
                        Main.player[Main.myPlayer].FindSpawn();
                        NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0f, 0f, 0, 0, 0);
                    }
                    if (Netplay.Connection.State == 6 && num != Netplay.Connection.State)
                    {
                        Main.statusText = "Requesting tile data";
                    }
                    if (!Netplay.Connection.IsReading && !Netplay.disconnect && Netplay.Connection.Socket.IsDataAvailable())
                    {
                        Netplay.Connection.IsReading = true;
                        Netplay.Connection.Socket.AsyncReceive(Netplay.Connection.ReadBuffer, 0, Netplay.Connection.ReadBuffer.Length, new SocketReceiveCallback(Netplay.Connection.ClientReadCallBack), null);
                    }
                    if (Netplay.Connection.StatusMax > 0 && Netplay.Connection.StatusText != "")
                    {
                        if (Netplay.Connection.StatusCount >= Netplay.Connection.StatusMax)
                        {
                            Main.statusText = Netplay.Connection.StatusText + ": Complete!";
                            Netplay.Connection.StatusText  = "";
                            Netplay.Connection.StatusMax   = 0;
                            Netplay.Connection.StatusCount = 0;
                        }
                        else
                        {
                            Main.statusText = string.Concat(new object[]
                            {
                                Netplay.Connection.StatusText,
                                ": ",
                                (int)((float)Netplay.Connection.StatusCount / (float)Netplay.Connection.StatusMax * 100f),
                                "%"
                            });
                        }
                    }
                    Thread.Sleep(1);
                }
                else if (Netplay.Connection.IsActive)
                {
                    Main.statusText    = "Lost connection";
                    Netplay.disconnect = true;
                }
                num = Netplay.Connection.State;
            }
            try
            {
                Netplay.Connection.Socket.Close();
            }
            catch (Exception ex)
            {
#if DEBUG
                Console.WriteLine(ex);
                System.Diagnostics.Debugger.Break();

                System.Diagnostics.Debugger.Break();
#endif
            }
            if (!Main.gameMenu)
            {
                Main.SwitchNetMode(0);
                Player.SavePlayer(Main.ActivePlayerFileData, false);
                Main.ActivePlayerFileData.StopPlayTimer();
                Main.gameMenu = true;
                Main.menuMode = 14;
            }
            NetMessage.buffer[256].Reset();
            if (Main.menuMode == 15 && Main.statusText == "Lost connection")
            {
                Main.menuMode = 14;
            }
            if (Netplay.Connection.StatusText != "" && Netplay.Connection.StatusText != null)
            {
                Main.statusText = "Lost connection";
            }
            Netplay.Connection.StatusCount = 0;
            Netplay.Connection.StatusMax   = 0;
            Netplay.Connection.StatusText  = "";
            Main.SwitchNetMode(0);
            if (Netplay.OnDisconnect != null)
            {
                Netplay.OnDisconnect();
            }
        }
コード例 #14
0
ファイル: Netplay.cs プロジェクト: saniainf/EDTerraria
        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;
        }
コード例 #15
0
        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";
            }
            int num = 0;

            while (!Netplay.disconnect)
            {
                if (Netplay.stopListen)
                {
                    int num2 = -1;
                    for (int j = 0; j < Main.maxNetPlayers; j++)
                    {
                        if (serverSock[j].tcpClient == null || !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_208;
                            }
                            catch
                            {
                                goto IL_208;
                            }
                        }
                        Netplay.tcpListener.Start();
                        Netplay.stopListen = false;
                        ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), 1);
                    }
                }
IL_208:
                int num3 = 0;
                for (int k = 0; k < 256; k++)
                {
                    if (NetMessage.buffer[k].checkBytes)
                    {
                        NetMessage.CheckBytes(k);
                    }
                    if (killInactive && serverSock[k].active && serverSock[k].state == 0 && (DateTime.UtcNow - serverSock[k].connectTime).TotalSeconds > 5)
                    {
                        Netplay.serverSock[k].kill = true;
                    }

                    if (Netplay.serverSock[k].kill)
                    {
                        ServerHooks.OnLeave(Netplay.serverSock[k].whoAmI);
                        Netplay.serverSock[k].Reset();
                        NetMessage.syncPlayers();
                    }
                    else if (serverSock[k].tcpClient != null && 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].statusText2 = "";
                                Netplay.serverSock[k].statusMax   = 0;
                                Netplay.serverSock[k].statusCount = 0;
                            }
                            else
                            {
                            }
                        }
                        else
                        {
                        }
                    }
                    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 (num3 == 0)
                {
                    Netplay.anyClients = false;
                }
                else
                {
                    Netplay.anyClients = true;
                }
                Netplay.ServerUp = true;
            }
            Netplay.tcpListener.Stop();
            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;
        }
コード例 #16
0
        public static void ClientLoop(object threadContext)
        {
            Netplay.ResetNetDiag();
            Main.ServerSideCharacter = false;
            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.player[Main.myPlayer].hostile = false;
            Main.clientPlayer = (Player)Main.player[Main.myPlayer].clientClone();
            for (int i = 0; i < 255; i++)
            {
                if (i != Main.myPlayer)
                {
                    Main.player[i] = new Player();
                }
            }
            Main.menuMode = 10;
            Main.menuMode = 14;
            if (!Main.autoPass)
            {
                Main.statusText = "Connecting to " + Netplay.serverIP;
            }
            Main.netMode       = 1;
            Netplay.disconnect = false;
            Netplay.clientSock = new ClientSock();
            Netplay.clientSock.tcpClient.NoDelay = true;
            Netplay.clientSock.readBuffer        = new byte[1024];
            Netplay.clientSock.writeBuffer       = new byte[1024];
            bool flag = true;

            while (flag)
            {
                flag = false;
                try
                {
                    Netplay.clientSock.tcpClient.Connect(Netplay.serverIP, Netplay.serverPort);
                    Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
                    flag = false;
                }
                catch
                {
                    if (!Netplay.disconnect && Main.gameMenu)
                    {
                        flag = true;
                    }
                }
            }
            NetMessage.buffer[256].Reset();
            int num = -1;

            while (!Netplay.disconnect)
            {
                if (Netplay.clientSock.tcpClient.Connected)
                {
                    if (NetMessage.buffer[256].checkBytes)
                    {
                        NetMessage.CheckBytes(256);
                    }
                    Netplay.clientSock.active = true;
                    if (Netplay.clientSock.state == 0)
                    {
                        Main.statusText          = "Found server";
                        Netplay.clientSock.state = 1;
                        NetMessage.SendData(1, -1, -1, "", 0, 0f, 0f, 0f, 0);
                    }
                    if (Netplay.clientSock.state == 2 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "Sending player data...";
                    }
                    if (Netplay.clientSock.state == 3 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "Requesting world information";
                    }
                    if (Netplay.clientSock.state == 4)
                    {
                        WorldGen.worldCleared    = false;
                        Netplay.clientSock.state = 5;
                        if (Main.cloudBGActive >= 1f)
                        {
                            Main.cloudBGAlpha = 1f;
                        }
                        else
                        {
                            Main.cloudBGAlpha = 0f;
                        }
                        Main.windSpeed = Main.windSpeedSet;
                        Cloud.resetClouds();
                        Main.cloudAlpha = Main.maxRaining;
                        WorldGen.clearWorld();
                        if (Main.mapEnabled)
                        {
                            Map.loadMap();
                        }
                    }
                    if (Netplay.clientSock.state == 5 && Main.loadMapLock)
                    {
                        float num2 = (float)Main.loadMapLastX / (float)Main.maxTilesX;
                        Main.statusText = string.Concat(new object[]
                        {
                            Lang.gen[68],
                            " ",
                            (int)(num2 * 100f + 1f),
                            "%"
                        });
                    }
                    else
                    {
                        if (Netplay.clientSock.state == 5 && WorldGen.worldCleared)
                        {
                            Netplay.clientSock.state = 6;
                            Main.player[Main.myPlayer].FindSpawn();
                            NetMessage.SendData(8, -1, -1, "", Main.player[Main.myPlayer].SpawnX, (float)Main.player[Main.myPlayer].SpawnY, 0f, 0f, 0);
                        }
                    }
                    if (Netplay.clientSock.state == 6 && num != Netplay.clientSock.state)
                    {
                        Main.statusText = "Requesting tile data";
                    }
                    if (!Netplay.clientSock.locked && !Netplay.disconnect && Netplay.clientSock.networkStream.DataAvailable)
                    {
                        Netplay.clientSock.locked = true;
                        Netplay.clientSock.networkStream.BeginRead(Netplay.clientSock.readBuffer, 0, Netplay.clientSock.readBuffer.Length, new AsyncCallback(Netplay.clientSock.ClientReadCallBack), Netplay.clientSock.networkStream);
                    }
                    if (Netplay.clientSock.statusMax > 0 && Netplay.clientSock.statusText != "")
                    {
                        if (Netplay.clientSock.statusCount >= Netplay.clientSock.statusMax)
                        {
                            Main.statusText = Netplay.clientSock.statusText + ": Complete!";
                            Netplay.clientSock.statusText  = "";
                            Netplay.clientSock.statusMax   = 0;
                            Netplay.clientSock.statusCount = 0;
                        }
                        else
                        {
                            Main.statusText = string.Concat(new object[]
                            {
                                Netplay.clientSock.statusText,
                                ": ",
                                (int)((float)Netplay.clientSock.statusCount / (float)Netplay.clientSock.statusMax * 100f),
                                "%"
                            });
                        }
                    }
                    Thread.Sleep(1);
                }
                else
                {
                    if (Netplay.clientSock.active)
                    {
                        Main.statusText    = "Lost connection";
                        Netplay.disconnect = true;
                    }
                }
                num = Netplay.clientSock.state;
            }
            try
            {
                Netplay.clientSock.networkStream.Close();
                Netplay.clientSock.networkStream = Netplay.clientSock.tcpClient.GetStream();
            }
            catch
            {
            }
            if (!Main.gameMenu)
            {
                Main.netMode = 0;
                Player.SavePlayer(Main.player[Main.myPlayer], Main.playerPathName);
                Main.gameMenu = true;
                Main.menuMode = 14;
            }
            NetMessage.buffer[256].Reset();
            if (Main.menuMode == 15 && Main.statusText == "Lost connection")
            {
                Main.menuMode = 14;
            }
            if (Netplay.clientSock.statusText != "" && Netplay.clientSock.statusText != null)
            {
                Main.statusText = "Lost connection";
            }
            Netplay.clientSock.statusCount = 0;
            Netplay.clientSock.statusMax   = 0;
            Netplay.clientSock.statusText  = "";
            Main.netMode = 0;
        }
コード例 #17
0
        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;
        }
コード例 #18
0
ファイル: Netplay.cs プロジェクト: windlex/mylualib
        // Token: 0x0600015D RID: 349 RVA: 0x0002AB20 File Offset: 0x00028D20
        public static void ServerLoop(object threadContext)
        {
            Netplay.ResetNetDiag();
            if (Main.rand == null)
            {
                Main.rand = new UnifiedRandom((int)DateTime.Now.Ticks);
            }
            Main.myPlayer      = 255;
            Netplay.ServerIP   = IPAddress.Any;
            Main.menuMode      = 14;
            Main.statusText    = Lang.menu[8].Value;
            Main.netMode       = 2;
            Netplay.disconnect = false;
            for (int i = 0; i < 256; i++)
            {
                Netplay.Clients[i] = new RemoteClient();
                Netplay.Clients[i].Reset();
                Netplay.Clients[i].Id         = i;
                Netplay.Clients[i].ReadBuffer = new byte[1024];
            }
            Netplay.TcpListener = 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 num = 0;

            while (!Netplay.disconnect)
            {
                if (!Netplay.IsListening)
                {
                    int num2 = -1;
                    for (int j = 0; j < Main.maxNetPlayers; j++)
                    {
                        if (!Netplay.Clients[j].IsConnected())
                        {
                            num2 = j;
                            break;
                        }
                    }
                    if (num2 >= 0)
                    {
                        if (Main.ignoreErrors)
                        {
                            try
                            {
                                Netplay.StartListening();
                                Netplay.IsListening = true;
                                goto IL_15E;
                            }
                            catch
                            {
                                goto IL_15E;
                            }
                        }
                        Netplay.StartListening();
                        Netplay.IsListening = true;
                    }
                }
IL_15E:
                int num3 = 0;
                for (int k = 0; k < 256; k++)
                {
                    if (NetMessage.buffer[k].checkBytes)
                    {
                        NetMessage.CheckBytes(k);
                    }
                    if (Netplay.Clients[k].PendingTermination)
                    {
                        Netplay.Clients[k].Reset();
                        NetMessage.SyncDisconnectedPlayer(k);
                    }
                    else
                    {
                        if (Netplay.Clients[k].IsConnected())
                        {
                            if (!Netplay.Clients[k].IsActive)
                            {
                                Netplay.Clients[k].State = 0;
                            }
                            Netplay.Clients[k].IsActive = true;
                            num3++;
                            if (!Netplay.Clients[k].IsReading)
                            {
                                try
                                {
                                    if (Netplay.Clients[k].Socket.IsDataAvailable())
                                    {
                                        Netplay.Clients[k].IsReading = true;
                                        Netplay.Clients[k].Socket.AsyncReceive(Netplay.Clients[k].ReadBuffer, 0, Netplay.Clients[k].ReadBuffer.Length, new SocketReceiveCallback(Netplay.Clients[k].ServerReadCallBack), null);
                                    }
                                }
                                catch
                                {
                                    Netplay.Clients[k].PendingTermination = true;
                                }
                            }
                            if (Netplay.Clients[k].StatusMax > 0 && Netplay.Clients[k].StatusText2 != "")
                            {
                                if (Netplay.Clients[k].StatusCount >= Netplay.Clients[k].StatusMax)
                                {
                                    Netplay.Clients[k].StatusText  = Language.GetTextValue("Net.ClientStatusComplete", Netplay.Clients[k].Socket.GetRemoteAddress(), Netplay.Clients[k].Name, Netplay.Clients[k].StatusText2);
                                    Netplay.Clients[k].StatusText2 = "";
                                    Netplay.Clients[k].StatusMax   = 0;
                                    Netplay.Clients[k].StatusCount = 0;
                                    goto IL_58E;
                                }
                                Netplay.Clients[k].StatusText = string.Concat(new object[]
                                {
                                    "(",
                                    Netplay.Clients[k].Socket.GetRemoteAddress(),
                                    ") ",
                                    Netplay.Clients[k].Name,
                                    " ",
                                    Netplay.Clients[k].StatusText2,
                                    ": ",
                                    (int)((float)Netplay.Clients[k].StatusCount / (float)Netplay.Clients[k].StatusMax * 100f),
                                    "%"
                                });
                                goto IL_58E;
                            }
                            else
                            {
                                if (Netplay.Clients[k].State == 0)
                                {
                                    Netplay.Clients[k].StatusText = Language.GetTextValue("Net.ClientConnecting", string.Format("({0}) {1}", Netplay.Clients[k].Socket.GetRemoteAddress(), Netplay.Clients[k].Name));
                                    goto IL_58E;
                                }
                                if (Netplay.Clients[k].State == 1)
                                {
                                    Netplay.Clients[k].StatusText = Language.GetTextValue("Net.ClientSendingData", Netplay.Clients[k].Socket.GetRemoteAddress(), Netplay.Clients[k].Name);
                                    goto IL_58E;
                                }
                                if (Netplay.Clients[k].State == 2)
                                {
                                    Netplay.Clients[k].StatusText = Language.GetTextValue("Net.ClientRequestedWorldInfo", Netplay.Clients[k].Socket.GetRemoteAddress(), Netplay.Clients[k].Name);
                                    goto IL_58E;
                                }
                                if (Netplay.Clients[k].State == 3 || Netplay.Clients[k].State != 10)
                                {
                                    goto IL_58E;
                                }
                                try
                                {
                                    Netplay.Clients[k].StatusText = Language.GetTextValue("Net.ClientPlaying", Netplay.Clients[k].Socket.GetRemoteAddress(), Netplay.Clients[k].Name);
                                    goto IL_58E;
                                }
                                catch (Exception)
                                {
                                    Netplay.Clients[k].PendingTermination = true;
                                    goto IL_58E;
                                }
                            }
                        }
                        if (Netplay.Clients[k].IsActive)
                        {
                            Netplay.Clients[k].PendingTermination = true;
                        }
                        else
                        {
                            Netplay.Clients[k].StatusText2 = "";
                            if (k < 255)
                            {
                                bool arg_585_0 = Main.player[k].active;
                                Main.player[k].active = false;
                                if (arg_585_0)
                                {
                                    Player.Hooks.PlayerDisconnect(k);
                                }
                            }
                        }
                    }
                    IL_58E :;
                }
                num++;
                if (num > 10)
                {
                    Thread.Sleep(1);
                    num = 0;
                }
                else
                {
                    Thread.Sleep(0);
                }
                if (!WorldGen.saveLock && !Main.dedServ)
                {
                    if (num3 == 0)
                    {
                        Main.statusText = Language.GetTextValue("Net.WaitingForClients");
                    }
                    else
                    {
                        Main.statusText = Language.GetTextValue("Net.ClientsConnected", num3);
                    }
                }
                if (num3 == 0)
                {
                    Netplay.anyClients = false;
                }
                else
                {
                    Netplay.anyClients = true;
                }
                Netplay.IsServerRunning = true;
            }
            Netplay.StopListening();
            try
            {
                Netplay.closePort();
            }
            catch
            {
            }
            for (int l = 0; l < 256; l++)
            {
                Netplay.Clients[l].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;
        }