diff --git a/src/main/java/com/simibubi/create/compat/computercraft/SequencedGearshiftPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/SequencedGearshiftPeripheral.java new file mode 100644 index 000000000..4d00c3652 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/computercraft/SequencedGearshiftPeripheral.java @@ -0,0 +1,63 @@ +package com.simibubi.create.compat.computercraft; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.Instruction; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.InstructionSpeedModifiers; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencerInstructions; + +import dan200.computercraft.api.lua.IArguments; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IPeripheral; + +public class SequencedGearshiftPeripheral implements IPeripheral { + + private final SequencedGearshiftTileEntity tile; + + public SequencedGearshiftPeripheral(SequencedGearshiftTileEntity tile) { + this.tile = tile; + } + + @LuaFunction(mainThread = true) + public void rotate(IArguments arguments) throws LuaException { + runInstruction(arguments, SequencerInstructions.TURN_ANGLE); + } + + @LuaFunction(mainThread = true) + public void move(IArguments arguments) throws LuaException { + runInstruction(arguments, SequencerInstructions.TURN_DISTANCE); + } + + @LuaFunction + public boolean isRunning() { + return !this.tile.isIdle(); + } + + private void runInstruction(IArguments arguments, SequencerInstructions instructionType) throws LuaException { + int speedModifier = arguments.count() > 1 ? arguments.getInt(1) : 1; + this.tile.getInstructions().clear(); + + this.tile.getInstructions().add(new Instruction( + instructionType, + InstructionSpeedModifiers.getByModifier(speedModifier), + Math.abs(arguments.getInt(0)))); + this.tile.getInstructions().add(new Instruction(SequencerInstructions.END)); + + this.tile.run(0); + } + + @NotNull + @Override + public String getType() { + return "Create_SequencedGearshift"; + } + + @Override + public boolean equals(@Nullable IPeripheral other) { + return this == other; + } + +} diff --git a/src/main/java/com/simibubi/create/compat/computercraft/SpeedControllerPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/SpeedControllerPeripheral.java new file mode 100644 index 000000000..5a3955d95 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/computercraft/SpeedControllerPeripheral.java @@ -0,0 +1,40 @@ +package com.simibubi.create.compat.computercraft; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; + +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.peripheral.IPeripheral; + +public class SpeedControllerPeripheral implements IPeripheral { + + private final ScrollValueBehaviour targetSpeed; + + public SpeedControllerPeripheral(ScrollValueBehaviour targetSpeed) { + this.targetSpeed = targetSpeed; + } + + @LuaFunction(mainThread = true) + public void setTargetSpeed(int speed) { + this.targetSpeed.setValue(speed); + } + + @LuaFunction + public float getTargetSpeed() { + return this.targetSpeed.getValue(); + } + + @NotNull + @Override + public String getType() { + return "Create_RotationSpeedController"; + } + + @Override + public boolean equals(@Nullable IPeripheral other) { + return this == other; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java index 9238ed52e..0470d8aeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java @@ -2,6 +2,11 @@ package com.simibubi.create.content.contraptions.relays.advanced; import java.util.List; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.compat.computercraft.ComputerControllable; +import com.simibubi.create.compat.computercraft.SpeedControllerPeripheral; import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity; @@ -15,19 +20,24 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; +import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; -public class SpeedControllerTileEntity extends KineticTileEntity { +public class SpeedControllerTileEntity extends KineticTileEntity implements ComputerControllable { public static final int DEFAULT_SPEED = 16; protected ScrollValueBehaviour targetSpeed; boolean hasBracket; + private LazyOptional peripheral; + public SpeedControllerTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); hasBracket = false; @@ -53,7 +63,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity { targetSpeed.withCallback(i -> this.updateTargetRotation()); targetSpeed.withStepFunction(CreativeMotorTileEntity::step); behaviours.add(targetSpeed); - + registerAwardables(behaviours, AllAdvancements.SPEED_CONTROLLER); } @@ -63,7 +73,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity { RotationPropagator.handleRemoved(level, worldPosition, this); removeSource(); attachKinetics(); - + if (isCogwheelPresent() && getSpeed() != 0) award(AllAdvancements.SPEED_CONTROLLER); } @@ -127,6 +137,36 @@ public class SpeedControllerTileEntity extends KineticTileEntity { && stateAbove.getValue(CogWheelBlock.AXIS).isHorizontal(); } + @NotNull + @Override + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + LazyOptional peripheralCap = getPeripheralCapability(cap); + + return peripheralCap.isPresent() ? peripheralCap : super.getCapability(cap, side); + } + + @Override + public void setRemoved() { + super.setRemoved(); + removePeripheral(); + } + + @Override + public IPeripheral createPeripheral() { + return new SpeedControllerPeripheral(targetSpeed); + } + + @Override + public void setPeripheral(LazyOptional peripheral) { + this.peripheral = peripheral; + } + + @Override + public LazyOptional getPeripheral() { + return this.peripheral; + } + + private class ControllerValueBoxTransform extends ValueBoxTransform.Sided { @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index 9335285d1..a7b91a04a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -19,8 +19,12 @@ public class Instruction { } public Instruction(SequencerInstructions instruction, int value) { + this(instruction, InstructionSpeedModifiers.FORWARD, value); + } + + public Instruction(SequencerInstructions instruction, InstructionSpeedModifiers speedModifier, int value) { this.instruction = instruction; - speedModifier = InstructionSpeedModifiers.FORWARD; + this.speedModifier = speedModifier; this.value = value; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java index 93713d075..b1a1f236a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.simibubi.create.foundation.utility.Components; @@ -36,4 +37,11 @@ public enum InstructionSpeedModifiers { return options; } + public static InstructionSpeedModifiers getByModifier(int modifier) { + return Arrays.stream(InstructionSpeedModifiers.values()) + .filter(speedModifier -> speedModifier.value == modifier) + .findAny() + .orElse(InstructionSpeedModifiers.FORWARD); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index 9c595af72..8d084e0bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -2,16 +2,24 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import java.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.compat.computercraft.ComputerControllable; +import com.simibubi.create.compat.computercraft.SequencedGearshiftPeripheral; import com.simibubi.create.content.contraptions.relays.encased.SplitShaftTileEntity; +import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; -public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { +public class SequencedGearshiftTileEntity extends SplitShaftTileEntity implements ComputerControllable { Vector instructions; int currentInstruction; @@ -20,6 +28,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { int timer; boolean poweredPreviously; + LazyOptional peripheral; + public SequencedGearshiftTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); instructions = Instruction.createDefault(); @@ -105,7 +115,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { } } - protected void run(int instructionIndex) { + public void run(int instructionIndex) { Instruction instruction = getInstruction(instructionIndex); if (instruction == null || instruction.instruction == SequencerInstructions.END) { if (getModifier() != 0) @@ -156,6 +166,35 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { super.read(compound, clientPacket); } + @NotNull + @Override + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + LazyOptional peripheralCap = getPeripheralCapability(cap); + + return peripheralCap.isPresent() ? peripheralCap : super.getCapability(cap, side); + } + + @Override + public void setRemoved() { + super.setRemoved(); + removePeripheral(); + } + + @Override + public IPeripheral createPeripheral() { + return new SequencedGearshiftPeripheral(this); + } + + @Override + public void setPeripheral(LazyOptional peripheral) { + this.peripheral = peripheral; + } + + @Override + public LazyOptional getPeripheral() { + return this.peripheral; + } + @Override public float getRotationSpeedModifier(Direction face) { if (isVirtual()) @@ -171,4 +210,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { .getSpeedModifier(); } + public Vector getInstructions() { + return this.instructions; + } + }