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.
This commit is contained in:
k0rd 2013-09-30 06:45:33 -04:00
parent 6e29a3b0ca
commit 584950bc6f
3 changed files with 19 additions and 8 deletions

View file

@ -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 (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 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); args.Player.SendTileSquare(tileX, tileY);
return true; return true;
} }
// If the tile is a hammer tile and they aren't selecting an hammer, they're hacking. // 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); args.Player.SendTileSquare(tileX, tileY);
return true; return true;
} }
// If the tile is a pickaxe tile and they aren't selecting an pickaxe, they're hacking. // 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); args.Player.SendTileSquare(tileX, tileY);
@ -1818,7 +1818,7 @@ namespace TShockAPI
else if (action == EditAction.KillWall) else if (action == EditAction.KillWall)
{ {
// If they aren't selecting an hammer, they're hacking. // 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); args.Player.SendTileSquare(tileX, tileY);
return true; 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)) if (hasPermission && (type == 28 || type == 29 || type == 37))
{ {
args.Player.RemoveProjectile(ident, owner); // Denotes that the player has recently set a fuse - used for cheat detection.
Projectile.NewProjectile(pos.X, pos.Y, vel.X, vel.Y, type, dmg, knockback); args.Player.RecentFuse = 10;
return true; // args.Player.RemoveProjectile(ident, owner);
// Projectile.NewProjectile(pos.X, pos.Y, vel.X, vel.Y, type, dmg, knockback);
// return true;
} }
return false; return false;

View file

@ -57,6 +57,11 @@ namespace TShockAPI
/// The number of projectiles created by the player in the last second. /// The number of projectiles created by the player in the last second.
/// </summary> /// </summary>
public int ProjectileThreshold { get; set; } public int ProjectileThreshold { get; set; }
/// <summary>
/// A timer to keep track of whether or not the player has recently thrown an explosive
// </summary>
public int RecentFuse = 0;
/// <summary> /// <summary>
/// A queue of tiles destroyed by the player for reverting. /// A queue of tiles destroyed by the player for reverting.

View file

@ -672,6 +672,10 @@ namespace TShockAPI
{ {
player.TilePlaceThreshold = 0; player.TilePlaceThreshold = 0;
} }
if (player.RecentFuse >0)
player.RecentFuse--;
if (player.TileLiquidThreshold >= Config.TileLiquidThreshold) if (player.TileLiquidThreshold >= Config.TileLiquidThreshold)
{ {
player.Disable("Reached TileLiquid threshold."); player.Disable("Reached TileLiquid threshold.");