package com.amadornes.connected.compat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.pluggable.PipePluggable;
import buildcraft.transport.FacadePluggable;
import buildcraft.transport.TileGenericPipe;
import buildcraft.transport.render.FacadeBlockAccess;
import com.amadornes.connected.api.ConnectedApi;
import com.amadornes.connected.api.ConnectedApi.DefaultConnectedProvider;
import com.amadornes.connected.api.ConnectedCuboid;
import com.amadornes.connected.api.IConnected;
import com.amadornes.connected.api.IConnected.IConnectedAdvanced;
import com.amadornes.connected.util.AABBUtils;
import cpw.mods.fml.common.event.FMLInitializationEvent;
public class CompatModuleBC extends CompatModule {
@Override
public void init(FMLInitializationEvent ev) {
ConnectedApi.registerBlockProvider(new ConnectedProviderBC());
}
private static class ConnectedProviderBC extends DefaultConnectedProvider {
@Override
public IConnected findConnectable(IBlockAccess world, int x, int y, int z, int side) {
if (world instanceof FacadeBlockAccess)
return ConnectedApi.findConnectable(Minecraft.getMinecraft().theWorld, x, y, z, side);
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof TileGenericPipe)
return new ConnectedBCFacadeAdvanced((TileGenericPipe) te);
return null;
}
}
private static class ConnectedBCFacade implements IConnected {
private static final double thickness = 2 / 16D;
private static final AxisAlignedBB[] boxes = new AxisAlignedBB[] {//
//
AxisAlignedBB.getBoundingBox(0, 0, 0, 1, thickness, 1), //
AxisAlignedBB.getBoundingBox(0, 1 - thickness, 0, 1, 1, 1), //
AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, thickness), //
AxisAlignedBB.getBoundingBox(0, 0, 1 - thickness, 1, 1, 1), //
AxisAlignedBB.getBoundingBox(0, 0, 0, thickness, 1, 1), //
AxisAlignedBB.getBoundingBox(1 - thickness, 0, 0, 1, 1, 1) //
};
protected TileGenericPipe tile;
public ConnectedBCFacade(TileGenericPipe tile) {
this.tile = tile;
}
@Override
public Collection<ConnectedCuboid> getCuboids(IBlockAccess world, int x, int y, int z, ForgeDirection side) {
List<ConnectedCuboid> cuboids = new ArrayList<ConnectedCuboid>();
// Loop through all the faces looking for facades
for (ForgeDirection face : ForgeDirection.VALID_DIRECTIONS) {
PipePluggable pp = tile.getPipePluggable(face);
if (pp != null && pp instanceof FacadePluggable) {
FacadePluggable facade = (FacadePluggable) pp;
Block block = facade.getRenderingBlock();
if (block != null && block instanceof IConnected) {
// Get all the cuboids for that face
for (ConnectedCuboid c : ((IConnected) block).getCuboids(world, x, y, z, side)) {
// Clip them to the facade's size
AxisAlignedBB clipped = clipBox(c.getAABB(), face);
// If they're valid cuboids, add them to the list
if (clipped != null)
cuboids.add(new ConnectedCuboid(clipped, c.getTexture()));
}
}
}
}
return cuboids;
}
private AxisAlignedBB clipBox(AxisAlignedBB aabb, ForgeDirection side) {
AxisAlignedBB sideBox = boxes[side.ordinal()];
if (aabb.intersectsWith(sideBox)) {
AxisAlignedBB box = AABBUtils.clip(aabb, sideBox);
if (box == null)
return null;
return box;
}
return null;
}
}
private static class ConnectedBCFacadeAdvanced extends ConnectedBCFacade implements IConnectedAdvanced {
public ConnectedBCFacadeAdvanced(TileGenericPipe tile) {
super(tile);
}
@Override
public boolean canConnectTo(IBlockAccess world, int x, int y, int z, IBlockAccess world_, int x_, int y_, int z_,
IConnected connected, ConnectedCuboid cuboid, ForgeDirection side) {
return true;// ((IConnectedAdvanced) block).canConnectTo(world, x, y, z, world_, x_, y_, z_, connected, cuboid, side);
}
}
}