From 3c3c5c00dd2fcad87858cf24c5a2643acf1fc197 Mon Sep 17 00:00:00 2001 From: iqtester Date: Wed, 16 Jul 2025 22:13:17 -0400 Subject: [PATCH 1/6] prevent multi-layer snow replacement --- .../craftengine/bukkit/world/BukkitBlockInWorld.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 170c50dd1..8d0451af7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -10,7 +10,9 @@ import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.data.type.Snow; public class BukkitBlockInWorld implements BlockInWorld { private final Block block; @@ -25,6 +27,10 @@ public class BukkitBlockInWorld implements BlockInWorld { if (customState != null && !customState.isEmpty()) { return customState.behavior().canBeReplaced(context, customState); } + if (this.block.getType() == Material.SNOW) { + Snow snow = (Snow) block.getBlockData(); + return snow.getLayers() == 1; + } return this.block.isReplaceable(); } From 07804a845985de335e40567e720efd8d0e432d0b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 17 Jul 2025 20:42:47 +0800 Subject: [PATCH 2/6] =?UTF-8?q?folia=E7=BB=99=E7=89=A9=E5=93=81=E8=B5=B0?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E8=B0=83=E5=BA=A6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/command/feature/GiveItemCommand.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java index fd056399e..c79161a19 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.bukkit.util.PlayerUtils; import net.momirealms.craftengine.core.item.CustomItem; @@ -10,6 +11,7 @@ import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import net.momirealms.craftengine.core.plugin.command.FlagKeys; import net.momirealms.craftengine.core.plugin.locale.MessageConstants; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -74,9 +76,17 @@ public class GiveItemCommand extends BukkitCommandFeature { ItemStack more = builtItem.clone(); more.setAmount(perStackSize); if (toInv) { - PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()); + if (VersionHelper.isFolia()) { + player.getScheduler().run(plugin().javaPlugin(), (t) -> PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()), () -> {}); + } else { + PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()); + } } else { - PlayerUtils.dropItem(player, more, false, true, false); + if (VersionHelper.isFolia()) { + player.getScheduler().run(plugin().javaPlugin(), (t) -> PlayerUtils.dropItem(player, more, false, true, false), () -> {}); + } else { + PlayerUtils.dropItem(player, more, false, true, false); + } } } } From fd94643440d752624969384f6ac26c3e470224dc Mon Sep 17 00:00:00 2001 From: iqtester Date: Thu, 17 Jul 2025 14:34:05 -0400 Subject: [PATCH 3/6] retrieving vanilla state once --- .../bukkit/world/BukkitBlockInWorld.java | 15 ++++++++++----- .../craftengine/core/item/ItemKeys.java | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 8d0451af7..a0596469f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -3,14 +3,15 @@ package net.momirealms.craftengine.bukkit.world; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.type.Snow; @@ -23,15 +24,19 @@ public class BukkitBlockInWorld implements BlockInWorld { @Override public boolean canBeReplaced(BlockPlaceContext context) { - ImmutableBlockState customState = CraftEngineBlocks.getCustomBlockState(this.block); + Object worldServer = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(this.block.getWorld()); + Object blockPos = LocationUtils.toBlockPos(this.block.getX(), this.block.getY(), this.block.getZ()); + Object state = FastNMS.INSTANCE.method$BlockGetter$getBlockState(worldServer, blockPos); + + ImmutableBlockState customState = BlockStateUtils.getOptionalCustomBlockState(state).orElse(null); if (customState != null && !customState.isEmpty()) { return customState.behavior().canBeReplaced(context, customState); } - if (this.block.getType() == Material.SNOW) { - Snow snow = (Snow) block.getBlockData(); + if (BlockStateUtils.getBlockOwnerIdFromState(state).equals(ItemKeys.SNOW)) { + Snow snow = (Snow) BlockStateUtils.fromBlockData(state); return snow.getLayers() == 1; } - return this.block.isReplaceable(); + return BlockStateUtils.isReplaceable(state); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java index 89916d9e3..a1991a9f8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -33,6 +33,7 @@ public class ItemKeys { public static final Key BARRIER = Key.of("minecraft:barrier"); public static final Key CACTUS = Key.of("minecraft:cactus"); public static final Key REDSTONE = Key.of("minecraft:redstone"); + public static final Key SNOW = Key.of("minecraft:snow"); public static final Key[] AXES = new Key[] { WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE From 755657617936f7cab8eae49ae1d037d04b4dda90 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 18 Jul 2025 04:03:19 +0800 Subject: [PATCH 4/6] 1.21.8 --- .../bukkit/item/factory/BukkitItemFactory.java | 2 +- .../bukkit/plugin/command/feature/GiveItemCommand.java | 1 - .../craftengine/core/util/MinecraftVersion.java | 3 ++- .../craftengine/core/util/MinecraftVersions.java | 1 + .../momirealms/craftengine/core/util/VersionHelper.java | 6 ++++++ gradle.properties | 8 ++++---- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index 42447daec..0c5ee3b3c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -49,7 +49,7 @@ public abstract class BukkitItemFactory> extend case "1.21.4" -> { return new ComponentItemFactory1_21_4(plugin); } - case "1.21.5", "1.21.6", "1.21.7", "1.22", "1.22.1" -> { + case "1.21.5", "1.21.6", "1.21.7", "1.21.8" -> { return new ComponentItemFactory1_21_5(plugin); } default -> throw new IllegalStateException("Unsupported server version: " + plugin.serverVersion()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java index c79161a19..f258b70f4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; -import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.bukkit.util.PlayerUtils; import net.momirealms.craftengine.core.item.CustomItem; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java index 75c383dd7..2e20c0a66 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java @@ -20,7 +20,8 @@ public final class MinecraftVersion implements Comparable { PACK_FORMATS.put(1_21_04, 46); PACK_FORMATS.put(1_21_05, 55); PACK_FORMATS.put(1_21_06, 63); - PACK_FORMATS.put(1_21_07, 64); // TODO 1.21.7-rc2 + PACK_FORMATS.put(1_21_07, 64); + PACK_FORMATS.put(1_21_08, 64); PACK_FORMATS.put(1_99_99, 1000); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java index a368a809a..2f28c73ad 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java @@ -18,5 +18,6 @@ public final class MinecraftVersions { public static final MinecraftVersion V1_21_5 = new MinecraftVersion("1.21.5"); public static final MinecraftVersion V1_21_6 = new MinecraftVersion("1.21.6"); public static final MinecraftVersion V1_21_7 = new MinecraftVersion("1.21.7"); + public static final MinecraftVersion V1_21_8 = new MinecraftVersion("1.21.8"); public static final MinecraftVersion FUTURE = new MinecraftVersion("1.99.99"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java index f88a0f19d..12e001c79 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -30,6 +30,7 @@ public class VersionHelper { private static final boolean v1_21_5; private static final boolean v1_21_6; private static final boolean v1_21_7; + private static final boolean v1_21_8; static { try (InputStream inputStream = Class.forName("net.minecraft.obfuscate.DontObfuscate").getResourceAsStream("/version.json")) { @@ -64,6 +65,7 @@ public class VersionHelper { v1_21_5 = version >= 12105; v1_21_6 = version >= 12106; v1_21_7 = version >= 12107; + v1_21_8 = version >= 12108; majorVersion = major; minorVersion = minor; @@ -215,4 +217,8 @@ public class VersionHelper { public static boolean isOrAbove1_21_7() { return v1_21_7; } + + public static boolean isOrAbove1_21_8() { + return v1_21_8; + } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index af7ef18be..649a773b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,17 +2,17 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.60.2 +project_version=0.0.60.3 config_version=42 lang_version=22 project_group=net.momirealms -latest_supported_version=1.21.7 +latest_supported_version=1.21.8 # Supported languages supported_languages=en,zh_cn,zh_tw,es,tr,de,ru_ru # Dependency settings -paper_version=1.21.7 +paper_version=1.21.8 jetbrains_annotations_version=26.0.2 slf4j_version=2.0.17 log4j_version=2.24.3 @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.35 +nms_helper_version=1.0.36 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From 84725e177ee77e358fcbee0193567324fbfe1ad9 Mon Sep 17 00:00:00 2001 From: iqtester Date: Thu, 17 Jul 2025 16:32:23 -0400 Subject: [PATCH 5/6] improve comparison --- .../bukkit/plugin/reflection/minecraft/MBlocks.java | 2 ++ .../craftengine/bukkit/world/BukkitBlockInWorld.java | 4 ++-- .../java/net/momirealms/craftengine/core/item/ItemKeys.java | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBlocks.java index 2cf9d1613..34d2f0e65 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBlocks.java @@ -17,6 +17,7 @@ public final class MBlocks { public static final Object SHORT_GRASS$defaultState; public static final Object SHULKER_BOX; public static final Object COMPOSTER; + public static final Object SNOW; private static Object getById(String id) { Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id); @@ -35,5 +36,6 @@ public final class MBlocks { SHORT_GRASS$defaultState = FastNMS.INSTANCE.method$Block$defaultState(SHORT_GRASS); SHULKER_BOX = getById("shulker_box"); COMPOSTER = getById("composter"); + SNOW = getById("snow"); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index a0596469f..6b6b6e675 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -2,12 +2,12 @@ package net.momirealms.craftengine.bukkit.world; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; -import net.momirealms.craftengine.core.item.ItemKeys; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.World; @@ -32,7 +32,7 @@ public class BukkitBlockInWorld implements BlockInWorld { if (customState != null && !customState.isEmpty()) { return customState.behavior().canBeReplaced(context, customState); } - if (BlockStateUtils.getBlockOwnerIdFromState(state).equals(ItemKeys.SNOW)) { + if (BlockStateUtils.getBlockOwner(state) == MBlocks.SNOW) { Snow snow = (Snow) BlockStateUtils.fromBlockData(state); return snow.getLayers() == 1; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java index a1991a9f8..89916d9e3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -33,7 +33,6 @@ public class ItemKeys { public static final Key BARRIER = Key.of("minecraft:barrier"); public static final Key CACTUS = Key.of("minecraft:cactus"); public static final Key REDSTONE = Key.of("minecraft:redstone"); - public static final Key SNOW = Key.of("minecraft:snow"); public static final Key[] AXES = new Key[] { WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE From 4c47407ba356e3ff83feee06602cb06704dabab9 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 18 Jul 2025 17:00:55 +0800 Subject: [PATCH 6/6] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=9B=AA=E7=9A=84=E6=9B=BF=E6=8D=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reflection/minecraft/CoreReflections.java | 23 +++++++++++++++++++ .../bukkit/util/BlockStateUtils.java | 7 ++++++ .../bukkit/world/BukkitBlockInWorld.java | 10 +++----- gradle.properties | 2 +- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index b8e41241c..77076e777 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -3873,4 +3873,27 @@ public final class CoreReflections { throw new ReflectionInitException("Failed to initialize HashOps", e); } } + + public static final Class clazz$SnowLayerBlock = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.level.block.BlockSnow", + "world.level.block.SnowLayerBlock" + ) + ); + + public static final Field field$SnowLayerBlock$LAYERS = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SnowLayerBlock, clazz$IntegerProperty, 0 + ) + ); + + public static final Object instance$SnowLayerBlock$LAYERS; + + static { + try { + instance$SnowLayerBlock$LAYERS = field$SnowLayerBlock$LAYERS.get(null); + } catch (IllegalAccessException e) { + throw new ReflectionInitException("Failed to initialize SnowLayerBlock$LAYERS", e); + } + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java index e575d2f20..00c8dfc57 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -11,6 +11,7 @@ import net.momirealms.craftengine.core.block.DelegatingBlockState; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.util.Key; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -142,4 +143,10 @@ public class BlockStateUtils { Object blockOwner = getBlockOwner(state); return IGNITE_ODDS.getOrDefault(blockOwner, 0) > 0; } + + public static Object getBlockState(Block block) { + Object worldServer = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(block.getWorld()); + Object blockPos = LocationUtils.toBlockPos(block.getX(), block.getY(), block.getZ()); + return FastNMS.INSTANCE.method$BlockGetter$getBlockState(worldServer, blockPos); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 6b6b6e675..6a9ce89a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.world; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; @@ -13,7 +14,6 @@ import net.momirealms.craftengine.core.world.BlockInWorld; import net.momirealms.craftengine.core.world.World; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.block.data.type.Snow; public class BukkitBlockInWorld implements BlockInWorld { private final Block block; @@ -24,17 +24,13 @@ public class BukkitBlockInWorld implements BlockInWorld { @Override public boolean canBeReplaced(BlockPlaceContext context) { - Object worldServer = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(this.block.getWorld()); - Object blockPos = LocationUtils.toBlockPos(this.block.getX(), this.block.getY(), this.block.getZ()); - Object state = FastNMS.INSTANCE.method$BlockGetter$getBlockState(worldServer, blockPos); - + Object state = BlockStateUtils.getBlockState(this.block); ImmutableBlockState customState = BlockStateUtils.getOptionalCustomBlockState(state).orElse(null); if (customState != null && !customState.isEmpty()) { return customState.behavior().canBeReplaced(context, customState); } if (BlockStateUtils.getBlockOwner(state) == MBlocks.SNOW) { - Snow snow = (Snow) BlockStateUtils.fromBlockData(state); - return snow.getLayers() == 1; + return (int) FastNMS.INSTANCE.method$StateHolder$getValue(state, CoreReflections.instance$SnowLayerBlock$LAYERS) == 1; } return BlockStateUtils.isReplaceable(state); } diff --git a/gradle.properties b/gradle.properties index 649a773b0..ef51839f9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.36 +nms_helper_version=1.0.37 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23