diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 4660f3744..1e3059c9f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -849,9 +849,19 @@ public class BukkitBlockManager extends AbstractBlockManager { return states.get(0); } + @SuppressWarnings("unchecked") private void deceiveBukkit(Object newBlock, Key replacedBlock, boolean isNoteBlock) throws IllegalAccessException { - @SuppressWarnings("unchecked") Map magicMap = (Map) Reflections.field$CraftMagicNumbers$BLOCK_MATERIAL.get(null); - magicMap.put(newBlock, isNoteBlock ? Material.STONE : org.bukkit.Registry.MATERIAL.get(new NamespacedKey(replacedBlock.namespace(), replacedBlock.value()))); + Map factories = (Map) Reflections.field$CraftBlockStates$FACTORIES.get(null); + if (isNoteBlock) { + magicMap.put(newBlock, Material.STONE); + } else { + Material material = org.bukkit.Registry.MATERIAL.get(new NamespacedKey(replacedBlock.namespace(), replacedBlock.value())); + if (Reflections.clazz$CraftBlockStates$BlockEntityStateFactory.isInstance(factories.get(material))) { + magicMap.put(newBlock, Material.STONE); + } else { + magicMap.put(newBlock, material); + } + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 7ab1bed6b..87cc8d579 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6591,4 +6591,16 @@ public class Reflections { clazz$ServerboundResourcePackPacket, clazz$ServerboundResourcePackPacket$Action, 0 ) ); + + public static final Field field$CraftBlockStates$FACTORIES = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftBlockStates, "FACTORIES" + ) + ); + + public static final Class clazz$CraftBlockStates$BlockEntityStateFactory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockStates$BlockEntityStateFactory") + ) + ); }