From 390649aa56852728aa7d428da4b14ec6c5b0b04b Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 21 Dec 2017 18:41:34 -0700 Subject: [PATCH] Move OnGetSection to Bouncer Bonus: Introduces a new GetDataHandledEventArgs for use in events that have players, data, and need to be handled. I was originally going to modify GetDataHandlerArgs, but that comes from the EventArgs class of args that isn't handled, and changing that to extend HandledEventArgs would imply we care or check to see if those are handled and we don't so we're stuck with this implementation for a teenie tiny bit. --- TShockAPI/Bouncer.cs | 23 +++++++++++++ TShockAPI/GetDataHandlers.cs | 63 +++++++++++++++++++++++++++++------- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 8e81d802..b0b6a427 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -42,6 +42,7 @@ namespace TShockAPI { // Setup hooks + GetDataHandlers.GetSection += OnGetSection; GetDataHandlers.PlaceItemFrame += OnPlaceItemFrame; GetDataHandlers.GemLockToggle += OnGemLockToggle; GetDataHandlers.PlaceTileEntity += OnPlaceTileEntity; @@ -64,6 +65,28 @@ namespace TShockAPI GetDataHandlers.TileEdit += OnTileEdit; } + internal void OnGetSection(object sender, GetDataHandlers.GetSectionEventArgs args) + { + if (args.Player.RequestedSection) + { + args.Handled = true; + return; + } + args.Player.RequestedSection = true; + + if (String.IsNullOrEmpty(args.Player.Name)) + { + TShock.Utils.ForceKick(args.Player, "Blank name.", true); + args.Handled = true; + return; + } + + if (!args.Player.HasPermission(Permissions.ignorestackhackdetection)) + { + args.Player.IsDisabledForStackDetection = args.Player.HasHackedItemStacks(true); + } + } + /// Fired when an item frame is placed for anti-cheat detection. /// The object that triggered the event. /// The packet arguments that the event has. diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 9162acd2..60ace5df 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -58,6 +58,19 @@ namespace TShockAPI } } + /// + /// A custom HandledEventArgs that contains TShock's TSPlayer for the triggering uesr and the Terraria MP data stream. + /// Differentiated by GetDataHandlerArgs because it can be handled and responds to being handled. + /// + public class GetDataHandledEventArgs : HandledEventArgs + { + /// The TSPlayer that triggered the event. + public TSPlayer Player { get; set; } + + /// The raw MP packet data associated with the event. + public MemoryStream Data { get; set; } + } + public static class GetDataHandlers { private static Dictionary GetDataHandlerDelegates; @@ -1903,21 +1916,47 @@ namespace TShockAPI return true; } + /// The arguments to a GetSection packet. + public class GetSectionEventArgs : GetDataHandledEventArgs + { + /// The X position requested. Or -1 for spawn. + public int X { get; set; } + + /// The Y position requested. Or -1 for spawn. + public int Y { get; set; } + } + + /// The hook for a GetSection event. + public static HandlerList GetSection = new HandlerList(); + + /// Fires a GetSection event. + /// The TSPlayer that caused the GetSection. + /// The raw MP protocol data. + /// The x coordinate requested or -1 for spawn. + /// The y coordinate requested or -1 for spawn. + /// bool + private static bool OnGetSection(TSPlayer player, MemoryStream data, int x, int y) + { + if (GetSection == null) + return false; + + var args = new GetSectionEventArgs + { + Player = player, + Data = data, + X = x, + Y = y, + }; + + GetSection.Invoke(null, args); + return args.Handled; + } + private static bool HandleGetSection(GetDataHandlerArgs args) { - if (args.Player.RequestedSection) - return true; - args.Player.RequestedSection = true; - if (String.IsNullOrEmpty(args.Player.Name)) - { - TShock.Utils.ForceKick(args.Player, "Blank name.", true); - return true; - } - if (!args.Player.HasPermission(Permissions.ignorestackhackdetection)) - { - args.Player.IsDisabledForStackDetection = args.Player.HasHackedItemStacks(true); - } + if (OnGetSection(args.Player, args.Data, args.Data.ReadInt32(), args.Data.ReadInt32())) + return true; if (TShock.Utils.ActivePlayers() + 1 > TShock.Config.MaxSlots && !args.Player.HasPermission(Permissions.reservedslot))