From b8dcba2ee5b2bc6fd4fe600b65058a58f5a2af04 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 5 Apr 2023 16:32:40 +0200 Subject: [PATCH 1/3] Fix #398 (supersedes and closes #395) --- .../java/dev/architectury/mixin/fabric/MixinBlockItem.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java index e6f96532..ae403f9a 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java @@ -30,10 +30,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BlockItem.class) public abstract class MixinBlockItem { - @Inject(method = "place", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/item/context/BlockPlaceContext;getClickedPos()Lnet/minecraft/core/BlockPos;"), - cancellable = true) + @Inject(method = "place", at = @At("HEAD"), cancellable = true) private void place(BlockPlaceContext context, CallbackInfoReturnable cir) { var result = BlockEvent.PLACE.invoker().placeBlock(context.getLevel(), context.getClickedPos(), context.getLevel().getBlockState(context.getClickedPos()), context.getPlayer()); if (result.isPresent()) { From b1e7c89ffb3d2ba95799748cd1ab4ef67e68cbe4 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 5 Apr 2023 16:33:51 +0200 Subject: [PATCH 2/3] Fix args order in player clone event (supersedes and closes #391) --- .../java/dev/architectury/mixin/fabric/MixinServerPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayer.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayer.java index 569efcc4..ce414bb0 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayer.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayer.java @@ -37,7 +37,7 @@ import java.util.OptionalInt; public class MixinServerPlayer { @Inject(method = "restoreFrom", at = @At("RETURN")) private void restoreFrom(ServerPlayer serverPlayer, boolean bl, CallbackInfo ci) { - PlayerEvent.PLAYER_CLONE.invoker().clone((ServerPlayer) (Object) this, serverPlayer, bl); + PlayerEvent.PLAYER_CLONE.invoker().clone(serverPlayer, (ServerPlayer) (Object) this, bl); } @Inject(method = "openMenu", at = @At("RETURN")) From c573dbe7bea610b1206676ff0095a631d08232a3 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 4 May 2023 09:44:56 +0200 Subject: [PATCH 3/3] Fix block place event mixin passing incorrect BlockState on Fabric Closes #402 --- .../mixin/fabric/MixinBlockItem.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java index ae403f9a..52ba0342 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinBlockItem.java @@ -23,18 +23,24 @@ import dev.architectury.event.events.common.BlockEvent; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(BlockItem.class) public abstract class MixinBlockItem { - @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void place(BlockPlaceContext context, CallbackInfoReturnable cir) { - var result = BlockEvent.PLACE.invoker().placeBlock(context.getLevel(), context.getClickedPos(), context.getLevel().getBlockState(context.getClickedPos()), context.getPlayer()); - if (result.isPresent()) { - cir.setReturnValue(result.isTrue() ? InteractionResult.SUCCESS : InteractionResult.FAIL); + @Inject(method = "place", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/item/BlockItem;placeBlock(Lnet/minecraft/world/item/context/BlockPlaceContext;Lnet/minecraft/world/level/block/state/BlockState;)Z"), + locals = LocalCapture.CAPTURE_FAILHARD, + cancellable = true) + private void place(BlockPlaceContext _0, CallbackInfoReturnable cir, BlockPlaceContext context, BlockState placedState) { + var result = BlockEvent.PLACE.invoker().placeBlock(context.getLevel(), context.getClickedPos(), placedState, context.getPlayer()); + if (result.isFalse()) { + cir.setReturnValue(InteractionResult.FAIL); } } }