Skip to content

Commit 9ebe554

Browse files
Noah Rossrossnoah
authored andcommitted
fix shulker bypass in regear whitelist
Players could hide restricted items inside a shulker box and regear them back since only the top-level item type was checked against the whitelist/blacklist. Now the contents of any shulker (or container) in a kit slot are filtered with the same whitelist logic before being returned to the player.
1 parent 7caa2cb commit 9ebe554

1 file changed

Lines changed: 23 additions & 2 deletions

File tree

src/main/java/dev/noah/perplayerkit/KitManager.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
import dev.noah.perplayerkit.util.Serializer;
2424
import org.bukkit.Bukkit;
2525
import org.bukkit.ChatColor;
26+
import org.bukkit.block.Container;
2627
import org.bukkit.entity.Player;
2728
import dev.noah.perplayerkit.util.SoundManager;
2829
import org.bukkit.inventory.ItemStack;
30+
import org.bukkit.inventory.meta.BlockStateMeta;
2931

3032
import java.io.IOException;
3133
import java.util.*;
@@ -297,8 +299,27 @@ public boolean regearKit(Player player, int slot) {
297299
}
298300
}
299301

300-
if (playerInventory[i] == null || playerInventory[i].getType().isAir() || playerInventory[i].getType() == kit[i].getType()) {
301-
playerInventory[i] = kit[i];
302+
ItemStack kitItem = kit[i].clone();
303+
304+
// Filter contents of any shulker box (or other container) against the same whitelist,
305+
// preventing players from bypassing regear restrictions by hiding items inside shulkers.
306+
if (kitItem.getItemMeta() instanceof BlockStateMeta blockStateMeta
307+
&& blockStateMeta.getBlockState() instanceof Container container) {
308+
ItemStack[] contents = container.getInventory().getContents();
309+
for (int j = 0; j < contents.length; j++) {
310+
if (contents[j] == null) continue;
311+
boolean onList = whitelist.contains(contents[j].getType().toString());
312+
if (invertWhitelist ? onList : !onList) {
313+
contents[j] = null;
314+
}
315+
}
316+
container.getInventory().setContents(contents);
317+
blockStateMeta.setBlockState(container);
318+
kitItem.setItemMeta(blockStateMeta);
319+
}
320+
321+
if (playerInventory[i] == null || playerInventory[i].getType().isAir() || playerInventory[i].getType() == kitItem.getType()) {
322+
playerInventory[i] = kitItem;
302323
continue;
303324
}
304325
}

0 commit comments

Comments
 (0)