diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b591efc..e48fd0cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ Putting this stuff down here so things don't conflict as often. * Added `TSPlayer` to `GetDataHandlers.PlayerAnimation`. (@hakusaro) * Added `GetDataHandlers.MassWireOperation` hook and related arguments. (@hakusaro) * Added `GetDataHandlers.PlaceTileEntity` hook and related arguments. (@hakusaro) +* Added `TSPlayer` to `GetDataHandlers.GemLockToggle`. (@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 b8df3ddb..d29b94ae 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -41,6 +41,7 @@ namespace TShockAPI { // Setup hooks + GetDataHandlers.GemLockToggle.Register(OnGemLockToggle); GetDataHandlers.PlaceTileEntity.Register(OnPlaceTileEntity); GetDataHandlers.PlayerAnimation.Register(OnPlayerAnimation); GetDataHandlers.NPCStrike.Register(OnNPCStrike); @@ -61,6 +62,36 @@ namespace TShockAPI GetDataHandlers.TileEdit.Register(OnTileEdit); } + /// Handles the anti-cheat components of gem lock toggles. + /// The object that triggered the event. + /// The packet arguments that the event has. + internal void OnGemLockToggle(object sender, GetDataHandlers.GemLockToggleEventArgs args) + { + if (args.X < 0 || args.Y < 0 || args.X >= Main.maxTilesX || args.Y >= Main.maxTilesY) + { + args.Handled = true; + return; + } + + if (!TShock.Utils.TilePlacementValid(args.X, args.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, args.X, args.Y)) + { + args.Handled = true; + return; + } + } + /// 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. diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 6721d5a1..8e10eb98 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -3080,14 +3080,16 @@ namespace TShockAPI /// public class GemLockToggleEventArgs : HandledEventArgs { + /// The TSPlayer that triggered the event. + public TSPlayer Player { get; set; } /// /// X Location /// - public Int32 X { get; set; } + public short X { get; set; } /// /// Y Location /// - public Int32 Y { get; set; } + public short Y { get; set; } /// /// On status /// @@ -3099,7 +3101,7 @@ namespace TShockAPI /// public static HandlerList GemLockToggle; - private static bool OnGemLockToggle(Int32 x, Int32 y, bool on) + private static bool OnGemLockToggle(short x, short y, bool on) { if (GemLockToggle == null) return false; @@ -3116,15 +3118,10 @@ namespace TShockAPI private static bool HandleGemLockToggle(GetDataHandlerArgs args) { - var x = (int)args.Data.ReadInt16(); - var y = (int)args.Data.ReadInt16(); + var x = args.Data.ReadInt16(); + var y = args.Data.ReadInt16(); var on = args.Data.ReadBoolean(); - if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) - { - return true; - } - if (OnGemLockToggle(x, y, on)) { return true; @@ -3135,21 +3132,6 @@ namespace TShockAPI return false; } - if (!TShock.Utils.TilePlacementValid(x, y) || (args.Player.Dead && TShock.Config.PreventDeadModification)) - { - return true; - } - - if (TShock.CheckIgnores(args.Player)) - { - return true; - } - - if (TShock.CheckTilePermission(args.Player, x, y)) - { - return true; - } - return false; }