|
23 | 23 | import dev.noah.perplayerkit.util.Serializer; |
24 | 24 | import org.bukkit.Bukkit; |
25 | 25 | import org.bukkit.ChatColor; |
| 26 | +import org.bukkit.block.Container; |
26 | 27 | import org.bukkit.entity.Player; |
27 | 28 | import dev.noah.perplayerkit.util.SoundManager; |
28 | 29 | import org.bukkit.inventory.ItemStack; |
| 30 | +import org.bukkit.inventory.meta.BlockStateMeta; |
29 | 31 |
|
30 | 32 | import java.io.IOException; |
31 | 33 | import java.util.*; |
@@ -297,8 +299,27 @@ public boolean regearKit(Player player, int slot) { |
297 | 299 | } |
298 | 300 | } |
299 | 301 |
|
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; |
302 | 323 | continue; |
303 | 324 | } |
304 | 325 | } |
|
0 commit comments