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] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96=E9=9B=AA?= =?UTF-8?q?=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