Skip to content

Commit 6c500df

Browse files
committed
fix(Bouncer): players bypass region protection and build permissions when using Quick Stack
1 parent 939d158 commit 6c500df

File tree

1 file changed

+41
-2
lines changed

1 file changed

+41
-2
lines changed

TShockAPI/Bouncer.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ You should have received a copy of the GNU General Public License
1919
using System.Collections.Generic;
2020
using System.Linq;
2121
using Terraria.ID;
22-
using TShockAPI.Net;
2322
using Terraria;
2423
using Microsoft.Xna.Framework;
2524
using TShockAPI.Localization;
@@ -29,6 +28,7 @@ You should have received a copy of the GNU General Public License
2928
using Terraria.Localization;
3029
using TShockAPI.Models.PlayerUpdate;
3130
using System.Threading.Tasks;
31+
using OTAPI;
3232
using Terraria.GameContent.Tile_Entities;
3333

3434
namespace TShockAPI
@@ -137,6 +137,7 @@ internal Bouncer()
137137
GetDataHandlers.KillMe += OnKillMe;
138138
GetDataHandlers.FishOutNPC += OnFishOutNPC;
139139
GetDataHandlers.FoodPlatterTryPlacing += OnFoodPlatterTryPlacing;
140+
OTAPI.Hooks.Chest.QuickStack += OnChestOnQuickStack;
140141

141142

142143
// 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
25052506
Main.item[num].playerIndexTheItemIsReservedFor = args.Player.Index;
25062507
NetMessage.SendData((int)PacketTypes.ItemDrop, args.Player.Index, -1, NetworkText.Empty, num, 1f);
25072508
NetMessage.SendData((int)PacketTypes.ItemOwner, args.Player.Index, -1, NetworkText.Empty, num);
2508-
2509+
25092510
TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlaceItemFrame rejected permissions from {0}", args.Player.Name));
25102511
NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, args.ItemFrame.ID, 0, 1);
25112512
args.Handled = true;
@@ -2871,6 +2872,44 @@ internal void OnFoodPlatterTryPlacing(object sender, GetDataHandlers.FoodPlatter
28712872
}
28722873
}
28732874

2875+
/// <summary>
2876+
/// Called when a player is trying to put an item into chest through Quick Stack.
2877+
/// </summary>
2878+
/// <param name="sender"></param>
2879+
/// <param name="args"></param>
2880+
internal void OnChestOnQuickStack(object sender, OTAPI.Hooks.Chest.QuickStackEventArgs args)
2881+
{
2882+
var id = args.ChestIndex;
2883+
var plr = TShock.Players[args.PlayerId];
2884+
2885+
if (plr is not { Active: true })
2886+
{
2887+
args.Result = HookResult.Cancel;
2888+
return;
2889+
}
2890+
2891+
if (plr.IsBeingDisabled())
2892+
{
2893+
TShock.Log.ConsoleDebug(GetString("Bouncer / OnQuickStack rejected from disable from {0}", plr.Name));
2894+
args.Result = HookResult.Cancel;
2895+
return;
2896+
}
2897+
2898+
if (!plr.HasBuildPermission(Main.chest[id].x, Main.chest[id].y) && TShock.Config.Settings.RegionProtectChests)
2899+
{
2900+
TShock.Log.ConsoleDebug(GetString("Bouncer / OnQuickStack rejected from region protection? from {0}", plr.Name));
2901+
args.Result = HookResult.Cancel;
2902+
return;
2903+
}
2904+
2905+
if (!plr.IsInRange(Main.chest[id].x, Main.chest[id].y, 600/16))
2906+
{
2907+
TShock.Log.ConsoleDebug(GetString("Bouncer / OnQuickStack rejected from range check from {0}", plr.Name));
2908+
args.Result = HookResult.Cancel;
2909+
return;
2910+
}
2911+
}
2912+
28742913
internal void OnSecondUpdate()
28752914
{
28762915
Task.Run(() =>

0 commit comments

Comments
 (0)