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..402de114 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(); } + public 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); 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..5f675a15 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; @@ -39,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. */ @@ -100,7 +103,7 @@ private void onInventoryClose(@NotNull final InventoryCloseEvent event) { return; } - InventoryHolder holder = event.getInventory().getHolder(); + InventoryHolder holder = getHolder(event.getInventory()); if (PlayerToggles.silent().is(player) && holder != null && this.accessor.getAnySilentContainer().isAnySilentContainer(holder)) {