From c800d7b91b48f4888cca0040ccf5b74825868f05 Mon Sep 17 00:00:00 2001 From: Salad Date: Fri, 14 Aug 2026 14:01:32 +0200 Subject: [PATCH 1/2] fixed the funniest crash ever (dispenser bucket) --- .../ledger/mixin/BucketItemMixin.java | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/github/quiltservertools/ledger/mixin/BucketItemMixin.java b/src/main/java/com/github/quiltservertools/ledger/mixin/BucketItemMixin.java index bc07a125..fa52c53a 100644 --- a/src/main/java/com/github/quiltservertools/ledger/mixin/BucketItemMixin.java +++ b/src/main/java/com/github/quiltservertools/ledger/mixin/BucketItemMixin.java @@ -7,7 +7,6 @@ import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.item.BucketItem; @@ -16,6 +15,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,7 +30,7 @@ public abstract class BucketItemMixin { private Fluid content; @Inject(method = "emptyContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;Z)Z")) - private void logFluidBreak(Player player, Level world, BlockPos pos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { + private void logFluidBreak(@Nullable Player player, Level world, BlockPos pos, @Nullable BlockHitResult blockHitResult, CallbackInfoReturnable cir) { var blockstate = world.getBlockState(pos); if (!blockstate.isAir()) { BlockBreakCallback.EVENT.invoker().breakBlock(world, pos, world.getBlockState(pos), world.getBlockEntity(pos), Sources.FLUID, player); @@ -38,8 +38,12 @@ private void logFluidBreak(Player player, Level world, BlockPos pos, BlockHitRes } @Inject(method = "emptyContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BucketItem;playEmptySound(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)V")) - private void logFluidPlace(Player player, Level world, BlockPos pos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { - BlockPlaceCallback.EVENT.invoker().place(world, pos, this.content.defaultFluidState().createLegacyBlock(), null, player); + private void logFluidPlace(@Nullable Player player, Level world, BlockPos pos, @Nullable BlockHitResult blockHitResult, CallbackInfoReturnable cir) { + if (player != null) { + BlockPlaceCallback.EVENT.invoker().place(world, pos, this.content.defaultFluidState().createLegacyBlock(), null, player); + } else { + BlockPlaceCallback.EVENT.invoker().place(world, pos, this.content.defaultFluidState().createLegacyBlock(), null, Sources.REDSTONE); + } } @Inject( @@ -50,16 +54,28 @@ private void logFluidPlace(Player player, Level world, BlockPos pos, BlockHitRes ordinal = 0 ) ) - private void logWaterlog(Player player, Level world, BlockPos pos, BlockHitResult blockHitResult, CallbackInfoReturnable cir, @Local BlockState blockState) { - BlockChangeCallback.EVENT.invoker().changeBlock( - world, - pos, - blockState, - world.getBlockState(pos), - world.getBlockEntity(pos), - world.getBlockEntity(pos), - player - ); + private void logWaterlog(@Nullable Player player, Level world, BlockPos pos, @Nullable BlockHitResult blockHitResult, CallbackInfoReturnable cir, @Local BlockState blockState) { + if (player != null) { + BlockChangeCallback.EVENT.invoker().changeBlock( + world, + pos, + blockState, + world.getBlockState(pos), + world.getBlockEntity(pos), + world.getBlockEntity(pos), + player + ); + } else { + BlockChangeCallback.EVENT.invoker().changeBlock( + world, + pos, + blockState, + world.getBlockState(pos), + world.getBlockEntity(pos), + world.getBlockEntity(pos), + Sources.REDSTONE + ); + } } @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;awardStat(Lnet/minecraft/stats/Stat;)V", ordinal = 0)) From edda555e24a2ab0b5fc3db6e61522a0da4ccaff7 Mon Sep 17 00:00:00 2001 From: Salad Date: Mon, 14 Sep 2026 12:59:07 +0200 Subject: [PATCH 2/2] fixed scholar issue --- build.gradle.kts | 4 ++++ gradle/gradle-daemon-jvm.properties | 2 ++ .../ledger/mixin/blocks/lectern/LecternBlockMixin.java | 6 ++++-- .../ledger/mixin/blocks/lectern/LecternMenuMixin.java | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 gradle/gradle-daemon-jvm.properties diff --git a/build.gradle.kts b/build.gradle.kts index 95be69bf..fbd30069 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -147,6 +147,10 @@ detekt { config.setFrom(rootProject.files("detekt.yml")) } +tasks.withType().configureEach { + jvmTarget = JavaVersion.VERSION_21.toString() +} + gitHooks { setHooks( mapOf("pre-commit" to "detekt") diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 00000000..63e5bbdf --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,2 @@ +#This file is generated by updateDaemonJvm +toolchainVersion=21 diff --git a/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternBlockMixin.java b/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternBlockMixin.java index 970b2899..40d148ae 100644 --- a/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternBlockMixin.java +++ b/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternBlockMixin.java @@ -28,8 +28,10 @@ private static void logPutBook(Entity user, Level world, BlockPos pos, BlockStat ItemInsertCallback.EVENT.invoker().insert(blockEntity.getBook(), pos, (ServerLevel) world, Sources.PLAYER, (ServerPlayer) user); } - @Inject(method = "openScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;openMenu(Lnet/minecraft/world/MenuProvider;)Ljava/util/OptionalInt;")) + @Inject(method = "openScreen", at = @At("HEAD")) public void storeLectern(Level world, BlockPos pos, Player player, CallbackInfo ci) { - PlayerLecternHook.getActiveHandlers().put(player, world.getBlockEntity(pos)); + if (world.getBlockEntity(pos) instanceof LecternBlockEntity blockEntity) { + PlayerLecternHook.getActiveHandlers().put(player, blockEntity); + } } } diff --git a/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternMenuMixin.java b/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternMenuMixin.java index 86389570..45cca0e3 100644 --- a/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternMenuMixin.java +++ b/src/main/java/com/github/quiltservertools/ledger/mixin/blocks/lectern/LecternMenuMixin.java @@ -20,6 +20,7 @@ public class LecternMenuMixin { public void logPickBook(Player player, int id, CallbackInfoReturnable cir, @Local ItemStack itemStack) { ServerPlayer serverPlayer = (ServerPlayer) player; BlockEntity blockEntity = PlayerLecternHook.getActiveHandlers().get(player); + if (blockEntity == null) return; ItemRemoveCallback.EVENT.invoker().remove(itemStack, blockEntity.getBlockPos(), serverPlayer.serverLevel(), Sources.PLAYER, serverPlayer); } }