From 2e722fa084c989fb47654aa29d85e57b775e8f8c Mon Sep 17 00:00:00 2001 From: Vaelow233 Date: Wed, 30 Sep 2026 18:56:20 -0700 Subject: [PATCH] fix: speed controller cannot rotate to correct direction sometimes after disassembly --- .../SubLevelAssemblyHelperMixin.java | 58 +++++++++++++++++++ .../main/resources/sable-neoforge.mixins.json | 1 + 2 files changed, 59 insertions(+) create mode 100644 neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/rotation_speed_controller/SubLevelAssemblyHelperMixin.java diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/rotation_speed_controller/SubLevelAssemblyHelperMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/rotation_speed_controller/SubLevelAssemblyHelperMixin.java new file mode 100644 index 000000000..fbb46c7ed --- /dev/null +++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/rotation_speed_controller/SubLevelAssemblyHelperMixin.java @@ -0,0 +1,58 @@ +package dev.ryanhcode.sable.neoforge.mixin.compatibility.create.rotation_speed_controller; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlock; +import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlockEntity; +import dev.ryanhcode.sable.api.SubLevelAssemblyHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = SubLevelAssemblyHelper.class, remap = false) +public class SubLevelAssemblyHelperMixin { + + @WrapOperation(method = "moveBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/BlockEntity;saveWithFullMetadata(Lnet/minecraft/core/HolderLookup$Provider;)Lnet/minecraft/nbt/CompoundTag;")) + private static CompoundTag sable$rotateControllerSpeed(final BlockEntity instance, final HolderLookup.Provider registries, + final Operation original, + @Local(argsOnly = true) final SubLevelAssemblyHelper.AssemblyTransform transform) { + final CompoundTag tag = original.call(instance, registries); + if (!(instance instanceof final SpeedControllerBlockEntity controller) + || transform.getRotation() == Rotation.NONE || !tag.contains("ScrollValue", Tag.TAG_INT)) { + return tag; + } + + final BlockPos source = controller.source; + if (source == null) { + return tag; + } + + final Direction.Axis shaftAxis = controller.getBlockState().getValue(SpeedControllerBlock.HORIZONTAL_AXIS); + final Direction shaftDirection = Direction.get(Direction.AxisDirection.POSITIVE, shaftAxis); + final Direction.Axis outputAxis; + if (source.equals(controller.getBlockPos().above())) { + // The large cog supplies power, so the setting controls the controller's shaft. + outputAxis = shaftAxis; + } else if (source.equals(controller.getBlockPos().relative(shaftDirection)) + || source.equals(controller.getBlockPos().relative(shaftDirection.getOpposite()))) { + // The shaft supplies power, so the setting controls the perpendicular large cog. + outputAxis = shaftAxis == Direction.Axis.X ? Direction.Axis.Z : Direction.Axis.X; + } else { + return tag; + } + + // BlockState stores an unsigned axis, but Create's speed is signed along its positive direction. + final Direction positiveOutput = Direction.get(Direction.AxisDirection.POSITIVE, outputAxis); + if (transform.getRotation().rotate(positiveOutput).getAxisDirection() == Direction.AxisDirection.NEGATIVE) { + tag.putInt("ScrollValue", -tag.getInt("ScrollValue")); + } + return tag; + } +} diff --git a/neoforge/src/main/resources/sable-neoforge.mixins.json b/neoforge/src/main/resources/sable-neoforge.mixins.json index 2c905b21d..4cdc76da2 100644 --- a/neoforge/src/main/resources/sable-neoforge.mixins.json +++ b/neoforge/src/main/resources/sable-neoforge.mixins.json @@ -136,6 +136,7 @@ "compatibility.create.redstone_contacts.AllBlockEntityTypesMixin", "compatibility.create.redstone_contacts.RedstoneContactBlockMixin", "compatibility.create.redstone_links.RedstoneLinkNetworkHandlerMixin", + "compatibility.create.rotation_speed_controller.SubLevelAssemblyHelperMixin", "compatibility.create.sails_providing_lift.SailBlockMixin", "compatibility.create.saw.SawBlockEntityMixin", "compatibility.create.schematics.DeployToolMixin",