mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-02-26 20:04:41 +01:00
Added Rotation Speed Controller and Sequenced Gearshift as peripherals
- Rotation Speed Controller can get and set targetSpeed - Sequenced Gearshift can rotate by a certain angle and move a certain distance
This commit is contained in:
parent
1420406ab7
commit
654476d9f3
6 changed files with 204 additions and 6 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,6 +2,11 @@ package com.simibubi.create.content.contraptions.relays.advanced;
|
||||||
|
|
||||||
import java.util.List;
|
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.RotationPropagator;
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
|
||||||
import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity;
|
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.Lang;
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
|
|
||||||
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.Vec3;
|
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;
|
public static final int DEFAULT_SPEED = 16;
|
||||||
protected ScrollValueBehaviour targetSpeed;
|
protected ScrollValueBehaviour targetSpeed;
|
||||||
|
|
||||||
boolean hasBracket;
|
boolean hasBracket;
|
||||||
|
|
||||||
|
private LazyOptional<IPeripheral> peripheral;
|
||||||
|
|
||||||
public SpeedControllerTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
public SpeedControllerTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
super(type, pos, state);
|
super(type, pos, state);
|
||||||
hasBracket = false;
|
hasBracket = false;
|
||||||
|
@ -53,7 +63,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
|
||||||
targetSpeed.withCallback(i -> this.updateTargetRotation());
|
targetSpeed.withCallback(i -> this.updateTargetRotation());
|
||||||
targetSpeed.withStepFunction(CreativeMotorTileEntity::step);
|
targetSpeed.withStepFunction(CreativeMotorTileEntity::step);
|
||||||
behaviours.add(targetSpeed);
|
behaviours.add(targetSpeed);
|
||||||
|
|
||||||
registerAwardables(behaviours, AllAdvancements.SPEED_CONTROLLER);
|
registerAwardables(behaviours, AllAdvancements.SPEED_CONTROLLER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +73,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
|
||||||
RotationPropagator.handleRemoved(level, worldPosition, this);
|
RotationPropagator.handleRemoved(level, worldPosition, this);
|
||||||
removeSource();
|
removeSource();
|
||||||
attachKinetics();
|
attachKinetics();
|
||||||
|
|
||||||
if (isCogwheelPresent() && getSpeed() != 0)
|
if (isCogwheelPresent() && getSpeed() != 0)
|
||||||
award(AllAdvancements.SPEED_CONTROLLER);
|
award(AllAdvancements.SPEED_CONTROLLER);
|
||||||
}
|
}
|
||||||
|
@ -127,6 +137,36 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
|
||||||
&& stateAbove.getValue(CogWheelBlock.AXIS).isHorizontal();
|
&& stateAbove.getValue(CogWheelBlock.AXIS).isHorizontal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
|
||||||
|
LazyOptional<T> 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<IPeripheral> peripheral) {
|
||||||
|
this.peripheral = peripheral;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LazyOptional<IPeripheral> getPeripheral() {
|
||||||
|
return this.peripheral;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private class ControllerValueBoxTransform extends ValueBoxTransform.Sided {
|
private class ControllerValueBoxTransform extends ValueBoxTransform.Sided {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -19,8 +19,12 @@ public class Instruction {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Instruction(SequencerInstructions instruction, int value) {
|
public Instruction(SequencerInstructions instruction, int value) {
|
||||||
|
this(instruction, InstructionSpeedModifiers.FORWARD, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instruction(SequencerInstructions instruction, InstructionSpeedModifiers speedModifier, int value) {
|
||||||
this.instruction = instruction;
|
this.instruction = instruction;
|
||||||
speedModifier = InstructionSpeedModifiers.FORWARD;
|
this.speedModifier = speedModifier;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
|
package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.utility.Components;
|
import com.simibubi.create.foundation.utility.Components;
|
||||||
|
@ -36,4 +37,11 @@ public enum InstructionSpeedModifiers {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static InstructionSpeedModifiers getByModifier(int modifier) {
|
||||||
|
return Arrays.stream(InstructionSpeedModifiers.values())
|
||||||
|
.filter(speedModifier -> speedModifier.value == modifier)
|
||||||
|
.findAny()
|
||||||
|
.orElse(InstructionSpeedModifiers.FORWARD);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,24 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
|
||||||
|
|
||||||
import java.util.Vector;
|
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 com.simibubi.create.content.contraptions.relays.encased.SplitShaftTileEntity;
|
||||||
|
|
||||||
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
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<Instruction> instructions;
|
Vector<Instruction> instructions;
|
||||||
int currentInstruction;
|
int currentInstruction;
|
||||||
|
@ -20,6 +28,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
|
||||||
int timer;
|
int timer;
|
||||||
boolean poweredPreviously;
|
boolean poweredPreviously;
|
||||||
|
|
||||||
|
LazyOptional<IPeripheral> peripheral;
|
||||||
|
|
||||||
public SequencedGearshiftTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
public SequencedGearshiftTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||||
super(type, pos, state);
|
super(type, pos, state);
|
||||||
instructions = Instruction.createDefault();
|
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);
|
Instruction instruction = getInstruction(instructionIndex);
|
||||||
if (instruction == null || instruction.instruction == SequencerInstructions.END) {
|
if (instruction == null || instruction.instruction == SequencerInstructions.END) {
|
||||||
if (getModifier() != 0)
|
if (getModifier() != 0)
|
||||||
|
@ -156,6 +166,35 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
|
||||||
super.read(compound, clientPacket);
|
super.read(compound, clientPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
|
||||||
|
LazyOptional<T> 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<IPeripheral> peripheral) {
|
||||||
|
this.peripheral = peripheral;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LazyOptional<IPeripheral> getPeripheral() {
|
||||||
|
return this.peripheral;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getRotationSpeedModifier(Direction face) {
|
public float getRotationSpeedModifier(Direction face) {
|
||||||
if (isVirtual())
|
if (isVirtual())
|
||||||
|
@ -171,4 +210,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
|
||||||
.getSpeedModifier();
|
.getSpeedModifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vector<Instruction> getInstructions() {
|
||||||
|
return this.instructions;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue