9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

feat(core): 添加监听spawnAfterBreak内部事件

This commit is contained in:
jhqwqmc
2025-07-13 12:56:43 +08:00
parent 022e401b89
commit b893e3bc6c
4 changed files with 36 additions and 1 deletions

View File

@@ -268,4 +268,11 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior {
}
return previous;
}
@Override
public void spawnAfterBreak(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.spawnAfterBreak(thisBlock, args, superMethod);
}
}
}

View File

@@ -180,7 +180,10 @@ public final class BlockGenerator {
.intercept(MethodDelegation.to(IsSignalSourceInterceptor.INSTANCE))
// playerWillDestroy
.method(ElementMatchers.is(CoreReflections.method$Block$playerWillDestroy))
.intercept(MethodDelegation.to(PlayerWillDestroyInterceptor.INSTANCE));
.intercept(MethodDelegation.to(PlayerWillDestroyInterceptor.INSTANCE))
// spawnAfterBreak
.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$spawnAfterBreak))
.intercept(MethodDelegation.to(SpawnAfterBreakInterceptor.INSTANCE));
if (CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval != null) {
builder.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$affectNeighborsAfterRemoval))
.intercept(MethodDelegation.to(AffectNeighborsAfterRemovalInterceptor.INSTANCE));
@@ -643,4 +646,18 @@ public final class BlockGenerator {
}
}
}
public static class SpawnAfterBreakInterceptor {
public static final SpawnAfterBreakInterceptor INSTANCE = new SpawnAfterBreakInterceptor();
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().spawnAfterBreak(thisObj, args, superMethod);
} catch (Exception e) {
CraftEngine.instance().logger().severe("Failed to run spawnAfterBreak", e);
}
}
}
}

View File

@@ -3816,4 +3816,10 @@ public final class CoreReflections {
VersionHelper.isOrAbove1_20_2() ?
ReflectionUtils.getStaticMethod(clazz$ArmorTrim, Optional.class, clazz$RegistryAccess, clazz$ItemStack, boolean.class) :
ReflectionUtils.getStaticMethod(clazz$ArmorTrim, Optional.class, clazz$RegistryAccess, clazz$ItemStack);
public static final Method method$BlockBehaviour$spawnAfterBreak = requireNonNull(
ReflectionUtils.getDeclaredMethod(
clazz$BlockBehaviour, void.class, clazz$BlockState, clazz$ServerLevel, clazz$BlockPos, clazz$ItemStack, boolean.class
)
);
}

View File

@@ -143,6 +143,11 @@ public abstract class BlockBehavior {
return superMethod.call();
}
// BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience
public void spawnAfterBreak(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
superMethod.call();
}
public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) {
return state;
}