From 517965711b6f409d1ee18fa08a44dde2e98317fa Mon Sep 17 00:00:00 2001 From: Xiao-MoMi <972454774@qq.com> Date: Fri, 19 Sep 2025 00:59:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0stepOn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/injector/BlockGenerator.java | 17 +++++++++++++++++ .../reflection/minecraft/CoreReflections.java | 4 ++++ .../craftengine/core/block/BlockBehavior.java | 5 +++++ 3 files changed, 26 insertions(+) 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 f7105c15e..ae5e8c670 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 @@ -167,6 +167,9 @@ public final class BlockGenerator { // updateEntityMovementAfterFallOn .method(ElementMatchers.is(CoreReflections.method$Block$updateEntityMovementAfterFallOn)) .intercept(MethodDelegation.to(UpdateEntityMovementAfterFallOnInterceptor.INSTANCE)) + // stepOn + .method(ElementMatchers.is(CoreReflections.method$Block$stepOn)) + .intercept(MethodDelegation.to(StepOnInterceptor.INSTANCE)) ; // 1.21.5+ if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) { @@ -708,6 +711,20 @@ public final class BlockGenerator { } } + public static class StepOnInterceptor { + public static final StepOnInterceptor INSTANCE = new StepOnInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); + try { + holder.value().stepOn(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run stepOn", e); + } + } + } + public static class FallOnInterceptor { public static final FallOnInterceptor INSTANCE = new FallOnInterceptor(); 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 48eb0072e..30a9f19cc 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 @@ -1687,6 +1687,10 @@ public final class CoreReflections { ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, boolean.class, clazz$BlockState, clazz$LevelReader, clazz$BlockPos) ); + public static final Method method$Block$stepOn = requireNonNull( + ReflectionUtils.getMethod(clazz$Block, void.class, new String[] {"stepOn", "a"}, clazz$Level, clazz$BlockPos, clazz$BlockState, clazz$Entity) + ); + public static final Method method$BlockBehaviour$onExplosionHit = MiscUtils.requireNonNullIf( ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, void.class, clazz$BlockState, VersionHelper.isOrAbove1_21_2() ? clazz$ServerLevel : clazz$Level, clazz$BlockPos, clazz$Explosion, BiConsumer.class), VersionHelper.isOrAbove1_21() 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 4f20228e3..f1aba39ce 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 @@ -178,6 +178,11 @@ public abstract class BlockBehavior { public void spawnAfterBreak(Object thisBlock, Object[] args, Callable superMethod) throws Exception { } + // Level level, BlockPos pos, BlockState state, Entity entity + public void stepOn(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { return state; }