From de017f2d416c20fc573445be5be2511369f58521 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Fri, 15 Dec 2017 22:51:07 -0700 Subject: [PATCH] Create & move OnPlaceTileEntity to Bouncer; fix unreachable code --- CHANGELOG.md | 1 + TShockAPI/Bouncer.cs | 33 ++++++++++++++++++++ TShockAPI/GetDataHandlers.cs | 60 ++++++++++++++++++++++++++---------- 3 files changed, 78 insertions(+), 16 deletions(-) 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; }