From 528c97f3677e277bf9881dbc052948fa1ff56d8e Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Wed, 26 Nov 2025 21:32:13 +0100 Subject: [PATCH] replace IrisCustomData class with a proxy to keep full access to the base BlockData --- .../core/link/data/HMCLeavesDataProvider.java | 2 +- .../link/data/MythicCrucibleDataProvider.java | 2 +- .../iris/core/link/data/NexoDataProvider.java | 4 +- .../volmit/iris/util/data/IrisCustomData.java | 167 +++++++----------- 4 files changed, 63 insertions(+), 112 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/link/data/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/data/HMCLeavesDataProvider.java index bbf2cd197..eb17801d7 100644 --- a/core/src/main/java/com/volmit/iris/core/link/data/HMCLeavesDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/data/HMCLeavesDataProvider.java @@ -67,7 +67,7 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { BlockData blockData = Bukkit.createBlockData(material); if (IrisSettings.get().getGenerator().preventLeafDecay && blockData instanceof Leaves leaves) leaves.setPersistent(true); - return new IrisCustomData(blockData, ExternalDataSVC.buildState(blockId, state)); + return IrisCustomData.of(blockData, ExternalDataSVC.buildState(blockId, state)); } @NotNull diff --git a/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java index 86d2ce327..b264e144a 100644 --- a/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java @@ -72,7 +72,7 @@ public class MythicCrucibleDataProvider extends ExternalDataProvider { CustomBlockItemContext blockItemContext = crucibleItem.getBlockData(); FurnitureItemContext furnitureItemContext = crucibleItem.getFurnitureData(); if (furnitureItemContext != null) { - return new IrisCustomData(B.getAir(), ExternalDataSVC.buildState(blockId, state)); + return IrisCustomData.of(B.getAir(), ExternalDataSVC.buildState(blockId, state)); } else if (blockItemContext != null) { return blockItemContext.getBlockData(); } diff --git a/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java index a0029c320..4eeff9a31 100644 --- a/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java @@ -49,9 +49,9 @@ public class NexoDataProvider extends ExternalDataProvider { BlockData data = NexoBlocks.blockData(blockId.key()); if (data == null) throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); - return new IrisCustomData(data, blockState); + return IrisCustomData.of(data, blockState); } else if (NexoFurniture.isFurniture(blockId.key())) { - return new IrisCustomData(B.getAir(), blockState); + return IrisCustomData.of(B.getAir(), blockState); } throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); diff --git a/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java b/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java index c02ea2879..20076cf84 100644 --- a/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java +++ b/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java @@ -1,127 +1,78 @@ package com.volmit.iris.util.data; import com.volmit.iris.core.link.Identifier; -import lombok.Data; +import com.volmit.iris.util.collection.KMap; import lombok.NonNull; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.SoundGroup; -import org.bukkit.block.*; import org.bukkit.block.data.BlockData; -import org.bukkit.block.structure.Mirror; -import org.bukkit.block.structure.StructureRotation; -import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -@Data -public class IrisCustomData implements BlockData { - private final @NonNull BlockData base; - private final @NotNull Identifier custom; +import java.lang.reflect.Proxy; +import java.util.*; - @NotNull - @Override - public Material getMaterial() { - return base.getMaterial(); +public interface IrisCustomData extends BlockData { + @NonNull BlockData getBase(); + @NonNull Identifier getCustom(); + + static IrisCustomData of(@NotNull BlockData base, @NotNull Identifier custom) { + var clazz = base.getClass(); + var loader = clazz.getClassLoader(); + return (IrisCustomData) Proxy.newProxyInstance(loader, Internal.getInterfaces(loader, clazz), (proxy, method, args) -> + switch (method.getName()) { + case "getBase" -> base; + case "getCustom" -> custom; + case "merge" -> of(base.merge((BlockData) args[0]), custom); + case "clone" -> of(base.clone(), custom); + case "hashCode" -> Objects.hash(base, custom); + case "copyTo" -> throw new UnsupportedOperationException("Cannot copy from custom block data"); + case "matches" -> { + if (!(args[0] instanceof IrisCustomData store)) + yield false; + yield base.matches(store.getBase()) && custom.equals(store.getCustom()); + } + case "equals" -> { + if (!(args[0] instanceof IrisCustomData store)) + yield false; + yield store.getBase().equals(base) && store.getCustom().equals(custom); + } + default -> method.invoke(base, args); + }); } - @NotNull - @Override - public String getAsString() { - return base.getAsString(); - } + @ApiStatus.Internal + abstract class Internal { + private static final KMap, Class[]> cache = new KMap<>(); - @NotNull - @Override - public String getAsString(boolean b) { - return base.getAsString(b); - } + private static Class[] getInterfaces(ClassLoader loader, Class base) { + return cache.computeIfAbsent(base, k -> { + Queue> queue = new LinkedList<>(); + Set> set = new HashSet<>(); - @NotNull - @Override - public BlockData merge(@NotNull BlockData blockData) { - return new IrisCustomData(base.merge(blockData), custom); - } + queue.add(k); + while (!queue.isEmpty()) { + Class i = queue.poll(); - @Override - public boolean matches(@Nullable BlockData blockData) { - if (blockData instanceof IrisCustomData b) - return custom.equals(b.custom) && base.matches(b.base); - return base.matches(blockData); - } + if (!BlockData.class.isAssignableFrom(i)) + continue; - @NotNull - @Override - public BlockData clone() { - return new IrisCustomData(base.clone(), custom); - } + for (Class j : i.getInterfaces()) { + if (j.isSealed() || j.isHidden()) + continue; - @NotNull - @Override - public SoundGroup getSoundGroup() { - return base.getSoundGroup(); - } + try { + Class.forName(j.getName(), false, loader); + set.add(j); + } catch (ClassNotFoundException ignored) {} + } - @Override - public int getLightEmission() { - return base.getLightEmission(); - } + var parent = i.getSuperclass(); + if (parent != null) + queue.add(parent); + } - @Override - public boolean isOccluding() { - return base.isOccluding(); - } - - @Override - public boolean requiresCorrectToolForDrops() { - return base.requiresCorrectToolForDrops(); - } - - @Override - public boolean isPreferredTool(@NotNull ItemStack itemStack) { - return base.isPreferredTool(itemStack); - } - - @NotNull - @Override - public PistonMoveReaction getPistonMoveReaction() { - return base.getPistonMoveReaction(); - } - - @Override - public boolean isSupported(@NotNull Block block) { - return base.isSupported(block); - } - - @Override - public boolean isSupported(@NotNull Location location) { - return base.isSupported(location); - } - - @Override - public boolean isFaceSturdy(@NotNull BlockFace blockFace, @NotNull BlockSupport blockSupport) { - return base.isFaceSturdy(blockFace, blockSupport); - } - - @NotNull - @Override - public Material getPlacementMaterial() { - return base.getPlacementMaterial(); - } - - @Override - public void rotate(@NotNull StructureRotation structureRotation) { - base.rotate(structureRotation); - } - - @Override - public void mirror(@NotNull Mirror mirror) { - base.mirror(mirror); - } - - @NotNull - @Override - public BlockState createBlockState() { - return base.createBlockState(); + set.add(IrisCustomData.class); + return set.toArray(Class[]::new); + }); + } } }