mirror of
http://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8.git
synced 2025-04-30 02:01:59 -05:00
2103 lines
68 KiB
Java
2103 lines
68 KiB
Java
package net.optifine;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.InputStream;
|
|
import java.io.StringReader;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.EnumMap;
|
|
import java.util.HashSet;
|
|
import java.util.IdentityHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Properties;
|
|
import java.util.Set;
|
|
|
|
import net.lax1dude.eaglercraft.v1_8.IOUtils;
|
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockGlass;
|
|
import net.minecraft.block.BlockPane;
|
|
import net.minecraft.block.BlockQuartz;
|
|
import net.minecraft.block.BlockRotatedPillar;
|
|
import net.minecraft.block.BlockStainedGlass;
|
|
import net.minecraft.block.BlockStainedGlassPane;
|
|
import net.minecraft.block.state.BlockStateBase;
|
|
import net.minecraft.block.state.IBlockState;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
|
import net.minecraft.client.renderer.texture.TextureMap;
|
|
import net.minecraft.client.resources.IResourcePack;
|
|
import net.minecraft.client.resources.model.IBakedModel;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.util.BlockPos;
|
|
import net.minecraft.util.EnumFacing;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.IBlockAccess;
|
|
import net.minecraft.world.biome.BiomeGenBase;
|
|
import net.optifine.config.Matches;
|
|
import net.optifine.model.BlockModelUtils;
|
|
import net.optifine.model.ListQuadsOverlay;
|
|
import net.optifine.render.RenderEnv;
|
|
import net.optifine.util.PropertiesOrdered;
|
|
import net.optifine.util.ResUtils;
|
|
import net.optifine.util.TileEntityUtils;
|
|
|
|
public class ConnectedTextures {
|
|
private static Map[] spriteQuadMaps = null;
|
|
private static Map[] spriteQuadFullMaps = null;
|
|
private static Map[][] spriteQuadCompactMaps = (Map[][]) null;
|
|
private static ConnectedProperties[][] blockProperties = (ConnectedProperties[][]) null;
|
|
private static ConnectedProperties[][] tileProperties = (ConnectedProperties[][]) null;
|
|
private static boolean multipass = false;
|
|
protected static final int UNKNOWN = -1;
|
|
protected static final int Y_NEG_DOWN = 0;
|
|
protected static final int Y_POS_UP = 1;
|
|
protected static final int Z_NEG_NORTH = 2;
|
|
protected static final int Z_POS_SOUTH = 3;
|
|
protected static final int X_NEG_WEST = 4;
|
|
protected static final int X_POS_EAST = 5;
|
|
private static final int Y_AXIS = 0;
|
|
private static final int Z_AXIS = 1;
|
|
private static final int X_AXIS = 2;
|
|
public static final IBlockState AIR_DEFAULT_STATE = Blocks.air.getDefaultState();
|
|
private static EaglerTextureAtlasSprite emptySprite = null;
|
|
private static final BlockDir[] SIDES_Y_NEG_DOWN = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.NORTH,
|
|
BlockDir.SOUTH };
|
|
private static final BlockDir[] SIDES_Y_POS_UP = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.SOUTH,
|
|
BlockDir.NORTH };
|
|
private static final BlockDir[] SIDES_Z_NEG_NORTH = new BlockDir[] { BlockDir.EAST, BlockDir.WEST, BlockDir.DOWN,
|
|
BlockDir.UP };
|
|
private static final BlockDir[] SIDES_Z_POS_SOUTH = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.DOWN,
|
|
BlockDir.UP };
|
|
private static final BlockDir[] SIDES_X_NEG_WEST = new BlockDir[] { BlockDir.NORTH, BlockDir.SOUTH, BlockDir.DOWN,
|
|
BlockDir.UP };
|
|
private static final BlockDir[] SIDES_X_POS_EAST = new BlockDir[] { BlockDir.SOUTH, BlockDir.NORTH, BlockDir.DOWN,
|
|
BlockDir.UP };
|
|
private static final BlockDir[] SIDES_Z_NEG_NORTH_Z_AXIS = new BlockDir[] { BlockDir.WEST, BlockDir.EAST,
|
|
BlockDir.UP, BlockDir.DOWN };
|
|
private static final BlockDir[] SIDES_X_POS_EAST_X_AXIS = new BlockDir[] { BlockDir.NORTH, BlockDir.SOUTH,
|
|
BlockDir.UP, BlockDir.DOWN };
|
|
private static final BlockDir[] EDGES_Y_NEG_DOWN = new BlockDir[] { BlockDir.NORTH_EAST, BlockDir.NORTH_WEST,
|
|
BlockDir.SOUTH_EAST, BlockDir.SOUTH_WEST };
|
|
private static final BlockDir[] EDGES_Y_POS_UP = new BlockDir[] { BlockDir.SOUTH_EAST, BlockDir.SOUTH_WEST,
|
|
BlockDir.NORTH_EAST, BlockDir.NORTH_WEST };
|
|
private static final BlockDir[] EDGES_Z_NEG_NORTH = new BlockDir[] { BlockDir.DOWN_WEST, BlockDir.DOWN_EAST,
|
|
BlockDir.UP_WEST, BlockDir.UP_EAST };
|
|
private static final BlockDir[] EDGES_Z_POS_SOUTH = new BlockDir[] { BlockDir.DOWN_EAST, BlockDir.DOWN_WEST,
|
|
BlockDir.UP_EAST, BlockDir.UP_WEST };
|
|
private static final BlockDir[] EDGES_X_NEG_WEST = new BlockDir[] { BlockDir.DOWN_SOUTH, BlockDir.DOWN_NORTH,
|
|
BlockDir.UP_SOUTH, BlockDir.UP_NORTH };
|
|
private static final BlockDir[] EDGES_X_POS_EAST = new BlockDir[] { BlockDir.DOWN_NORTH, BlockDir.DOWN_SOUTH,
|
|
BlockDir.UP_NORTH, BlockDir.UP_SOUTH };
|
|
private static final BlockDir[] EDGES_Z_NEG_NORTH_Z_AXIS = new BlockDir[] { BlockDir.UP_EAST, BlockDir.UP_WEST,
|
|
BlockDir.DOWN_EAST, BlockDir.DOWN_WEST };
|
|
private static final BlockDir[] EDGES_X_POS_EAST_X_AXIS = new BlockDir[] { BlockDir.UP_SOUTH, BlockDir.UP_NORTH,
|
|
BlockDir.DOWN_SOUTH, BlockDir.DOWN_NORTH };
|
|
public static final EaglerTextureAtlasSprite SPRITE_DEFAULT = new EaglerTextureAtlasSprite("<default>");
|
|
|
|
public static BakedQuad[] getConnectedTexture(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
|
|
BakedQuad quad, RenderEnv renderEnv) {
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
|
|
if (textureatlassprite == null) {
|
|
return renderEnv.getArrayQuadsCtm(quad);
|
|
} else {
|
|
Block block = blockState.getBlock();
|
|
|
|
if (skipConnectedTexture(blockAccess, blockState, blockPos, quad, renderEnv)) {
|
|
quad = getQuad(emptySprite, quad);
|
|
return renderEnv.getArrayQuadsCtm(quad);
|
|
} else {
|
|
EnumFacing enumfacing = quad.getFace();
|
|
BakedQuad[] abakedquad = getConnectedTextureMultiPass(blockAccess, blockState, blockPos, enumfacing,
|
|
quad, renderEnv);
|
|
return abakedquad;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static boolean skipConnectedTexture(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
|
|
BakedQuad quad, RenderEnv renderEnv) {
|
|
Block block = blockState.getBlock();
|
|
|
|
if (block instanceof BlockPane) {
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
|
|
if (textureatlassprite.getIconName().startsWith("minecraft:blocks/glass_pane_top")) {
|
|
IBlockState iblockstate1 = blockAccess.getBlockState(blockPos.offset(quad.getFace()));
|
|
return iblockstate1 == blockState;
|
|
}
|
|
}
|
|
|
|
if (block instanceof BlockPane) {
|
|
EnumFacing enumfacing = quad.getFace();
|
|
|
|
if (enumfacing != EnumFacing.UP && enumfacing != EnumFacing.DOWN) {
|
|
return false;
|
|
}
|
|
|
|
if (!quad.isFaceQuad()) {
|
|
return false;
|
|
}
|
|
|
|
BlockPos blockpos = blockPos.offset(quad.getFace());
|
|
IBlockState iblockstate = blockAccess.getBlockState(blockpos);
|
|
|
|
if (iblockstate.getBlock() != block) {
|
|
return false;
|
|
}
|
|
|
|
if (block == Blocks.stained_glass_pane && iblockstate.getValue(BlockStainedGlassPane.COLOR) != blockState
|
|
.getValue(BlockStainedGlassPane.COLOR)) {
|
|
return false;
|
|
}
|
|
|
|
iblockstate = iblockstate.getBlock().getActualState(iblockstate, blockAccess, blockpos);
|
|
double d0 = (double) quad.getMidX();
|
|
|
|
if (d0 < 0.4D) {
|
|
if (((Boolean) iblockstate.getValue(BlockPane.WEST)).booleanValue()) {
|
|
return true;
|
|
}
|
|
} else if (d0 > 0.6D) {
|
|
if (((Boolean) iblockstate.getValue(BlockPane.EAST)).booleanValue()) {
|
|
return true;
|
|
}
|
|
} else {
|
|
double d1 = quad.getMidZ();
|
|
|
|
if (d1 < 0.4D) {
|
|
if (((Boolean) iblockstate.getValue(BlockPane.NORTH)).booleanValue()) {
|
|
return true;
|
|
}
|
|
} else {
|
|
if (d1 <= 0.6D) {
|
|
return true;
|
|
}
|
|
|
|
if (((Boolean) iblockstate.getValue(BlockPane.SOUTH)).booleanValue()) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
protected static BakedQuad[] getQuads(EaglerTextureAtlasSprite sprite, BakedQuad quadIn, RenderEnv renderEnv) {
|
|
if (sprite == null) {
|
|
return null;
|
|
} else if (sprite == SPRITE_DEFAULT) {
|
|
return renderEnv.getArrayQuadsCtm(quadIn);
|
|
} else {
|
|
BakedQuad bakedquad = getQuad(sprite, quadIn);
|
|
BakedQuad[] abakedquad = renderEnv.getArrayQuadsCtm(bakedquad);
|
|
return abakedquad;
|
|
}
|
|
}
|
|
|
|
private static synchronized BakedQuad getQuad(EaglerTextureAtlasSprite sprite, BakedQuad quadIn) {
|
|
if (spriteQuadMaps == null) {
|
|
return quadIn;
|
|
} else {
|
|
int i = sprite.getIndexInMap();
|
|
|
|
if (i >= 0 && i < spriteQuadMaps.length) {
|
|
Map map = spriteQuadMaps[i];
|
|
|
|
if (map == null) {
|
|
map = new IdentityHashMap(1);
|
|
spriteQuadMaps[i] = map;
|
|
}
|
|
|
|
BakedQuad bakedquad = (BakedQuad) map.get(quadIn);
|
|
|
|
if (bakedquad == null) {
|
|
bakedquad = makeSpriteQuad(quadIn, sprite);
|
|
map.put(quadIn, bakedquad);
|
|
}
|
|
|
|
return bakedquad;
|
|
} else {
|
|
return quadIn;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static synchronized BakedQuad getQuadFull(EaglerTextureAtlasSprite sprite, BakedQuad quadIn,
|
|
int tintIndex) {
|
|
if (spriteQuadFullMaps == null) {
|
|
return null;
|
|
} else if (sprite == null) {
|
|
return null;
|
|
} else {
|
|
int i = sprite.getIndexInMap();
|
|
|
|
if (i >= 0 && i < spriteQuadFullMaps.length) {
|
|
Map map = spriteQuadFullMaps[i];
|
|
|
|
if (map == null) {
|
|
map = new EnumMap(EnumFacing.class);
|
|
spriteQuadFullMaps[i] = map;
|
|
}
|
|
|
|
EnumFacing enumfacing = quadIn.getFace();
|
|
BakedQuad bakedquad = (BakedQuad) map.get(enumfacing);
|
|
|
|
if (bakedquad == null) {
|
|
bakedquad = BlockModelUtils.makeBakedQuad(enumfacing, sprite, tintIndex);
|
|
map.put(enumfacing, bakedquad);
|
|
}
|
|
|
|
return bakedquad;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static BakedQuad makeSpriteQuad(BakedQuad quad, EaglerTextureAtlasSprite sprite) {
|
|
int[] aint = (int[]) quad.getVertexData().clone();
|
|
int[] aint2 = (int[]) quad.getVertexDataWithNormals().clone();
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
fixVertex(aint, aint2, i, textureatlassprite, sprite);
|
|
}
|
|
|
|
BakedQuad bakedquad = new BakedQuad(aint, aint2, quad.getTintIndex(), quad.getFace(), sprite);
|
|
return bakedquad;
|
|
}
|
|
|
|
private static void fixVertex(int[] data, int[] data2, int vertex, EaglerTextureAtlasSprite spriteFrom,
|
|
EaglerTextureAtlasSprite spriteTo) {
|
|
int i = data.length / 4;
|
|
int j = i * vertex;
|
|
int i2 = data2.length / 4;
|
|
int j2 = i2 * vertex;
|
|
float f = Float.intBitsToFloat(data[j + 4]);
|
|
float f1 = Float.intBitsToFloat(data[j + 4 + 1]);
|
|
double d0 = spriteFrom.getSpriteU16(f);
|
|
double d1 = spriteFrom.getSpriteV16(f1);
|
|
data[j + 4] = data2[j2 + 4] = Float.floatToRawIntBits(spriteTo.getInterpolatedU(d0));
|
|
data[j + 4 + 1] = data2[j2 + 4 + 1] = Float.floatToRawIntBits(spriteTo.getInterpolatedV(d1));
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureMultiPass(IBlockAccess blockAccess, IBlockState blockState,
|
|
BlockPos blockPos, EnumFacing side, BakedQuad quad, RenderEnv renderEnv) {
|
|
BakedQuad[] abakedquad = getConnectedTextureSingle(blockAccess, blockState, blockPos, side, quad, true, 0,
|
|
renderEnv);
|
|
|
|
if (!multipass) {
|
|
return abakedquad;
|
|
} else if (abakedquad.length == 1 && abakedquad[0] == quad) {
|
|
return abakedquad;
|
|
} else {
|
|
List<BakedQuad> list = renderEnv.getListQuadsCtmMultipass(abakedquad);
|
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
|
BakedQuad bakedquad = (BakedQuad) list.get(i);
|
|
BakedQuad bakedquad1 = bakedquad;
|
|
|
|
for (int j = 0; j < 3; ++j) {
|
|
BakedQuad[] abakedquad1 = getConnectedTextureSingle(blockAccess, blockState, blockPos, side,
|
|
bakedquad1, false, j + 1, renderEnv);
|
|
|
|
if (abakedquad1.length != 1 || abakedquad1[0] == bakedquad1) {
|
|
break;
|
|
}
|
|
|
|
bakedquad1 = abakedquad1[0];
|
|
}
|
|
|
|
list.set(i, bakedquad1);
|
|
}
|
|
|
|
for (int k = 0; k < abakedquad.length; ++k) {
|
|
abakedquad[k] = (BakedQuad) list.get(k);
|
|
}
|
|
|
|
return abakedquad;
|
|
}
|
|
}
|
|
|
|
public static BakedQuad[] getConnectedTextureSingle(IBlockAccess blockAccess, IBlockState blockState,
|
|
BlockPos blockPos, EnumFacing facing, BakedQuad quad, boolean checkBlocks, int pass, RenderEnv renderEnv) {
|
|
Block block = blockState.getBlock();
|
|
|
|
if (!(blockState instanceof BlockStateBase)) {
|
|
return renderEnv.getArrayQuadsCtm(quad);
|
|
} else {
|
|
BlockStateBase blockstatebase = (BlockStateBase) blockState;
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
|
|
if (tileProperties != null) {
|
|
int i = textureatlassprite.getIndexInMap();
|
|
|
|
if (i >= 0 && i < tileProperties.length) {
|
|
ConnectedProperties[] aconnectedproperties = tileProperties[i];
|
|
|
|
if (aconnectedproperties != null) {
|
|
int j = getSide(facing);
|
|
|
|
for (int k = 0; k < aconnectedproperties.length; ++k) {
|
|
ConnectedProperties connectedproperties = aconnectedproperties[k];
|
|
|
|
if (connectedproperties != null
|
|
&& connectedproperties.matchesBlockId(blockstatebase.getBlockId())) {
|
|
BakedQuad[] abakedquad = getConnectedTexture(connectedproperties, blockAccess,
|
|
blockstatebase, blockPos, j, quad, pass, renderEnv);
|
|
|
|
if (abakedquad != null) {
|
|
return abakedquad;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (blockProperties != null && checkBlocks) {
|
|
int l = renderEnv.getBlockId();
|
|
|
|
if (l >= 0 && l < blockProperties.length) {
|
|
ConnectedProperties[] aconnectedproperties1 = blockProperties[l];
|
|
|
|
if (aconnectedproperties1 != null) {
|
|
int i1 = getSide(facing);
|
|
|
|
for (int j1 = 0; j1 < aconnectedproperties1.length; ++j1) {
|
|
ConnectedProperties connectedproperties1 = aconnectedproperties1[j1];
|
|
|
|
if (connectedproperties1 != null && connectedproperties1.matchesIcon(textureatlassprite)) {
|
|
BakedQuad[] abakedquad1 = getConnectedTexture(connectedproperties1, blockAccess,
|
|
blockstatebase, blockPos, i1, quad, pass, renderEnv);
|
|
|
|
if (abakedquad1 != null) {
|
|
return abakedquad1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return renderEnv.getArrayQuadsCtm(quad);
|
|
}
|
|
}
|
|
|
|
public static int getSide(EnumFacing facing) {
|
|
if (facing == null) {
|
|
return -1;
|
|
} else {
|
|
switch (facing) {
|
|
case DOWN:
|
|
return 0;
|
|
|
|
case UP:
|
|
return 1;
|
|
|
|
case EAST:
|
|
return 5;
|
|
|
|
case WEST:
|
|
return 4;
|
|
|
|
case NORTH:
|
|
return 2;
|
|
|
|
case SOUTH:
|
|
return 3;
|
|
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static EnumFacing getFacing(int side) {
|
|
switch (side) {
|
|
case 0:
|
|
return EnumFacing.DOWN;
|
|
|
|
case 1:
|
|
return EnumFacing.UP;
|
|
|
|
case 2:
|
|
return EnumFacing.NORTH;
|
|
|
|
case 3:
|
|
return EnumFacing.SOUTH;
|
|
|
|
case 4:
|
|
return EnumFacing.WEST;
|
|
|
|
case 5:
|
|
return EnumFacing.EAST;
|
|
|
|
default:
|
|
return EnumFacing.UP;
|
|
}
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTexture(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
BlockStateBase blockState, BlockPos blockPos, int side, BakedQuad quad, int pass, RenderEnv renderEnv) {
|
|
int i = 0;
|
|
int j = blockState.getMetadata();
|
|
int k = j;
|
|
Block block = blockState.getBlock();
|
|
|
|
if (block instanceof BlockRotatedPillar) {
|
|
i = getWoodAxis(side, j);
|
|
|
|
if (cp.getMetadataMax() <= 3) {
|
|
k = j & 3;
|
|
}
|
|
}
|
|
|
|
if (block instanceof BlockQuartz) {
|
|
i = getQuartzAxis(side, j);
|
|
|
|
if (cp.getMetadataMax() <= 2 && k > 2) {
|
|
k = 2;
|
|
}
|
|
}
|
|
|
|
if (!cp.matchesBlock(blockState.getBlockId(), k)) {
|
|
return null;
|
|
} else {
|
|
if (side >= 0 && cp.faces != 63) {
|
|
int l = side;
|
|
|
|
if (i != 0) {
|
|
l = fixSideByAxis(side, i);
|
|
}
|
|
|
|
if ((1 << l & cp.faces) == 0) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
int i1 = blockPos.getY();
|
|
|
|
if (cp.heights != null && !cp.heights.isInRange(i1)) {
|
|
return null;
|
|
} else {
|
|
if (cp.biomes != null) {
|
|
BiomeGenBase biomegenbase = blockAccess.getBiomeGenForCoords(blockPos);
|
|
|
|
if (!cp.matchesBiome(biomegenbase)) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
if (cp.nbtName != null) {
|
|
String s = TileEntityUtils.getTileEntityName(blockAccess, blockPos);
|
|
|
|
if (!cp.nbtName.matchesValue(s)) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
|
|
switch (cp.method) {
|
|
case 1:
|
|
return getQuads(getConnectedTextureCtm(cp, blockAccess, blockState, blockPos, i, side,
|
|
textureatlassprite, j, renderEnv), quad, renderEnv);
|
|
|
|
case 2:
|
|
return getQuads(getConnectedTextureHorizontal(cp, blockAccess, blockState, blockPos, i, side,
|
|
textureatlassprite, j), quad, renderEnv);
|
|
|
|
case 3:
|
|
return getQuads(getConnectedTextureTop(cp, blockAccess, blockState, blockPos, i, side,
|
|
textureatlassprite, j), quad, renderEnv);
|
|
|
|
case 4:
|
|
return getQuads(getConnectedTextureRandom(cp, blockAccess, blockState, blockPos, side), quad,
|
|
renderEnv);
|
|
|
|
case 5:
|
|
return getQuads(getConnectedTextureRepeat(cp, blockPos, side), quad, renderEnv);
|
|
|
|
case 6:
|
|
return getQuads(getConnectedTextureVertical(cp, blockAccess, blockState, blockPos, i, side,
|
|
textureatlassprite, j), quad, renderEnv);
|
|
|
|
case 7:
|
|
return getQuads(getConnectedTextureFixed(cp), quad, renderEnv);
|
|
|
|
case 8:
|
|
return getQuads(getConnectedTextureHorizontalVertical(cp, blockAccess, blockState, blockPos, i,
|
|
side, textureatlassprite, j), quad, renderEnv);
|
|
|
|
case 9:
|
|
return getQuads(getConnectedTextureVerticalHorizontal(cp, blockAccess, blockState, blockPos, i,
|
|
side, textureatlassprite, j), quad, renderEnv);
|
|
|
|
case 10:
|
|
if (pass == 0) {
|
|
return getConnectedTextureCtmCompact(cp, blockAccess, blockState, blockPos, i, side, quad, j,
|
|
renderEnv);
|
|
}
|
|
|
|
default:
|
|
return null;
|
|
|
|
case 11:
|
|
return getConnectedTextureOverlay(cp, blockAccess, blockState, blockPos, i, side, quad, j,
|
|
renderEnv);
|
|
|
|
case 12:
|
|
return getConnectedTextureOverlayFixed(cp, quad, renderEnv);
|
|
|
|
case 13:
|
|
return getConnectedTextureOverlayRandom(cp, blockAccess, blockState, blockPos, side, quad,
|
|
renderEnv);
|
|
|
|
case 14:
|
|
return getConnectedTextureOverlayRepeat(cp, blockPos, side, quad, renderEnv);
|
|
|
|
case 15:
|
|
return getConnectedTextureOverlayCtm(cp, blockAccess, blockState, blockPos, i, side, quad, j,
|
|
renderEnv);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int fixSideByAxis(int side, int vertAxis) {
|
|
switch (vertAxis) {
|
|
case 0:
|
|
return side;
|
|
|
|
case 1:
|
|
switch (side) {
|
|
case 0:
|
|
return 2;
|
|
|
|
case 1:
|
|
return 3;
|
|
|
|
case 2:
|
|
return 1;
|
|
|
|
case 3:
|
|
return 0;
|
|
|
|
default:
|
|
return side;
|
|
}
|
|
|
|
case 2:
|
|
switch (side) {
|
|
case 0:
|
|
return 4;
|
|
|
|
case 1:
|
|
return 5;
|
|
|
|
case 2:
|
|
case 3:
|
|
default:
|
|
return side;
|
|
|
|
case 4:
|
|
return 1;
|
|
|
|
case 5:
|
|
return 0;
|
|
}
|
|
|
|
default:
|
|
return side;
|
|
}
|
|
}
|
|
|
|
private static int getWoodAxis(int side, int metadata) {
|
|
int i = (metadata & 12) >> 2;
|
|
|
|
switch (i) {
|
|
case 1:
|
|
return 2;
|
|
|
|
case 2:
|
|
return 1;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private static int getQuartzAxis(int side, int metadata) {
|
|
switch (metadata) {
|
|
case 3:
|
|
return 2;
|
|
|
|
case 4:
|
|
return 1;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureRandom(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
BlockStateBase blockState, BlockPos blockPos, int side) {
|
|
if (cp.tileIcons.length == 1) {
|
|
return cp.tileIcons[0];
|
|
} else {
|
|
int i = side / cp.symmetry * cp.symmetry;
|
|
|
|
if (cp.linked) {
|
|
BlockPos blockpos = blockPos.down();
|
|
|
|
for (IBlockState iblockstate = blockAccess.getBlockState(blockpos); iblockstate.getBlock() == blockState
|
|
.getBlock(); iblockstate = blockAccess.getBlockState(blockpos)) {
|
|
blockPos = blockpos;
|
|
blockpos = blockpos.down();
|
|
|
|
if (blockpos.getY() < 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
int l = Config.getRandom(blockPos, i) & Integer.MAX_VALUE;
|
|
|
|
for (int i1 = 0; i1 < cp.randomLoops; ++i1) {
|
|
l = Config.intHash(l);
|
|
}
|
|
|
|
int j1 = 0;
|
|
|
|
if (cp.weights == null) {
|
|
j1 = l % cp.tileIcons.length;
|
|
} else {
|
|
int j = l % cp.sumAllWeights;
|
|
int[] aint = cp.sumWeights;
|
|
|
|
for (int k = 0; k < aint.length; ++k) {
|
|
if (j < aint[k]) {
|
|
j1 = k;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return cp.tileIcons[j1];
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureFixed(ConnectedProperties cp) {
|
|
return cp.tileIcons[0];
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureRepeat(ConnectedProperties cp, BlockPos blockPos,
|
|
int side) {
|
|
if (cp.tileIcons.length == 1) {
|
|
return cp.tileIcons[0];
|
|
} else {
|
|
int i = blockPos.getX();
|
|
int j = blockPos.getY();
|
|
int k = blockPos.getZ();
|
|
int l = 0;
|
|
int i1 = 0;
|
|
|
|
switch (side) {
|
|
case 0:
|
|
l = i;
|
|
i1 = -k - 1;
|
|
break;
|
|
|
|
case 1:
|
|
l = i;
|
|
i1 = k;
|
|
break;
|
|
|
|
case 2:
|
|
l = -i - 1;
|
|
i1 = -j;
|
|
break;
|
|
|
|
case 3:
|
|
l = i;
|
|
i1 = -j;
|
|
break;
|
|
|
|
case 4:
|
|
l = k;
|
|
i1 = -j;
|
|
break;
|
|
|
|
case 5:
|
|
l = -k - 1;
|
|
i1 = -j;
|
|
}
|
|
|
|
l = l % cp.width;
|
|
i1 = i1 % cp.height;
|
|
|
|
if (l < 0) {
|
|
l += cp.width;
|
|
}
|
|
|
|
if (i1 < 0) {
|
|
i1 += cp.height;
|
|
}
|
|
|
|
int j1 = i1 * cp.width + l;
|
|
return cp.tileIcons[j1];
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureCtm(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
|
|
int metadata, RenderEnv renderEnv) {
|
|
int i = getConnectedTextureCtmIndex(cp, blockAccess, blockState, blockPos, vertAxis, side, icon, metadata,
|
|
renderEnv);
|
|
return cp.tileIcons[i];
|
|
}
|
|
|
|
private static synchronized BakedQuad[] getConnectedTextureCtmCompact(ConnectedProperties cp,
|
|
IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad,
|
|
int metadata, RenderEnv renderEnv) {
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
int i = getConnectedTextureCtmIndex(cp, blockAccess, blockState, blockPos, vertAxis, side, textureatlassprite,
|
|
metadata, renderEnv);
|
|
return ConnectedTexturesCompact.getConnectedTextureCtmCompact(i, cp, side, quad, renderEnv);
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureOverlay(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad, int metadata,
|
|
RenderEnv renderEnv) {
|
|
if (!quad.isFullQuad()) {
|
|
return null;
|
|
} else {
|
|
EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
|
|
BlockDir[] ablockdir = getSideDirections(side, vertAxis);
|
|
boolean[] aboolean = renderEnv.getBorderFlags();
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
aboolean[i] = isNeighbourOverlay(cp, blockAccess, blockState, ablockdir[i].offset(blockPos), side,
|
|
textureatlassprite, metadata);
|
|
}
|
|
|
|
ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
|
|
Object dirEdges;
|
|
|
|
try {
|
|
if (!aboolean[0] || !aboolean[1] || !aboolean[2] || !aboolean[3]) {
|
|
if (aboolean[0] && aboolean[1] && aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[5], quad, cp.tintIndex), cp.tintBlockState);
|
|
dirEdges = null;
|
|
return (BakedQuad[]) dirEdges;
|
|
}
|
|
|
|
if (aboolean[0] && aboolean[2] && aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[6], quad, cp.tintIndex), cp.tintBlockState);
|
|
dirEdges = null;
|
|
return (BakedQuad[]) dirEdges;
|
|
}
|
|
|
|
if (aboolean[1] && aboolean[2] && aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[12], quad, cp.tintIndex), cp.tintBlockState);
|
|
dirEdges = null;
|
|
return (BakedQuad[]) dirEdges;
|
|
}
|
|
|
|
if (aboolean[0] && aboolean[1] && aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[13], quad, cp.tintIndex), cp.tintBlockState);
|
|
dirEdges = null;
|
|
return (BakedQuad[]) dirEdges;
|
|
}
|
|
|
|
BlockDir[] ablockdir1 = getEdgeDirections(side, vertAxis);
|
|
boolean[] aboolean1 = renderEnv.getBorderFlags2();
|
|
|
|
for (int j = 0; j < 4; ++j) {
|
|
aboolean1[j] = isNeighbourOverlay(cp, blockAccess, blockState, ablockdir1[j].offset(blockPos),
|
|
side, textureatlassprite, metadata);
|
|
}
|
|
|
|
if (aboolean[1] && aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[3], quad, cp.tintIndex), cp.tintBlockState);
|
|
|
|
if (aboolean1[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[16], quad, cp.tintIndex),
|
|
cp.tintBlockState);
|
|
}
|
|
|
|
Object object4 = null;
|
|
return (BakedQuad[]) object4;
|
|
}
|
|
|
|
if (aboolean[0] && aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[4], quad, cp.tintIndex), cp.tintBlockState);
|
|
|
|
if (aboolean1[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[14], quad, cp.tintIndex),
|
|
cp.tintBlockState);
|
|
}
|
|
|
|
Object object3 = null;
|
|
return (BakedQuad[]) object3;
|
|
}
|
|
|
|
if (aboolean[1] && aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[10], quad, cp.tintIndex), cp.tintBlockState);
|
|
|
|
if (aboolean1[1]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[2], quad, cp.tintIndex),
|
|
cp.tintBlockState);
|
|
}
|
|
|
|
Object object2 = null;
|
|
return (BakedQuad[]) object2;
|
|
}
|
|
|
|
if (aboolean[0] && aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[11], quad, cp.tintIndex), cp.tintBlockState);
|
|
|
|
if (aboolean1[0]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[0], quad, cp.tintIndex),
|
|
cp.tintBlockState);
|
|
}
|
|
|
|
Object object1 = null;
|
|
return (BakedQuad[]) object1;
|
|
}
|
|
|
|
boolean[] aboolean2 = renderEnv.getBorderFlags3();
|
|
|
|
for (int k = 0; k < 4; ++k) {
|
|
aboolean2[k] = isNeighbourMatching(cp, blockAccess, blockState, ablockdir[k].offset(blockPos),
|
|
side, textureatlassprite, metadata);
|
|
}
|
|
|
|
if (aboolean[0]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[9], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean[1]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[7], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[1], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[15], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean1[0] && (aboolean2[1] || aboolean2[2]) && !aboolean[1] && !aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[0], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean1[1] && (aboolean2[0] || aboolean2[2]) && !aboolean[0] && !aboolean[2]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[2], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean1[2] && (aboolean2[1] || aboolean2[3]) && !aboolean[1] && !aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[14], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
if (aboolean1[3] && (aboolean2[0] || aboolean2[3]) && !aboolean[0] && !aboolean[3]) {
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[16], quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
Object object5 = null;
|
|
return (BakedQuad[]) object5;
|
|
}
|
|
|
|
listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[8], quad, cp.tintIndex), cp.tintBlockState);
|
|
dirEdges = null;
|
|
} finally {
|
|
if (listquadsoverlay.size() > 0) {
|
|
renderEnv.setOverlaysRendered(true);
|
|
}
|
|
}
|
|
|
|
return (BakedQuad[]) dirEdges;
|
|
}
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureOverlayFixed(ConnectedProperties cp, BakedQuad quad,
|
|
RenderEnv renderEnv) {
|
|
if (!quad.isFullQuad()) {
|
|
return null;
|
|
} else {
|
|
ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
|
|
Object object;
|
|
|
|
try {
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureFixed(cp);
|
|
|
|
if (textureatlassprite != null) {
|
|
listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
object = null;
|
|
} finally {
|
|
if (listquadsoverlay.size() > 0) {
|
|
renderEnv.setOverlaysRendered(true);
|
|
}
|
|
}
|
|
|
|
return (BakedQuad[]) object;
|
|
}
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureOverlayRandom(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
BlockStateBase blockState, BlockPos blockPos, int side, BakedQuad quad, RenderEnv renderEnv) {
|
|
if (!quad.isFullQuad()) {
|
|
return null;
|
|
} else {
|
|
ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
|
|
Object object;
|
|
|
|
try {
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureRandom(cp, blockAccess, blockState,
|
|
blockPos, side);
|
|
|
|
if (textureatlassprite != null) {
|
|
listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
object = null;
|
|
} finally {
|
|
if (listquadsoverlay.size() > 0) {
|
|
renderEnv.setOverlaysRendered(true);
|
|
}
|
|
}
|
|
|
|
return (BakedQuad[]) object;
|
|
}
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureOverlayRepeat(ConnectedProperties cp, BlockPos blockPos, int side,
|
|
BakedQuad quad, RenderEnv renderEnv) {
|
|
if (!quad.isFullQuad()) {
|
|
return null;
|
|
} else {
|
|
ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
|
|
Object object;
|
|
|
|
try {
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureRepeat(cp, blockPos, side);
|
|
|
|
if (textureatlassprite != null) {
|
|
listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
object = null;
|
|
} finally {
|
|
if (listquadsoverlay.size() > 0) {
|
|
renderEnv.setOverlaysRendered(true);
|
|
}
|
|
}
|
|
|
|
return (BakedQuad[]) object;
|
|
}
|
|
}
|
|
|
|
private static BakedQuad[] getConnectedTextureOverlayCtm(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad, int metadata,
|
|
RenderEnv renderEnv) {
|
|
if (!quad.isFullQuad()) {
|
|
return null;
|
|
} else {
|
|
ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
|
|
Object object;
|
|
|
|
try {
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureCtm(cp, blockAccess, blockState,
|
|
blockPos, vertAxis, side, quad.getSprite(), metadata, renderEnv);
|
|
|
|
if (textureatlassprite != null) {
|
|
listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
|
|
}
|
|
|
|
object = null;
|
|
} finally {
|
|
if (listquadsoverlay.size() > 0) {
|
|
renderEnv.setOverlaysRendered(true);
|
|
}
|
|
}
|
|
|
|
return (BakedQuad[]) object;
|
|
}
|
|
}
|
|
|
|
private static BlockDir[] getSideDirections(int side, int vertAxis) {
|
|
switch (side) {
|
|
case 0:
|
|
return SIDES_Y_NEG_DOWN;
|
|
|
|
case 1:
|
|
return SIDES_Y_POS_UP;
|
|
|
|
case 2:
|
|
if (vertAxis == 1) {
|
|
return SIDES_Z_NEG_NORTH_Z_AXIS;
|
|
}
|
|
|
|
return SIDES_Z_NEG_NORTH;
|
|
|
|
case 3:
|
|
return SIDES_Z_POS_SOUTH;
|
|
|
|
case 4:
|
|
return SIDES_X_NEG_WEST;
|
|
|
|
case 5:
|
|
if (vertAxis == 2) {
|
|
return SIDES_X_POS_EAST_X_AXIS;
|
|
}
|
|
|
|
return SIDES_X_POS_EAST;
|
|
|
|
default:
|
|
throw new IllegalArgumentException("Unknown side: " + side);
|
|
}
|
|
}
|
|
|
|
private static BlockDir[] getEdgeDirections(int side, int vertAxis) {
|
|
switch (side) {
|
|
case 0:
|
|
return EDGES_Y_NEG_DOWN;
|
|
|
|
case 1:
|
|
return EDGES_Y_POS_UP;
|
|
|
|
case 2:
|
|
if (vertAxis == 1) {
|
|
return EDGES_Z_NEG_NORTH_Z_AXIS;
|
|
}
|
|
|
|
return EDGES_Z_NEG_NORTH;
|
|
|
|
case 3:
|
|
return EDGES_Z_POS_SOUTH;
|
|
|
|
case 4:
|
|
return EDGES_X_NEG_WEST;
|
|
|
|
case 5:
|
|
if (vertAxis == 2) {
|
|
return EDGES_X_POS_EAST_X_AXIS;
|
|
}
|
|
|
|
return EDGES_X_POS_EAST;
|
|
|
|
default:
|
|
throw new IllegalArgumentException("Unknown side: " + side);
|
|
}
|
|
}
|
|
|
|
protected static Map[][] getSpriteQuadCompactMaps() {
|
|
return spriteQuadCompactMaps;
|
|
}
|
|
|
|
private static int getConnectedTextureCtmIndex(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
|
|
int metadata, RenderEnv renderEnv) {
|
|
boolean[] aboolean = renderEnv.getBorderFlags();
|
|
|
|
switch (side) {
|
|
case 0:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos6 = blockPos.down();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos6.west(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos6.east(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos6.north(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos6.south(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos5 = blockPos.up();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos5.west(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos5.east(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos5.south(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos5.north(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos4 = blockPos.north();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos4.east(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos4.west(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos4.down(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos4.up(), side, icon, metadata);
|
|
}
|
|
|
|
if (vertAxis == 1) {
|
|
switchValues(0, 1, aboolean);
|
|
switchValues(2, 3, aboolean);
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos3 = blockPos.south();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos3.west(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos3.east(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos3.down(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos3.up(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 4:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos2 = blockPos.west();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos2.north(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos2.south(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos2.down(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos2.up(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 5:
|
|
aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos = blockPos.east();
|
|
aboolean[0] = aboolean[0]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos.south(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos.north(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos.down(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
&& !isNeighbour(cp, blockAccess, blockState, blockpos.up(), side, icon, metadata);
|
|
}
|
|
|
|
if (vertAxis == 2) {
|
|
switchValues(0, 1, aboolean);
|
|
switchValues(2, 3, aboolean);
|
|
}
|
|
}
|
|
|
|
int i = 0;
|
|
|
|
if (aboolean[0] & !aboolean[1] & !aboolean[2] & !aboolean[3]) {
|
|
i = 3;
|
|
} else if (!aboolean[0] & aboolean[1] & !aboolean[2] & !aboolean[3]) {
|
|
i = 1;
|
|
} else if (!aboolean[0] & !aboolean[1] & aboolean[2] & !aboolean[3]) {
|
|
i = 12;
|
|
} else if (!aboolean[0] & !aboolean[1] & !aboolean[2] & aboolean[3]) {
|
|
i = 36;
|
|
} else if (aboolean[0] & aboolean[1] & !aboolean[2] & !aboolean[3]) {
|
|
i = 2;
|
|
} else if (!aboolean[0] & !aboolean[1] & aboolean[2] & aboolean[3]) {
|
|
i = 24;
|
|
} else if (aboolean[0] & !aboolean[1] & aboolean[2] & !aboolean[3]) {
|
|
i = 15;
|
|
} else if (aboolean[0] & !aboolean[1] & !aboolean[2] & aboolean[3]) {
|
|
i = 39;
|
|
} else if (!aboolean[0] & aboolean[1] & aboolean[2] & !aboolean[3]) {
|
|
i = 13;
|
|
} else if (!aboolean[0] & aboolean[1] & !aboolean[2] & aboolean[3]) {
|
|
i = 37;
|
|
} else if (!aboolean[0] & aboolean[1] & aboolean[2] & aboolean[3]) {
|
|
i = 25;
|
|
} else if (aboolean[0] & !aboolean[1] & aboolean[2] & aboolean[3]) {
|
|
i = 27;
|
|
} else if (aboolean[0] & aboolean[1] & !aboolean[2] & aboolean[3]) {
|
|
i = 38;
|
|
} else if (aboolean[0] & aboolean[1] & aboolean[2] & !aboolean[3]) {
|
|
i = 14;
|
|
} else if (aboolean[0] & aboolean[1] & aboolean[2] & aboolean[3]) {
|
|
i = 26;
|
|
}
|
|
|
|
if (i == 0) {
|
|
return i;
|
|
} else if (!Config.isConnectedTexturesFancy()) {
|
|
return i;
|
|
} else {
|
|
switch (side) {
|
|
case 0:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().north(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().north(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().south(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().south(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos11 = blockPos.down();
|
|
aboolean[0] = aboolean[0] || isNeighbour(cp, blockAccess, blockState, blockpos11.east().north(),
|
|
side, icon, metadata);
|
|
aboolean[1] = aboolean[1] || isNeighbour(cp, blockAccess, blockState, blockpos11.west().north(),
|
|
side, icon, metadata);
|
|
aboolean[2] = aboolean[2] || isNeighbour(cp, blockAccess, blockState, blockpos11.east().south(),
|
|
side, icon, metadata);
|
|
aboolean[3] = aboolean[3] || isNeighbour(cp, blockAccess, blockState, blockpos11.west().south(),
|
|
side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().south(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().south(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().north(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().north(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos10 = blockPos.up();
|
|
aboolean[0] = aboolean[0] || isNeighbour(cp, blockAccess, blockState, blockpos10.east().south(),
|
|
side, icon, metadata);
|
|
aboolean[1] = aboolean[1] || isNeighbour(cp, blockAccess, blockState, blockpos10.west().south(),
|
|
side, icon, metadata);
|
|
aboolean[2] = aboolean[2] || isNeighbour(cp, blockAccess, blockState, blockpos10.east().north(),
|
|
side, icon, metadata);
|
|
aboolean[3] = aboolean[3] || isNeighbour(cp, blockAccess, blockState, blockpos10.west().north(),
|
|
side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().down(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().down(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().up(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos9 = blockPos.north();
|
|
aboolean[0] = aboolean[0]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos9.west().down(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos9.east().down(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos9.west().up(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos9.east().up(), side, icon, metadata);
|
|
}
|
|
|
|
if (vertAxis == 1) {
|
|
switchValues(0, 3, aboolean);
|
|
switchValues(1, 2, aboolean);
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().down(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().down(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().up(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().up(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos8 = blockPos.south();
|
|
aboolean[0] = aboolean[0]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos8.east().down(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos8.west().down(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos8.east().up(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos8.west().up(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 4:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().south(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().north(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().south(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().north(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos7 = blockPos.west();
|
|
aboolean[0] = aboolean[0]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos7.down().south(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos7.down().north(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos7.up().south(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos7.up().north(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 5:
|
|
aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().north(), side, icon, metadata);
|
|
aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().south(), side, icon, metadata);
|
|
aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().north(), side, icon, metadata);
|
|
aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().south(), side, icon, metadata);
|
|
|
|
if (cp.innerSeams) {
|
|
BlockPos blockpos1 = blockPos.east();
|
|
aboolean[0] = aboolean[0]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos1.down().north(), side, icon, metadata);
|
|
aboolean[1] = aboolean[1]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos1.down().south(), side, icon, metadata);
|
|
aboolean[2] = aboolean[2]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos1.up().north(), side, icon, metadata);
|
|
aboolean[3] = aboolean[3]
|
|
|| isNeighbour(cp, blockAccess, blockState, blockpos1.up().south(), side, icon, metadata);
|
|
}
|
|
|
|
if (vertAxis == 2) {
|
|
switchValues(0, 3, aboolean);
|
|
switchValues(1, 2, aboolean);
|
|
}
|
|
}
|
|
|
|
if (i == 13 && aboolean[0]) {
|
|
i = 4;
|
|
} else if (i == 15 && aboolean[1]) {
|
|
i = 5;
|
|
} else if (i == 37 && aboolean[2]) {
|
|
i = 16;
|
|
} else if (i == 39 && aboolean[3]) {
|
|
i = 17;
|
|
} else if (i == 14 && aboolean[0] && aboolean[1]) {
|
|
i = 7;
|
|
} else if (i == 25 && aboolean[0] && aboolean[2]) {
|
|
i = 6;
|
|
} else if (i == 27 && aboolean[3] && aboolean[1]) {
|
|
i = 19;
|
|
} else if (i == 38 && aboolean[3] && aboolean[2]) {
|
|
i = 18;
|
|
} else if (i == 14 && !aboolean[0] && aboolean[1]) {
|
|
i = 31;
|
|
} else if (i == 25 && aboolean[0] && !aboolean[2]) {
|
|
i = 30;
|
|
} else if (i == 27 && !aboolean[3] && aboolean[1]) {
|
|
i = 41;
|
|
} else if (i == 38 && aboolean[3] && !aboolean[2]) {
|
|
i = 40;
|
|
} else if (i == 14 && aboolean[0] && !aboolean[1]) {
|
|
i = 29;
|
|
} else if (i == 25 && !aboolean[0] && aboolean[2]) {
|
|
i = 28;
|
|
} else if (i == 27 && aboolean[3] && !aboolean[1]) {
|
|
i = 43;
|
|
} else if (i == 38 && !aboolean[3] && aboolean[2]) {
|
|
i = 42;
|
|
} else if (i == 26 && aboolean[0] && aboolean[1] && aboolean[2] && aboolean[3]) {
|
|
i = 46;
|
|
} else if (i == 26 && !aboolean[0] && aboolean[1] && aboolean[2] && aboolean[3]) {
|
|
i = 9;
|
|
} else if (i == 26 && aboolean[0] && !aboolean[1] && aboolean[2] && aboolean[3]) {
|
|
i = 21;
|
|
} else if (i == 26 && aboolean[0] && aboolean[1] && !aboolean[2] && aboolean[3]) {
|
|
i = 8;
|
|
} else if (i == 26 && aboolean[0] && aboolean[1] && aboolean[2] && !aboolean[3]) {
|
|
i = 20;
|
|
} else if (i == 26 && aboolean[0] && aboolean[1] && !aboolean[2] && !aboolean[3]) {
|
|
i = 11;
|
|
} else if (i == 26 && !aboolean[0] && !aboolean[1] && aboolean[2] && aboolean[3]) {
|
|
i = 22;
|
|
} else if (i == 26 && !aboolean[0] && aboolean[1] && !aboolean[2] && aboolean[3]) {
|
|
i = 23;
|
|
} else if (i == 26 && aboolean[0] && !aboolean[1] && aboolean[2] && !aboolean[3]) {
|
|
i = 10;
|
|
} else if (i == 26 && aboolean[0] && !aboolean[1] && !aboolean[2] && aboolean[3]) {
|
|
i = 34;
|
|
} else if (i == 26 && !aboolean[0] && aboolean[1] && aboolean[2] && !aboolean[3]) {
|
|
i = 35;
|
|
} else if (i == 26 && aboolean[0] && !aboolean[1] && !aboolean[2] && !aboolean[3]) {
|
|
i = 32;
|
|
} else if (i == 26 && !aboolean[0] && aboolean[1] && !aboolean[2] && !aboolean[3]) {
|
|
i = 33;
|
|
} else if (i == 26 && !aboolean[0] && !aboolean[1] && aboolean[2] && !aboolean[3]) {
|
|
i = 44;
|
|
} else if (i == 26 && !aboolean[0] && !aboolean[1] && !aboolean[2] && aboolean[3]) {
|
|
i = 45;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
}
|
|
|
|
private static void switchValues(int ix1, int ix2, boolean[] arr) {
|
|
boolean flag = arr[ix1];
|
|
arr[ix1] = arr[ix2];
|
|
arr[ix2] = flag;
|
|
}
|
|
|
|
private static boolean isNeighbourOverlay(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
|
|
BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
|
|
IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
|
|
|
|
if (!isFullCubeModel(iblockstate)) {
|
|
return false;
|
|
} else {
|
|
if (cp.connectBlocks != null) {
|
|
BlockStateBase blockstatebase = (BlockStateBase) iblockstate;
|
|
|
|
if (!Matches.block(blockstatebase.getBlockId(), blockstatebase.getMetadata(), cp.connectBlocks)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (cp.connectTileIcons != null) {
|
|
EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
|
|
iblockstate, side);
|
|
|
|
if (!Config.isSameOne(textureatlassprite, cp.connectTileIcons)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
IBlockState iblockstate1 = iblockaccess.getBlockState(blockPos.offset(getFacing(side)));
|
|
return iblockstate1.getBlock().isOpaqueCube() ? false
|
|
: (side == 1 && iblockstate1.getBlock() == Blocks.snow_layer ? false
|
|
: !isNeighbour(cp, iblockaccess, blockState, blockPos, iblockstate, side, icon, metadata));
|
|
}
|
|
}
|
|
|
|
private static boolean isFullCubeModel(IBlockState state) {
|
|
if (state.getBlock().isFullCube()) {
|
|
return true;
|
|
} else {
|
|
Block block = state.getBlock();
|
|
return block instanceof BlockGlass ? true : block instanceof BlockStainedGlass;
|
|
}
|
|
}
|
|
|
|
private static boolean isNeighbourMatching(ConnectedProperties cp, IBlockAccess iblockaccess,
|
|
IBlockState blockState, BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
|
|
IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
|
|
|
|
if (iblockstate == AIR_DEFAULT_STATE) {
|
|
return false;
|
|
} else {
|
|
if (cp.matchBlocks != null && iblockstate instanceof BlockStateBase) {
|
|
BlockStateBase blockstatebase = (BlockStateBase) iblockstate;
|
|
|
|
if (!cp.matchesBlock(blockstatebase.getBlockId(), blockstatebase.getMetadata())) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (cp.matchTileIcons != null) {
|
|
EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
|
|
iblockstate, side);
|
|
|
|
if (textureatlassprite != icon) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
IBlockState iblockstate1 = iblockaccess.getBlockState(blockPos.offset(getFacing(side)));
|
|
return iblockstate1.getBlock().isOpaqueCube() ? false
|
|
: side != 1 || iblockstate1.getBlock() != Blocks.snow_layer;
|
|
}
|
|
}
|
|
|
|
private static boolean isNeighbour(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
|
|
BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
|
|
IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
|
|
return isNeighbour(cp, iblockaccess, blockState, blockPos, iblockstate, side, icon, metadata);
|
|
}
|
|
|
|
private static boolean isNeighbour(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
|
|
BlockPos blockPos, IBlockState neighbourState, int side, EaglerTextureAtlasSprite icon, int metadata) {
|
|
if (blockState == neighbourState) {
|
|
return true;
|
|
} else if (cp.connect == 2) {
|
|
if (neighbourState == null) {
|
|
return false;
|
|
} else if (neighbourState == AIR_DEFAULT_STATE) {
|
|
return false;
|
|
} else {
|
|
EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
|
|
neighbourState, side);
|
|
return textureatlassprite == icon;
|
|
}
|
|
} else if (cp.connect == 3) {
|
|
return neighbourState == null ? false
|
|
: (neighbourState == AIR_DEFAULT_STATE ? false
|
|
: neighbourState.getBlock().getMaterial() == blockState.getBlock().getMaterial());
|
|
} else if (!(neighbourState instanceof BlockStateBase)) {
|
|
return false;
|
|
} else {
|
|
BlockStateBase blockstatebase = (BlockStateBase) neighbourState;
|
|
Block block = blockstatebase.getBlock();
|
|
int i = blockstatebase.getMetadata();
|
|
return block == blockState.getBlock() && i == metadata;
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getNeighbourIcon(IBlockAccess iblockaccess, IBlockState blockState,
|
|
BlockPos blockPos, IBlockState neighbourState, int side) {
|
|
neighbourState = neighbourState.getBlock().getActualState(neighbourState, iblockaccess, blockPos);
|
|
IBakedModel ibakedmodel = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes()
|
|
.getModelForState(neighbourState);
|
|
|
|
if (ibakedmodel == null) {
|
|
return null;
|
|
} else {
|
|
// if (Reflector.ForgeBlock_getExtendedState.exists()) {
|
|
// neighbourState = (IBlockState) Reflector.call(neighbourState.getBlock(),
|
|
// Reflector.ForgeBlock_getExtendedState, new Object[] { neighbourState, iblockaccess, blockPos });
|
|
// }
|
|
|
|
EnumFacing enumfacing = getFacing(side);
|
|
List list = ibakedmodel.getFaceQuads(enumfacing);
|
|
|
|
if (list == null) {
|
|
return null;
|
|
} else {
|
|
if (Config.isBetterGrass()) {
|
|
list = BetterGrass.getFaceQuads(iblockaccess, neighbourState, blockPos, enumfacing, list);
|
|
}
|
|
|
|
if (list.size() > 0) {
|
|
BakedQuad bakedquad1 = (BakedQuad) list.get(0);
|
|
return bakedquad1.getSprite();
|
|
} else {
|
|
List list1 = ibakedmodel.getGeneralQuads();
|
|
|
|
if (list1 == null) {
|
|
return null;
|
|
} else {
|
|
for (int i = 0; i < list1.size(); ++i) {
|
|
BakedQuad bakedquad = (BakedQuad) list1.get(i);
|
|
|
|
if (bakedquad.getFace() == enumfacing) {
|
|
return bakedquad.getSprite();
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureHorizontal(ConnectedProperties cp,
|
|
IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
|
|
EaglerTextureAtlasSprite icon, int metadata) {
|
|
boolean flag;
|
|
boolean flag1;
|
|
flag = false;
|
|
flag1 = false;
|
|
label0:
|
|
|
|
switch (vertAxis) {
|
|
case 0:
|
|
switch (side) {
|
|
case 0:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 1:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 2:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 3:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 4:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 5:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
|
|
default:
|
|
break label0;
|
|
}
|
|
|
|
case 1:
|
|
switch (side) {
|
|
case 0:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 1:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 2:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 3:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 4:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
break label0;
|
|
|
|
case 5:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
|
|
default:
|
|
break label0;
|
|
}
|
|
|
|
case 2:
|
|
switch (side) {
|
|
case 0:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
break;
|
|
|
|
case 1:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
break;
|
|
|
|
case 2:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
break;
|
|
|
|
case 3:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
break;
|
|
|
|
case 4:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
break;
|
|
|
|
case 5:
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
}
|
|
}
|
|
|
|
int i = 3;
|
|
|
|
if (flag) {
|
|
if (flag1) {
|
|
i = 1;
|
|
} else {
|
|
i = 2;
|
|
}
|
|
} else if (flag1) {
|
|
i = 0;
|
|
} else {
|
|
i = 3;
|
|
}
|
|
|
|
return cp.tileIcons[i];
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureVertical(ConnectedProperties cp,
|
|
IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
|
|
EaglerTextureAtlasSprite icon, int metadata) {
|
|
boolean flag = false;
|
|
boolean flag1 = false;
|
|
|
|
switch (vertAxis) {
|
|
case 0:
|
|
if (side == 1) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
} else if (side == 0) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
} else {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
if (side == 3) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
} else if (side == 2) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
} else {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
if (side == 5) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
} else if (side == 4) {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
} else {
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
|
|
flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
}
|
|
}
|
|
|
|
int i = 3;
|
|
|
|
if (flag) {
|
|
if (flag1) {
|
|
i = 1;
|
|
} else {
|
|
i = 2;
|
|
}
|
|
} else if (flag1) {
|
|
i = 0;
|
|
} else {
|
|
i = 3;
|
|
}
|
|
|
|
return cp.tileIcons[i];
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureHorizontalVertical(ConnectedProperties cp,
|
|
IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
|
|
EaglerTextureAtlasSprite icon, int metadata) {
|
|
EaglerTextureAtlasSprite[] atextureatlassprite = cp.tileIcons;
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureHorizontal(cp, blockAccess, blockState,
|
|
blockPos, vertAxis, side, icon, metadata);
|
|
|
|
if (textureatlassprite != null && textureatlassprite != icon && textureatlassprite != atextureatlassprite[3]) {
|
|
return textureatlassprite;
|
|
} else {
|
|
EaglerTextureAtlasSprite textureatlassprite1 = getConnectedTextureVertical(cp, blockAccess, blockState,
|
|
blockPos, vertAxis, side, icon, metadata);
|
|
return textureatlassprite1 == atextureatlassprite[0] ? atextureatlassprite[4]
|
|
: (textureatlassprite1 == atextureatlassprite[1] ? atextureatlassprite[5]
|
|
: (textureatlassprite1 == atextureatlassprite[2] ? atextureatlassprite[6]
|
|
: textureatlassprite1));
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureVerticalHorizontal(ConnectedProperties cp,
|
|
IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
|
|
EaglerTextureAtlasSprite icon, int metadata) {
|
|
EaglerTextureAtlasSprite[] atextureatlassprite = cp.tileIcons;
|
|
EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureVertical(cp, blockAccess, blockState, blockPos,
|
|
vertAxis, side, icon, metadata);
|
|
|
|
if (textureatlassprite != null && textureatlassprite != icon && textureatlassprite != atextureatlassprite[3]) {
|
|
return textureatlassprite;
|
|
} else {
|
|
EaglerTextureAtlasSprite textureatlassprite1 = getConnectedTextureHorizontal(cp, blockAccess, blockState,
|
|
blockPos, vertAxis, side, icon, metadata);
|
|
return textureatlassprite1 == atextureatlassprite[0] ? atextureatlassprite[4]
|
|
: (textureatlassprite1 == atextureatlassprite[1] ? atextureatlassprite[5]
|
|
: (textureatlassprite1 == atextureatlassprite[2] ? atextureatlassprite[6]
|
|
: textureatlassprite1));
|
|
}
|
|
}
|
|
|
|
private static EaglerTextureAtlasSprite getConnectedTextureTop(ConnectedProperties cp, IBlockAccess blockAccess,
|
|
IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
|
|
int metadata) {
|
|
boolean flag = false;
|
|
|
|
switch (vertAxis) {
|
|
case 0:
|
|
if (side == 1 || side == 0) {
|
|
return null;
|
|
}
|
|
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
|
|
break;
|
|
|
|
case 1:
|
|
if (side == 3 || side == 2) {
|
|
return null;
|
|
}
|
|
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
|
|
break;
|
|
|
|
case 2:
|
|
if (side == 5 || side == 4) {
|
|
return null;
|
|
}
|
|
|
|
flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
|
|
}
|
|
|
|
if (flag) {
|
|
return cp.tileIcons[0];
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static void updateIcons(TextureMap textureMap) {
|
|
blockProperties = (ConnectedProperties[][]) null;
|
|
tileProperties = (ConnectedProperties[][]) null;
|
|
spriteQuadMaps = null;
|
|
spriteQuadCompactMaps = (Map[][]) null;
|
|
|
|
if (Config.isConnectedTextures()) {
|
|
IResourcePack[] airesourcepack = Config.getResourcePacks();
|
|
|
|
for (int i = airesourcepack.length - 1; i >= 0; --i) {
|
|
IResourcePack iresourcepack = airesourcepack[i];
|
|
updateIcons(textureMap, iresourcepack);
|
|
}
|
|
|
|
updateIcons(textureMap, Minecraft.getMinecraft().getDefaultResourcePack());
|
|
ResourceLocation resourcelocation = new ResourceLocation("mcpatcher/ctm/default/empty");
|
|
emptySprite = textureMap.registerSprite(resourcelocation);
|
|
spriteQuadMaps = new Map[textureMap.getCountRegisteredSprites() + 1];
|
|
spriteQuadFullMaps = new Map[textureMap.getCountRegisteredSprites() + 1];
|
|
spriteQuadCompactMaps = new Map[textureMap.getCountRegisteredSprites() + 1][];
|
|
|
|
if (blockProperties.length <= 0) {
|
|
blockProperties = (ConnectedProperties[][]) null;
|
|
}
|
|
|
|
if (tileProperties.length <= 0) {
|
|
tileProperties = (ConnectedProperties[][]) null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void updateIconEmpty(TextureMap textureMap) {
|
|
}
|
|
|
|
public static void updateIcons(TextureMap textureMap, IResourcePack rp) {
|
|
List<String> astring = ResUtils.collectPropertyFiles(rp, "mcpatcher/ctm/");
|
|
Collections.sort(astring);
|
|
List list = makePropertyList(tileProperties);
|
|
List list1 = makePropertyList(blockProperties);
|
|
|
|
for (int i = 0, l = astring.size(); i < l; ++i) {
|
|
String s = astring.get(i);
|
|
Config.dbg("ConnectedTextures: " + s);
|
|
|
|
try {
|
|
ResourceLocation resourcelocation = new ResourceLocation(s);
|
|
InputStream inputstream = rp.getInputStream(resourcelocation);
|
|
|
|
if (inputstream == null) {
|
|
Config.warn("ConnectedTextures file not found: " + s);
|
|
} else {
|
|
Properties properties = new PropertiesOrdered();
|
|
properties.load(inputstream);
|
|
inputstream.close();
|
|
ConnectedProperties connectedproperties = new ConnectedProperties(properties, s);
|
|
|
|
if (connectedproperties.isValid(s)) {
|
|
connectedproperties.updateIcons(textureMap);
|
|
addToTileList(connectedproperties, list);
|
|
addToBlockList(connectedproperties, list1);
|
|
}
|
|
}
|
|
} catch (FileNotFoundException var11) {
|
|
Config.warn("ConnectedTextures file not found: " + s);
|
|
} catch (Exception exception) {
|
|
exception.printStackTrace();
|
|
}
|
|
}
|
|
|
|
blockProperties = propertyListToArray(list1);
|
|
tileProperties = propertyListToArray(list);
|
|
multipass = detectMultipass();
|
|
Config.dbg("Multipass connected textures: " + multipass);
|
|
}
|
|
|
|
private static List makePropertyList(ConnectedProperties[][] propsArr) {
|
|
List list = new ArrayList();
|
|
|
|
if (propsArr != null) {
|
|
for (int i = 0; i < propsArr.length; ++i) {
|
|
ConnectedProperties[] aconnectedproperties = propsArr[i];
|
|
List list1 = null;
|
|
|
|
if (aconnectedproperties != null) {
|
|
list1 = new ArrayList(Arrays.asList(aconnectedproperties));
|
|
}
|
|
|
|
list.add(list1);
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
private static boolean detectMultipass() {
|
|
List list = new ArrayList();
|
|
|
|
for (int i = 0; i < tileProperties.length; ++i) {
|
|
ConnectedProperties[] aconnectedproperties = tileProperties[i];
|
|
|
|
if (aconnectedproperties != null) {
|
|
list.addAll(Arrays.asList(aconnectedproperties));
|
|
}
|
|
}
|
|
|
|
for (int k = 0; k < blockProperties.length; ++k) {
|
|
ConnectedProperties[] aconnectedproperties2 = blockProperties[k];
|
|
|
|
if (aconnectedproperties2 != null) {
|
|
list.addAll(Arrays.asList(aconnectedproperties2));
|
|
}
|
|
}
|
|
|
|
ConnectedProperties[] aconnectedproperties1 = (ConnectedProperties[]) ((ConnectedProperties[]) list
|
|
.toArray(new ConnectedProperties[list.size()]));
|
|
Set set1 = new HashSet();
|
|
Set set = new HashSet();
|
|
|
|
for (int j = 0; j < aconnectedproperties1.length; ++j) {
|
|
ConnectedProperties connectedproperties = aconnectedproperties1[j];
|
|
|
|
if (connectedproperties.matchTileIcons != null) {
|
|
set1.addAll(Arrays.asList(connectedproperties.matchTileIcons));
|
|
}
|
|
|
|
if (connectedproperties.tileIcons != null) {
|
|
set.addAll(Arrays.asList(connectedproperties.tileIcons));
|
|
}
|
|
}
|
|
|
|
set1.retainAll(set);
|
|
return !set1.isEmpty();
|
|
}
|
|
|
|
private static ConnectedProperties[][] propertyListToArray(List list) {
|
|
ConnectedProperties[][] aconnectedproperties = new ConnectedProperties[list.size()][];
|
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
|
List list2 = (List) list.get(i);
|
|
|
|
if (list2 != null) {
|
|
ConnectedProperties[] aconnectedproperties1 = (ConnectedProperties[]) list2
|
|
.toArray(new ConnectedProperties[list2.size()]);
|
|
aconnectedproperties[i] = aconnectedproperties1;
|
|
}
|
|
}
|
|
|
|
return aconnectedproperties;
|
|
}
|
|
|
|
private static void addToTileList(ConnectedProperties cp, List tileList) {
|
|
if (cp.matchTileIcons != null) {
|
|
for (int i = 0; i < cp.matchTileIcons.length; ++i) {
|
|
EaglerTextureAtlasSprite textureatlassprite = cp.matchTileIcons[i];
|
|
int j = textureatlassprite.getIndexInMap();
|
|
|
|
if (j < 0) {
|
|
Config.warn("Invalid tile ID: " + j + ", icon: " + textureatlassprite.getIconName());
|
|
} else {
|
|
addToList(cp, tileList, j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void addToBlockList(ConnectedProperties cp, List blockList) {
|
|
if (cp.matchBlocks != null) {
|
|
for (int i = 0; i < cp.matchBlocks.length; ++i) {
|
|
int j = cp.matchBlocks[i].getBlockId();
|
|
|
|
if (j < 0) {
|
|
Config.warn("Invalid block ID: " + j);
|
|
} else {
|
|
addToList(cp, blockList, j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void addToList(ConnectedProperties cp, List list, int id) {
|
|
while (id >= list.size()) {
|
|
list.add(null);
|
|
}
|
|
|
|
List list1 = (List) list.get(id);
|
|
|
|
if (list1 == null) {
|
|
list1 = new ArrayList();
|
|
list.set(id, list1);
|
|
}
|
|
|
|
list1.add(cp);
|
|
}
|
|
|
|
}
|