diff --git a/common/src/main/java/com/copycatsplus/copycats/content/copycat/flat_pane/CopycatFlatPaneBlock.java b/common/src/main/java/com/copycatsplus/copycats/content/copycat/flat_pane/CopycatFlatPaneBlock.java index 08a88c820..8fcae4a40 100644 --- a/common/src/main/java/com/copycatsplus/copycats/content/copycat/flat_pane/CopycatFlatPaneBlock.java +++ b/common/src/main/java/com/copycatsplus/copycats/content/copycat/flat_pane/CopycatFlatPaneBlock.java @@ -15,6 +15,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -100,7 +101,40 @@ public BlockState transform(BlockState state, StructureTransform transform) { @Override public boolean isIgnoredConnectivitySide(BlockAndTintGetter reader, BlockState fromState, Direction face, BlockPos fromPos, BlockPos toPos, BlockState toState) { - return (toState.getBlock() instanceof IronBarsBlock && face.getAxis().isVertical()); + toState = reader.getBlockState(toPos); + Vec3i diff = toPos.subtract(fromPos); + if (diff.equals(Vec3i.ZERO)) + return false; + Direction facing = Direction.fromDelta(diff.getX(), diff.getY(), diff.getZ()); + if (toState.getBlock() instanceof IronBarsBlock) { + if (facing == null) + return true; + return face.getAxis().isVertical() || fromState.getValue(AXIS) == facing.getAxis(); + } else if (toState.is(this)) { + if (facing == null) + return true; + return toState.getValue(AXIS) != fromState.getValue(AXIS) || fromState.getValue(AXIS) == facing.getAxis(); + } + return true; + } + + @Override + public boolean canConnectTexturesToward(BlockAndTintGetter reader, BlockPos fromPos, BlockPos toPos, BlockState fromState) { + BlockState toState = reader.getBlockState(toPos); + Vec3i diff = toPos.subtract(fromPos); + if (diff.equals(Vec3i.ZERO)) + return true; + Direction facing = Direction.fromDelta(diff.getX(), diff.getY(), diff.getZ()); + if (toState.getBlock() instanceof IronBarsBlock) { + if (facing == null) + return false; + return fromState.getValue(AXIS) != facing.getAxis(); + } else if (toState.is(this)) { + if (facing == null) + return false; + return toState.getValue(AXIS) == fromState.getValue(AXIS) && fromState.getValue(AXIS) != facing.getAxis(); + } + return false; } @Override 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 b2322bcf9..bc3885f66 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 @@ -319,10 +319,6 @@ default void playerWillDestroy(Level level, BlockPos pos, BlockState state, Play static BlockState getAppearance(ICopycatBlock block, BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, BlockState queryState, BlockPos queryPos) { - // queryState is inconsistent between different CT mods - // our assumption is that queryState refers to the true block state (copycat), not the material - queryState = level.getBlockState(queryPos); - if (block.isIgnoredConnectivitySide(level, state, side, pos, queryPos, queryState)) return state; @@ -490,6 +486,10 @@ default boolean isIgnoredConnectivitySide(BlockAndTintGetter reader, BlockState return false; } + // queryState is inconsistent between different CT mods + // our assumption is that queryState refers to the true block state (copycat), not the material + toState = reader.getBlockState(toPos); + // we are swapping to and from states because we want to consider from the perspective of the block that is trying // to display connected textures return !checkConnection(reader, toPos, fromPos, toState); 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 451fde411..ea0db4b48 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 @@ -393,9 +393,6 @@ default void fillEmptyParts(Level level, BlockPos pos, BlockState state, BlockSt static BlockState getAppearance(IMultiStateCopycatBlock block, BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, BlockState queryState, BlockPos queryPos) { - // queryState is inconsistent between different CT mods - // our assumption is that queryState refers to the true block state (copycat), not the material - queryState = level.getBlockState(queryPos); BlockAndTintGetter reader = Mods.ATHENA.runIfInstalled(() -> () -> AthenaCompat.unwrapAthenaGetter(level)).orElse(level); diff --git a/common/src/main/java/com/copycatsplus/copycats/mixin/copycat/flat_pane/IronBarsBlockMixin.java b/common/src/main/java/com/copycatsplus/copycats/mixin/copycat/flat_pane/IronBarsBlockMixin.java index 0260c1341..a70e60c88 100644 --- a/common/src/main/java/com/copycatsplus/copycats/mixin/copycat/flat_pane/IronBarsBlockMixin.java +++ b/common/src/main/java/com/copycatsplus/copycats/mixin/copycat/flat_pane/IronBarsBlockMixin.java @@ -27,4 +27,52 @@ private boolean attachsToCopycat(IronBarsBlock instance, BlockState state, boole } return original.call(instance, state, solidSide); } + + @WrapOperation( + method = "getStateForPlacement", + at = @At(ordinal = 0, value = "INVOKE", target = "Lnet/minecraft/world/level/block/IronBarsBlock;attachsTo(Lnet/minecraft/world/level/block/state/BlockState;Z)Z") + ) + private boolean attachNorth(IronBarsBlock instance, BlockState state, boolean solidSide, Operation original) { + if (state.getBlock() instanceof CopycatFlatPaneBlock) { + Axis axis = state.getValue(CopycatFlatPaneBlock.AXIS); + return axis != Axis.Y && axis != Direction.NORTH.getAxis(); + } + return original.call(instance, state, solidSide); + } + + @WrapOperation( + method = "getStateForPlacement", + at = @At(ordinal = 1, value = "INVOKE", target = "Lnet/minecraft/world/level/block/IronBarsBlock;attachsTo(Lnet/minecraft/world/level/block/state/BlockState;Z)Z") + ) + private boolean attachSouth(IronBarsBlock instance, BlockState state, boolean solidSide, Operation original) { + if (state.getBlock() instanceof CopycatFlatPaneBlock) { + Axis axis = state.getValue(CopycatFlatPaneBlock.AXIS); + return axis != Axis.Y && axis != Direction.SOUTH.getAxis(); + } + return original.call(instance, state, solidSide); + } + + @WrapOperation( + method = "getStateForPlacement", + at = @At(ordinal = 2, value = "INVOKE", target = "Lnet/minecraft/world/level/block/IronBarsBlock;attachsTo(Lnet/minecraft/world/level/block/state/BlockState;Z)Z") + ) + private boolean attachWest(IronBarsBlock instance, BlockState state, boolean solidSide, Operation original) { + if (state.getBlock() instanceof CopycatFlatPaneBlock) { + Axis axis = state.getValue(CopycatFlatPaneBlock.AXIS); + return axis != Axis.Y && axis != Direction.WEST.getAxis(); + } + return original.call(instance, state, solidSide); + } + + @WrapOperation( + method = "getStateForPlacement", + at = @At(ordinal = 3, value = "INVOKE", target = "Lnet/minecraft/world/level/block/IronBarsBlock;attachsTo(Lnet/minecraft/world/level/block/state/BlockState;Z)Z") + ) + private boolean attachEast(IronBarsBlock instance, BlockState state, boolean solidSide, Operation original) { + if (state.getBlock() instanceof CopycatFlatPaneBlock) { + Axis axis = state.getValue(CopycatFlatPaneBlock.AXIS); + return axis != Axis.Y && axis != Direction.EAST.getAxis(); + } + return original.call(instance, state, solidSide); + } } diff --git a/fabric/src/main/java/com/copycatsplus/copycats/fabric/mixin/foundation/copycat/CopycatBlockMixin.java b/fabric/src/main/java/com/copycatsplus/copycats/fabric/mixin/foundation/copycat/CopycatBlockMixin.java index cfb64b321..66a3a71fb 100644 --- a/fabric/src/main/java/com/copycatsplus/copycats/fabric/mixin/foundation/copycat/CopycatBlockMixin.java +++ b/fabric/src/main/java/com/copycatsplus/copycats/fabric/mixin/foundation/copycat/CopycatBlockMixin.java @@ -1,6 +1,7 @@ package com.copycatsplus.copycats.fabric.mixin.foundation.copycat; import com.copycatsplus.copycats.content.copycat.door.CopycatDoorBlock; +import com.copycatsplus.copycats.content.copycat.pane.CopycatPaneBlock; import com.copycatsplus.copycats.content.copycat.sliding_door.CopycatSlidingDoorBlock; import com.copycatsplus.copycats.foundation.copycat.CCCopycatBlock; import com.copycatsplus.copycats.foundation.copycat.CopycatMaterialStore; @@ -67,7 +68,8 @@ CopycatShaftBlock.class, CopycatFluidPipeBlock.class, CopycatGlassFluidPipeBlock.class, - CopycatSlidingDoorBlock.class + CopycatSlidingDoorBlock.class, + CopycatPaneBlock.class }) public abstract class CopycatBlockMixin extends Block implements ICopycatBlock, CustomFrictionBlock, CustomSoundTypeBlock, LightEmissiveBlock, ExplosionResistanceBlock, diff --git a/forge/src/main/java/com/copycatsplus/copycats/forge/mixin/foundation/copycat/CopycatBlockMixin.java b/forge/src/main/java/com/copycatsplus/copycats/forge/mixin/foundation/copycat/CopycatBlockMixin.java index 6f9bd96e8..c0c144646 100644 --- a/forge/src/main/java/com/copycatsplus/copycats/forge/mixin/foundation/copycat/CopycatBlockMixin.java +++ b/forge/src/main/java/com/copycatsplus/copycats/forge/mixin/foundation/copycat/CopycatBlockMixin.java @@ -62,8 +62,7 @@ CopycatGlassFluidPipeBlock.class, CopycatDoorBlock.class, CopycatSlidingDoorBlock.class, - CopycatPaneBlock.class, - CopycatFlatPaneBlock.class + CopycatPaneBlock.class }) public abstract class CopycatBlockMixin extends Block implements ICopycatBlock {