Skip to content

Commit

Permalink
Fix schematics item requirement for all copycats
Browse files Browse the repository at this point in the history
They are all currently too cheap because they don't consider cases where a copycat takes multiple items to build
  • Loading branch information
hlysine committed Jul 21, 2024
1 parent aea62bb commit cc9ccc2
Show file tree
Hide file tree
Showing 18 changed files with 128 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
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;
import com.copycatsplus.copycats.foundation.copycat.model.ScaledBlockAndTintGetter;
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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

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;
import com.copycatsplus.copycats.foundation.copycat.multistate.WaterloggedMultiStateCopycatBlock;
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;
Expand All @@ -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;
Expand All @@ -50,7 +54,7 @@

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class CopycatHalfLayerBlock extends WaterloggedMultiStateCopycatBlock {
public class CopycatHalfLayerBlock extends WaterloggedMultiStateCopycatBlock implements ISpecialBlockItemRequirement {


public static final EnumProperty<Axis> AXIS = BlockStateProperties.HORIZONTAL_AXIS;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

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;
import com.copycatsplus.copycats.foundation.copycat.multistate.WaterloggedMultiStateCopycatBlock;
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;
Expand All @@ -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;
Expand All @@ -50,7 +54,7 @@

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class CopycatSlabBlock extends WaterloggedMultiStateCopycatBlock {
public class CopycatSlabBlock extends WaterloggedMultiStateCopycatBlock implements ISpecialBlockItemRequirement {

public static final EnumProperty<Axis> AXIS = BlockStateProperties.AXIS;
public static final EnumProperty<SlabType> SLAB_TYPE = BlockStateProperties.SLAB_TYPE;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -100,6 +101,11 @@ public void setCTEnabledInternal(boolean value) {
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
}

@Override
public ItemRequirement getRequiredItems(BlockState state) {
return ICopycatBlockEntity.super.getRequiredItems(state);
}

@Override
public void read(CompoundTag tag, boolean clientPacket) {
super.read(tag, clientPacket);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.*;
Expand Down Expand Up @@ -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.
* <p>
Expand Down
Loading

0 comments on commit cc9ccc2

Please sign in to comment.