From 8ba1aa58acfaf3eedab6a9b4ae9a47f9759bdf0b Mon Sep 17 00:00:00 2001 From: MarioE Date: Wed, 10 Jul 2013 08:51:42 -0400 Subject: [PATCH] Added some tile hacking checks and moved explosive projectiles server-side. --- TShockAPI/GetDataHandlers.cs | 184 ++++++++++++++++++++++------------- 1 file changed, 118 insertions(+), 66 deletions(-) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index b79c0e12..0db5b28a 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -17,13 +17,13 @@ along with this program. If not, see . */ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; +using System.ComponentModel; +using System.Diagnostics; using System.IO; using System.IO.Streams; using System.Linq; -using System.Text; -using TShockAPI.DB; +using System.Text; +using TShockAPI.DB; using Terraria; using TShockAPI.Net; @@ -1220,13 +1220,13 @@ namespace TShockAPI if (args.Player.IsLoggedIn) { args.Player.PlayerData.StoreSlot(slot, type, prefix, stack); - } - else if ( - TShock.Config.ServerSideInventory && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck && - args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassinventorychecks) - ) { - // The player might have moved an item to their trash can before they performed a single login attempt yet. - args.Player.IgnoreActionsForClearingTrashCan = true; + } + else if ( + TShock.Config.ServerSideInventory && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck && + args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassinventorychecks) + ) { + // The player might have moved an item to their trash can before they performed a single login attempt yet. + args.Player.IgnoreActionsForClearingTrashCan = true; } return false; @@ -1694,31 +1694,31 @@ namespace TShockAPI bool includeUnprotected = false; bool includeZIndexes = false; bool persistentMode = false; - foreach (string parameter in args.Player.AwaitingNameParameters) - { - if (parameter.Equals("-u", StringComparison.InvariantCultureIgnoreCase)) - includeUnprotected = true; - if (parameter.Equals("-z", StringComparison.InvariantCultureIgnoreCase)) - includeZIndexes = true; - if (parameter.Equals("-p", StringComparison.InvariantCultureIgnoreCase)) - persistentMode = true; + foreach (string parameter in args.Player.AwaitingNameParameters) + { + if (parameter.Equals("-u", StringComparison.InvariantCultureIgnoreCase)) + includeUnprotected = true; + if (parameter.Equals("-z", StringComparison.InvariantCultureIgnoreCase)) + includeZIndexes = true; + if (parameter.Equals("-p", StringComparison.InvariantCultureIgnoreCase)) + persistentMode = true; } List outputRegions = new List(); - foreach (Region region in TShock.Regions.Regions.OrderBy(r => r.Z).Reverse()) - { - if (!includeUnprotected && !region.DisableBuild) - continue; + foreach (Region region in TShock.Regions.Regions.OrderBy(r => r.Z).Reverse()) + { + if (!includeUnprotected && !region.DisableBuild) + continue; if (tileX < region.Area.Left || tileX > region.Area.Right) continue; if (tileY < region.Area.Top || tileY > region.Area.Bottom) - continue; - - string format = "{1}"; - if (includeZIndexes) - format = "{1} (z:{0})"; - - outputRegions.Add(string.Format(format, region.Z, region.Name)); + continue; + + string format = "{1}"; + if (includeZIndexes) + format = "{1} (z:{0})"; + + outputRegions.Add(string.Format(format, region.Z, region.Name)); } if (outputRegions.Count == 0) @@ -1739,10 +1739,10 @@ namespace TShockAPI args.Player.SendMessage(line, Color.White); } - if (!persistentMode) - { - args.Player.AwaitingName = false; - args.Player.AwaitingNameParameters = null; + if (!persistentMode) + { + args.Player.AwaitingName = false; + args.Player.AwaitingNameParameters = null; } args.Player.SendTileSquare(tileX, tileY); @@ -1759,22 +1759,54 @@ namespace TShockAPI return true; } - if (type == 1 || type == 3) + byte[] rightClickKill = new byte[] { 4, 13, 33, 49, 50, 128}; + Item selectedItem = args.TPlayer.inventory[args.TPlayer.selectedItem]; + if (type == 0 && Main.tile[tileX, tileY].type != 127 && !Main.tileCut[Main.tile[tileX, tileY].type] && !rightClickKill.Contains(Main.tile[tileX, tileY].type)) { - if (tiletype >= ((type == 1) ? Main.maxTileSets : Main.maxWallTypes)) + // If the tile is an axe tile and they aren't selecting an axe, they're hacking. + if (Main.tileAxe[Main.tile[tileX, tileY].type] && selectedItem.axe == 0) { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + // If the tile is a hammer tile and they aren't selecting an hammer, they're hacking. + else if (Main.tileHammer[Main.tile[tileX, tileY].type] && selectedItem.hammer == 0) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + // If the tile is a pickaxe tile and they aren't selecting an pickaxe, they're hacking. + else if ((!Main.tileAxe[Main.tile[tileX, tileY].type] && !Main.tileHammer[Main.tile[tileX, tileY].type]) && selectedItem.pick == 0) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + } + else if (type == 2) + { + // If they aren't selecting an hammer, they're hacking. + if (selectedItem.hammer == 0) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + } + else if (type == 1 || type == 3) + { + // If they aren't selecting the item which creates the tile or wall, they're hacking. + if (tiletype != 127 && tiletype != (type == 1 ? selectedItem.createTile : selectedItem.createWall)) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + if (TShock.Itembans.ItemIsBanned(selectedItem.name, args.Player) || tiletype >= (type == 1 ? Main.maxTileSets : Main.maxWallTypes)) + { + args.Player.SendTileSquare(tileX, tileY); return true; } if (type == 1 && (tiletype == 29 || tiletype == 97) && TShock.Config.ServerSideInventory && TShock.Config.DisablePiggybanksOnSSI) { - args.Player.SendMessage("You cannot place this tile, server side inventory is enabled.", Color.Red); - args.Player.SendTileSquare(tileX, tileY); - return true; - } - if (tiletype == 48 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Spike", args.Player)) - { - args.Player.Disable("Used banned spikes without permission."); + args.Player.SendMessage("You cannot place this tile because server side inventory is enabled.", Color.Red); args.Player.SendTileSquare(tileX, tileY); return true; } @@ -1782,7 +1814,7 @@ namespace TShockAPI { if (TShock.Utils.MaxChests()) { - args.Player.SendMessage("Reached the world's max chest limit, unable to place more.", Color.Red); + args.Player.SendMessage("The world's chest limit has been reached - unable to place more.", Color.Red); args.Player.SendTileSquare(tileX, tileY); return true; } @@ -1793,10 +1825,21 @@ namespace TShockAPI return true; } } - if (tiletype == 141 && !args.Player.Group.HasPermission(Permissions.usebanneditem) && - TShock.Itembans.ItemIsBanned("Explosives", args.Player)) + } + else if (type == 5) + { + // If they aren't selecting the wrench, they're hacking. + if (args.TPlayer.inventory[args.TPlayer.selectedItem].type != 509) + { + args.Player.SendTileSquare(tileX, tileY); + return true; + } + } + else if (type == 6) + { + // If they aren't selecting the wire cutter, they're hacking. + if (args.TPlayer.inventory[args.TPlayer.selectedItem].type != 510) { - args.Player.Disable("Used banned explosives tile without permission."); args.Player.SendTileSquare(tileX, tileY); return true; } @@ -2112,17 +2155,18 @@ namespace TShockAPI return true; } - if (!TShock.Config.IgnoreProjUpdate && TShock.CheckProjectilePermission(args.Player, index, type)) + bool hasPermission = !TShock.CheckProjectilePermission(args.Player, index, type); + if (!TShock.Config.IgnoreProjUpdate && !hasPermission) { - if (type == 100) - { //fix for skele prime - Log.Debug("Skeletron Prime's death laser ignored for cheat detection.."); - } - else - { - args.Player.Disable("Does not have projectile permission to update projectile."); - args.Player.RemoveProjectile(ident, owner); - } + if (type == 100) + { //fix for skele prime + Log.Debug("Skeletron Prime's death laser ignored for cheat detection.."); + } + else + { + args.Player.Disable("Does not have projectile permission to update projectile."); + args.Player.RemoveProjectile(ident, owner); + } return true; } @@ -2141,14 +2185,22 @@ namespace TShockAPI if (!args.Player.Group.HasPermission(Permissions.ignoreprojectiledetection)) { - if ((type ==90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel - { - Log.Debug("Ignoring shrapnel per config.."); - } - else - { - args.Player.ProjectileThreshold++; - } + if ((type == 90) && (TShock.Config.ProjIgnoreShrapnel))// ignore shrapnel + { + Log.Debug("Ignoring shrapnel per config.."); + } + else + { + args.Player.ProjectileThreshold++; + } + } + + // force all explosives server-side. + if (hasPermission && (type == 28 || type == 29 || type == 37)) + { + args.Player.RemoveProjectile(ident, owner); + Projectile.NewProjectile(pos.X, pos.Y, vel.X, vel.Y, type, dmg, knockback); + return true; } return false;