From 3bc1743ac6e7debf7c7e954e28eb70a8749dbf75 Mon Sep 17 00:00:00 2001 From: personalized-advertising <265311956+personalized-advertising@users.noreply.github.com> Date: Sun, 15 Mar 2026 02:49:52 +0000 Subject: [PATCH 1/4] get holder without snapshot --- .../internal/AnySilentContainerBase.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java index df477629..ca0fbc23 100644 --- a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java +++ b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java @@ -10,12 +10,15 @@ import org.bukkit.block.data.type.Chest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; import java.lang.reflect.Method; public abstract class AnySilentContainerBase implements IAnySilentContainer { private static final @Nullable Method BLOCK_GET_STATE_BOOLEAN; + private static final @Nullable Method INVENTORY_GET_HOLDER_BOOLEAN; static { @Nullable Method getState; @@ -26,6 +29,15 @@ public abstract class AnySilentContainerBase implements IAnySilentContainer { getState = null; } BLOCK_GET_STATE_BOOLEAN = getState; + + @Nullable Method getHolder; + try { + //noinspection JavaReflectionMemberAccess + getHolder = Inventory.class.getMethod("getHolder", boolean.class); + } catch (NoSuchMethodException e) { + getHolder = null; + } + INVENTORY_GET_HOLDER_BOOLEAN = getHolder; } private static BlockState getBlockState(Block block) { @@ -40,6 +52,18 @@ private static BlockState getBlockState(Block block) { return block.getState(); } + private static @Nullable InventoryHolder getHolder(@NotNull Inventory inventory) { + if (INVENTORY_GET_HOLDER_BOOLEAN != null) { + try { + return (InventoryHolder) INVENTORY_GET_HOLDER_BOOLEAN.invoke(inventory, false); + } catch (ReflectiveOperationException ignored) { + // fallback + } + } + + return inventory.getHolder(); + } + @Override public boolean isAnyContainerNeeded(@NotNull Block block) { BlockState blockState = getBlockState(block); From 0418e86a775e644a7deb783a6a63e31a87c9aa80 Mon Sep 17 00:00:00 2001 From: personalized-advertising <265311956+personalized-advertising@users.noreply.github.com> Date: Sun, 15 Mar 2026 02:51:48 +0000 Subject: [PATCH 2/4] use new method --- .../java/com/lishid/openinv/listener/ContainerListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java index 87fbb941..b2a9cc57 100644 --- a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java @@ -19,6 +19,7 @@ import com.google.errorprone.annotations.Keep; import com.lishid.openinv.internal.ViewOnly; import com.lishid.openinv.util.InternalAccessor; +import com.lishid.openinv.util.InventoryAccess; import com.lishid.openinv.util.Permissions; import com.lishid.openinv.util.lang.LanguageManager; import com.lishid.openinv.util.setting.PlayerToggles; @@ -100,7 +101,7 @@ private void onInventoryClose(@NotNull final InventoryCloseEvent event) { return; } - InventoryHolder holder = event.getInventory().getHolder(); + InventoryHolder holder = InventoryAccess.getHolder(event.getInventory()); if (PlayerToggles.silent().is(player) && holder != null && this.accessor.getAnySilentContainer().isAnySilentContainer(holder)) { From 4b799e160fbafb685cfe25e80d39a6b561d7bb89 Mon Sep 17 00:00:00 2001 From: personalized-advertising <265311956+personalized-advertising@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:05:06 +0000 Subject: [PATCH 3/4] oops --- .../com/lishid/openinv/internal/AnySilentContainerBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java index ca0fbc23..402de114 100644 --- a/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java +++ b/common/src/main/java/com/lishid/openinv/internal/AnySilentContainerBase.java @@ -52,7 +52,7 @@ private static BlockState getBlockState(Block block) { return block.getState(); } - private static @Nullable InventoryHolder getHolder(@NotNull Inventory inventory) { + public static @Nullable InventoryHolder getHolder(@NotNull Inventory inventory) { if (INVENTORY_GET_HOLDER_BOOLEAN != null) { try { return (InventoryHolder) INVENTORY_GET_HOLDER_BOOLEAN.invoke(inventory, false); From ff3750e39f000f126273b4e7030c6ade831adf90 Mon Sep 17 00:00:00 2001 From: personalized-advertising <265311956+personalized-advertising@users.noreply.github.com> Date: Sun, 15 Mar 2026 04:05:37 +0000 Subject: [PATCH 4/4] Update ContainerListener.java --- .../java/com/lishid/openinv/listener/ContainerListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java index b2a9cc57..5f675a15 100644 --- a/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listener/ContainerListener.java @@ -40,6 +40,8 @@ import org.bukkit.inventory.InventoryHolder; import org.jetbrains.annotations.NotNull; +import static com.lishid.openinv.internal.AnySilentContainerBase.getHolder; + /** * A listener managing AnyContainer, SilentContainer, and more. */ @@ -101,7 +103,7 @@ private void onInventoryClose(@NotNull final InventoryCloseEvent event) { return; } - InventoryHolder holder = InventoryAccess.getHolder(event.getInventory()); + InventoryHolder holder = getHolder(event.getInventory()); if (PlayerToggles.silent().is(player) && holder != null && this.accessor.getAnySilentContainer().isAnySilentContainer(holder)) {