diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java index c0319a8f3..a6189b298 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java @@ -300,8 +300,8 @@ public class DeployerHandler { return; if (useItem == DENY) return; - if (item instanceof BlockItem && !(item instanceof CartAssemblerBlockItem) - && !clickedState.canBeReplaced(new BlockPlaceContext(itemusecontext))) + if (item instanceof CartAssemblerBlockItem + && clickedState.canBeReplaced(new BlockPlaceContext(itemusecontext))) return; // Reposition fire placement for convenience diff --git a/src/main/java/com/simibubi/create/foundation/mixin/BlockItemMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/BlockItemMixin.java new file mode 100644 index 000000000..a9c6d514b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/BlockItemMixin.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.content.kinetics.deployer.DeployerFakePlayer; + +import com.simibubi.create.foundation.mixin.accessor.UseOnContextAccessor; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BlockItem; + +import net.minecraft.world.item.context.BlockPlaceContext; + +import net.minecraft.world.level.block.Blocks; +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; + +@Mixin(BlockItem.class) +public class BlockItemMixin { + @Inject(method = "place", at = @At("HEAD"), cancellable = true) + private void create$fixDeployerPlacement(BlockPlaceContext pContext, CallbackInfoReturnable cir) { + BlockState state = pContext.getLevel().getBlockState(((UseOnContextAccessor) pContext).create$getHitResult().getBlockPos()); + if (state != Blocks.AIR.defaultBlockState() && pContext.getPlayer() instanceof DeployerFakePlayer) { + cir.setReturnValue(InteractionResult.PASS); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/UseOnContextAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/UseOnContextAccessor.java new file mode 100644 index 000000000..87f2929e0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/UseOnContextAccessor.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import net.minecraft.world.item.context.UseOnContext; + +import net.minecraft.world.phys.BlockHitResult; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(UseOnContext.class) +public interface UseOnContextAccessor { + @Invoker("getHitResult") + BlockHitResult create$getHitResult(); +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index a434994ce..9187472d9 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -6,6 +6,7 @@ "compatibilityLevel": "JAVA_17", "refmap": "create.refmap.json", "mixins": [ + "BlockItemMixin", "ClientboundMapItemDataPacketMixin", "ContraptionDriverInteractMixin", "CustomItemUseEffectsMixin", @@ -23,7 +24,8 @@ "accessor.LivingEntityAccessor", "accessor.NbtAccounterAccessor", "accessor.ServerLevelAccessor", - "accessor.SystemReportAccessor" + "accessor.SystemReportAccessor", + "accessor.UseOnContextAccessor" ], "client": [ "accessor.AgeableListModelAccessor",