From cc9ccc2f1eb8c621bab633f1bc00af3f319834a9 Mon Sep 17 00:00:00 2001 From: Henry Lin Date: Sun, 21 Jul 2024 17:37:04 +0800 Subject: [PATCH] Fix schematics item requirement for all copycats They are all currently too cheap because they don't consider cases where a copycat takes multiple items to build --- .../copycat/board/CopycatBoardBlock.java | 11 ++++++++++- .../copycat/bytes/CopycatByteBlock.java | 10 +++++++++- .../cogwheel/CopycatCogWheelBlockEntity.java | 7 +++++++ .../CopycatFluidPipeBlockEntity.java | 6 ++++++ .../CopycatStraightPipeBlockEntity.java | 6 ++++++ .../half_layer/CopycatHalfLayerBlock.java | 11 ++++++++++- .../copycat/layer/CopycatLayerBlock.java | 5 +---- .../shaft/CopycatShaftBlockEntity.java | 6 ++++++ .../copycat/slab/CopycatSlabBlock.java | 17 ++++++++++++++++- .../copycat/slice/CopycatSliceBlock.java | 5 +---- .../slope_layer/CopycatSlopeLayerBlock.java | 5 +---- .../CopycatVerticalSliceBlock.java | 5 +---- .../copycat/CCCopycatBlockEntity.java | 6 ++++++ .../foundation/copycat/ICopycatBlock.java | 12 ++++++++++++ .../multistate/IMultiStateCopycatBlock.java | 19 +++++++++++++++++++ .../IMultiStateCopycatBlockEntity.java | 10 ++++++++++ .../MultiStateCopycatBlockEntity.java | 6 ++++++ .../copycats/utility/ItemUtils.java | 1 + 18 files changed, 128 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/board/CopycatBoardBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/board/CopycatBoardBlock.java index 598c4c7cb..edbf79f30 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/board/CopycatBoardBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/board/CopycatBoardBlock.java @@ -1,6 +1,7 @@ package com.copycatsplus.copycats.content.copycat.board; import com.copycatsplus.copycats.CCShapes; +import com.copycatsplus.copycats.foundation.copycat.ICopycatBlock; import com.copycatsplus.copycats.foundation.copycat.ICustomCTBlocking; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlock; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlockEntity; @@ -8,6 +9,8 @@ import com.copycatsplus.copycats.foundation.copycat.multistate.WaterloggedMultiStateCopycatBlock; import com.google.common.collect.ImmutableMap; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -28,6 +31,7 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -47,7 +51,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CopycatBoardBlock extends WaterloggedMultiStateCopycatBlock implements ICustomCTBlocking { +public class CopycatBoardBlock extends WaterloggedMultiStateCopycatBlock implements ICustomCTBlocking, ISpecialBlockItemRequirement { public static BooleanProperty UP = BlockStateProperties.UP; public static BooleanProperty DOWN = BlockStateProperties.DOWN; public static BooleanProperty NORTH = BlockStateProperties.NORTH; @@ -259,6 +263,11 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) return InteractionResult.SUCCESS; } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + return IMultiStateCopycatBlock.getRequiredItemsForParts(state, UP, DOWN, NORTH, SOUTH, EAST, WEST); + } + private static int getByAxis(Vec3i pos, Direction.Axis axis) { return switch (axis) { case X -> pos.getX(); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/bytes/CopycatByteBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/bytes/CopycatByteBlock.java index 3afed7a4c..8b6d20402 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/bytes/CopycatByteBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/bytes/CopycatByteBlock.java @@ -8,6 +8,8 @@ import com.mojang.math.OctahedralGroup; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -26,6 +28,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -43,7 +46,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CopycatByteBlock extends WaterloggedMultiStateCopycatBlock { +public class CopycatByteBlock extends WaterloggedMultiStateCopycatBlock implements ISpecialBlockItemRequirement { public static BooleanProperty TOP_NE = BooleanProperty.create("top_northeast"); public static BooleanProperty TOP_NW = BooleanProperty.create("top_northwest"); public static BooleanProperty TOP_SE = BooleanProperty.create("top_southeast"); @@ -250,6 +253,11 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) return InteractionResult.SUCCESS; } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + return IMultiStateCopycatBlock.getRequiredItemsForParts(state, TOP_NE, TOP_NW, TOP_SE, TOP_SW, BOTTOM_NE, BOTTOM_NW, BOTTOM_SE, BOTTOM_SW); + } + public boolean supportsExternalFaceHiding(BlockState state) { return true; } diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/cogwheel/CopycatCogWheelBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/cogwheel/CopycatCogWheelBlockEntity.java index 9fb759d7f..c012f7acb 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/cogwheel/CopycatCogWheelBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/cogwheel/CopycatCogWheelBlockEntity.java @@ -1,8 +1,10 @@ package com.copycatsplus.copycats.content.copycat.cogwheel; +import com.copycatsplus.copycats.foundation.copycat.ICopycatBlockEntity; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlockEntity; import com.copycatsplus.copycats.foundation.copycat.multistate.MaterialItemStorage; import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockEntity; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -31,6 +33,11 @@ public void setMaterialItemStorageInternal(MaterialItemStorage storage) { this.storage = storage; } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return IMultiStateCopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatFluidPipeBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatFluidPipeBlockEntity.java index 97529cb92..d7f1e6e03 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatFluidPipeBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatFluidPipeBlockEntity.java @@ -2,6 +2,7 @@ import com.copycatsplus.copycats.foundation.copycat.ICopycatBlockEntity; import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -50,6 +51,11 @@ public void setCTEnabledInternal(boolean value) { enableCT = value; } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return ICopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatStraightPipeBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatStraightPipeBlockEntity.java index e1b705714..d729a2ccc 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatStraightPipeBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/fluid_pipe/CopycatStraightPipeBlockEntity.java @@ -2,6 +2,7 @@ import com.copycatsplus.copycats.foundation.copycat.ICopycatBlockEntity; import com.simibubi.create.content.fluids.pipes.StraightPipeBlockEntity; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -50,6 +51,11 @@ public void setCTEnabledInternal(boolean value) { enableCT = value; } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return ICopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/half_layer/CopycatHalfLayerBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/half_layer/CopycatHalfLayerBlock.java index 02549422c..dd06e62d5 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/half_layer/CopycatHalfLayerBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/half_layer/CopycatHalfLayerBlock.java @@ -2,6 +2,7 @@ import com.copycatsplus.copycats.CCShapes; import com.copycatsplus.copycats.Copycats; +import com.copycatsplus.copycats.foundation.copycat.ICopycatBlock; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlock; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlockEntity; import com.copycatsplus.copycats.foundation.copycat.model.ScaledBlockAndTintGetter; @@ -9,6 +10,8 @@ import com.google.common.collect.ImmutableMap; import com.mojang.math.OctahedralGroup; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -25,6 +28,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -50,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CopycatHalfLayerBlock extends WaterloggedMultiStateCopycatBlock { +public class CopycatHalfLayerBlock extends WaterloggedMultiStateCopycatBlock implements ISpecialBlockItemRequirement { public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; @@ -215,6 +219,11 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) return InteractionResult.SUCCESS; } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + return ICopycatBlock.getRequiredItemsForLayer(state, POSITIVE_LAYERS).union(ICopycatBlock.getRequiredItemsForLayer(state, NEGATIVE_LAYERS)); + } + @Override public boolean isIgnoredConnectivitySide(String property, BlockAndTintGetter reader, BlockState state, Direction face, BlockPos fromPos, BlockPos toPos) { BlockState toState = reader.getBlockState(toPos); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/layer/CopycatLayerBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/layer/CopycatLayerBlock.java index 6dbad5105..f61e4557f 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/layer/CopycatLayerBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/layer/CopycatLayerBlock.java @@ -111,10 +111,7 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { - return new ItemRequirement( - ItemRequirement.ItemUseType.CONSUME, - new ItemStack(asItem(), state.getValue(LAYERS)) - ); + return ICopycatBlock.getRequiredItemsForLayer(state, LAYERS); } @Override diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/shaft/CopycatShaftBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/shaft/CopycatShaftBlockEntity.java index 53902cc3f..b3da95748 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/shaft/CopycatShaftBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/shaft/CopycatShaftBlockEntity.java @@ -2,6 +2,7 @@ import com.copycatsplus.copycats.foundation.copycat.ICopycatBlockEntity; import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockEntity; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -49,6 +50,11 @@ public void setCTEnabledInternal(boolean value) { enableCT = value; } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return ICopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slab/CopycatSlabBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slab/CopycatSlabBlock.java index 2bb229472..2fee754d2 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slab/CopycatSlabBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slab/CopycatSlabBlock.java @@ -2,6 +2,7 @@ import com.copycatsplus.copycats.CCBlocks; import com.copycatsplus.copycats.CCShapes; +import com.copycatsplus.copycats.foundation.copycat.ICopycatBlock; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlock; import com.copycatsplus.copycats.foundation.copycat.multistate.IMultiStateCopycatBlockEntity; import com.copycatsplus.copycats.foundation.copycat.model.ScaledBlockAndTintGetter; @@ -9,6 +10,8 @@ import com.copycatsplus.copycats.utility.InteractionUtils; import com.mojang.math.OctahedralGroup; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.placement.IPlacementHelper; import com.simibubi.create.foundation.placement.PlacementHelpers; import com.simibubi.create.foundation.placement.PlacementOffset; @@ -29,6 +32,7 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -50,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CopycatSlabBlock extends WaterloggedMultiStateCopycatBlock { +public class CopycatSlabBlock extends WaterloggedMultiStateCopycatBlock implements ISpecialBlockItemRequirement { public static final EnumProperty AXIS = BlockStateProperties.AXIS; public static final EnumProperty SLAB_TYPE = BlockStateProperties.SLAB_TYPE; @@ -152,6 +156,17 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) return InteractionResult.SUCCESS; } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + return new ItemRequirement( + ItemRequirement.ItemUseType.CONSUME, + new ItemStack(asItem(), switch (state.getValue(SLAB_TYPE)) { + case BOTTOM, TOP -> 1; + case DOUBLE -> 2; + }) + ); + } + @Override public boolean isIgnoredConnectivitySide(String property, BlockAndTintGetter reader, BlockState state, Direction face, BlockPos fromPos, BlockPos toPos) { if (fromPos.equals(toPos)) return false; // Compat with Fusion CT: allow connection to self diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slice/CopycatSliceBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slice/CopycatSliceBlock.java index 41d5a7250..3ac2da829 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slice/CopycatSliceBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slice/CopycatSliceBlock.java @@ -185,10 +185,7 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { - return new ItemRequirement( - ItemRequirement.ItemUseType.CONSUME, - new ItemStack(asItem(), state.getValue(LAYERS)) - ); + return ICopycatBlock.getRequiredItemsForLayer(state, LAYERS); } @Override diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slope_layer/CopycatSlopeLayerBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slope_layer/CopycatSlopeLayerBlock.java index a065565eb..002e46ee7 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/slope_layer/CopycatSlopeLayerBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/slope_layer/CopycatSlopeLayerBlock.java @@ -126,10 +126,7 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { - return new ItemRequirement( - ItemRequirement.ItemUseType.CONSUME, - new ItemStack(asItem(), state.getValue(LAYERS)) - ); + return ICopycatBlock.getRequiredItemsForLayer(state, LAYERS); } @Override diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/vertical_slice/CopycatVerticalSliceBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/vertical_slice/CopycatVerticalSliceBlock.java index 10fa5533b..23aadfb42 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/vertical_slice/CopycatVerticalSliceBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/vertical_slice/CopycatVerticalSliceBlock.java @@ -192,10 +192,7 @@ public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { - return new ItemRequirement( - ItemRequirement.ItemUseType.CONSUME, - new ItemStack(asItem(), state.getValue(LAYERS)) - ); + return ICopycatBlock.getRequiredItemsForLayer(state, LAYERS); } @Override diff --git a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/CCCopycatBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/CCCopycatBlockEntity.java index bc563438a..8e29f45b2 100644 --- a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/CCCopycatBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/CCCopycatBlockEntity.java @@ -2,6 +2,7 @@ import java.util.List; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -100,6 +101,11 @@ public void setCTEnabledInternal(boolean value) { public void addBehaviours(List behaviours) { } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return ICopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/ICopycatBlock.java b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/ICopycatBlock.java index 6126f0fd7..153de13e8 100644 --- a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/ICopycatBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/ICopycatBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -24,6 +25,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.*; @@ -322,6 +324,16 @@ static BlockState getMaterial(BlockGetter reader, BlockPos targetPos) { return Blocks.AIR.defaultBlockState(); } + /** + * Utility to get the required items for a layer of a block state. + */ + static ItemRequirement getRequiredItemsForLayer(BlockState state, IntegerProperty property) { + return new ItemRequirement( + ItemRequirement.ItemUseType.CONSUME, + new ItemStack(state.getBlock().asItem(), state.getValue(property)) + ); + } + /** * Transform the block state of the copycat according to the provided transform. *

diff --git a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlock.java b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlock.java index fc833690f..dd688cac3 100644 --- a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlock.java @@ -15,6 +15,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -37,6 +38,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; @@ -413,6 +416,22 @@ static BlockState getMaterial(BlockGetter reader, BlockPos targetPos, String pro void transformStorage(BlockState state, IMultiStateCopycatBlockEntity be, StructureTransform transform); + /** + * Utility to get the required items for a multi-state block where each part is represented by a boolean property. + */ + static ItemRequirement getRequiredItemsForParts(BlockState state, BooleanProperty... property) { + int count = 0; + for (BooleanProperty part : property) { + if (state.getValue(part)) + count++; + } + if (count == 0) return ItemRequirement.NONE; + return new ItemRequirement( + ItemRequirement.ItemUseType.CONSUME, + new ItemStack(state.getBlock().asItem(), count) + ); + } + @Override default boolean isIgnoredConnectivitySide(BlockAndTintGetter reader, BlockState state, Direction face, BlockPos fromPos, BlockPos toPos) { diff --git a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlockEntity.java index 2dba0d48e..bf5e779c8 100644 --- a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/IMultiStateCopycatBlockEntity.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -155,6 +156,15 @@ default void setEnableCT(String property, boolean value) { notifyUpdate(); } + @Override + default ItemRequirement getRequiredItems(BlockState state) { + return new ItemRequirement( + getMaterialItemStorage().getAllConsumedItems().stream() + .map(stack -> new ItemRequirement.StackRequirement(stack, ItemRequirement.ItemUseType.CONSUME)) + .toList() + ); + } + @Override default void transform(StructureTransform transform) { getBlock().transformStorage(this.getBlockState(), this, transform); diff --git a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/MultiStateCopycatBlockEntity.java b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/MultiStateCopycatBlockEntity.java index 473bcfc22..2710bf114 100644 --- a/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/MultiStateCopycatBlockEntity.java +++ b/common/src/main/java/com/copycatsplus/copycats/foundation/copycat/multistate/MultiStateCopycatBlockEntity.java @@ -3,6 +3,7 @@ import com.copycatsplus.copycats.Copycats; import com.copycatsplus.copycats.foundation.copycat.ICopycatBlockEntity; import com.copycatsplus.copycats.utility.BlockEntityUtils; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.minecraft.MethodsReturnNonnullByDefault; @@ -48,6 +49,11 @@ public void setMaterialItemStorageInternal(MaterialItemStorage storage) { public void addBehaviours(List behaviours) { } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + return IMultiStateCopycatBlockEntity.super.getRequiredItems(state); + } + @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/common/src/main/java/com/copycatsplus/copycats/utility/ItemUtils.java b/common/src/main/java/com/copycatsplus/copycats/utility/ItemUtils.java index ac6cd2b75..339b7f3fe 100644 --- a/common/src/main/java/com/copycatsplus/copycats/utility/ItemUtils.java +++ b/common/src/main/java/com/copycatsplus/copycats/utility/ItemUtils.java @@ -1,5 +1,6 @@ package com.copycatsplus.copycats.utility; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack;