diff --git a/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBlockState.java b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBlockState.java index 428b1427b..c0513856f 100644 --- a/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBlockState.java +++ b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBlockState.java @@ -21,6 +21,7 @@ package art.arcane.iris.platform.bukkit; import art.arcane.iris.core.nms.INMS; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.util.common.data.B; +import art.arcane.iris.util.common.data.IrisCustomData; import org.bukkit.Bukkit; import org.bukkit.block.data.BlockData; @@ -37,6 +38,8 @@ public final class BukkitBlockState implements PlatformBlockState { private final BlockData data; private final String key; private final String namespace; + private volatile Boolean air; + private volatile Boolean solid; private BukkitBlockState(BlockData data, String key) { this.data = data; @@ -45,10 +48,29 @@ public final class BukkitBlockState implements PlatformBlockState { } public static BukkitBlockState of(BlockData data) { + if (data instanceof IrisCustomData custom) { + return new BukkitBlockState(data, custom.getAsString()); + } String key = data.getAsString(); return CACHE.computeIfAbsent(key, (String k) -> new BukkitBlockState(data, k)); } + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof BukkitBlockState state)) { + return false; + } + return data.equals(state.data); + } + + @Override + public int hashCode() { + return key.hashCode(); + } + private static String parseNamespace(String key) { String base = key; int bracket = base.indexOf('['); @@ -99,12 +121,22 @@ public final class BukkitBlockState implements PlatformBlockState { @Override public boolean isAir() { - return B.isAir(data); + Boolean cached = air; + if (cached == null) { + cached = B.isAir(data); + air = cached; + } + return cached; } @Override public boolean isSolid() { - return B.isSolid(data); + Boolean cached = solid; + if (cached == null) { + cached = B.isSolid(data); + solid = cached; + } + return cached; } @Override diff --git a/core/src/main/java/art/arcane/iris/util/common/data/B.java b/core/src/main/java/art/arcane/iris/util/common/data/B.java index 837834594..25b67a503 100644 --- a/core/src/main/java/art/arcane/iris/util/common/data/B.java +++ b/core/src/main/java/art/arcane/iris/util/common/data/B.java @@ -192,6 +192,15 @@ public class B { return BASE.get(bdxf); } + public static art.arcane.iris.spi.PlatformBlockState getState(String bdxf) { + return art.arcane.iris.platform.bukkit.BukkitBlockState.of(BASE.get(bdxf)); + } + + public static art.arcane.iris.spi.PlatformBlockState getStateOrNull(String bdxf) { + BlockData data = BASE.getOrNull(bdxf); + return data == null ? null : art.arcane.iris.platform.bukkit.BukkitBlockState.of(data); + } + public static boolean isStorage(BlockData mat) { return BASE.isStorage(mat); }