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; + } + } }