From cf736cbb30b691ac11041c87e7e9625ad5c8be26 Mon Sep 17 00:00:00 2001 From: high Date: Fri, 3 Jun 2011 02:34:25 -0400 Subject: [PATCH] Fixed kick, SendData sets kill when sending packet 0x2. Also when a socket is killed players are resynced. --- TShockAPI/Tools.cs | 608 +++++++++++++++++++++++---------------------- 1 file changed, 307 insertions(+), 301 deletions(-) diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index 619affed..653155c2 100644 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -1,301 +1,307 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using Terraria; - -namespace TShockAPI -{ - class Tools - { - /// - /// Provides the real IP address from a RemoteEndPoint string that contains a port and an IP - /// - /// A string IPv4 address in IP:PORT form. - /// A string IPv4 address. - public static string GetRealIP(string mess) - { - return mess.Split(':')[0]; - } - /// - /// Used for some places where a list of players might be used. - /// - /// String of players seperated by commas. - public static string GetPlayers() - { - string str = ""; - for (int i = 0; i < Main.maxPlayers; i++) - { - if (Main.player[i].active) - { - if (str == "") - { - str = str + Main.player[i].name; - } - else - { - str = str + ", " + Main.player[i].name; - } - } - } - return str; - } - /// - /// It's a clamp function - /// - /// - /// Value to clamp - /// Maximum bounds of the clamp - /// Minimum bounds of the clamp - /// - public static T Clamp(T value, T max, T min) - where T : System.IComparable - { - T result = value; - if (value.CompareTo(max) > 0) - result = max; - if (value.CompareTo(min) < 0) - result = min; - return result; - } - /// - /// Broadcasts a message to all players - /// - /// string message - public static void Broadcast(string msg) - { - for (int i = 0; i < Main.player.Length; i++) - { - SendMessage(i, msg); - } - } - /// - /// Sends a message out to a single player - /// - /// int socket thingy for the player from the server socket - /// String message - /// Float containing red, blue, and green color values - public static void SendMessage(int ply, string msg, float[] color) - { - NetMessage.SendData(0x19, ply, -1, msg, 255, color[0], color[1], color[2]); - } - /// - /// Sends a green message to a player - /// - /// int socket thingy for the player from the server socket - /// string message - public static void SendMessage(int ply, string message) - { - NetMessage.SendData(0x19, ply, -1, message, 255, 0f, 255f, 0f); - } - /// - /// The number of active players on the server. - /// - /// int playerCount - public static int activePlayers() - { - int num = 0; - for (int i = 0; i < Main.maxPlayers; i++) - { - if (Main.player[i].active) - { - num++; - } - } - return num; - } - /// - /// Finds the name of the player of the int given - /// - /// string player name - /// int player - public static int FindPlayer(string ply) - { - int pl = -1; - for (int i = 0; i < Main.player.Length; i++) - { - if ((ply.ToLower()) == Main.player[i].name.ToLower()) - { - pl = i; - break; - } - } - return pl; - } - /// - /// Gets the given player's name - /// - /// int player - /// string name - public static string FindPlayer(int ply) - { - for (int i = 0; i < Main.player.Length; i++) - { - if (i == ply) - { - return Main.player[i].name; - } - } - return "null"; - } - /// - /// Creates an NPC - /// - /// Type is defined in the enum NPC list - /// X coord of the desired npc - /// Y coord of the desired npc - /// int player that the npc targets - public static void NewNPC(int type, int x, int y, int target) - { - - switch (type) - { - case 0: //World Eater - WorldGen.shadowOrbSmashed = true; - WorldGen.shadowOrbCount = 3; - int w = NPC.NewNPC(x, y, 13, 1); - Main.npc[w].target = target; - break; - case 1: //Eye - Main.time = 4861; - Main.dayTime = false; - WorldGen.spawnEye = true; - break; - case 2: //Skeletron - int enpeecee = NPC.NewNPC(x, y, 0x23, 0); - Main.npc[enpeecee].netUpdate = true; - break; - - } - - } - /// - /// Finds a player, reads admins.txt, and determines if their IP address is on that list. - /// - /// int player - /// true/false - public static bool IsAdmin(int ply) - { - string remoteEndPoint = Convert.ToString((Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); - string[] remoteEndPointIP = remoteEndPoint.Split(':'); - TextReader tr = new StreamReader(FileTools.SaveDir + "admins.txt"); - string adminlist = tr.ReadToEnd(); - tr.Close(); - if (adminlist.Contains(remoteEndPointIP[0])) - { - return true; - } - return false; - } - /// - /// Finds a player based on their name, reads admins.txt, and determines if thier IP address is on that list. - /// - /// - /// - public static bool IsAdmin(string ply) - { - string remoteEndPoint = Convert.ToString((Netplay.serverSock[Tools.FindPlayer(ply)].tcpClient.Client.RemoteEndPoint)); - string[] remoteEndPointIP = remoteEndPoint.Split(':'); - TextReader tr = new StreamReader(FileTools.SaveDir + "admins.txt"); - string adminlist = tr.ReadToEnd(); - tr.Close(); - if (adminlist.Contains(remoteEndPointIP[0])) - { - return true; - } - return false; - } - /// - /// Kicks a player from the server. - /// - /// int player - /// string reason - public static void Kick(int ply, string reason) - { - NetMessage.SendData(0x2, ply, -1, reason, 0x0, 0f, 0f, 0f); - Netplay.serverSock[ply].kill = true; - NetMessage.syncPlayers(); - } - - /// - /// Adds someone to cheaters.txt - /// - /// int player - public static void HandleCheater(int ply) - { - if (!TShock.players[ply].IsAdmin()) - { - string cheater = Tools.FindPlayer(ply); - string ip = Tools.GetRealIP(Convert.ToString(Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); - - FileTools.WriteCheater(ply); - if (!ConfigurationManager.kickCheater) { return; } - Netplay.serverSock[ply].kill = true; - Netplay.serverSock[ply].Reset(); - NetMessage.syncPlayers(); - Tools.Broadcast(cheater + " was " + (ConfigurationManager.banCheater ? "banned " : "kicked ") + "for cheating."); - } - } - - /// - /// Adds someone to greifers.txt - /// - /// int player - public static void HandleGreifer(int ply) - { - if (!TShock.players[ply].IsAdmin()) - { - string cheater = Tools.FindPlayer(ply); - string ip = Tools.GetRealIP(Convert.ToString(Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); - - FileTools.WriteGrief(ply); - if (!ConfigurationManager.kickGriefer) { return; } - Netplay.serverSock[ply].kill = true; - Netplay.serverSock[ply].Reset(); - NetMessage.syncPlayers(); - Tools.Broadcast(cheater + " was " + (ConfigurationManager.banCheater ? "banned " : "kicked ") + "for greifing."); - } - } - /// - /// Shows a MOTD to the player - /// - /// int player - public static void ShowMOTD(int ply) - { - string foo = ""; - TextReader tr = new StreamReader(FileTools.SaveDir + "motd.txt"); - while ((foo = tr.ReadLine()) != null) - { - foo = foo.Replace("%map%", Main.worldName); - foo = foo.Replace("%players%", Tools.GetPlayers()); - if (foo.Substring(0, 1) == "%" && foo.Substring(12, 1) == "%") //Look for a beginning color code. - { - string possibleColor = foo.Substring(0, 13); - foo = foo.Remove(0, 13); - float[] pC = { 0, 0, 0 }; - possibleColor = possibleColor.Replace("%", ""); - string[] pCc = possibleColor.Split(','); - if (pCc.Length == 3) - { - try - { - pC[0] = Tools.Clamp(Convert.ToInt32(pCc[0]), 255, 0); - pC[1] = Tools.Clamp(Convert.ToInt32(pCc[1]), 255, 0); - pC[2] = Tools.Clamp(Convert.ToInt32(pCc[2]), 255, 0); - Tools.SendMessage(ply, foo, pC); - continue; - } - catch (Exception e) - { - FileTools.WriteError(e.Message); - } - } - } - Tools.SendMessage(ply, foo); - } - tr.Close(); - } - public Tools() { } - } -} +using System; +using System.IO; +using Terraria; + +namespace TShockAPI +{ + class Tools + { + /// + /// Provides the real IP address from a RemoteEndPoint string that contains a port and an IP + /// + /// A string IPv4 address in IP:PORT form. + /// A string IPv4 address. + public static string GetRealIP(string mess) + { + return mess.Split(':')[0]; + } + + /// + /// Used for some places where a list of players might be used. + /// + /// String of players seperated by commas. + public static string GetPlayers() + { + string str = ""; + for (int i = 0; i < Main.maxPlayers; i++) + { + if (Main.player[i].active) + { + if (str == "") + { + str = str + Main.player[i].name; + } + else + { + str = str + ", " + Main.player[i].name; + } + } + } + return str; + } + + /// + /// It's a clamp function + /// + /// + /// Value to clamp + /// Maximum bounds of the clamp + /// Minimum bounds of the clamp + /// + public static T Clamp(T value, T max, T min) + where T : System.IComparable + { + T result = value; + if (value.CompareTo(max) > 0) + result = max; + if (value.CompareTo(min) < 0) + result = min; + return result; + } + + /// + /// Broadcasts a message to all players + /// + /// string message + public static void Broadcast(string msg) + { + for (int i = 0; i < Main.player.Length; i++) + { + SendMessage(i, msg); + } + } + + /// + /// Sends a message out to a single player + /// + /// int socket thingy for the player from the server socket + /// String message + /// Float containing red, blue, and green color values + public static void SendMessage(int ply, string msg, float[] color) + { + NetMessage.SendData(0x19, ply, -1, msg, 255, color[0], color[1], color[2]); + } + + /// + /// Sends a green message to a player + /// + /// int socket thingy for the player from the server socket + /// string message + public static void SendMessage(int ply, string message) + { + NetMessage.SendData(0x19, ply, -1, message, 255, 0f, 255f, 0f); + } + + /// + /// The number of active players on the server. + /// + /// int playerCount + public static int activePlayers() + { + int num = 0; + for (int i = 0; i < Main.maxPlayers; i++) + { + if (Main.player[i].active) + { + num++; + } + } + return num; + } + + /// + /// Finds the name of the player of the int given + /// + /// string player name + /// int player + public static int FindPlayer(string ply) + { + int pl = -1; + for (int i = 0; i < Main.player.Length; i++) + { + if ((ply.ToLower()) == Main.player[i].name.ToLower()) + { + pl = i; + break; + } + } + return pl; + } + + /// + /// Gets the given player's name + /// + /// int player + /// string name + public static string FindPlayer(int ply) + { + for (int i = 0; i < Main.player.Length; i++) + { + if (i == ply) + { + return Main.player[i].name; + } + } + return "null"; + } + + /// + /// Creates an NPC + /// + /// Type is defined in the enum NPC list + /// X coord of the desired npc + /// Y coord of the desired npc + /// int player that the npc targets + public static void NewNPC(int type, int x, int y, int target) + { + switch (type) + { + case 0: //World Eater + WorldGen.shadowOrbSmashed = true; + WorldGen.shadowOrbCount = 3; + int w = NPC.NewNPC(x, y, 13, 1); + Main.npc[w].target = target; + break; + case 1: //Eye + Main.time = 4861; + Main.dayTime = false; + WorldGen.spawnEye = true; + break; + case 2: //Skeletron + int enpeecee = NPC.NewNPC(x, y, 0x23, 0); + Main.npc[enpeecee].netUpdate = true; + break; + } + } + + /// + /// Finds a player, reads admins.txt, and determines if their IP address is on that list. + /// + /// int player + /// true/false + public static bool IsAdmin(int ply) + { + string remoteEndPoint = Convert.ToString((Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); + string[] remoteEndPointIP = remoteEndPoint.Split(':'); + TextReader tr = new StreamReader(FileTools.SaveDir + "admins.txt"); + string adminlist = tr.ReadToEnd(); + tr.Close(); + if (adminlist.Contains(remoteEndPointIP[0])) + { + return true; + } + return false; + } + + /// + /// Finds a player based on their name, reads admins.txt, and determines if thier IP address is on that list. + /// + /// + /// + public static bool IsAdmin(string ply) + { + string remoteEndPoint = Convert.ToString((Netplay.serverSock[Tools.FindPlayer(ply)].tcpClient.Client.RemoteEndPoint)); + string[] remoteEndPointIP = remoteEndPoint.Split(':'); + TextReader tr = new StreamReader(FileTools.SaveDir + "admins.txt"); + string adminlist = tr.ReadToEnd(); + tr.Close(); + if (adminlist.Contains(remoteEndPointIP[0])) + { + return true; + } + return false; + } + + /// + /// Kicks a player from the server. + /// + /// int player + /// string reason + public static void Kick(int ply, string reason) + { + NetMessage.SendData(0x2, ply, -1, reason, 0x0, 0f, 0f, 0f); + } + + /// + /// Adds someone to cheaters.txt + /// + /// int player + public static void HandleCheater(int ply) + { + if (!TShock.players[ply].IsAdmin()) + { + string cheater = Tools.FindPlayer(ply); + string ip = Tools.GetRealIP(Convert.ToString(Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); + + FileTools.WriteCheater(ply); + if (!ConfigurationManager.kickCheater) { return; } + Netplay.serverSock[ply].kill = true; + Netplay.serverSock[ply].Reset(); + NetMessage.syncPlayers(); + Tools.Broadcast(cheater + " was " + (ConfigurationManager.banCheater ? "banned " : "kicked ") + "for cheating."); + } + } + + /// + /// Adds someone to greifers.txt + /// + /// int player + public static void HandleGreifer(int ply) + { + if (!TShock.players[ply].IsAdmin()) + { + string cheater = Tools.FindPlayer(ply); + string ip = Tools.GetRealIP(Convert.ToString(Netplay.serverSock[ply].tcpClient.Client.RemoteEndPoint)); + + FileTools.WriteGrief(ply); + if (!ConfigurationManager.kickGriefer) { return; } + Netplay.serverSock[ply].kill = true; + Netplay.serverSock[ply].Reset(); + NetMessage.syncPlayers(); + Tools.Broadcast(cheater + " was " + (ConfigurationManager.banCheater ? "banned " : "kicked ") + "for greifing."); + } + } + + /// + /// Shows a MOTD to the player + /// + /// int player + public static void ShowMOTD(int ply) + { + string foo = ""; + TextReader tr = new StreamReader(FileTools.SaveDir + "motd.txt"); + while ((foo = tr.ReadLine()) != null) + { + foo = foo.Replace("%map%", Main.worldName); + foo = foo.Replace("%players%", Tools.GetPlayers()); + if (foo.Substring(0, 1) == "%" && foo.Substring(12, 1) == "%") //Look for a beginning color code. + { + string possibleColor = foo.Substring(0, 13); + foo = foo.Remove(0, 13); + float[] pC = { 0, 0, 0 }; + possibleColor = possibleColor.Replace("%", ""); + string[] pCc = possibleColor.Split(','); + if (pCc.Length == 3) + { + try + { + pC[0] = Tools.Clamp(Convert.ToInt32(pCc[0]), 255, 0); + pC[1] = Tools.Clamp(Convert.ToInt32(pCc[1]), 255, 0); + pC[2] = Tools.Clamp(Convert.ToInt32(pCc[2]), 255, 0); + Tools.SendMessage(ply, foo, pC); + continue; + } + catch (Exception e) + { + FileTools.WriteError(e.Message); + } + } + } + Tools.SendMessage(ply, foo); + } + tr.Close(); + } + + public Tools() { } + } +} \ No newline at end of file