From 8599997e03ebc0665f981bba9b63f3bcafd4a650 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Wed, 28 Jul 2021 13:38:21 -0400 Subject: [PATCH] Work towards fixing shulkers --- .../openinv/internal/IAnySilentContainer.java | 22 +++++++++++++++---- .../internal/v1_16_R3/AnySilentContainer.java | 20 +++++++++++++++++ internal/v1_17_R1/pom.xml | 2 +- .../internal/v1_17_R1/AnySilentContainer.java | 20 +++++++++++++++++ scripts/get_spigot_versions.sh | 2 +- 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java index c042777..ef78c76 100644 --- a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java +++ b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java @@ -98,11 +98,17 @@ public interface IAnySilentContainer { Directional directional = (Directional) blockData; BlockFace face = directional.getFacing(); - boundingBox.shift(face.getDirection()); - // Return whether or not bounding boxes overlap. - return block.getRelative(face, 1).getBoundingBox().overlaps(boundingBox); - } + Block relative = block.getRelative(face, 1); + if (isShulkerIgnoreBoundingBox(relative)) { + // Certain special cases are ignored. Signs, simple redstone, etc. + return false; + } + + boundingBox.expand(face.getDirection(), 0.5); + // Return whether or not bounding boxes overlap. + return relative.getBoundingBox().overlaps(boundingBox); + } if (!(blockState instanceof org.bukkit.block.Chest)) { return false; @@ -140,6 +146,14 @@ public interface IAnySilentContainer { return isChestBlocked(relative); } + boolean isShulkerIgnoreBoundingBox(Block block); + + /** + * Determine whether or not a chest is blocked. + * + * @param chest the chest block + * @return true if the chest block cannot be opened under ordinary circumstances + */ default boolean isChestBlocked(Block chest) { org.bukkit.block.Block relative = chest.getRelative(0, 1, 0); return relative.getType().isOccluding() diff --git a/internal/v1_16_R3/src/main/java/com/lishid/openinv/internal/v1_16_R3/AnySilentContainer.java b/internal/v1_16_R3/src/main/java/com/lishid/openinv/internal/v1_16_R3/AnySilentContainer.java index 3e099c0..03a9173 100644 --- a/internal/v1_16_R3/src/main/java/com/lishid/openinv/internal/v1_16_R3/AnySilentContainer.java +++ b/internal/v1_16_R3/src/main/java/com/lishid/openinv/internal/v1_16_R3/AnySilentContainer.java @@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_16_R3; import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentContainer; import java.lang.reflect.Field; +import java.util.logging.Level; import net.minecraft.server.v1_16_R3.Block; import net.minecraft.server.v1_16_R3.BlockBarrel; import net.minecraft.server.v1_16_R3.BlockChest; @@ -46,8 +47,10 @@ import net.minecraft.server.v1_16_R3.TileEntityEnderChest; import net.minecraft.server.v1_16_R3.TileEntityLootable; import net.minecraft.server.v1_16_R3.TileInventory; import net.minecraft.server.v1_16_R3.World; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Statistic; +import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; @@ -66,6 +69,23 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public boolean isShulkerIgnoreBoundingBox(org.bukkit.block.Block bukkitBlock) { + org.bukkit.World bukkitWorld = bukkitBlock.getWorld(); + if (!(bukkitWorld instanceof CraftWorld)) { + bukkitWorld = Bukkit.getWorld(bukkitWorld.getUID()); + } + if (!(bukkitWorld instanceof CraftWorld)) { + Exception exception = new IllegalStateException("AnySilentContainer access attempted on an unknown world!"); + OpenInv.getPlugin(OpenInv.class).getLogger().log(Level.WARNING, exception.getMessage(), exception); + return false; + } + + final World world = ((CraftWorld) bukkitWorld).getHandle(); + final BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ()); + return world.getType(blockPosition).d(); + } + @Override public boolean activateContainer(@NotNull final Player bukkitPlayer, final boolean silentchest, @NotNull final org.bukkit.block.Block bukkitBlock) { diff --git a/internal/v1_17_R1/pom.xml b/internal/v1_17_R1/pom.xml index 2cd9043..2c06c72 100644 --- a/internal/v1_17_R1/pom.xml +++ b/internal/v1_17_R1/pom.xml @@ -39,7 +39,7 @@ spigot org.spigotmc provided - 1.17-R0.1-SNAPSHOT + 1.17.1-R0.1-SNAPSHOT openinvapi diff --git a/internal/v1_17_R1/src/main/java/com/lishid/openinv/internal/v1_17_R1/AnySilentContainer.java b/internal/v1_17_R1/src/main/java/com/lishid/openinv/internal/v1_17_R1/AnySilentContainer.java index 26a6266..672e890 100644 --- a/internal/v1_17_R1/src/main/java/com/lishid/openinv/internal/v1_17_R1/AnySilentContainer.java +++ b/internal/v1_17_R1/src/main/java/com/lishid/openinv/internal/v1_17_R1/AnySilentContainer.java @@ -48,8 +48,10 @@ import net.minecraft.world.level.block.entity.TileEntityEnderChest; import net.minecraft.world.level.block.entity.TileEntityLootable; import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.block.state.properties.BlockPropertyChestType; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Statistic; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; @@ -69,6 +71,24 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public boolean isShulkerIgnoreBoundingBox(org.bukkit.block.Block bukkitBlock) { + org.bukkit.World bukkitWorld = bukkitBlock.getWorld(); + if (!(bukkitWorld instanceof CraftWorld)) { + bukkitWorld = Bukkit.getWorld(bukkitWorld.getUID()); + } + if (!(bukkitWorld instanceof CraftWorld)) { + Exception exception = new IllegalStateException("AnySilentContainer access attempted on an unknown world!"); + OpenInv.getPlugin(OpenInv.class).getLogger().log(Level.WARNING, exception.getMessage(), exception); + return false; + } + + final World world = ((CraftWorld) bukkitWorld).getHandle(); + final BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ()); + // isLargeVoxelShape + return world.getType(blockPosition).d(); + } + @Override public boolean activateContainer( @NotNull final Player bukkitPlayer, diff --git a/scripts/get_spigot_versions.sh b/scripts/get_spigot_versions.sh index e524912..29376e0 100644 --- a/scripts/get_spigot_versions.sh +++ b/scripts/get_spigot_versions.sh @@ -16,7 +16,7 @@ # # TODO FIGURE OUT AND REMOVE WHEN LESS STRESS -hacky_versions=("1.16.5-R0.1-SNAPSHOT" "1.17-R0.1-SNAPSHOT") +hacky_versions=("1.16.5-R0.1-SNAPSHOT" "1.17.1-R0.1-SNAPSHOT") for hacky_version in "${hacky_versions[@]}"; do echo "$hacky_version" done