default boolean outsideCornerEdgeOpen(int s, int edgeRot) {
        BlockPos pos = posOfInternal().relative(Direction.values()[s]);
        if (getBlockLevel().isEmptyBlock(pos)) return true;

        int side1 = s ^ 1;
        int side2 = Rotation.rotateSide(s ^ 1, edgeRot);
        TileMultipart t = BlockMultipart.getTile(getBlockLevel(), pos);
        if (t == null) return false;

        return t.getSlottedPart(side1) == null &&
                t.getSlottedPart(side2) == null &&
                t.getSlottedPart(PartMap.edgeBetween(side1, side2)) == null;
    }
Full block connection mask
<p>
0000 0000 EEEE WWWW SSSS NNNN UUUU DDDD | 00FF FFFF EEEE WWWW SSSS NNNN UUUU DDDD
<p>
For a full block, you can connect through all 6 sides, with 5 connections on each side. (1 through center, and 4 edges)
<p>
First 8 nibbles, straight connections, of nibble of 1 << r where r is a Rotation.rotationTo(blockSide, edgeSide)
D - Down
U - Up
N - North
S - South
W - West
E - East
F - Straight connections to center part or another full block
<p>
Second 8 nibbles, corner face connections:
D - Down
U - Up
N - North
S - South
W - West
E - East
core/src/main/java/mrtjp/projectred/core/tile/IConnectableBlockEntity.java