From c0ba2392eeb7ed72604f88e2d61a84ec5d9b9125 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 5 Jul 2025 02:13:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=88=86=E7=82=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/behavior/UnsafeCompositeBlockBehavior.java | 2 +- .../bukkit/plugin/injector/BlockGenerator.java | 3 ++- .../bukkit/plugin/injector/BlockStateGenerator.java | 3 +++ .../craftengine/core/block/BlockBehavior.java | 2 +- .../momirealms/craftengine/core/util/MiscUtils.java | 10 ++++++++++ 5 files changed, 17 insertions(+), 3 deletions(-) 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 724bc0109..5508e189e 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 @@ -188,7 +188,7 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior { } @Override - public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) { + public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) throws Exception { for (AbstractBlockBehavior behavior : this.behaviors) { behavior.onExplosionHit(thisBlock, args, superMethod); } 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 45e4d41cc..c5f7fa313 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 @@ -148,7 +148,7 @@ public final class BlockGenerator { // onExplosionHit 1.21+ .method(ElementMatchers.returns(void.class) .and(ElementMatchers.takesArgument(0, CoreReflections.clazz$BlockState)) - .and(ElementMatchers.takesArgument(1, CoreReflections.clazz$ServerLevel)) + .and(ElementMatchers.takesArgument(1, VersionHelper.isOrAbove1_21_2() ? CoreReflections.clazz$ServerLevel : CoreReflections.clazz$Level)) .and(ElementMatchers.takesArgument(2, CoreReflections.clazz$BlockPos)) .and(ElementMatchers.takesArgument(3, CoreReflections.clazz$Explosion)) .and(ElementMatchers.takesArgument(4, BiConsumer.class)) @@ -501,6 +501,7 @@ public final class BlockGenerator { ObjectHolder holder = ((DelegatingBlock) thisObj).behaviorDelegate(); try { holder.value().onExplosionHit(thisObj, args, superMethod); + superMethod.call(); } catch (Exception e) { CraftEngine.instance().logger().severe("Failed to run onExplosionHit", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockStateGenerator.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockStateGenerator.java index edd60946d..c878e6df8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockStateGenerator.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BlockStateGenerator.java @@ -100,6 +100,9 @@ public final class BlockStateGenerator { Object tool = FastNMS.INSTANCE.method$LootParams$Builder$getOptionalParameter(builder, MLootContextParams.TOOL); Item item = BukkitItemManager.instance().wrap(tool == null || FastNMS.INSTANCE.method$ItemStack$isEmpty(tool) ? null : FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(tool)); Object optionalPlayer = FastNMS.INSTANCE.method$LootParams$Builder$getOptionalParameter(builder, MLootContextParams.THIS_ENTITY); + if (!CoreReflections.clazz$Player.isInstance(optionalPlayer)) { + optionalPlayer = null; + } // do not drop if it's not the correct tool BlockSettings settings = state.settings(); 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 259a6e37b..94fb7bb2e 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 @@ -94,7 +94,7 @@ public abstract class BlockBehavior { } // 1.21+ BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer dropConsumer - public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) { + public void onExplosionHit(Object thisBlock, Object[] args, Callable superMethod) throws Exception { } // LevelAccessor level, BlockPos pos, BlockState state, FluidState fluidState diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java index ee228fab9..b387e855a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java @@ -7,6 +7,8 @@ import org.joml.Vector3f; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Predicate; public class MiscUtils { @@ -130,4 +132,12 @@ public class MiscUtils { } } } + + public static T requireNonNullIf(T o, boolean condition) { + if (condition) { + return Objects.requireNonNull(o); + } else { + return o; + } + } }