diff --git a/CHANGELOG.md b/CHANGELOG.md
index 574c1962..9b591efc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -78,6 +78,7 @@ Putting this stuff down here so things don't conflict as often.
* Added `TSPlayer` to `GetDataHandlers.NPCStrike`. (@hakusaro)
* Added `TSPlayer` to `GetDataHandlers.PlayerAnimation`. (@hakusaro)
* Added `GetDataHandlers.MassWireOperation` hook and related arguments. (@hakusaro)
+* Added `GetDataHandlers.PlaceTileEntity` hook and related arguments. (@hakusaro)
## TShock 4.3.25
* Fixed a critical exploit in the Terraria protocol that could cause massive unpreventable world corruption as well as a number of other problems. Thanks to @bartico6 for reporting. Fixed by the efforts of @QuiCM, @hakusaro, and tips in the right directioon from @bartico6.
diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs
index 731abbda..b8df3ddb 100644
--- a/TShockAPI/Bouncer.cs
+++ b/TShockAPI/Bouncer.cs
@@ -41,6 +41,7 @@ namespace TShockAPI
{
// Setup hooks
+ GetDataHandlers.PlaceTileEntity.Register(OnPlaceTileEntity);
GetDataHandlers.PlayerAnimation.Register(OnPlayerAnimation);
GetDataHandlers.NPCStrike.Register(OnNPCStrike);
GetDataHandlers.ItemDrop.Register(OnItemDrop);
@@ -60,6 +61,30 @@ namespace TShockAPI
GetDataHandlers.TileEdit.Register(OnTileEdit);
}
+ /// Fired when a PlaceTileEntity occurs for basic anti-cheat on perms and range.
+ /// The object that triggered the event.
+ /// The packet arguments that the event has.
+ internal void OnPlaceTileEntity(object sender, GetDataHandlers.PlaceTileEntityEventArgs args)
+ {
+ if (TShock.CheckIgnores(args.Player))
+ {
+ args.Handled = true;
+ return;
+ }
+
+ if (TShock.CheckTilePermission(args.Player, args.X, args.Y))
+ {
+ args.Handled = true;
+ return;
+ }
+
+ if (TShock.CheckRangePermission(args.Player, args.X, args.Y))
+ {
+ args.Handled = true;
+ return;
+ }
+ }
+
/// Handles validation of of basic anti-cheat on mass wire operations.
/// The object that triggered the event.
/// The packet arguments that the event has.
@@ -87,16 +112,22 @@ namespace TShockAPI
y = p.Y;
if (!TShock.Utils.TilePlacementValid(x, y) || (args.Player.Dead && TShock.Config.PreventDeadModification))
+ {
args.Handled = true;
return;
+ }
if (TShock.CheckIgnores(args.Player))
+ {
args.Handled = true;
return;
+ }
if (TShock.CheckTilePermission(args.Player, x, y))
+ {
args.Handled = true;
return;
+ }
}
}
@@ -497,8 +528,10 @@ namespace TShockAPI
int flag = args.Flag;
if (!TShock.Utils.TilePlacementValid(tileX, tileY) || (args.Player.Dead && TShock.Config.PreventDeadModification))
+ {
args.Handled = true;
return;
+ }
if (TShock.CheckIgnores(args.Player))
{
diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index eb7aa572..6721d5a1 100644
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -1304,6 +1304,42 @@ namespace TShockAPI
return args.Handled;
}
+ /// For use in a PlaceTileEntity event.
+ public class PlaceTileEntityEventArgs : HandledEventArgs
+ {
+ /// The TSPlayer that triggered the event.
+ public TSPlayer Player { get; set; }
+
+ /// The X coordinate of the event.
+ public short X { get; set; }
+
+ /// The Y coordinate of the event.
+ public short Y { get; set; }
+
+ /// The Type of event.
+ public byte Type { get; set; }
+ }
+
+ /// Fired when a PlaceTileEntity event occurs.
+ public static HandlerList PlaceTileEntity;
+
+ private static bool OnPlaceTileEntity(TSPlayer player, short x, short y, byte type)
+ {
+ if (PlaceTileEntity == null)
+ return false;
+
+ var args = new PlaceTileEntityEventArgs
+ {
+ Player = player,
+ X = x,
+ Y = y,
+ Type = type
+ };
+
+ PlaceTileEntity.Invoke(null, args);
+ return args.Handled;
+ }
+
///
/// For use with a NPCSpecial event
///
@@ -3175,7 +3211,14 @@ namespace TShockAPI
{
var x = args.Data.ReadInt16();
var y = args.Data.ReadInt16();
- var type = args.Data.ReadByte();
+ var type = (byte) args.Data.ReadByte();
+
+ if (OnPlaceTileEntity(args.Player, x, y, type))
+ {
+ return true;
+ }
+
+ // ItemBan subsystem
if (TShock.TileBans.TileIsBanned((short)TileID.LogicSensor, args.Player))
{
@@ -3184,21 +3227,6 @@ namespace TShockAPI
return true;
}
- if (TShock.CheckIgnores(args.Player))
- {
- return true;
- }
-
- if (TShock.CheckTilePermission(args.Player, x, y))
- {
- return true;
- }
-
- if (TShock.CheckRangePermission(args.Player, x, y))
- {
- return true;
- }
-
return false;
}