diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index cd595f2e..bcadc1d4 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -184,13 +184,10 @@ namespace TShockAPI int player = Tools.FindPlayer(plStr); if (!(player == -1 || player == -2 || plStr == "")) { - if (!TShock.players[Tools.FindPlayer(plStr)].group.HasPermission("immunetokick")) + if (!Tools.Kick(player, "Misbehaviour.")) { - Tools.Kick(player, "You were kicked."); - Tools.Broadcast(Tools.FindPlayer(player) + " was kicked by " + Tools.FindPlayer(ply)); - } - else Tools.SendMessage(ply, "You can't kick another admin!", new[] {255f, 0f, 0f}); + } } else if (Tools.FindPlayer(plStr) == -2) Tools.SendMessage(ply, "More than one player matched!", new[] {255f, 0f, 0f}); @@ -216,14 +213,10 @@ namespace TShockAPI int player = Tools.FindPlayer(plStr); if (!(player == -1 || player == -2 || plStr == "")) { - if (!TShock.players[Tools.FindPlayer(plStr)].group.HasPermission("immunetoban")) + if (!Tools.Ban(player, banReason.Equals("") ? "Misbehaviour." : banReason, Tools.FindPlayer(adminplr))) { - TShock.Bans.AddBan(Tools.GetPlayerIP(player), Main.player[player].name); - Tools.Kick(player, "You were banned."); - Tools.Broadcast(Tools.FindPlayer(adminplr) + " banned " + Tools.FindPlayer(player) + "!"); - } - else Tools.SendMessage(adminplr, "You can't ban another admin!", new[] {255f, 0f, 0f}); + } } else if (Tools.FindPlayer(plStr) == -2) Tools.SendMessage(adminplr, "More than one player matched!", new[] {255f, 0f, 0f}); @@ -237,7 +230,7 @@ namespace TShockAPI { if (Main.player[player].active) { - Tools.Kick(player, "Server shutting down!"); + Tools.ForceKick(player, "Server shutting down!"); } } WorldGen.saveWorld(); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index cf3562b7..05c8e455 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -203,13 +203,12 @@ namespace TShockAPI { if (players[e.Msg.whoAmI] == null) { - Tools.Kick(e.Msg.whoAmI, "Player doesn't exist"); + Tools.ForceKick(e.Msg.whoAmI, "Player doesn't exist"); e.Handled = true; } else if (players[e.Msg.whoAmI].receivedInfo) { - Tools.Kick(e.Msg.whoAmI, "Sent client info more than once"); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Sent client info more than once"); } else { @@ -229,8 +228,7 @@ namespace TShockAPI int tileY = Math.Abs(y); if (size > 5 || Math.Abs(plyX - tileX) > 10 || Math.Abs(plyY - tileY) > 10) { - Ban(e.Msg.whoAmI, "Send Tile Square Abuse"); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Send Tile Square Abuse"); } } } @@ -251,10 +249,7 @@ namespace TShockAPI if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6)) { - TShock.Ban(e.Msg.whoAmI, "Placing impossible to place blocks."); - Tools.Broadcast(Main.player[e.Msg.whoAmI].name + - " was banned for placing impossible to place blocks."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place blocks."); } } if (type == 0 || type == 1) @@ -298,25 +293,18 @@ namespace TShockAPI } else if (e.MsgID == 0x0A) //SendSection { - Tools.Broadcast(string.Format("{0}({1}) attempted sending a section", Main.player[e.Msg.whoAmI].name, - e.Msg.whoAmI)); - Tools.Kick(e.Msg.whoAmI, "SendSection abuse."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "SendSection abuse."); } else if (e.MsgID == 0x17) //Npc Data { - Tools.Broadcast(string.Format("{0}({1}) attempted spawning an NPC", Main.player[e.Msg.whoAmI].name, - e.Msg.whoAmI)); - Tools.Kick(e.Msg.whoAmI, "Spawn NPC abuse"); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Spawn NPC abuse"); } else if (e.MsgID == 0x0D) //Update Player { byte plr = e.Msg.readBuffer[e.Index]; if (plr != e.Msg.whoAmI) { - Tools.Kick(e.Msg.whoAmI, "Update Player abuse"); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Update Player abuse"); } } else if (e.MsgID == 0x10) @@ -331,19 +319,7 @@ namespace TShockAPI { if (players[ply].syncHP) { - if (!players[ply].group.HasPermission("ignorecheatdetection")) - { - if (ConfigurationManager.banCheater || ConfigurationManager.kickCheater) - { - string playerName = Tools.FindPlayer(ply); - if (ConfigurationManager.banCheater) - Ban(ply, "Abnormal life increase"); - Tools.Kick(ply, "Abnormal life increase"); - Tools.Broadcast(playerName + " was " + (ConfigurationManager.banCheater ? "banned" : "kicked") + - " because they gained an abnormal amount of health."); - e.Handled = true; - } - } + e.Handled = Tools.HandleCheater(ply, "Abnormal life increase"); } else { @@ -364,19 +340,7 @@ namespace TShockAPI { if (players[ply].syncMP) { - if (!players[ply].group.HasPermission("ignorecheatdetection")) - { - if (ConfigurationManager.banCheater || ConfigurationManager.kickCheater) - { - string playerName = Tools.FindPlayer(ply); - if (ConfigurationManager.banCheater) - Ban(ply, "Abnormal mana increase"); - Tools.Kick(ply, "Abnormal mana increase"); - Tools.Broadcast(playerName + " was " + (ConfigurationManager.banCheater ? "banned" : "kicked") + - " because they gained an abnormal amount of mana."); - e.Handled = true; - } - } + e.Handled = Tools.HandleCheater(ply, "Abnormal mana increase"); } else { @@ -401,20 +365,7 @@ namespace TShockAPI if (type == 29 || type == 28 || type == 30) { - if (!players[e.Msg.whoAmI].group.HasPermission("ignoregriefdetection")) - { - if (ConfigurationManager.kickBoom || ConfigurationManager.banBoom) - { - int i = e.Msg.whoAmI; - if (ConfigurationManager.banBoom) - Ban(i, "Explosives"); - Tools.Kick(i, "Explosives were thrown."); - Tools.Broadcast(Main.player[i].name + " was " + - (ConfigurationManager.banBoom ? "banned" : "kicked") + - " for throwing an explosive device."); - e.Handled = true; - } - } + e.Handled = Tools.HandleExplosivesUser(e.Msg.whoAmI, "Throwing an explosive device."); } } } @@ -429,10 +380,7 @@ namespace TShockAPI if (id != e.Msg.whoAmI) { - Ban(e.Msg.whoAmI, "Griefer"); - Log.Info(Tools.FindPlayer(e.Msg.whoAmI) + - " was kicked for trying to execute KillMe on someone else."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Trying to execute KillMe on someone else."); } } } @@ -476,20 +424,15 @@ namespace TShockAPI if (lava && lavacount <= 0) { - TShock.Ban(e.Msg.whoAmI, "Placing lava they didn't have."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Placing lava they didn't have."); ; } else if (!lava && watercount <= 0) { - TShock.Ban(e.Msg.whoAmI, "Placing water they didn't have."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Placing water they didn't have."); } if ((Math.Abs(plyX - tileX) > 6) || (Math.Abs(plyY - tileY) > 6)) { - TShock.Ban(e.Msg.whoAmI, "Placing impossible to place liquid."); - Tools.Broadcast(Main.player[e.Msg.whoAmI].name + - " was banned for placing impossible to place liquid."); - e.Handled = true; + e.Handled = Tools.HandleGriefer(e.Msg.whoAmI, "Placing impossible to place liquid."); ; } if (ConfigurationManager.spawnProtect) @@ -519,17 +462,11 @@ namespace TShockAPI return; } int plr = who; //legacy support + Log.Info(Tools.FindPlayer(who) + " (" + Tools.GetPlayerIP(who) + ") from '" + players[who].group.GetName() + "' group joined."); Tools.ShowMOTD(who); - if (!players[who].group.HasPermission("ignorecheatdetection") && HackedHealth(who)) + if (HackedHealth(who)) { - if (ConfigurationManager.banCheater || ConfigurationManager.kickCheater) - { - string playerName = Tools.FindPlayer(who); - if (ConfigurationManager.banCheater) - Ban(who, "Hacked health."); - Tools.Kick(who, "Hacked health."); - Tools.Broadcast(playerName + " was " + (ConfigurationManager.banCheater ? "banned" : "kicked") + " for hacked health."); - } + Tools.HandleCheater(who, "Hacked health."); } if (ConfigurationManager.permaPvp) { @@ -551,9 +488,7 @@ namespace TShockAPI if (msg.whoAmI != ply) { - Log.Info(Tools.FindPlayer(msg.whoAmI) + " was kicked for trying to fake chat as someone else."); - Ban(ply, "Faking Chat"); - e.Handled = true; + e.Handled = Tools.HandleGriefer(ply, "Faking Chat"); ; } int x = (int)Main.player[ply].position.X; @@ -596,30 +531,34 @@ namespace TShockAPI } string ip = Tools.GetPlayerIP(ply); - ; + players[ply] = new TSPlayer(ply); players[ply].group = Tools.GetGroupForIP(ip); if (Tools.activePlayers() + 1 > ConfigurationManager.maxSlots && !players[ply].group.HasPermission("reservedslot")) { - Tools.Kick(ply, "Server is full"); - return; + Tools.ForceKick(ply, "Server is full"); + handler.Handled = true; } - - var ban = Bans.GetBanByIp(ip); - if (ban != null) + else { - Tools.Kick(ply, "You are banned: " + ban.Reason); - } - else if (Tools.FindPlayer(ply).Length > 32) - { - Tools.Kick(ply, "Your name was too long."); - Tools.Broadcast(ip + " was kicked because their name exceeded 32 characters."); - } - if (!FileTools.OnWhitelist(ip)) - { - Tools.Kick(ply, "Not on whitelist."); + var ban = Bans.GetBanByIp(ip); + if (ban != null) + { + Tools.ForceKick(ply, "You are banned: " + ban.Reason); + handler.Handled = true; + } + else if (Tools.FindPlayer(ply).Length > 32) + { + Tools.ForceKick(ply, "Your name was too long."); + handler.Handled = true; + } + else if (!FileTools.OnWhitelist(ip)) + { + Tools.ForceKick(ply, "Not on whitelist."); + handler.Handled = true; + } } } @@ -643,7 +582,7 @@ namespace TShockAPI FileTools.CreateFile(FileTools.SaveDir + "auth.lck"); } - ConfigurationManager.maxSlots = Main.maxPlayers - 1; + //ConfigurationManager.maxSlots = Main.maxPlayers - 1; } private void OnUpdate(GameTime time) @@ -662,14 +601,8 @@ namespace TShockAPI { if (Main.player[i] != null) { - if (ConfigurationManager.kickTnt || ConfigurationManager.banTnt) + if (Tools.HandleTntUser((int)i, "Kill tile abuse detected.")) { - if (ConfigurationManager.banTnt) - Ban((int)i, "Explosives"); - Tools.Kick((int)i, "Kill tile abuse detected."); - Tools.Broadcast(Main.player[i].name + " was " + - (ConfigurationManager.banTnt ? "banned" : "kicked") + - " for kill tile abuse."); RevertKillTile((int)i); } else if (players[i].tileThreshold > 0) @@ -873,15 +806,6 @@ namespace TShockAPI return true; } - public static void Ban(int plr, string reason = "") - { - if (!players[plr].group.HasPermission("immunetoban")) - { - Tools.Kick(plr, "Banned: " + reason); - Bans.AddBan(Tools.GetPlayerIP(plr), Main.player[plr].name, reason); - } - } - public class Position { public float X; diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index 513e3961..81c60876 100644 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -208,19 +208,96 @@ namespace TShockAPI } } + /// + /// Kicks a player from the server without checking for immunetokick permission. + /// + /// int player + /// string reason + public static void ForceKick(int ply, string reason) + { + string ip = GetPlayerIP(ply); + NetMessage.SendData(0x2, ply, -1, reason, 0x0, 0f, 0f, 0f); + Log.Info(ip + " was force kicked for : " + reason); + } + /// /// Kicks a player from the server. /// /// int player /// string reason - public static void Kick(int ply, string reason) + public static bool Kick(int ply, string reason, string adminUserName = "") { - if (!TShock.players[ply].group.HasPermission("immunetokick") || reason.Contains("Banned: ")) + if (!TShock.players[ply].group.HasPermission("immunetokick")) { - string displayName = FindPlayer(ply).Equals("") ? GetPlayerIP(ply) : FindPlayer(ply); - NetMessage.SendData(0x2, ply, -1, reason, 0x0, 0f, 0f, 0f); - Log.Info("Kicked " + displayName + " for : " + reason); + string playerName = Main.player[ply].name; + NetMessage.SendData(0x2, ply, -1, "Kicked: " + reason, 0x0, 0f, 0f, 0f); + Log.Info("Kicked " + playerName + " for : " + reason); + if (adminUserName.Equals("")) + Broadcast(playerName + " was kicked for " + reason.ToLower()); + else + Tools.Broadcast(adminUserName + " kicked " + playerName + " for " + reason.ToLower()); + return true; } + return false; + } + + /// + /// Bans and kicks a player from the server. + /// + /// int player + /// string reason + public static bool Ban(int plr, string reason, string adminUserName = "") + { + if (!TShock.players[plr].group.HasPermission("immunetoban")) + { + string ip = GetPlayerIP(plr); + string playerName = Main.player[plr].name; + TShock.Bans.AddBan(ip, playerName, reason); + NetMessage.SendData(0x2, plr, -1, "Banned: " + reason, 0x0, 0f, 0f, 0f); + Log.Info("Banned " + playerName + " for : " + reason); + if (adminUserName.Equals("")) + Broadcast(playerName + " was banned for " + reason.ToLower()); + else + Tools.Broadcast(adminUserName + " banned " + playerName + " for " + reason.ToLower()); + return true; + } + return false; + } + + public static bool HandleCheater(int ply, string reason) + { + return HandleBadPlayer(ply, "ignorecheatdetection", ConfigurationManager.banCheater, ConfigurationManager.kickCheater, reason); + } + + public static bool HandleGriefer(int ply, string reason) + { + return HandleBadPlayer(ply, "ignoregriefdetection", ConfigurationManager.banGriefer, ConfigurationManager.kickGriefer, reason); + } + + public static bool HandleTntUser(int ply, string reason) + { + return HandleBadPlayer(ply, "ignoregriefdetection", ConfigurationManager.banTnt, ConfigurationManager.kickTnt, reason); + } + + public static bool HandleExplosivesUser(int ply, string reason) + { + return HandleBadPlayer(ply, "ignoregriefdetection", ConfigurationManager.banBoom, ConfigurationManager.kickBoom, reason); + } + + private static bool HandleBadPlayer(int ply, string overridePermission, bool ban, bool kick, string reason) + { + if (!TShock.players[ply].group.HasPermission(overridePermission)) + { + if (ban) + { + return Ban(ply, reason); + } + else if (kick) + { + return Kick(ply, reason); + } + } + return false; } ///