blob: 3c0f04eeaee11c707903e431082873453dce1e22 [file] [log] [blame] [raw]
package mekanism.client.render;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import net.minecraft.block.Block;
import net.minecraft.world.IBlockAccess;
/**
* CTM Logic adapted from Chisel.
* Code licensed under GPLv2
* @author AUTOMATIC_MAIDEN, asie, pokefenn, unpairedbracket
*/
public class CTM
{
static int submaps[][] = {
{16, 17, 18, 19},
{16, 9, 18, 13},
{8, 9, 12, 13},
{8, 17, 12, 19},
{16, 9, 6, 15},
{8, 17, 14, 7},
{2, 11, 6, 15},
{8, 9, 14, 15},
{10, 1, 14, 15},
{10, 11, 14, 5},
{0, 11, 4, 15},
{0, 1, 14, 15},
{},
{},
{},
{},
{16, 17, 6, 7},
{16, 9, 6, 5},
{8, 9, 4, 5},
{8, 17, 4, 7},
{2, 11, 18, 13},
{10, 3, 12, 19},
{10, 11, 12, 13},
{10, 3, 14, 7},
{0, 11, 14, 15},
{10, 11, 4, 15},
{10, 11, 4, 5},
{10, 1, 14, 5},
{},
{},
{},
{},
{2, 3, 6, 7},
{2, 1, 6, 5},
{0, 1, 4, 5},
{0, 3, 4, 7},
{2, 11, 6, 5},
{8, 9, 4, 15},
{2, 1, 6, 15},
{8, 9, 14, 5},
{0, 1, 4, 15},
{0, 1, 14, 5},
{10, 1, 4, 15},
{0, 11, 14, 5},
{},
{},
{},
{},
{2, 3, 18, 19},
{2, 1, 18, 13},
{0, 1, 12, 13},
{0, 3, 12, 19},
{10, 1, 12, 13},
{0, 3, 14, 7},
{0, 11, 12, 13},
{10, 3, 4, 7},
{0, 11, 4, 5},
{10, 1, 4, 5},
{10, 11, 14, 15},
{0, 1, 4, 5},
{},
{},
{},
{},
};
public static int[] getSubmapIndices(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
{
int index = getTexture(world, x, y, z, side, blockMetas);
return submaps[index];
}
public static int getTexture(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
{
if(world == null)
{
return 0;
}
int texture = 0;
boolean b[] = new boolean[6];
if(side <= 1)
{
b[0] = isConnected(world, x - 1, y, z, side, blockMetas);
b[1] = isConnected(world, x + 1, y, z, side, blockMetas);
b[2] = isConnected(world, x, y, z + 1, side, blockMetas);
b[3] = isConnected(world, x, y, z - 1, side, blockMetas);
}
else if(side == 2)
{
b[0] = isConnected(world, x + 1, y, z, side, blockMetas);
b[1] = isConnected(world, x - 1, y, z, side, blockMetas);
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
}
else if(side == 3)
{
b[0] = isConnected(world, x - 1, y, z, side, blockMetas);
b[1] = isConnected(world, x + 1, y, z, side, blockMetas);
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
}
else if(side == 4)
{
b[0] = isConnected(world, x, y, z - 1, side, blockMetas);
b[1] = isConnected(world, x, y, z + 1, side, blockMetas);
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
}
else if(side == 5)
{
b[0] = isConnected(world, x, y, z + 1, side, blockMetas);
b[1] = isConnected(world, x, y, z - 1, side, blockMetas);
b[2] = isConnected(world, x, y - 1, z, side, blockMetas);
b[3] = isConnected(world, x, y + 1, z, side, blockMetas);
}
if(b[0] & !b[1] & !b[2] & !b[3])
{
texture = 3;
}
else if(!b[0] & b[1] & !b[2] & !b[3])
{
texture = 1;
}
else if(!b[0] & !b[1] & b[2] & !b[3])
{
texture = 16;
}
else if(!b[0] & !b[1] & !b[2] & b[3])
{
texture = 48;
}
else if(b[0] & b[1] & !b[2] & !b[3])
{
texture = 2;
}
else if(!b[0] & !b[1] & b[2] & b[3])
{
texture = 32;
}
else if(b[0] & !b[1] & b[2] & !b[3])
{
texture = 19;
}
else if(b[0] & !b[1] & !b[2] & b[3])
{
texture = 51;
}
else if(!b[0] & b[1] & b[2] & !b[3])
{
texture = 17;
}
else if(!b[0] & b[1] & !b[2] & b[3])
{
texture = 49;
}
else if(!b[0] & b[1] & b[2] & b[3])
{
texture = 33;
}
else if(b[0] & !b[1] & b[2] & b[3])
{
texture = 35;
}
else if(b[0] & b[1] & !b[2] & b[3])
{
texture = 50;
}
else if(b[0] & b[1] & b[2] & !b[3])
{
texture = 18;
}
else if(b[0] & b[1] & b[2] & b[3])
{
texture = 34;
}
boolean b2[] = new boolean[6];
if(side <= 1)
{
b2[0] = !isConnected(world, x + 1, y, z + 1, side, blockMetas);
b2[1] = !isConnected(world, x - 1, y, z + 1, side, blockMetas);
b2[2] = !isConnected(world, x + 1, y, z - 1, side, blockMetas);
b2[3] = !isConnected(world, x - 1, y, z - 1, side, blockMetas);
}
else if(side == 2)
{
b2[0] = !isConnected(world, x - 1, y - 1, z, side, blockMetas);
b2[1] = !isConnected(world, x + 1, y - 1, z, side, blockMetas);
b2[2] = !isConnected(world, x - 1, y + 1, z, side, blockMetas);
b2[3] = !isConnected(world, x + 1, y + 1, z, side, blockMetas);
}
else if(side == 3)
{
b2[0] = !isConnected(world, x + 1, y - 1, z, side, blockMetas);
b2[1] = !isConnected(world, x - 1, y - 1, z, side, blockMetas);
b2[2] = !isConnected(world, x + 1, y + 1, z, side, blockMetas);
b2[3] = !isConnected(world, x - 1, y + 1, z, side, blockMetas);
}
else if(side == 4)
{
b2[0] = !isConnected(world, x, y - 1, z + 1, side, blockMetas);
b2[1] = !isConnected(world, x, y - 1, z - 1, side, blockMetas);
b2[2] = !isConnected(world, x, y + 1, z + 1, side, blockMetas);
b2[3] = !isConnected(world, x, y + 1, z - 1, side, blockMetas);
}
else if(side == 5)
{
b2[0] = !isConnected(world, x, y - 1, z - 1, side, blockMetas);
b2[1] = !isConnected(world, x, y - 1, z + 1, side, blockMetas);
b2[2] = !isConnected(world, x, y + 1, z - 1, side, blockMetas);
b2[3] = !isConnected(world, x, y + 1, z + 1, side, blockMetas);
}
if(texture == 17 && b2[0])
{
texture = 4;
}
if(texture == 19 && b2[1])
{
texture = 5;
}
if(texture == 49 && b2[2])
{
texture = 20;
}
if(texture == 51 && b2[3])
{
texture = 21;
}
if(texture == 18 && b2[0] && b2[1])
{
texture = 7;
}
if(texture == 33 && b2[0] && b2[2])
{
texture = 6;
}
if(texture == 35 && b2[3] && b2[1])
{
texture = 23;
}
if(texture == 50 && b2[3] && b2[2])
{
texture = 22;
}
if(texture == 18 && !b2[0] && b2[1])
{
texture = 39;
}
if(texture == 33 && b2[0] && !b2[2])
{
texture = 38;
}
if(texture == 35 && !b2[3] && b2[1])
{
texture = 53;
}
if(texture == 50 && b2[3] && !b2[2])
{
texture = 52;
}
if(texture == 18 && b2[0] && !b2[1])
{
texture = 37;
}
if(texture == 33 && !b2[0] && b2[2])
{
texture = 36;
}
if(texture == 35 && b2[3] && !b2[1])
{
texture = 55;
}
if(texture == 50 && !b2[3] && b2[2])
{
texture = 54;
}
if(texture == 34 && b2[0] && b2[1] && b2[2] && b2[3])
{
texture = 58;
}
if(texture == 34 && !b2[0] && b2[1] && b2[2] && b2[3])
{
texture = 9;
}
if(texture == 34 && b2[0] && !b2[1] && b2[2] && b2[3])
{
texture = 25;
}
if(texture == 34 && b2[0] && b2[1] && !b2[2] && b2[3])
{
texture = 8;
}
if(texture == 34 && b2[0] && b2[1] && b2[2] && !b2[3])
{
texture = 24;
}
if(texture == 34 && b2[0] && b2[1] && !b2[2] && !b2[3])
{
texture = 11;
}
if(texture == 34 && !b2[0] && !b2[1] && b2[2] && b2[3])
{
texture = 26;
}
if(texture == 34 && !b2[0] && b2[1] && !b2[2] && b2[3])
{
texture = 27;
}
if(texture == 34 && b2[0] && !b2[1] && b2[2] && !b2[3])
{
texture = 10;
}
if(texture == 34 && b2[0] && !b2[1] && !b2[2] && b2[3])
{
texture = 42;
}
if(texture == 34 && !b2[0] && b2[1] && b2[2] && !b2[3])
{
texture = 43;
}
if(texture == 34 && b2[0] && !b2[1] && !b2[2] && !b2[3])
{
texture = 40;
}
if(texture == 34 && !b2[0] && b2[1] && !b2[2] && !b2[3])
{
texture = 41;
}
if(texture == 34 && !b2[0] && !b2[1] && b2[2] && !b2[3])
{
texture = 56;
}
if(texture == 34 && !b2[0] && !b2[1] && !b2[2] && b2[3])
{
texture = 57;
}
return texture;
}
public static boolean isConnected(IBlockAccess world, int x, int y, int z, int side, HashMap<Block, List<Integer>> blockMetas)
{
int x2 = x, y2 = y, z2 = z;
switch(side)
{
case 0:
y2--;
break;
case 1:
y2++;
break;
case 2:
z2--;
break;
case 3:
z2++;
break;
case 4:
x2--;
break;
case 5:
x2++;
break;
}
Block block1 = world.getBlock(x, y, z);
Block block2 = world.getBlock(x2, y2, z2);
int meta1 = world.getBlockMetadata(x, y, z);
int meta2 = world.getBlockMetadata(x2, y2, z2);
boolean validBlockMeta1 = false;
boolean invalidBlockMeta2 = true;
for(Entry<Block, List<Integer>> entry : blockMetas.entrySet())
{
validBlockMeta1 |= block1.equals(entry.getKey()) && entry.getValue().contains(meta1);
invalidBlockMeta2 &= !(block2.equals(entry.getKey()) && entry.getValue().contains(meta2));
}
return validBlockMeta1 && invalidBlockMeta2;
}
}