1.0.4.0 Source

This commit is contained in:
MikeyIsBaeYT 2021-10-26 14:55:42 -04:00
commit ff3d24ee9d
35 changed files with 101417 additions and 0 deletions

526
Netplay.cs Normal file
View file

@ -0,0 +1,526 @@
// Decompiled with JetBrains decompiler
// Type: Terraria.Netplay
// Assembly: Terraria, Version=1.0.4.0, Culture=neutral, PublicKeyToken=null
// MVID: FF258283-FE37-4E8A-A035-CB1E6DC74C3C
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Terraria
{
public class Netplay
{
public const int bufferSize = 1024;
public const int maxConnections = 256;
public static bool stopListen = false;
public static ServerSock[] serverSock = new ServerSock[256];
public static ClientSock clientSock = new ClientSock();
public static TcpListener tcpListener;
public static IPAddress serverListenIP;
public static IPAddress serverIP;
public static int serverPort = 7777;
public static bool disconnect = false;
public static string password = "";
public static string banFile = "banlist.txt";
public static bool spamCheck = false;
public static bool anyClients = false;
public static bool ServerUp = false;
public static void ResetNetDiag()
{
Main.rxMsg = 0;
Main.rxData = 0;
Main.txMsg = 0;
Main.txData = 0;
for (int index = 0; index < Main.maxMsg; ++index)
{
Main.rxMsgType[index] = 0;
Main.rxDataType[index] = 0;
Main.txMsgType[index] = 0;
Main.txDataType[index] = 0;
}
}
public static void ResetSections()
{
for (int index1 = 0; index1 < 256; ++index1)
{
for (int index2 = 0; index2 < Main.maxSectionsX; ++index2)
{
for (int index3 = 0; index3 < Main.maxSectionsY; ++index3)
Netplay.serverSock[index1].tileSection[index2, index3] = false;
}
}
}
public static void AddBan(int plr)
{
string str1 = Netplay.serverSock[plr].tcpClient.Client.RemoteEndPoint.ToString();
string str2 = str1;
for (int index = 0; index < str1.Length; ++index)
{
if (str1.Substring(index, 1) == ":")
str2 = str1.Substring(0, index);
}
using (StreamWriter streamWriter = new StreamWriter(Netplay.banFile, true))
{
streamWriter.WriteLine("//" + Main.player[plr].name);
streamWriter.WriteLine(str2);
}
}
public static bool CheckBan(string ip)
{
try
{
string str1 = ip;
for (int index = 0; index < ip.Length; ++index)
{
if (ip.Substring(index, 1) == ":")
str1 = ip.Substring(0, index);
}
if (System.IO.File.Exists(Netplay.banFile))
{
using (StreamReader streamReader = new StreamReader(Netplay.banFile))
{
string str2;
while ((str2 = streamReader.ReadLine()) != null)
{
if (str2 == str1)
return true;
}
}
}
}
catch
{
}
return false;
}
public static void newRecent()
{
for (int index1 = 0; index1 < Main.maxMP; ++index1)
{
if (Main.recentIP[index1] == Netplay.serverIP.ToString() && Main.recentPort[index1] == Netplay.serverPort)
{
for (int index2 = index1; index2 < Main.maxMP - 1; ++index2)
{
Main.recentIP[index2] = Main.recentIP[index2 + 1];
Main.recentPort[index2] = Main.recentPort[index2 + 1];
Main.recentWorld[index2] = Main.recentWorld[index2 + 1];
}
}
}
for (int index = Main.maxMP - 1; index > 0; --index)
{
Main.recentIP[index] = Main.recentIP[index - 1];
Main.recentPort[index] = Main.recentPort[index - 1];
Main.recentWorld[index] = Main.recentWorld[index - 1];
}
Main.recentIP[0] = Netplay.serverIP.ToString();
Main.recentPort[0] = Netplay.serverPort;
Main.recentWorld[0] = Main.worldName;
Main.SaveRecent();
}
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 index = 0; index < (int) byte.MaxValue; ++index)
{
if (index != Main.myPlayer)
Main.player[index] = new Player();
}
Main.menuMode = 10;
Main.menuMode = 14;
if (!Main.autoPass)
Main.statusText = "Connecting to " + (object) 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)
{
if (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();
Netplay.clientSock.active = true;
if (Netplay.clientSock.state == 0)
{
Main.statusText = "Found server";
Netplay.clientSock.state = 1;
NetMessage.SendData(1);
}
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;
WorldGen.clearWorld();
}
if (Netplay.clientSock.state == 5 && WorldGen.worldCleared)
{
Netplay.clientSock.state = 6;
Main.player[Main.myPlayer].FindSpawn();
NetMessage.SendData(8, number: Main.player[Main.myPlayer].SpawnX, number2: ((float) Main.player[Main.myPlayer].SpawnY));
}
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), (object) 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 = Netplay.clientSock.statusText + ": " + (object) (int) ((double) Netplay.clientSock.statusCount / (double) Netplay.clientSock.statusMax * 100.0) + "%";
}
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;
}
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;
Netplay.serverListenIP = Netplay.serverIP;
Main.menuMode = 14;
Main.statusText = "Starting server...";
Main.netMode = 2;
Netplay.disconnect = false;
for (int index = 0; index < 256; ++index)
{
Netplay.serverSock[index] = new ServerSock();
Netplay.serverSock[index].Reset();
Netplay.serverSock[index].whoAmI = index;
Netplay.serverSock[index].tcpClient = new TcpClient();
Netplay.serverSock[index].tcpClient.NoDelay = true;
Netplay.serverSock[index].readBuffer = new byte[1024];
Netplay.serverSock[index].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), (object) 1);
Main.statusText = "Server started";
}
int num1 = 0;
while (!Netplay.disconnect)
{
if (Netplay.stopListen)
{
int num2 = -1;
for (int index = 0; index < Main.maxNetPlayers; ++index)
{
if (!Netplay.serverSock[index].tcpClient.Connected)
{
num2 = index;
break;
}
}
if (num2 >= 0)
{
if (Main.ignoreErrors)
{
try
{
Netplay.tcpListener.Start();
Netplay.stopListen = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), (object) 1);
}
catch
{
}
}
else
{
Netplay.tcpListener.Start();
Netplay.stopListen = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ListenForClients), (object) 1);
}
}
}
int num3 = 0;
for (int i = 0; i < 256; ++i)
{
if (NetMessage.buffer[i].checkBytes)
NetMessage.CheckBytes(i);
if (Netplay.serverSock[i].kill)
{
Netplay.serverSock[i].Reset();
NetMessage.syncPlayers();
}
else if (Netplay.serverSock[i].tcpClient.Connected)
{
if (!Netplay.serverSock[i].active)
Netplay.serverSock[i].state = 0;
Netplay.serverSock[i].active = true;
++num3;
if (!Netplay.serverSock[i].locked)
{
try
{
Netplay.serverSock[i].networkStream = Netplay.serverSock[i].tcpClient.GetStream();
if (Netplay.serverSock[i].networkStream.DataAvailable)
{
Netplay.serverSock[i].locked = true;
Netplay.serverSock[i].networkStream.BeginRead(Netplay.serverSock[i].readBuffer, 0, Netplay.serverSock[i].readBuffer.Length, new AsyncCallback(Netplay.serverSock[i].ServerReadCallBack), (object) Netplay.serverSock[i].networkStream);
}
}
catch
{
Netplay.serverSock[i].kill = true;
}
}
if (Netplay.serverSock[i].statusMax > 0 && Netplay.serverSock[i].statusText2 != "")
{
if (Netplay.serverSock[i].statusCount >= Netplay.serverSock[i].statusMax)
{
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " " + Netplay.serverSock[i].statusText2 + ": Complete!";
Netplay.serverSock[i].statusText2 = "";
Netplay.serverSock[i].statusMax = 0;
Netplay.serverSock[i].statusCount = 0;
}
else
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " " + Netplay.serverSock[i].statusText2 + ": " + (object) (int) ((double) Netplay.serverSock[i].statusCount / (double) Netplay.serverSock[i].statusMax * 100.0) + "%";
}
else if (Netplay.serverSock[i].state == 0)
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " is connecting...";
else if (Netplay.serverSock[i].state == 1)
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " is sending player data...";
else if (Netplay.serverSock[i].state == 2)
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " requested world information";
else if (Netplay.serverSock[i].state != 3 && Netplay.serverSock[i].state == 10)
Netplay.serverSock[i].statusText = "(" + (object) Netplay.serverSock[i].tcpClient.Client.RemoteEndPoint + ") " + Netplay.serverSock[i].name + " is playing";
}
else if (Netplay.serverSock[i].active)
{
Netplay.serverSock[i].kill = true;
}
else
{
Netplay.serverSock[i].statusText2 = "";
if (i < (int) byte.MaxValue)
Main.player[i].active = false;
}
}
++num1;
if (num1 > 10)
{
Thread.Sleep(1);
num1 = 0;
}
else
Thread.Sleep(0);
if (!WorldGen.saveLock && !Main.dedServ)
Main.statusText = num3 != 0 ? num3.ToString() + " clients connected" : "Waiting for clients...";
Netplay.anyClients = num3 != 0;
Netplay.ServerUp = true;
}
Netplay.tcpListener.Stop();
for (int index = 0; index < 256; ++index)
Netplay.serverSock[index].Reset();
if (Main.menuMode != 15)
{
Main.netMode = 0;
Main.menuMode = 10;
WorldGen.saveWorld();
do
;
while (WorldGen.saveLock);
Main.menuMode = 0;
}
else
Main.netMode = 0;
Main.myPlayer = 0;
}
public static void ListenForClients(object threadContext)
{
while (!Netplay.disconnect && !Netplay.stopListen)
{
int index1 = -1;
for (int index2 = 0; index2 < Main.maxNetPlayers; ++index2)
{
if (!Netplay.serverSock[index2].tcpClient.Connected)
{
index1 = index2;
break;
}
}
if (index1 >= 0)
{
try
{
Netplay.serverSock[index1].tcpClient = Netplay.tcpListener.AcceptTcpClient();
Netplay.serverSock[index1].tcpClient.NoDelay = true;
Console.WriteLine(Netplay.serverSock[index1].tcpClient.Client.RemoteEndPoint.ToString() + " is connecting...");
}
catch (Exception ex)
{
if (!Netplay.disconnect)
{
Main.menuMode = 15;
Main.statusText = ex.ToString();
Netplay.disconnect = true;
}
}
}
else
{
Netplay.stopListen = true;
Netplay.tcpListener.Stop();
}
}
}
public static void StartClient() => ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ClientLoop), (object) 1);
public static void StartServer() => ThreadPool.QueueUserWorkItem(new WaitCallback(Netplay.ServerLoop), (object) 1);
public static bool SetIP(string newIP)
{
try
{
Netplay.serverIP = IPAddress.Parse(newIP);
}
catch
{
return false;
}
return true;
}
public static bool SetIP2(string newIP)
{
try
{
IPAddress[] addressList = Dns.GetHostEntry(newIP).AddressList;
for (int index = 0; index < addressList.Length; ++index)
{
if (addressList[index].AddressFamily == AddressFamily.InterNetwork)
{
Netplay.serverIP = addressList[index];
return true;
}
}
return false;
}
catch
{
return false;
}
}
public static void Init()
{
for (int index = 0; index < 257; ++index)
{
if (index < 256)
{
Netplay.serverSock[index] = new ServerSock();
Netplay.serverSock[index].tcpClient.NoDelay = true;
}
NetMessage.buffer[index] = new messageBuffer();
NetMessage.buffer[index].whoAmI = index;
}
Netplay.clientSock.tcpClient.NoDelay = true;
}
public static int GetSectionX(int x) => x / 200;
public static int GetSectionY(int y) => y / 150;
}
}