diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index d7f7be18..f8449d0f 100755
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -1849,7 +1849,7 @@ namespace TShockAPI
return true;
}
- Item selectedItem = args.TPlayer.inventory[args.TPlayer.selectedItem];
+ Item selectedItem = args.Player.SelectedItem;
if (type == 0 && !Main.tileCut[Main.tile[tileX, tileY].type] && !breakableTiles.Contains(Main.tile[tileX, tileY].type))
{
// If the tile is an axe tile and they aren't selecting an axe, they're hacking.
@@ -1879,7 +1879,6 @@ namespace TShockAPI
args.Player.SendTileSquare(tileX, tileY, 1);
return true;
}
-
}
else if (action == EditAction.PlaceTile || action == EditAction.PlaceWall)
{
@@ -3192,6 +3191,13 @@ namespace TShockAPI
if (OnPaintTile(x, y, t))
return true;
+ // Not selecting paintbrush or paint scraper? Hacking.
+ if (args.Player.SelectedItem.type != 1071 && args.Player.SelectedItem.type != 1100)
+ {
+ args.Player.SendData(PacketTypes.PaintWall, "", x, y, 0);
+ return true;
+ }
+
if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000 ||
TShock.CheckTilePermission(args.Player, x, y, true) ||
TShock.CheckRangePermission(args.Player, x, y))
@@ -3199,7 +3205,11 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.PaintTile, "", x, y, 0);
return true;
}
- args.Player.PaintThreshold++;
+
+ if (!args.Player.Group.HasPermission(Permissions.ignorepaintdetection))
+ {
+ args.Player.PaintThreshold++;
+ }
return false;
}
@@ -3212,6 +3222,13 @@ namespace TShockAPI
if (OnPaintTile(x, y, t))
return true;
+ // Not selecting paint roller or paint scraper? Hacking.
+ if (args.Player.SelectedItem.type != 1072 && args.Player.SelectedItem.type != 1100)
+ {
+ args.Player.SendData(PacketTypes.PaintWall, "", x, y, 0);
+ return true;
+ }
+
if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000 ||
TShock.CheckTilePermission(args.Player, x, y, true) ||
TShock.CheckRangePermission(args.Player, x, y))
@@ -3219,7 +3236,11 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.PaintWall, "", x, y, 0);
return true;
}
- args.Player.PaintThreshold++;
+
+ if (!args.Player.Group.HasPermission(Permissions.ignorepaintdetection))
+ {
+ args.Player.PaintThreshold++;
+ }
return false;
}
diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs
index e6289131..6671e9e8 100644
--- a/TShockAPI/Permissions.cs
+++ b/TShockAPI/Permissions.cs
@@ -130,6 +130,9 @@ namespace TShockAPI
[Description("Prevents you from being disabled by projectile abuse detection.")]
public static readonly string ignoreprojectiledetection = "tshock.ignore.projectile";
+ [Description("Prevents you from being disabled by paint abuse detection.")]
+ public static readonly string ignorepaintdetection = "tshock.ignore.paint";
+
[Description("Prevents you from being reverted by no clip detection.")]
public static readonly string ignorenoclipdetection = "tshock.ignore.noclip";
diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs
index b72fa0e6..8ef45cc7 100755
--- a/TShockAPI/TSPlayer.cs
+++ b/TShockAPI/TSPlayer.cs
@@ -319,21 +319,31 @@ namespace TShockAPI
}
}
+ ///
+ /// Gets the player's selected item.
+ ///
+ public Item SelectedItem
+ {
+ get { return TPlayer.inventory[TPlayer.selectedItem]; }
+ }
+
public int State
{
get { return Netplay.serverSock[Index].state; }
set { Netplay.serverSock[Index].state = value; }
}
+ ///
+ /// Gets the player's UUID.
+ ///
public string UUID
{
- get {
- return RealPlayer
- ? Netplay.serverSock[Index].clientUUID
- : "";
- }
+ get { return RealPlayer ? Netplay.serverSock[Index].clientUUID : ""; }
}
+ ///
+ /// Gets the player's IP.
+ ///
public string IP
{
get