Skip to content

Commit

Permalink
Fix CT for panes and flat panes
Browse files Browse the repository at this point in the history
  • Loading branch information
hlysine committed Jan 19, 2025
1 parent d351ccb commit a90d381
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean> 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<Boolean> 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<Boolean> 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<Boolean> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@
CopycatGlassFluidPipeBlock.class,
CopycatDoorBlock.class,
CopycatSlidingDoorBlock.class,
CopycatPaneBlock.class,
CopycatFlatPaneBlock.class
CopycatPaneBlock.class
})
public abstract class CopycatBlockMixin extends Block implements ICopycatBlock {

Expand Down

0 comments on commit a90d381

Please sign in to comment.