From 86b1854676d751392865418c6aa3410445c4396d Mon Sep 17 00:00:00 2001 From: Henry Lin Date: Sat, 16 Mar 2024 18:14:17 +0800 Subject: [PATCH] Fix chain cogwheels not connecting to each other via cogwheels (#51) --- .../RotationPropagatorMixin.java | 54 +++++++++++++++++++ .../resources/create_connected.mixins.json | 1 + 2 files changed, 55 insertions(+) create mode 100644 src/main/java/com/hlysine/create_connected/mixin/chaincogwheel/RotationPropagatorMixin.java diff --git a/src/main/java/com/hlysine/create_connected/mixin/chaincogwheel/RotationPropagatorMixin.java b/src/main/java/com/hlysine/create_connected/mixin/chaincogwheel/RotationPropagatorMixin.java new file mode 100644 index 00000000..182c8125 --- /dev/null +++ b/src/main/java/com/hlysine/create_connected/mixin/chaincogwheel/RotationPropagatorMixin.java @@ -0,0 +1,54 @@ +package com.hlysine.create_connected.mixin.chaincogwheel; + +import com.hlysine.create_connected.CCBlocks; +import com.simibubi.create.content.kinetics.RotationPropagator; +import com.simibubi.create.content.kinetics.base.IRotate; +import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import com.simibubi.create.content.kinetics.chainDrive.ChainDriveBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +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(value = RotationPropagator.class, remap = false) +public class RotationPropagatorMixin { + @Inject( + method = "getRotationSpeedModifier(Lcom/simibubi/create/content/kinetics/base/KineticBlockEntity;Lcom/simibubi/create/content/kinetics/base/KineticBlockEntity;)F", + at = @At(value = "INVOKE", target = "Lcom/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock;areBlocksConnected(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;)Z"), + cancellable = true + ) + private static void handleChainCogwheels(KineticBlockEntity from, + KineticBlockEntity to, + CallbackInfoReturnable cir) { + final BlockState stateFrom = from.getBlockState(); + final BlockState stateTo = to.getBlockState(); + Block fromBlock = stateFrom.getBlock(); + Block toBlock = stateTo.getBlock(); + final IRotate definitionFrom = (IRotate) fromBlock; + final IRotate definitionTo = (IRotate) toBlock; + final BlockPos diff = to.getBlockPos() + .subtract(from.getBlockPos()); + final Direction direction = Direction.getNearest(diff.getX(), diff.getY(), diff.getZ()); + + if (stateFrom.is(CCBlocks.ENCASED_CHAIN_COGWHEEL.get()) && stateTo.is(CCBlocks.ENCASED_CHAIN_COGWHEEL.get())) { + boolean connected = ChainDriveBlock.areBlocksConnected(stateFrom, stateTo, direction); + if (!connected) { + if (diff.distManhattan(BlockPos.ZERO) != 1) { + cir.setReturnValue(0f); + return; + } + if (direction.getAxis() == definitionFrom.getRotationAxis(stateFrom)) { + cir.setReturnValue(0f); + return; + } + if (definitionFrom.getRotationAxis(stateFrom) == definitionTo.getRotationAxis(stateTo)) { + cir.setReturnValue(-1f); + } + } + } + } +} diff --git a/src/main/resources/create_connected.mixins.json b/src/main/resources/create_connected.mixins.json index ff706dbc..19061385 100644 --- a/src/main/resources/create_connected.mixins.json +++ b/src/main/resources/create_connected.mixins.json @@ -9,6 +9,7 @@ "ItemUseOverridesMixin", "KineticBlockAdvancementMixin", "ManualApplicationRecipeMixin", + "chaincogwheel.RotationPropagatorMixin", "compat.CopycatBlockEntityMixin", "compat.CopycatBlockMixin", "contraption.AbstractContainerMenuMixin",