package net.minecraft.block.state.pattern;
import com.google.common.base.Predicate;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.LoadingCache;
import java.util.Iterator;
import net.minecraft.block.state.BlockWorldState;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.Vec3i;
import net.minecraft.world.World;
public class BlockPattern
{
private final Predicate[][][] field_177689_a;
private final int field_177687_b;
private final int field_177688_c;
private final int field_177686_d;
private static final String __OBFID = "CL_00002024";
public BlockPattern(Predicate[][][] p_i45657_1_)
{
this.field_177689_a = p_i45657_1_;
this.field_177687_b = p_i45657_1_.length;
if (this.field_177687_b > 0)
{
this.field_177688_c = p_i45657_1_[0].length;
if (this.field_177688_c > 0)
{
this.field_177686_d = p_i45657_1_[0][0].length;
}
else
{
this.field_177686_d = 0;
}
}
else
{
this.field_177688_c = 0;
this.field_177686_d = 0;
}
}
public int func_177685_b()
{
return this.field_177688_c;
}
public int func_177684_c()
{
return this.field_177686_d;
}
private BlockPattern.PatternHelper func_177682_a(BlockPos p_177682_1_, EnumFacing p_177682_2_, EnumFacing p_177682_3_, LoadingCache p_177682_4_)
{
for (int var5 = 0; var5 < this.field_177686_d; ++var5)
{
for (int var6 = 0; var6 < this.field_177688_c; ++var6)
{
for (int var7 = 0; var7 < this.field_177687_b; ++var7)
{
if (!this.field_177689_a[var7][var6][var5].apply(p_177682_4_.getUnchecked(func_177683_a(p_177682_1_, p_177682_2_, p_177682_3_, var5, var6, var7))))
{
return null;
}
}
}
}
return new BlockPattern.PatternHelper(p_177682_1_, p_177682_2_, p_177682_3_, p_177682_4_);
}
public BlockPattern.PatternHelper func_177681_a(World worldIn, BlockPos p_177681_2_)
{
LoadingCache var3 = CacheBuilder.newBuilder().build(new BlockPattern.CacheLoader(worldIn));
int var4 = Math.max(Math.max(this.field_177686_d, this.field_177688_c), this.field_177687_b);
Iterator var5 = BlockPos.getAllInBox(p_177681_2_, p_177681_2_.add(var4 - 1, var4 - 1, var4 - 1)).iterator();
while (var5.hasNext())
{
BlockPos var6 = (BlockPos)var5.next();
EnumFacing[] var7 = EnumFacing.values();
int var8 = var7.length;
for (int var9 = 0; var9 < var8; ++var9)
{
EnumFacing var10 = var7[var9];
EnumFacing[] var11 = EnumFacing.values();
int var12 = var11.length;
for (int var13 = 0; var13 < var12; ++var13)
{
EnumFacing var14 = var11[var13];
if (var14 != var10 && var14 != var10.getOpposite())
{
BlockPattern.PatternHelper var15 = this.func_177682_a(var6, var10, var14, var3);
if (var15 != null)
{
return var15;
}
}
}
}
}
return null;
}
protected static BlockPos func_177683_a(BlockPos p_177683_0_, EnumFacing p_177683_1_, EnumFacing p_177683_2_, int p_177683_3_, int p_177683_4_, int p_177683_5_)
{
if (p_177683_1_ != p_177683_2_ && p_177683_1_ != p_177683_2_.getOpposite())
{
Vec3i var6 = new Vec3i(p_177683_1_.getFrontOffsetX(), p_177683_1_.getFrontOffsetY(), p_177683_1_.getFrontOffsetZ());
Vec3i var7 = new Vec3i(p_177683_2_.getFrontOffsetX(), p_177683_2_.getFrontOffsetY(), p_177683_2_.getFrontOffsetZ());
Vec3i var8 = var6.crossProduct(var7);
return p_177683_0_.add(var7.getX() * -p_177683_4_ + var8.getX() * p_177683_3_ + var6.getX() * p_177683_5_, var7.getY() * -p_177683_4_ + var8.getY() * p_177683_3_ + var6.getY() * p_177683_5_, var7.getZ() * -p_177683_4_ + var8.getZ() * p_177683_3_ + var6.getZ() * p_177683_5_);
}
else
{
throw new IllegalArgumentException("Invalid forwards & up combination");
}
}
static class CacheLoader extends com.google.common.cache.CacheLoader
{
private final World field_177680_a;
private static final String __OBFID = "CL_00002023";
public CacheLoader(World worldIn)
{
this.field_177680_a = worldIn;
}
public BlockWorldState func_177679_a(BlockPos p_177679_1_)
{
return new BlockWorldState(this.field_177680_a, p_177679_1_);
}
public Object load(Object p_load_1_)
{
return this.func_177679_a((BlockPos)p_load_1_);
}
}
public static class PatternHelper
{
private final BlockPos field_177674_a;
private final EnumFacing field_177672_b;
private final EnumFacing field_177673_c;
private final LoadingCache field_177671_d;
private static final String __OBFID = "CL_00002022";
public PatternHelper(BlockPos p_i45655_1_, EnumFacing p_i45655_2_, EnumFacing p_i45655_3_, LoadingCache p_i45655_4_)
{
this.field_177674_a = p_i45655_1_;
this.field_177672_b = p_i45655_2_;
this.field_177673_c = p_i45655_3_;
this.field_177671_d = p_i45655_4_;
}
public EnumFacing func_177669_b()
{
return this.field_177672_b;
}
public EnumFacing func_177668_c()
{
return this.field_177673_c;
}
public BlockWorldState func_177670_a(int p_177670_1_, int p_177670_2_, int p_177670_3_)
{
return (BlockWorldState)this.field_177671_d.getUnchecked(BlockPattern.func_177683_a(this.field_177674_a, this.func_177669_b(), this.func_177668_c(), p_177670_1_, p_177670_2_, p_177670_3_));
}
}
}