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.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.parts.IFacadeContainer;
import appeng.api.parts.IFacadePart;
import appeng.facade.FacadePart;
import appeng.facade.IFacadeItem;
import appeng.tile.networking.TileCableBus;
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 CompatModuleAE2 extends CompatModule {
@Override
public void init(FMLInitializationEvent ev) {
ConnectedApi.registerBlockProvider(new ConnectedProviderAE2());
}
private static class ConnectedProviderAE2 extends DefaultConnectedProvider {
@Override
public IConnected findConnectable(IBlockAccess world, int x, int y, int z, int side) {
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof TileCableBus) {
return new ConnectedAE2FacadeAdvanced(((TileCableBus) te).cb.getFacadeContainer());
}
return null;
}
}
private static class ConnectedAE2Facade 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 IFacadeContainer tile;
public ConnectedAE2Facade(IFacadeContainer 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) {
IFacadePart p = tile.getFacade(face);
if (p != null && p instanceof FacadePart) {
FacadePart facade = (FacadePart) p;
Item item = facade.facade.getItem();
Block block = null;
if (item instanceof IFacadeItem) {
block = ((IFacadeItem) item).getBlock(facade.facade);
} else if (item instanceof ItemBlock) {
block = Block.getBlockFromItem(item);
} else if (item instanceof buildcraft.api.facades.IFacadeItem) {
block = ((buildcraft.api.facades.IFacadeItem) item).getBlocksForFacade(facade.facade)[0];
}
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 ConnectedAE2FacadeAdvanced extends ConnectedAE2Facade implements IConnectedAdvanced {
public ConnectedAE2FacadeAdvanced(IFacadeContainer 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);
}
}
}