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;
}
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;
}
Aggregations