From 753056abd2b181b87846c44369308f770fe147c2 Mon Sep 17 00:00:00 2001 From: Emilia Kond Date: Wed, 12 Nov 2025 17:18:17 +0200 Subject: [PATCH] Use Paper's snapshot-less inventory holder method This simplifies the inventory listener and makes it more resistant to mistakes (such as forgetting an inventory type) and more future-proof, without sacrificing performance. In my initial tests, this has no performance impact but my testing wasn't on a particularly large scale. --- .../bolt/listeners/InventoryListener.java | 64 ++----------------- 1 file changed, 7 insertions(+), 57 deletions(-) diff --git a/bukkit/src/main/java/org/popcraft/bolt/listeners/InventoryListener.java b/bukkit/src/main/java/org/popcraft/bolt/listeners/InventoryListener.java index 0e13d2a3..ce6a05e2 100644 --- a/bukkit/src/main/java/org/popcraft/bolt/listeners/InventoryListener.java +++ b/bukkit/src/main/java/org/popcraft/bolt/listeners/InventoryListener.java @@ -1,12 +1,6 @@ package org.popcraft.bolt.listeners; import com.destroystokyo.paper.event.block.AnvilDamagedEvent; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.Tag; -import org.bukkit.block.Block; import org.bukkit.block.DoubleChest; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -16,7 +10,6 @@ import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; @@ -35,35 +28,9 @@ import org.popcraft.bolt.util.EnumUtil; import org.popcraft.bolt.util.Permission; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - public final class InventoryListener implements Listener { private static final SourceResolver BLOCK_SOURCE_RESOLVER = new SourceTypeResolver(Source.of(SourceTypes.BLOCK)); private static final SourceResolver REDSTONE_SOURCE_RESOLVER = new SourceTypeResolver(Source.of(SourceTypes.REDSTONE)); - private static final Tag COPPER_CHESTS = Bukkit.getTag(Tag.REGISTRY_BLOCKS, NamespacedKey.minecraft("copper_chests"), Material.class); - @SuppressWarnings("UnstableApiUsage") - private static final Map> INVENTORY_TYPE_BLOCKS = Map.ofEntries( - Map.entry(InventoryType.ANVIL, Set.of(Material.ANVIL, Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL)), - Map.entry(InventoryType.BARREL, Set.of(Material.BARREL)), - Map.entry(InventoryType.BLAST_FURNACE, Set.of(Material.BLAST_FURNACE)), - Map.entry(InventoryType.CHEST, new HashSet<>(Set.of(Material.CHEST, Material.TRAPPED_CHEST))), - Map.entry(InventoryType.CRAFTER, Set.of(Material.CRAFTER)), - Map.entry(InventoryType.DISPENSER, Set.of(Material.DISPENSER)), - Map.entry(InventoryType.DROPPER, Set.of(Material.DROPPER)), - Map.entry(InventoryType.FURNACE, Set.of(Material.FURNACE)), - Map.entry(InventoryType.HOPPER, Set.of(Material.HOPPER)), - Map.entry(InventoryType.SHULKER_BOX, Set.of(Material.SHULKER_BOX)), - Map.entry(InventoryType.SMOKER, Set.of(Material.SMOKER)) - ); - - static { - // Future: Replace with Tag.COPPER_CHESTS, and merge into map above (and remove new HashMap) - if (COPPER_CHESTS != null) { - INVENTORY_TYPE_BLOCKS.get(InventoryType.CHEST).addAll(COPPER_CHESTS.getValues()); - } - } // These exist only in newer versions of 1.21.4 and only in Paper. private static final InventoryAction PICKUP_FROM_BUNDLE = EnumUtil.valueOf(InventoryAction.class, "PICKUP_FROM_BUNDLE").orElse(null); @@ -217,29 +184,12 @@ public void onAnvilDamaged(final AnvilDamagedEvent e) { } private Protection getInventoryProtection(final Inventory inventory) { - final InventoryType inventoryType = inventory.getType(); - final Set blockTypes = INVENTORY_TYPE_BLOCKS.get(inventoryType); - if (blockTypes != null) { - final Location inventoryLocation = inventory.getLocation(); - if (inventoryLocation != null) { - final Block block = inventoryLocation.getBlock(); - if (blockTypes.contains(block.getType())) { - return plugin.findProtection(block); - } - } - } - return getHolderProtection(inventory.getHolder()); - } - - private Protection getHolderProtection(final InventoryHolder inventoryHolder) { - if (inventoryHolder instanceof final Entity entity) { - return plugin.findProtection(entity); - } else if (inventoryHolder instanceof final BlockInventoryHolder blockInventoryHolder) { - return plugin.findProtection(blockInventoryHolder.getBlock()); - } else if (inventoryHolder instanceof final DoubleChest doubleChest) { - return plugin.findProtection(doubleChest.getLocation().getBlock()); - } else { - return null; - } + final InventoryHolder holder = inventory.getHolder(false); + return switch (holder) { + case final Entity entity -> plugin.findProtection(entity); + case final BlockInventoryHolder blockInventoryHolder -> plugin.findProtection(blockInventoryHolder.getBlock()); + case final DoubleChest doubleChest -> plugin.findProtection(doubleChest.getLocation().getBlock()); + case null, default -> null; + }; } }