From a01074e812fbaaf49969dcf787b044a2762a08bc Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:07:36 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix(block):=20=E4=BF=AE=E5=A4=8D=E9=97=A8?= =?UTF-8?q?=E6=8E=89=E8=90=BD=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/api/CraftEngineBlocks.java | 2 +- .../AbstractCanSurviveBlockBehavior.java | 2 +- .../block/behavior/DoorBlockBehavior.java | 52 ++++++++++++++++++- .../behavior/PressurePlateBlockBehavior.java | 2 +- .../UnsafeCompositeBlockBehavior.java | 12 +++++ .../plugin/injector/BlockGenerator.java | 33 +++++++++++- .../reflection/minecraft/CoreReflections.java | 10 ++++ .../plugin/user/BukkitServerPlayer.java | 9 +--- .../craftengine/bukkit/world/BukkitWorld.java | 2 +- .../craftengine/core/block/BlockBehavior.java | 5 ++ gradle.properties | 2 +- 11 files changed, 117 insertions(+), 14 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index bab5db3ec..f13128275 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -184,7 +184,7 @@ public final class CraftEngineBlocks { world.playBlockSound(position, state.settings().sounds().breakSound()); } if (sendParticles) { - FastNMS.INSTANCE.method$Level$levelEvent(world.serverWorld(), WorldEvents.BLOCK_BREAK_EFFECT, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), state.customBlockState().registryId()); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(world.serverWorld(), WorldEvents.BLOCK_BREAK_EFFECT, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), state.customBlockState().registryId()); } FastNMS.INSTANCE.method$Level$removeBlock(world.serverWorld(), LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), isMoving); return true; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java index 7e6bc299b..2f83e55e0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java @@ -75,7 +75,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos)); world.playBlockSound(position, customState.settings().sounds().breakSound()); - FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); return MBlocks.AIR$defaultState; } return state; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java index 189bf0fca..f053ff84a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java @@ -1,8 +1,12 @@ package net.momirealms.craftengine.bukkit.block.behavior; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; 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.MItems; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.DirectionUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; @@ -15,10 +19,13 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.block.state.properties.DoorHinge; import net.momirealms.craftengine.core.block.state.properties.DoubleBlockHalf; +import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.entity.player.InteractionResult; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.HorizontalDirection; @@ -32,6 +39,7 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Door; import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import javax.annotation.Nullable; @@ -111,13 +119,55 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos)); world.playBlockSound(position, customState.settings().sounds().breakSound()); - FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); return MBlocks.AIR$defaultState; } return blockState; } } + @Override + public Object playerWillDestroy(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[0]; + Object pos = args[1]; + Object state = args[2]; + Object player = args[3]; + ImmutableBlockState blockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (blockState == null || blockState.isEmpty()) return superMethod.call(); + org.bukkit.entity.Player bukkitPlayer = FastNMS.INSTANCE.method$ServerPlayer$getBukkitEntity(player); + BukkitServerPlayer cePlayer = BukkitCraftEngine.instance().adapt(bukkitPlayer); + Item item = cePlayer.getItemInHand(InteractionHand.MAIN_HAND); + if (preventsBlockDrops(cePlayer) || !hasCorrectToolForDrops(blockState, item)) { + preventDropFromBottomPart(level, pos, blockState, player); + } + return superMethod.call(); + } + + private void preventDropFromBottomPart(Object level, Object pos, ImmutableBlockState state, Object player) { + DoubleBlockHalf half = state.get(this.halfProperty); + if (half == DoubleBlockHalf.UPPER) { + Object blockPos = FastNMS.INSTANCE.method$BlockPos$relative(pos, CoreReflections.instance$Direction$DOWN); + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, blockPos); + ImmutableBlockState belowState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (belowState == null || belowState.isEmpty()) return; + Optional belowDoorBehavior = belowState.behavior().getAs(DoorBlockBehavior.class); + if (belowDoorBehavior.isEmpty() || belowState.get(this.halfProperty) != DoubleBlockHalf.LOWER) return; + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, blockPos, MBlocks.AIR$defaultState, UpdateOption.builder().updateSuppressDrops().updateClients().updateNeighbors().build().flags()); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(level, player, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, belowState.customBlockState().registryId()); + } + } + + private boolean hasCorrectToolForDrops(ImmutableBlockState state, @Nullable Item item) { + if (item == null) return !state.settings().requireCorrectTool(); + return !state.settings().requireCorrectTool() + || state.settings().isCorrectTool(item.id()) + || (state.settings().respectToolComponent() && FastNMS.INSTANCE.method$ItemStack$isCorrectToolForDrops(item.getLiteralObject(), state)); + } + + private boolean preventsBlockDrops(BukkitServerPlayer cePlayer) { + return VersionHelper.isOrAbove1_21_5() ? cePlayer.canInstabuild() : cePlayer.isCreativeMode(); + } + @Override public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) { if (this.canOpenByWindCharge && FastNMS.INSTANCE.method$Explosion$canTriggerBlocks(args[3])) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java index e2713c35b..51ad4edb3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java @@ -70,7 +70,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos)); world.playBlockSound(position, customState.settings().sounds().breakSound()); - FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId()); return MBlocks.AIR$defaultState; } return state; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java index 5508e189e..e70881894 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/UnsafeCompositeBlockBehavior.java @@ -256,4 +256,16 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior { } return false; } + + @Override + public Object playerWillDestroy(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object previous = args[0]; + for (AbstractBlockBehavior behavior : this.behaviors) { + Object processed = behavior.playerWillDestroy(thisBlock, args, superMethod); + if (processed != previous) { + return processed; + } + } + return previous; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index c5f7fa313..653c5258c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -177,7 +177,9 @@ public final class BlockGenerator { .intercept(MethodDelegation.to(GetDirectSignalInterceptor.INSTANCE)) // isSignalSource .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$isSignalSource)) - .intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE)); + .intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE)) + .method(ElementMatchers.is(CoreReflections.method$Block$playerWillDestroy)) + .intercept(MethodDelegation.to(VersionHelper.isOrAbove1_21_2() ? PlayerWillDestroyInterceptor1_20_3.INSTANCE : PlayerWillDestroyInterceptor1_20.INSTANCE)); if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { builder.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval)) .intercept(MethodDelegation.to(AffectNeighborsAfterRemovalInterceptor.INSTANCE)); @@ -625,4 +627,33 @@ public final class BlockGenerator { } } } + + public static class PlayerWillDestroyInterceptor1_20_3 { + public static final PlayerWillDestroyInterceptor1_20_3 INSTANCE = new PlayerWillDestroyInterceptor1_20_3(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); + try { + return holder.value().playerWillDestroy(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run entityInside", e); + return superMethod.call(); + } + } + } + + public static class PlayerWillDestroyInterceptor1_20 { + public static final PlayerWillDestroyInterceptor1_20 INSTANCE = new PlayerWillDestroyInterceptor1_20(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); + try { + holder.value().playerWillDestroy(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run entityInside", e); + } + } + } } 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 41844a1d2..e82d3b130 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 @@ -1824,6 +1824,7 @@ public final class CoreReflections { ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 2) ); + @Deprecated public static final Field field$Abilities$instabuild = requireNonNull( ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 3) ); @@ -1832,6 +1833,7 @@ public final class CoreReflections { ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 4) ); + @Deprecated public static final Field field$Player$abilities = requireNonNull( ReflectionUtils.getInstanceDeclaredField(clazz$Player, clazz$Abilities, 0) ); @@ -3764,4 +3766,12 @@ public final class CoreReflections { throw new ReflectionInitException("Failed to initialize reflection", e); } } + + public static final Method method$Block$playerWillDestroy = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Block, + VersionHelper.isOrAbove1_20_3() ? clazz$BlockState : void.class, + clazz$Level, clazz$BlockPos, clazz$BlockState, clazz$Player + ) + ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 3216a3bd1..5145f721c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -250,13 +250,8 @@ public class BukkitServerPlayer extends Player { @Override public boolean canInstabuild() { - try { - Object abilities = CoreReflections.field$Player$abilities.get(serverPlayer()); - return (boolean) CoreReflections.field$Abilities$instabuild.get(abilities); - } catch (ReflectiveOperationException e) { - CraftEngine.instance().logger().warn("Failed to get canInstabuild for " + name(), e); - return false; - } + Object abilities = FastNMS.INSTANCE.field$Player$abilities(serverPlayer()); + return FastNMS.INSTANCE.field$Abilities$instabuild(abilities); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java index ff28dbf29..9e0751a36 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -121,6 +121,6 @@ public class BukkitWorld implements World { @Override public void levelEvent(int id, BlockPos pos, int data) { - FastNMS.INSTANCE.method$Level$levelEvent(serverWorld(), id, LocationUtils.toBlockPos(pos), data); + FastNMS.INSTANCE.method$LevelAccessor$levelEvent(serverWorld(), id, LocationUtils.toBlockPos(pos), data); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java index 94fb7bb2e..0cca29faf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockBehavior.java @@ -138,6 +138,11 @@ public abstract class BlockBehavior { return false; } + // Level level, BlockPos pos, BlockState state, Player player + public Object playerWillDestroy(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return superMethod.call(); + } + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { return state; } diff --git a/gradle.properties b/gradle.properties index 69673cad8..d71f01899 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.28 +nms_helper_version=1.0.29 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 From e202b74452d30724120471c29c9f6f48760a36d4 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:16:30 +0800 Subject: [PATCH 2/8] =?UTF-8?q?refactor(bukkit):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=E5=AF=BC=E5=85=A5=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/block/behavior/DoorBlockBehavior.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java index f053ff84a..6c5dd7a4e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; 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.MItems; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.DirectionUtils; @@ -25,7 +24,6 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.item.context.UseOnContext; -import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.HorizontalDirection; @@ -39,7 +37,6 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Door; import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import javax.annotation.Nullable; From d755974699c43bb290402980df258c60dbdb54c5 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:26:45 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84if=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/injector/BlockGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index 653c5258c..3bb6f390e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -179,7 +179,7 @@ public final class BlockGenerator { .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$isSignalSource)) .intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE)) .method(ElementMatchers.is(CoreReflections.method$Block$playerWillDestroy)) - .intercept(MethodDelegation.to(VersionHelper.isOrAbove1_21_2() ? PlayerWillDestroyInterceptor1_20_3.INSTANCE : PlayerWillDestroyInterceptor1_20.INSTANCE)); + .intercept(MethodDelegation.to(VersionHelper.isOrAbove1_20_3() ? PlayerWillDestroyInterceptor1_20_3.INSTANCE : PlayerWillDestroyInterceptor1_20.INSTANCE)); if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { builder.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval)) .intercept(MethodDelegation.to(AffectNeighborsAfterRemovalInterceptor.INSTANCE)); From 37c702e493c05e9aa1b72ccc595d9467b87f78a5 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:27:51 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84if=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/injector/BlockGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index 3bb6f390e..fe99c0132 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -178,6 +178,7 @@ public final class BlockGenerator { // isSignalSource .method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$isSignalSource)) .intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE)) + // playerWillDestroy .method(ElementMatchers.is(CoreReflections.method$Block$playerWillDestroy)) .intercept(MethodDelegation.to(VersionHelper.isOrAbove1_20_3() ? PlayerWillDestroyInterceptor1_20_3.INSTANCE : PlayerWillDestroyInterceptor1_20.INSTANCE)); if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { From 38ae40b318bc7ab81b792c28eacdfbae42661608 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:33:06 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8A=A5=E9=94=99=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/injector/BlockGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index fe99c0132..85fdb037f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -638,7 +638,7 @@ public final class BlockGenerator { try { return holder.value().playerWillDestroy(thisObj, args, superMethod); } catch (Exception e) { - CraftEngine.instance().logger().severe("Failed to run entityInside", e); + CraftEngine.instance().logger().severe("Failed to run playerWillDestroy", e); return superMethod.call(); } } @@ -653,7 +653,7 @@ public final class BlockGenerator { try { holder.value().playerWillDestroy(thisObj, args, superMethod); } catch (Exception e) { - CraftEngine.instance().logger().severe("Failed to run entityInside", e); + CraftEngine.instance().logger().severe("Failed to run playerWillDestroy", e); } } } From fcb5ae36fd0bd2d82279eec7a967a911ab237c08 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:38:07 +0800 Subject: [PATCH 6/8] =?UTF-8?q?refactor(bukkit):=20=E5=90=88=E5=B9=B6=20Pl?= =?UTF-8?q?ayerWillDestroyInterceptor=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/injector/BlockGenerator.java | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java index 85fdb037f..e92214714 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockGenerator.java @@ -180,7 +180,7 @@ public final class BlockGenerator { .intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE)) // playerWillDestroy .method(ElementMatchers.is(CoreReflections.method$Block$playerWillDestroy)) - .intercept(MethodDelegation.to(VersionHelper.isOrAbove1_20_3() ? PlayerWillDestroyInterceptor1_20_3.INSTANCE : PlayerWillDestroyInterceptor1_20.INSTANCE)); + .intercept(MethodDelegation.to(PlayerWillDestroyInterceptor.INSTANCE)); if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { builder.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval)) .intercept(MethodDelegation.to(AffectNeighborsAfterRemovalInterceptor.INSTANCE)); @@ -629,8 +629,8 @@ public final class BlockGenerator { } } - public static class PlayerWillDestroyInterceptor1_20_3 { - public static final PlayerWillDestroyInterceptor1_20_3 INSTANCE = new PlayerWillDestroyInterceptor1_20_3(); + public static class PlayerWillDestroyInterceptor { + public static final PlayerWillDestroyInterceptor INSTANCE = new PlayerWillDestroyInterceptor(); @RuntimeType public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { @@ -643,18 +643,4 @@ public final class BlockGenerator { } } } - - public static class PlayerWillDestroyInterceptor1_20 { - public static final PlayerWillDestroyInterceptor1_20 INSTANCE = new PlayerWillDestroyInterceptor1_20(); - - @RuntimeType - public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { - ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); - try { - holder.value().playerWillDestroy(thisObj, args, superMethod); - } catch (Exception e) { - CraftEngine.instance().logger().severe("Failed to run playerWillDestroy", e); - } - } - } } From b0d30e2d6960cf53b47dbfa7612a93b9b0160848 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:49:16 +0800 Subject: [PATCH 7/8] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=97=A8=E6=96=B9=E5=9D=97=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/DoorBlockBehavior.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java index 6c5dd7a4e..b63a7511c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java @@ -37,6 +37,7 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Door; import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import javax.annotation.Nullable; @@ -133,8 +134,8 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior { if (blockState == null || blockState.isEmpty()) return superMethod.call(); org.bukkit.entity.Player bukkitPlayer = FastNMS.INSTANCE.method$ServerPlayer$getBukkitEntity(player); BukkitServerPlayer cePlayer = BukkitCraftEngine.instance().adapt(bukkitPlayer); - Item item = cePlayer.getItemInHand(InteractionHand.MAIN_HAND); - if (preventsBlockDrops(cePlayer) || !hasCorrectToolForDrops(blockState, item)) { + Item item = cePlayer.getItemInHand(InteractionHand.MAIN_HAND); + if (preventsBlockDrops(cePlayer) || !BlockStateUtils.isCorrectTool(blockState, item)) { preventDropFromBottomPart(level, pos, blockState, player); } return superMethod.call(); @@ -154,13 +155,6 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior { } } - private boolean hasCorrectToolForDrops(ImmutableBlockState state, @Nullable Item item) { - if (item == null) return !state.settings().requireCorrectTool(); - return !state.settings().requireCorrectTool() - || state.settings().isCorrectTool(item.id()) - || (state.settings().respectToolComponent() && FastNMS.INSTANCE.method$ItemStack$isCorrectToolForDrops(item.getLiteralObject(), state)); - } - private boolean preventsBlockDrops(BukkitServerPlayer cePlayer) { return VersionHelper.isOrAbove1_21_5() ? cePlayer.canInstabuild() : cePlayer.isCreativeMode(); } From e95cc1c724b99dedab2192ea2913b46ef76fa96b Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Jul 2025 00:53:32 +0800 Subject: [PATCH 8/8] =?UTF-8?q?refactor(bukkit):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=97=A8=E8=A1=8C=E4=B8=BA=E5=B9=B6=E6=9B=B4=E6=96=B0=E5=8F=8D?= =?UTF-8?q?=E5=B0=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/block/behavior/DoorBlockBehavior.java | 6 +----- .../plugin/reflection/minecraft/CoreReflections.java | 10 ---------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java index b63a7511c..768f01adf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/DoorBlockBehavior.java @@ -135,7 +135,7 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior { org.bukkit.entity.Player bukkitPlayer = FastNMS.INSTANCE.method$ServerPlayer$getBukkitEntity(player); BukkitServerPlayer cePlayer = BukkitCraftEngine.instance().adapt(bukkitPlayer); Item item = cePlayer.getItemInHand(InteractionHand.MAIN_HAND); - if (preventsBlockDrops(cePlayer) || !BlockStateUtils.isCorrectTool(blockState, item)) { + if (cePlayer.canInstabuild() || !BlockStateUtils.isCorrectTool(blockState, item)) { preventDropFromBottomPart(level, pos, blockState, player); } return superMethod.call(); @@ -155,10 +155,6 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior { } } - private boolean preventsBlockDrops(BukkitServerPlayer cePlayer) { - return VersionHelper.isOrAbove1_21_5() ? cePlayer.canInstabuild() : cePlayer.isCreativeMode(); - } - @Override public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) { if (this.canOpenByWindCharge && FastNMS.INSTANCE.method$Explosion$canTriggerBlocks(args[3])) { 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 e82d3b130..dfbf5ac18 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 @@ -1824,20 +1824,10 @@ public final class CoreReflections { ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 2) ); - @Deprecated - public static final Field field$Abilities$instabuild = requireNonNull( - ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 3) - ); - public static final Field field$Abilities$mayBuild = requireNonNull( ReflectionUtils.getInstanceDeclaredField(clazz$Abilities, boolean.class, 4) ); - @Deprecated - public static final Field field$Player$abilities = requireNonNull( - ReflectionUtils.getInstanceDeclaredField(clazz$Player, clazz$Abilities, 0) - ); - public static final Class clazz$FlowingFluid = requireNonNull( BukkitReflectionUtils.findReobfOrMojmapClass( "world.level.material.FluidTypeFlowing",