From 86fa50ca73b54c72018fccaa4ab4ee4637d37807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9leste=20Wouters?= Date: Thu, 5 Sep 2024 11:51:06 +0200 Subject: [PATCH] Add ComputerCraft integration to Stickers - Add CC isExtended() function to check extension state - Add CC extend()/retract()/toggle() to change the Sticker extension state, returning state change success. --- .../implementation/ComputerBehaviour.java | 4 ++ .../peripherals/StickerPeripheral.java | 62 +++++++++++++++++++ .../chassis/StickerBlockEntity.java | 24 ++++++- 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StickerPeripheral.java diff --git a/src/main/java/com/simibubi/create/compat/computercraft/implementation/ComputerBehaviour.java b/src/main/java/com/simibubi/create/compat/computercraft/implementation/ComputerBehaviour.java index a4faf85691..747f93f9a3 100644 --- a/src/main/java/com/simibubi/create/compat/computercraft/implementation/ComputerBehaviour.java +++ b/src/main/java/com/simibubi/create/compat/computercraft/implementation/ComputerBehaviour.java @@ -13,9 +13,11 @@ import com.simibubi.create.compat.computercraft.implementation.peripherals.Signa import com.simibubi.create.compat.computercraft.implementation.peripherals.SpeedControllerPeripheral; import com.simibubi.create.compat.computercraft.implementation.peripherals.SpeedGaugePeripheral; import com.simibubi.create.compat.computercraft.implementation.peripherals.StationPeripheral; +import com.simibubi.create.compat.computercraft.implementation.peripherals.StickerPeripheral; import com.simibubi.create.compat.computercraft.implementation.peripherals.StressGaugePeripheral; import com.simibubi.create.compat.computercraft.implementation.peripherals.SyncedPeripheral; import com.simibubi.create.compat.computercraft.implementation.peripherals.TrackObserverPeripheral; +import com.simibubi.create.content.contraptions.chassis.StickerBlockEntity; import com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity; import com.simibubi.create.content.kinetics.gauge.StressGaugeBlockEntity; import com.simibubi.create.content.kinetics.motor.CreativeMotorBlockEntity; @@ -66,6 +68,8 @@ public class ComputerBehaviour extends AbstractComputerBehaviour { return () -> new SpeedGaugePeripheral(sgbe); if (be instanceof StressGaugeBlockEntity sgbe) return () -> new StressGaugePeripheral(sgbe); + if (be instanceof StickerBlockEntity sbe) + return () -> new StickerPeripheral(sbe); if (be instanceof StationBlockEntity sbe) return () -> new StationPeripheral(sbe); if (be instanceof TrackObserverBlockEntity tobe) diff --git a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StickerPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StickerPeripheral.java new file mode 100644 index 0000000000..f68042df04 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StickerPeripheral.java @@ -0,0 +1,62 @@ +package com.simibubi.create.compat.computercraft.implementation.peripherals; + +import org.jetbrains.annotations.NotNull; + + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.chassis.StickerBlock; +import com.simibubi.create.content.contraptions.chassis.StickerBlockEntity; + +import dan200.computercraft.api.lua.LuaFunction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class StickerPeripheral extends SyncedPeripheral { + + public StickerPeripheral(StickerBlockEntity blockEntity) { + super(blockEntity); + } + + @LuaFunction + public boolean isExtended() { + return blockEntity.isBlockStateExtended(); + } + + @LuaFunction(mainThread = true) + public boolean extend() { + BlockState state = blockEntity.getBlockState(); + if (!AllBlocks.STICKER.has(state) || state.getValue(StickerBlock.EXTENDED)) + return false; + blockEntity.getLevel().setBlock( + blockEntity.getBlockPos(), state.setValue(StickerBlock.EXTENDED, true), Block.UPDATE_CLIENTS); + return true; + } + + @LuaFunction(mainThread = true) + public boolean retract() { + BlockState state = blockEntity.getBlockState(); + if (!AllBlocks.STICKER.has(state) || !state.getValue(StickerBlock.EXTENDED)) + return false; + blockEntity.getLevel().setBlock( + blockEntity.getBlockPos(), state.setValue(StickerBlock.EXTENDED, false), Block.UPDATE_CLIENTS); + return true; + } + + @LuaFunction(mainThread = true) + public boolean toggle() { + BlockState state = blockEntity.getBlockState(); + if (!AllBlocks.STICKER.has(state)) + return false; + boolean extended = state.getValue(StickerBlock.EXTENDED); + blockEntity.getLevel().setBlock( + blockEntity.getBlockPos(), state.setValue(StickerBlock.EXTENDED, !extended), Block.UPDATE_CLIENTS); + return true; + } + + @NotNull + @Override + public String getType() { + return "Create_Sticker"; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java index 53ca8c9396..354a3278b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java @@ -4,6 +4,8 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; +import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.contraptions.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.glue.SuperGlueItem; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; @@ -21,13 +23,19 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.DistExecutor; +import org.jetbrains.annotations.NotNull; + public class StickerBlockEntity extends SmartBlockEntity { LerpedFloat piston; boolean update; + public AbstractComputerBehaviour computerBehaviour; + public StickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); piston = LerpedFloat.linear(); @@ -35,7 +43,9 @@ public class StickerBlockEntity extends SmartBlockEntity { } @Override - public void addBehaviours(List behaviours) {} + public void addBehaviours(List behaviours) { + behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this)); + } @Override public void initialize() { @@ -99,5 +109,17 @@ public class StickerBlockEntity extends SmartBlockEntity { AllSoundEvents.SLIME_ADDED.play(level, Minecraft.getInstance().player, worldPosition, 0.35f, attach ? 0.75f : 0.2f); } + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, Direction side) { + if (computerBehaviour.isPeripheralCap(cap)) + return computerBehaviour.getPeripheralCapability(); + return super.getCapability(cap, side); + } + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + computerBehaviour.removePeripheral(); + } }