Fix block place event mixin passing incorrect BlockState on Fabric

Closes #402
This commit is contained in:
Max
2023-05-04 09:44:56 +02:00
parent a62231ab87
commit 935b06c72f

View File

@@ -23,18 +23,24 @@ import dev.architectury.event.events.common.BlockEvent;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.context.BlockPlaceContext; 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.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(BlockItem.class) @Mixin(BlockItem.class)
public abstract class MixinBlockItem { public abstract class MixinBlockItem {
@Inject(method = "place", at = @At("HEAD"), cancellable = true) @Inject(method = "place",
private void place(BlockPlaceContext context, CallbackInfoReturnable<InteractionResult> cir) { at = @At(value = "INVOKE",
var result = BlockEvent.PLACE.invoker().placeBlock(context.getLevel(), context.getClickedPos(), context.getLevel().getBlockState(context.getClickedPos()), context.getPlayer()); target = "Lnet/minecraft/world/item/BlockItem;placeBlock(Lnet/minecraft/world/item/context/BlockPlaceContext;Lnet/minecraft/world/level/block/state/BlockState;)Z"),
if (result.isPresent()) { locals = LocalCapture.CAPTURE_FAILHARD,
cir.setReturnValue(result.isTrue() ? InteractionResult.SUCCESS : InteractionResult.FAIL); cancellable = true)
private void place(BlockPlaceContext _0, CallbackInfoReturnable<InteractionResult> 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);
} }
} }
} }