Search in sources :

Example 1 with ConnectionType

use of com.bluepowermod.api.connect.ConnectionType in project BluePower by Qmunity.

the class ConnectionLogicHelper method getNeighbor.

public C getNeighbor(T device, ForgeDirection side) {
    ForgeDirection face = ForgeDirection.UNKNOWN;
    if (device instanceof IFace)
        face = ((IFace) device).getFace();
    // In same block
    do {
        Vec3i loc = new Vec3i(device);
        T dev = provider.getConnectableAt(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), side == face.getOpposite() ? ForgeDirection.UNKNOWN : side, face == ForgeDirection.UNKNOWN ? side.getOpposite() : face);
        if (dev == null || dev == device || !provider.isValidClosedCorner(dev))
            break;
        ConnectionType type = (device instanceof IFace || dev instanceof IFace) && !(device instanceof IFace == dev instanceof IFace) ? ConnectionType.STRAIGHT : ConnectionType.CLOSED_CORNER;
        if (provider.canConnect(device, dev, side, type) && provider.canConnect(dev, device, face, type))
            return provider.createConnection(device, dev, side, face, type);
    } while (false);
    // On same block
    if (face != ForgeDirection.UNKNOWN) {
        do {
            Vec3i loc = new Vec3i(device).add(face).add(side);
            T dev = provider.getConnectableAt(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), side.getOpposite(), face.getOpposite());
            if (dev == null || dev == device || !provider.isValidOpenCorner(dev))
                break;
            Vec3i block = new Vec3i(device).add(side);
            Block b = block.getBlock();
            // Full block check
            if (b.isNormalCube() || b == Blocks.redstone_block)
                break;
            // Microblock check
            if (!OcclusionHelper.microblockOcclusionTest(block, MicroblockShape.EDGE, 2, face, side.getOpposite()))
                break;
            if (provider.canConnect(device, dev, side, ConnectionType.OPEN_CORNER) && provider.canConnect(dev, device, face.getOpposite(), ConnectionType.OPEN_CORNER))
                return provider.createConnection(device, dev, side, face.getOpposite(), ConnectionType.OPEN_CORNER);
        } while (false);
    }
    // Straight connection
    do {
        Vec3i loc = new Vec3i(device).add(side);
        T dev = provider.getConnectableAt(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), face, side.getOpposite());
        if (dev == null) {
            dev = provider.getConnectableAt(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), side.getOpposite(), side.getOpposite());
            if (dev == null && face == ForgeDirection.UNKNOWN && provider.isNormalFace(device, side)) {
                for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
                    if (d != side && d != side.getOpposite()) {
                        dev = provider.getConnectableAt(loc.getWorld(), loc.getX(), loc.getY(), loc.getZ(), d, side.getOpposite());
                        if (dev != null)
                            break;
                    }
                }
            }
        }
        if (dev == null || dev == device || !provider.isValidStraight(dev))
            break;
        if (provider.canConnect(device, dev, side, ConnectionType.STRAIGHT) && provider.canConnect(dev, device, side.getOpposite(), ConnectionType.STRAIGHT))
            return provider.createConnection(device, dev, side, side.getOpposite(), ConnectionType.STRAIGHT);
    } while (false);
    return null;
}
Also used : Vec3i(uk.co.qmunity.lib.vec.Vec3i) IFace(com.bluepowermod.api.misc.IFace) ConnectionType(com.bluepowermod.api.connect.ConnectionType) ForgeDirection(net.minecraftforge.common.util.ForgeDirection) Block(net.minecraft.block.Block)

Aggregations

ConnectionType (com.bluepowermod.api.connect.ConnectionType)1 IFace (com.bluepowermod.api.misc.IFace)1 Block (net.minecraft.block.Block)1 ForgeDirection (net.minecraftforge.common.util.ForgeDirection)1 Vec3i (uk.co.qmunity.lib.vec.Vec3i)1