diff --git a/common/src/main/java/dev/ryanhcode/sable/api/SubLevelAssemblyHelper.java b/common/src/main/java/dev/ryanhcode/sable/api/SubLevelAssemblyHelper.java index c95b740..e32c156 100644 --- a/common/src/main/java/dev/ryanhcode/sable/api/SubLevelAssemblyHelper.java +++ b/common/src/main/java/dev/ryanhcode/sable/api/SubLevelAssemblyHelper.java @@ -20,20 +20,27 @@ import dev.ryanhcode.sable.util.BoundedBitVolume3i; import dev.ryanhcode.sable.util.LevelAccelerator; import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.FullChunkStatus; import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; import net.minecraft.world.Clearable; import net.minecraft.world.RandomizableContainer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.HangingEntity; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DiodeBlock; +import net.minecraft.world.level.block.TorchBlock; import net.minecraft.world.level.block.BellBlock; +import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; @@ -284,12 +291,38 @@ private static boolean needsBitSet(final ServerLevel level, final BoundingBox3ic /** * For what good is the movement of a king if his people do not follow? */ - public static void moveBlocks(final ServerLevel level, final AssemblyTransform transform, final Iterable blocks) { + public static void moveBlocks(final ServerLevel level, final AssemblyTransform transform, Iterable blocks) { final ServerLevel resultingLevel = transform.resultingLevel; final LevelAccelerator accelerator = new LevelAccelerator(level); final LevelAccelerator resultingAccelerator = new LevelAccelerator(resultingLevel); + // Get Create's brittle and wrench_pickup tags. + final TagKey createBrittleTag = TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath("create", "brittle")); + final TagKey createWrenchPickupTag = TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath("create", "wrench_pickup")); + + final ObjectArrayList newBlocks = new ObjectArrayList<>(); + final ObjectArrayList brittleBlocks = new ObjectArrayList<>(); + + // Check if blocks have Create's brittle tag or the wrench_pickup tag for redstone blocks. + for (final BlockPos pos : blocks) { + final LevelChunk chunk = accelerator.getChunk(SectionPos.blockToSectionCoord(pos.getX()), + SectionPos.blockToSectionCoord(pos.getZ())); + + final BlockState posState = chunk.getBlockState(pos); + final Block block = posState.getBlock(); + + // A bit of a dirty way of checking for affected blocks. + if (posState.is(createBrittleTag) || posState.is(createWrenchPickupTag) + || block instanceof DiodeBlock || block instanceof TorchBlock || block instanceof SignBlock) { brittleBlocks.add(pos); continue; } + newBlocks.add(pos); + } + + // Add all brittle blocks in the front of the blocks list so they are processed first. + newBlocks.addAll(0, brittleBlocks); + + blocks = newBlocks; + final List states = new ArrayList<>(); BlockPos firstBlock = null; @@ -540,4 +573,4 @@ public enum State { } } } -} +} \ No newline at end of file