Search in sources :

Example 1 with IFace

use of com.bluepowermod.api.misc.IFace in project BluePower by Qmunity.

the class PneumaticTube method canConnect.

@Override
public boolean canConnect(ForgeDirection side, IRedstoneDevice device, ConnectionType type) {
    if (type == ConnectionType.STRAIGHT) {
        if (getRedwireType(side) == null)
            return false;
        if (device instanceof IRedwire) {
            RedwireType rwt = getRedwireType(side);
            if (type == null)
                return false;
            RedwireType rwt_ = ((IRedwire) device).getRedwireType(type == ConnectionType.STRAIGHT ? side.getOpposite() : side.getOpposite());
            if (rwt_ == null)
                return false;
            if (!rwt.canConnectTo(rwt_))
                return false;
        }
        if (device instanceof IFace)
            return ((IFace) device).getFace() == side.getOpposite();
        if (!OcclusionHelper.microblockOcclusionTest(new Vec3i(this), MicroblockShape.FACE_HOLLOW, 8, side))
            return false;
        if (device instanceof PneumaticTube)
            if (device instanceof MagTube != this instanceof MagTube)
                return false;
        return true;
    }
    return false;
}
Also used : RedwireType(com.bluepowermod.api.wire.redstone.RedwireType) Vec3i(uk.co.qmunity.lib.vec.Vec3i) IFace(com.bluepowermod.api.misc.IFace) IRedwire(com.bluepowermod.api.wire.redstone.IRedwire)

Example 2 with IFace

use of com.bluepowermod.api.misc.IFace 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

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