diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 488abe617..dde7f1a5e 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -19,7 +19,6 @@ You should have received a copy of the GNU General Public License using System.Collections.Generic; using System.Linq; using Terraria.ID; -using TShockAPI.Net; using Terraria; using Microsoft.Xna.Framework; using TShockAPI.Localization; @@ -29,6 +28,7 @@ You should have received a copy of the GNU General Public License using Terraria.Localization; using TShockAPI.Models.PlayerUpdate; using System.Threading.Tasks; +using OTAPI; using Terraria.GameContent.Tile_Entities; namespace TShockAPI @@ -137,6 +137,7 @@ internal Bouncer() GetDataHandlers.KillMe += OnKillMe; GetDataHandlers.FishOutNPC += OnFishOutNPC; GetDataHandlers.FoodPlatterTryPlacing += OnFoodPlatterTryPlacing; + OTAPI.Hooks.Chest.QuickStack += OnQuickStack; // The following section is based off Player.PlaceThing_Tiles_PlaceIt and Player.PlaceThing_Tiles_PlaceIt_GetLegacyTileStyle. @@ -2505,7 +2506,7 @@ internal void OnPlaceItemFrame(object sender, GetDataHandlers.PlaceItemFrameEven Main.item[num].playerIndexTheItemIsReservedFor = args.Player.Index; NetMessage.SendData((int)PacketTypes.ItemDrop, args.Player.Index, -1, NetworkText.Empty, num, 1f); NetMessage.SendData((int)PacketTypes.ItemOwner, args.Player.Index, -1, NetworkText.Empty, num); - + TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlaceItemFrame rejected permissions from {0}", args.Player.Name)); NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, args.ItemFrame.ID, 0, 1); args.Handled = true; @@ -2871,6 +2872,37 @@ internal void OnFoodPlatterTryPlacing(object sender, GetDataHandlers.FoodPlatter } } + /// + /// Called when a player is trying to put an item into chest through Quick Stack. + /// + /// + /// + internal void OnQuickStack(object sender, OTAPI.Hooks.Chest.QuickStackEventArgs args) + { + var id = args.ChestIndex; + var plr = TShock.Players[args.PlayerId]; + + if (plr is not { Active: true }) + { + args.Result = HookResult.Cancel; + return; + } + + if (plr.IsBeingDisabled()) + { + TShock.Log.ConsoleDebug(GetString("Bouncer / OnQuickStack rejected from disable from {0}", plr.Name)); + args.Result = HookResult.Cancel; + return; + } + + if (!plr.HasBuildPermission(Main.chest[id].x, Main.chest[id].y) && TShock.Config.Settings.RegionProtectChests) + { + TShock.Log.ConsoleDebug(GetString("Bouncer / OnQuickStack rejected from region protection? from {0}", plr.Name)); + args.Result = HookResult.Cancel; + return; + } + } + internal void OnSecondUpdate() { Task.Run(() =>