From 64cac87f456cb81a27a090429ffd787b572a8aab Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Wed, 7 Oct 2026 19:37:27 -0400 Subject: [PATCH] Implement preservation sensor --- .../structure/PreservationSensorBlock.java | 72 ++++++++++++++++++ .../PreservationSensorBlockEntity.java | 51 +++++++++++++ .../registries/SpectrumBlockEntities.java | 1 + .../spectrum/registries/SpectrumBlocks.java | 1 + .../registries/SpectrumItemGroups.java | 1 + .../blockstates/preservation_sensor.json | 10 +++ .../resources/assets/spectrum/lang/en_us.json | 1 + .../models/block/preservation_sensor.json | 6 ++ .../models/block/preservation_sensor_on.json | 6 ++ .../models/item/preservation_sensor.json | 3 + .../textures/block/preservation_sensor.png | Bin 0 -> 518 bytes .../textures/block/preservation_sensor_on.png | Bin 0 -> 519 bytes .../ink_color_mapping/item/spectrum.json | 1 + .../block/unbreakable_structure_blocks.json | 1 + 14 files changed, 154 insertions(+) create mode 100644 src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlock.java create mode 100644 src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlockEntity.java create mode 100644 src/main/resources/assets/spectrum/blockstates/preservation_sensor.json create mode 100644 src/main/resources/assets/spectrum/models/block/preservation_sensor.json create mode 100644 src/main/resources/assets/spectrum/models/block/preservation_sensor_on.json create mode 100644 src/main/resources/assets/spectrum/models/item/preservation_sensor.json create mode 100644 src/main/resources/assets/spectrum/textures/block/preservation_sensor.png create mode 100644 src/main/resources/assets/spectrum/textures/block/preservation_sensor_on.png diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlock.java new file mode 100644 index 0000000000..362ee61afc --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlock.java @@ -0,0 +1,72 @@ +package de.dafuqs.spectrum.blocks.structure; + +import com.mojang.serialization.*; +import de.dafuqs.spectrum.blocks.redstone.*; +import net.minecraft.core.*; +import net.minecraft.server.level.*; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; +import net.minecraft.world.level.block.state.properties.*; + +public class PreservationSensorBlock extends BaseEntityBlock { + + public static final MapCodec CODEC = simpleCodec(PreservationSensorBlock::new); + + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public PreservationSensorBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(POWERED, false)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new PreservationSensorBlockEntity(pos, state); + } + + @Override + public void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { + var isPowered = world.hasNeighborSignal(pos) || world.hasNeighborSignal(pos.above()); + boolean wasPowered = state.getValue(POWERED); + + if (isPowered && !wasPowered) { + if (!world.isClientSide()) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof PreservationSensorBlockEntity sensorBlockEntity) { + sensorBlockEntity.activateController(); + } + } + world.setBlock(pos, state.setValue(POWERED, true), Block.UPDATE_CLIENTS); + } else if (!isPowered && wasPowered) { + world.setBlock(pos, state.setValue(POWERED, false), Block.UPDATE_CLIENTS); + } + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING, POWERED); + } +} diff --git a/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlockEntity.java new file mode 100644 index 0000000000..98e503c4e1 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/blocks/structure/PreservationSensorBlockEntity.java @@ -0,0 +1,51 @@ +package de.dafuqs.spectrum.blocks.structure; + +import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.server.level.*; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.*; + +public class PreservationSensorBlockEntity extends BlockEntity { + + protected Vec3i controllerOffset = Vec3i.ZERO; + + public PreservationSensorBlockEntity(BlockPos pos, BlockState state) { + super(SpectrumBlockEntities.PRESERVATION_SENSOR.get(), pos, state); + } + + @Override + public void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.loadAdditional(nbt, registryLookup); + this.controllerOffset = null; + if (nbt.contains("ControllerOffset", Tag.TAG_INT_ARRAY)) { + int[] offset = nbt.getIntArray("ControllerOffset"); + this.controllerOffset = new Vec3i(offset[0], offset[1], offset[2]); + } + } + + @Override + public void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) { + super.saveAdditional(nbt, registryLookup); + if (this.controllerOffset != null) { + nbt.putIntArray("ControllerOffset", new int[]{this.controllerOffset.getX(), this.controllerOffset.getY(), this.controllerOffset.getZ()}); + } + } + + @Override + public boolean onlyOpCanSetNbt() { + return true; + } + + public void activateController() { + if (level instanceof ServerLevel && controllerOffset != null) { + BlockEntity blockEntity = level.getBlockEntity(Support.directionalOffset(this.worldPosition, this.controllerOffset, level.getBlockState(this.worldPosition).getValue(PreservationSensorBlock.FACING))); + if (blockEntity instanceof PreservationControllerBlockEntity controller) { + controller.openExit(); + } + } + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlockEntities.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlockEntities.java index ed84a3528c..ad0f30e549 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlockEntities.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlockEntities.java @@ -109,6 +109,7 @@ public class SpectrumBlockEntities { public static DeferredHolder, BlockEntityType> PRESERVATION_CONTROLLER = register("preservation_controller", PreservationControllerBlockEntity::new, SpectrumBlocks.PRESERVATION_CONTROLLER); public static DeferredHolder, BlockEntityType> PRESERVATION_ROUNDEL = register("preservation_roundel", PreservationRoundelBlockEntity::new, SpectrumBlocks.PRESERVATION_ROUNDEL); + public static DeferredHolder, BlockEntityType> PRESERVATION_SENSOR = register("preservation_sensor", PreservationSensorBlockEntity::new, SpectrumBlocks.PRESERVATION_SENSOR); public static DeferredHolder, BlockEntityType> PRESERVATION_BLOCK_DETECTOR = register("preservation_block_detector", PreservationBlockDetectorBlockEntity::new, SpectrumBlocks.PRESERVATION_BLOCK_DETECTOR); public static DeferredHolder, BlockEntityType> DEEP_LIGHT = register("deep_light", DeepLightBlockEntity::new, SpectrumBlocks.DEEP_LIGHT_CHISELED_PRESERVATION_STONE); public static DeferredHolder, BlockEntityType> PLAYER_TRACKING = register("player_tracking", PlayerTrackerBlockEntity::new, SpectrumBlocks.MANXI, SpectrumBlocks.PRESERVATION_ITEM_BOWL); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java index 906eb22f14..1ae3d37c2f 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumBlocks.java @@ -1771,6 +1771,7 @@ private static BlockBehaviour.Properties preservationBlock() { public static final DeferredBlock PRESERVATION_GLASS = register(simple(blockWithItem("preservation_glass", () -> new TransparentBlock(preservationBlock().sound(SoundType.GLASS).noOcclusion().isRedstoneConductor(SpectrumBlocks::never).isSuffocating(SpectrumBlocks::never).isViewBlocking(SpectrumBlocks::never))))); public static final DeferredBlock TINTED_PRESERVATION_GLASS = register(simple(blockWithItem("tinted_preservation_glass", () -> new TintedGlassBlock(BlockBehaviour.Properties.ofFullCopy(PRESERVATION_GLASS.get()).pushReaction(PushReaction.NORMAL))))); public static final DeferredBlock PRESERVATION_ROUNDEL = register(singleton(blockWithItem("preservation_roundel", () -> new PreservationRoundelBlock(preservationBlock().noOcclusion().forceSolidOn())), SpectrumTexturedModelProviders.ROUNDEL)); + public static final DeferredBlock PRESERVATION_SENSOR = register(simple(blockWithItem("preservation_sensor", () -> new PreservationSensorBlock(preservationBlock())))); public static final DeferredBlock PRESERVATION_BLOCK_DETECTOR = register(blockWithItem("preservation_block_detector", () -> new PreservationBlockDetectorBlock(preservationBlock())).withBlockModel((ctx, block) -> MultiVariantGenerator.multiVariant(block, SpectrumModelHelper.createModelVariant(SpectrumTexturedModelProviders.complexOrientable(b -> b, "_side", b -> b, "_top", b -> PRESERVATION_STONE.get(), "_top_generic", b -> b, "_front", b -> b, "_back", b -> b, "_side").create(block, ctx.modelOutput))).with(SpectrumModelHelper.createNorthDefaultFacingVariantMap()))); private static BlockBehaviour.Properties shootingStar() { diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java index 55cef1f4a1..8f43e73a66 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java @@ -1532,6 +1532,7 @@ public static void registerSubTabs() { entries.accept(SpectrumBlocks.PRESERVATION_GLASS); entries.accept(SpectrumBlocks.TINTED_PRESERVATION_GLASS); entries.accept(SpectrumBlocks.PRESERVATION_ROUNDEL); + entries.accept(SpectrumBlocks.PRESERVATION_SENSOR); entries.accept(SpectrumBlocks.PRESERVATION_BLOCK_DETECTOR); entries.accept(SpectrumBlocks.DIKE_GATE_FOUNTAIN); entries.accept(SpectrumBlocks.DIKE_GATE); diff --git a/src/main/resources/assets/spectrum/blockstates/preservation_sensor.json b/src/main/resources/assets/spectrum/blockstates/preservation_sensor.json new file mode 100644 index 0000000000..6cfc9b9e4a --- /dev/null +++ b/src/main/resources/assets/spectrum/blockstates/preservation_sensor.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "spectrum:block/preservation_sensor" + }, + "powered=true": { + "model": "spectrum:block/preservation_sensor_on" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/spectrum/lang/en_us.json b/src/main/resources/assets/spectrum/lang/en_us.json index a43d7844dc..02925d14c7 100644 --- a/src/main/resources/assets/spectrum/lang/en_us.json +++ b/src/main/resources/assets/spectrum/lang/en_us.json @@ -1720,6 +1720,7 @@ "block.spectrum.preservation_controller": "Preservation Controller", "block.spectrum.preservation_glass": "Preservation Glass", "block.spectrum.preservation_roundel": "Preservation Roundel", + "block.spectrum.preservation_sensor": "Preservation Sensor", "block.spectrum.preservation_slab": "Preservation Slab", "block.spectrum.preservation_stairs": "Preservation Stairs", "block.spectrum.preservation_stone": "Preservation Stone", diff --git a/src/main/resources/assets/spectrum/models/block/preservation_sensor.json b/src/main/resources/assets/spectrum/models/block/preservation_sensor.json new file mode 100644 index 0000000000..f6364d6fa7 --- /dev/null +++ b/src/main/resources/assets/spectrum/models/block/preservation_sensor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "spectrum:block/preservation_sensor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/spectrum/models/block/preservation_sensor_on.json b/src/main/resources/assets/spectrum/models/block/preservation_sensor_on.json new file mode 100644 index 0000000000..1296c78b36 --- /dev/null +++ b/src/main/resources/assets/spectrum/models/block/preservation_sensor_on.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "spectrum:block/preservation_sensor_on" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/spectrum/models/item/preservation_sensor.json b/src/main/resources/assets/spectrum/models/item/preservation_sensor.json new file mode 100644 index 0000000000..9713485410 --- /dev/null +++ b/src/main/resources/assets/spectrum/models/item/preservation_sensor.json @@ -0,0 +1,3 @@ +{ + "parent": "spectrum:block/preservation_sensor" +} \ No newline at end of file diff --git a/src/main/resources/assets/spectrum/textures/block/preservation_sensor.png b/src/main/resources/assets/spectrum/textures/block/preservation_sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0965036755320e9508faa4dc127fce5f8cdad7 GIT binary patch literal 518 zcmV+h0{Q)kP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;zXY5*Fpo9#fD zsd&OMmMg_%Ji@jd94VQMM`WRSeZ#xw5k@|(+k1+(FtII%hU+q)P07Q2Ha$4C9Bg4? zSY?4DCAKirrKgMFB>DO4VBZ$zA*&?BtmQn>VwTz@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;zXoow=em?ja>LO8>TLx;rB=&!AoPuR z!qFB>m(ie)W!l(MG8**BLiO~F2ge}@J?fX&