package com.amadornes.connected.compat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; import codechicken.microblock.CommonMicroblock; import codechicken.microblock.FaceMicroblock; import codechicken.microblock.HollowMicroblock; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; 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.test.MicroMaterialConnected; import com.amadornes.connected.util.AABBUtils; import cpw.mods.fml.common.event.FMLInitializationEvent; public class CompatModuleFMP extends CompatModule { @Override public void init(FMLInitializationEvent ev) { ConnectedApi.registerBlockProvider(new ConnectedProviderFMP()); } private static class ConnectedProviderFMP 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 TileMultipart) return new ConnectedFMPCover((TileMultipart) te); return null; } } private static class ConnectedFMPCover implements IConnected { private static final AxisAlignedBB[][] boxes = new AxisAlignedBB[6][8]; static { for (int i = 0; i < 8; i++) { double thickness = i / 8D; boxes[0][i] = AxisAlignedBB.getBoundingBox(0, 0, 0, 1, thickness, 1); boxes[1][i] = AxisAlignedBB.getBoundingBox(0, 1 - thickness, 0, 1, 1, 1); boxes[2][i] = AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, thickness); boxes[3][i] = AxisAlignedBB.getBoundingBox(0, 0, 1 - thickness, 1, 1, 1); boxes[4][i] = AxisAlignedBB.getBoundingBox(0, 0, 0, thickness, 1, 1); boxes[5][i] = AxisAlignedBB.getBoundingBox(1 - thickness, 0, 0, 1, 1, 1); } } protected TileMultipart tile; public ConnectedFMPCover(TileMultipart 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 multiparts looking for face microblocks for (TMultiPart p : tile.jPartList()) { if (p instanceof FaceMicroblock || p instanceof HollowMicroblock) { CommonMicroblock mb = (CommonMicroblock) p; if (mb.getIMaterial() instanceof MicroMaterialConnected) { MicroMaterialConnected mat = (MicroMaterialConnected) mb.getIMaterial(); // Get all the cuboids for that face for (ConnectedCuboid c : ((IConnected) mat.block()).getCuboids(world, x, y, z, side)) { // Clip them to the facade's size AxisAlignedBB clipped = clipBox(c.getAABB(), ForgeDirection.getOrientation(mb.getShape()), mb.getSize()); // 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, int thickness) { thickness = Math.min(thickness, 7); AxisAlignedBB sideBox = boxes[side.ordinal()][thickness]; if (aabb.intersectsWith(sideBox)) { AxisAlignedBB box = AABBUtils.clip(aabb, sideBox); if (box == null) return null; return box; } return null; } } private static class ConnectedBCFacadeAdvanced extends ConnectedFMPCover implements IConnectedAdvanced { public ConnectedBCFacadeAdvanced(TileMultipart 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); } } }