From 914782ab9ebb6f00b76e324b2fe00779ff625b51 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Thu, 7 Dec 2017 21:43:33 -0700 Subject: [PATCH] Create hook PlaceObject; move anti-hack to Bouncer --- TShockAPI/Bouncer.cs | 136 +++++++++++++++++++++++++++++++++++ TShockAPI/GetDataHandlers.cs | 132 +++++++++++----------------------- 2 files changed, 179 insertions(+), 89 deletions(-) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 5199dcb0..d11cac4d 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -27,6 +27,7 @@ using OTAPI.Tile; using TShockAPI.Localization; using static TShockAPI.GetDataHandlers; using TerrariaApi.Server; +using Terraria.ObjectData; namespace TShockAPI @@ -40,11 +41,138 @@ namespace TShockAPI { // Setup hooks + GetDataHandlers.PlaceObject.Register(OnPlaceObject); GetDataHandlers.SendTileSquare.Register(OnSendTileSquare); GetDataHandlers.HealOtherPlayer.Register(OnHealOtherPlayer); GetDataHandlers.TileEdit.Register(OnTileEdit); } + internal void OnPlaceObject(object sender, GetDataHandlers.PlaceObjectEventArgs args) + { + short x = args.X; + short y = args.Y; + short type = args.Type; + short style = args.Style; + byte alternate = args.Alternate; + bool direction = args.Direction; + + if (type < 0 || type >= Main.maxTileSets) + { + args.Handled = true; + return; + } + + if (x < 0 || x >= Main.maxTilesX) + { + args.Handled = true; + return; + } + + if (y < 0 || y >= Main.maxTilesY) + { + args.Handled = true; + return; + } + + //style 52 and 53 are used by ItemID.Fake_newchest1 and ItemID.Fake_newchest2 + //These two items cause localised lag and rendering issues + if (type == TileID.FakeContainers && (style == 52 || style == 53)) + { + args.Player.SendTileSquare(x, y, 4); + args.Handled = true; + return; + } + + if (TShock.TileBans.TileIsBanned(type, args.Player)) + { + args.Player.SendTileSquare(x, y, 1); + args.Player.SendErrorMessage("You do not have permission to place this tile."); + args.Handled = true; + return; + } + + if (!TShock.Utils.TilePlacementValid(x, y)) + { + args.Handled = true; + return; + } + + if (args.Player.Dead && TShock.Config.PreventDeadModification) + { + args.Handled = true; + return; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendTileSquare(x, y, 4); + args.Handled = true; + return; + } + + // This is neccessary to check in order to prevent special tiles such as + // queen bee larva, paintings etc that use this packet from being placed + // without selecting the right item. + if (type != args.Player.TPlayer.inventory[args.Player.TPlayer.selectedItem].createTile) + { + args.Player.SendTileSquare(x, y, 4); + args.Handled = true; + return; + } + + TileObjectData tileData = TileObjectData.GetTileData(type, style, 0); + if (tileData == null) + { + args.Handled = true; + return; + } + + x -= tileData.Origin.X; + y -= tileData.Origin.Y; + + for (int i = x; i < x + tileData.Width; i++) + { + for (int j = y; j < y + tileData.Height; j++) + { + if (TShock.CheckTilePermission(args.Player, i, j, type, EditAction.PlaceTile)) + { + args.Player.SendTileSquare(i, j, 4); + args.Handled = true; + return; + } + } + } + + // Ignore rope placement range + if ((type != TileID.Rope + || type != TileID.SilkRope + || type != TileID.VineRope + || type != TileID.WebRope) + && TShock.CheckRangePermission(args.Player, x, y)) + { + args.Player.SendTileSquare(x, y, 4); + args.Handled = true; + return; + } + + if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) + { + args.Player.Disable("Reached TilePlace threshold.", DisableFlags.WriteToLogAndConsole); + args.Player.SendTileSquare(x, y, 4); + args.Handled = true; + return; + } + + if (!args.Player.HasPermission(Permissions.ignoreplacetiledetection)) + { + args.Player.TilePlaceThreshold++; + var coords = new Vector2(x, y); + lock (args.Player.TilesCreated) + if (!args.Player.TilesCreated.ContainsKey(coords)) + args.Player.TilesCreated.Add(coords, Main.tile[x, y]); + } + } + internal void OnTileEdit(object sender, GetDataHandlers.TileEditEventArgs args) { EditAction action = args.Action; @@ -64,14 +192,22 @@ namespace TShockAPI } if (!TShock.Utils.TilePlacementValid(tileX, tileY)) + { args.Handled = true; return; + } + if (action == EditAction.KillTile && Main.tile[tileX, tileY].type == TileID.MagicalIceBlock) + { args.Handled = false; return; + } + if (args.Player.Dead && TShock.Config.PreventDeadModification) + { args.Handled = true; return; + } if (args.Player.AwaitingName) { diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 7fbfd560..1997c554 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -613,9 +613,51 @@ namespace TShockAPI TileX = tilex, TileY = tiley, }; + SendTileSquare.Invoke(null, args); return args.Handled; } + + public class PlaceObjectEventArgs : HandledEventArgs + { + public TSPlayer Player { get; set; } + + public short X { get; set ; } + + public short Y { get; set; } + + public short Type { get; set; } + + public short Style { get; set; } + + public byte Alternate { get; set; } + + public bool Direction { get; set; } + } + + public static HandlerList PlaceObject; + + private static bool OnPlaceObject(TSPlayer player, short x, short y, short type, short style, byte alternate, bool direction) + { + if (PlaceObject == null) + return false; + + var args = new PlaceObjectEventArgs + { + Player = player, + X = x, + Y = y, + Type = type, + Style = style, + Alternate = alternate, + Direction = direction + }; + + PlaceObject.Invoke(null, args); + return args.Handled; + } + + /// /// For use in a NewProjectile event /// @@ -1826,7 +1868,6 @@ namespace TShockAPI return false; } - /// /// Handle PlaceObject event /// @@ -1839,96 +1880,9 @@ namespace TShockAPI byte alternate = args.Data.ReadInt8(); bool direction = args.Data.ReadBoolean(); - if (type < 0 || type >= Main.maxTileSets) + if (OnPlaceObject(args.Player, x, y, type, style, alternate, direction)) return true; - if (x < 0 || x >= Main.maxTilesX) - return true; - - if (y < 0 || y >= Main.maxTilesY) - return true; - - //style 52 and 53 are used by ItemID.Fake_newchest1 and ItemID.Fake_newchest2 - //These two items cause localised lag and rendering issues - if (type == TileID.FakeContainers && (style == 52 || style == 53)) - { - args.Player.SendTileSquare(x, y, 4); - return true; - } - - if (TShock.TileBans.TileIsBanned(type, args.Player)) - { - args.Player.SendTileSquare(x, y, 1); - args.Player.SendErrorMessage("You do not have permission to place this tile."); - return true; - } - - if (!TShock.Utils.TilePlacementValid(x, y)) - return true; - if (args.Player.Dead && TShock.Config.PreventDeadModification) - return true; - - if (TShock.CheckIgnores(args.Player)) - { - args.Player.SendTileSquare(x, y, 4); - return true; - } - - // This is neccessary to check in order to prevent special tiles such as - // queen bee larva, paintings etc that use this packet from being placed - // without selecting the right item. - if (type != args.TPlayer.inventory[args.TPlayer.selectedItem].createTile) - { - args.Player.SendTileSquare(x, y, 4); - return true; - } - - TileObjectData tileData = TileObjectData.GetTileData(type, style, 0); - if (tileData == null) - return true; - - x -= tileData.Origin.X; - y -= tileData.Origin.Y; - - for (int i = x; i < x + tileData.Width; i++) - { - for (int j = y; j < y + tileData.Height; j++) - { - if (TShock.CheckTilePermission(args.Player, i, j, type, EditAction.PlaceTile)) - { - args.Player.SendTileSquare(i, j, 4); - return true; - } - } - } - - // Ignore rope placement range - if ((type != TileID.Rope - || type != TileID.SilkRope - || type != TileID.VineRope - || type != TileID.WebRope) - && TShock.CheckRangePermission(args.Player, x, y)) - { - args.Player.SendTileSquare(x, y, 4); - return true; - } - - if (args.Player.TilePlaceThreshold >= TShock.Config.TilePlaceThreshold) - { - args.Player.Disable("Reached TilePlace threshold.", DisableFlags.WriteToLogAndConsole); - args.Player.SendTileSquare(x, y, 4); - return true; - } - - if (!args.Player.HasPermission(Permissions.ignoreplacetiledetection)) - { - args.Player.TilePlaceThreshold++; - var coords = new Vector2(x, y); - lock (args.Player.TilesCreated) - if (!args.Player.TilesCreated.ContainsKey(coords)) - args.Player.TilesCreated.Add(coords, Main.tile[x, y]); - } - return false; }