From 18bdec4b5466aecf80994cc41d1f6e737b094f78 Mon Sep 17 00:00:00 2001 From: Matt598 <24874369+Matt5981@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:42:05 +1000 Subject: [PATCH] Add check to contraption disassembly code to not set NBT data for Sculk sensors/shriekers. Add check in same location to reset Sculk shriekers to their default block state after contraption disassembly. (Fixes #4677) --- .../components/structureMovement/Contraption.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 8d5cb27cb..931789959 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -1006,7 +1006,7 @@ public abstract class Contraption { if (disassembled) return; disassembled = true; - + for (boolean nonBrittles : Iterate.trueAndFalse) { for (StructureBlockInfo block : blocks.values()) { if (nonBrittles == BlockMovementChecks.isBrittle(block.state)) @@ -1047,6 +1047,10 @@ public abstract class Contraption { if (state.hasProperty(SlidingDoorBlock.VISIBLE)) state = state.setValue(SlidingDoorBlock.VISIBLE, !state.getValue(SlidingDoorBlock.OPEN)) .setValue(SlidingDoorBlock.POWERED, false); + // Stop Sculk shriekers from getting "stuck" if moved mid-shriek. + if(state.is(Blocks.SCULK_SHRIEKER)){ + state = Blocks.SCULK_SHRIEKER.defaultBlockState(); + } world.setBlock(targetPos, state, Block.UPDATE_MOVE_BY_PISTON | Block.UPDATE_ALL); @@ -1060,6 +1064,12 @@ public abstract class Contraption { BlockEntity tileEntity = world.getBlockEntity(targetPos); CompoundTag tag = block.nbt; + + // Temporary fix: Calling load(CompoundTag tag) on a Sculk sensor causes it to not react to vibrations. + if(state.is(Blocks.SCULK_SENSOR) || state.is(Blocks.SCULK_SHRIEKER)){ + tag = null; + } + if (tileEntity != null) tag = NBTProcessors.process(tileEntity, tag, false); if (tileEntity != null && tag != null) {