From 584950bc6f1e47345dcc9a943b765ecea4f30b00 Mon Sep 17 00:00:00 2001 From: k0rd Date: Mon, 30 Sep 2013 06:45:33 -0400 Subject: [PATCH] Added a check to see if player has recently lit a fuse This will prevent cheat detection from wrongly triggering if the player uses a fused explosive and quickly switches to another weapon before the explosive detonates. I also commented out a block where we force explosives server-side, this would usually cause dynamite to explode in the wrong position when it bounced around too much. --- TShockAPI/GetDataHandlers.cs | 18 ++++++++++-------- TShockAPI/TSPlayer.cs | 5 +++++ TShockAPI/TShock.cs | 4 ++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 6e088865..2e3a043c 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1796,19 +1796,19 @@ namespace TShockAPI if (type == 0 && Main.tile[tileX, tileY].type != 127 && !Main.tileCut[Main.tile[tileX, tileY].type] && !rightClickKill.Contains(Main.tile[tileX, tileY].type)) { // 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 && selectedItem.explosive == 0)) + if (Main.tileAxe[Main.tile[tileX, tileY].type] && (selectedItem.axe == 0 && selectedItem.explosive == 0 && args.Player.RecentFuse == 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 && selectedItem.explosive == 0)) + else if (Main.tileHammer[Main.tile[tileX, tileY].type] && (selectedItem.hammer == 0 && selectedItem.explosive == 0 && args.Player.RecentFuse == 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 && selectedItem.explosive == 0)) + else if ((!Main.tileAxe[Main.tile[tileX, tileY].type] && !Main.tileHammer[Main.tile[tileX, tileY].type]) && (selectedItem.pick == 0 && selectedItem.explosive == 0 && args.Player.RecentFuse == 0)) { args.Player.SendTileSquare(tileX, tileY); @@ -1818,7 +1818,7 @@ namespace TShockAPI else if (action == EditAction.KillWall) { // If they aren't selecting an hammer, they're hacking. - if (selectedItem.hammer == 0 && selectedItem.explosive == 0) + if (selectedItem.hammer == 0 && selectedItem.explosive == 0 && args.Player.RecentFuse == 0) { args.Player.SendTileSquare(tileX, tileY); return true; @@ -2246,12 +2246,14 @@ namespace TShockAPI } } - // force all explosives server-side. + // force all explosives server-side. -- DOES NOT WORK DUE TO LATENCY 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; + // Denotes that the player has recently set a fuse - used for cheat detection. + args.Player.RecentFuse = 10; + // args.Player.RemoveProjectile(ident, owner); + // Projectile.NewProjectile(pos.X, pos.Y, vel.X, vel.Y, type, dmg, knockback); + // return true; } return false; diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 525bc701..f5354d0a 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -57,6 +57,11 @@ namespace TShockAPI /// The number of projectiles created by the player in the last second. /// public int ProjectileThreshold { get; set; } + + /// + /// A timer to keep track of whether or not the player has recently thrown an explosive + // + public int RecentFuse = 0; /// /// A queue of tiles destroyed by the player for reverting. diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 8cb0ad93..c4a4dd12 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -672,6 +672,10 @@ namespace TShockAPI { player.TilePlaceThreshold = 0; } + + if (player.RecentFuse >0) + player.RecentFuse--; + if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) { player.Disable("Reached TileLiquid threshold.");