package net.minecraft.block;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Random;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemMonsterPlacer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.Direction;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockPortal extends BlockBreakable
{
public static final int[][] field_150001_a = new int[][] {new int[0], {3, 1}, {2, 0}};
private static final String __OBFID = "CL_00000284";
public BlockPortal()
{
super("portal", Material.portal, false);
this.setTickRandomly(true);
}
/**
* Ticks the block if it's been scheduled
*/
public void updateTick(World worldIn, int x, int y, int z, Random random)
{
super.updateTick(worldIn, x, y, z, random);
if (worldIn.provider.isSurfaceWorld() && worldIn.getGameRules().getGameRuleBooleanValue("doMobSpawning") && random.nextInt(2000) < worldIn.difficultySetting.getDifficultyId())
{
int l;
for (l = y; !World.doesBlockHaveSolidTopSurface(worldIn, x, l, z) && l > 0; --l)
{
;
}
if (l > 0 && !worldIn.getBlock(x, l + 1, z).isNormalCube())
{
Entity entity = ItemMonsterPlacer.spawnCreature(worldIn, 57, (double)x + 0.5D, (double)l + 1.1D, (double)z + 0.5D);
if (entity != null)
{
entity.timeUntilPortal = entity.getPortalCooldown();
}
}
}
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z)
{
return null;
}
public void setBlockBoundsBasedOnState(IBlockAccess worldIn, int x, int y, int z)
{
int l = func_149999_b(worldIn.getBlockMetadata(x, y, z));
if (l == 0)
{
if (worldIn.getBlock(x - 1, y, z) != this && worldIn.getBlock(x + 1, y, z) != this)
{
l = 2;
}
else
{
l = 1;
}
if (worldIn instanceof World && !((World)worldIn).isRemote)
{
((World)worldIn).setBlockMetadataWithNotify(x, y, z, l, 2);
}
}
float f = 0.125F;
float f1 = 0.125F;
if (l == 1)
{
f = 0.5F;
}
if (l == 2)
{
f1 = 0.5F;
}
this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
}
public boolean renderAsNormalBlock()
{
return false;
}
public boolean tryToCreatePortal(World p_150000_1_, int p_150000_2_, int p_150000_3_, int p_150000_4_)
{
BlockPortal.Size size = new BlockPortal.Size(p_150000_1_, p_150000_2_, p_150000_3_, p_150000_4_, 1);
BlockPortal.Size size1 = new BlockPortal.Size(p_150000_1_, p_150000_2_, p_150000_3_, p_150000_4_, 2);
if (size.func_150860_b() && size.field_150864_e == 0)
{
size.func_150859_c();
return true;
}
else if (size1.func_150860_b() && size1.field_150864_e == 0)
{
size1.func_150859_c();
return true;
}
else
{
return false;
}
}
public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor)
{
int l = func_149999_b(worldIn.getBlockMetadata(x, y, z));
BlockPortal.Size size = new BlockPortal.Size(worldIn, x, y, z, 1);
BlockPortal.Size size1 = new BlockPortal.Size(worldIn, x, y, z, 2);
if (l == 1 && (!size.func_150860_b() || size.field_150864_e < size.field_150868_h * size.field_150862_g))
{
worldIn.setBlock(x, y, z, Blocks.air);
}
else if (l == 2 && (!size1.func_150860_b() || size1.field_150864_e < size1.field_150868_h * size1.field_150862_g))
{
worldIn.setBlock(x, y, z, Blocks.air);
}
else if (l == 0 && !size.func_150860_b() && !size1.func_150860_b())
{
worldIn.setBlock(x, y, z, Blocks.air);
}
}
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side)
{
int i1 = 0;
if (worldIn.getBlock(x, y, z) == this)
{
i1 = func_149999_b(worldIn.getBlockMetadata(x, y, z));
if (i1 == 0)
{
return false;
}
if (i1 == 2 && side != 5 && side != 4)
{
return false;
}
if (i1 == 1 && side != 3 && side != 2)
{
return false;
}
}
boolean flag = worldIn.getBlock(x - 1, y, z) == this && worldIn.getBlock(x - 2, y, z) != this;
boolean flag1 = worldIn.getBlock(x + 1, y, z) == this && worldIn.getBlock(x + 2, y, z) != this;
boolean flag2 = worldIn.getBlock(x, y, z - 1) == this && worldIn.getBlock(x, y, z - 2) != this;
boolean flag3 = worldIn.getBlock(x, y, z + 1) == this && worldIn.getBlock(x, y, z + 2) != this;
boolean flag4 = flag || flag1 || i1 == 1;
boolean flag5 = flag2 || flag3 || i1 == 2;
return flag4 && side == 4 ? true : (flag4 && side == 5 ? true : (flag5 && side == 2 ? true : flag5 && side == 3));
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random random)
{
return 0;
}
public void onEntityCollidedWithBlock(World worldIn, int x, int y, int z, Entity entityIn)
{
if (entityIn.ridingEntity == null && entityIn.riddenByEntity == null)
{
entityIn.setInPortal();
}
}
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
@SideOnly(Side.CLIENT)
public int getRenderBlockPass()
{
return 1;
}
/**
* A randomly called display update to be able to add particles or other items for display
*/
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World worldIn, int x, int y, int z, Random random)
{
if (random.nextInt(100) == 0)
{
worldIn.playSound((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "portal.portal", 0.5F, random.nextFloat() * 0.4F + 0.8F, false);
}
for (int l = 0; l < 4; ++l)
{
double d0 = (double)((float)x + random.nextFloat());
double d1 = (double)((float)y + random.nextFloat());
double d2 = (double)((float)z + random.nextFloat());
double d3 = 0.0D;
double d4 = 0.0D;
double d5 = 0.0D;
int i1 = random.nextInt(2) * 2 - 1;
d3 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d4 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d5 = ((double)random.nextFloat() - 0.5D) * 0.5D;
if (worldIn.getBlock(x - 1, y, z) != this && worldIn.getBlock(x + 1, y, z) != this)
{
d0 = (double)x + 0.5D + 0.25D * (double)i1;
d3 = (double)(random.nextFloat() * 2.0F * (float)i1);
}
else
{
d2 = (double)z + 0.5D + 0.25D * (double)i1;
d5 = (double)(random.nextFloat() * 2.0F * (float)i1);
}
worldIn.spawnParticle("portal", d0, d1, d2, d3, d4, d5);
}
}
public static int func_149999_b(int p_149999_0_)
{
return p_149999_0_ & 3;
}
/**
* Gets an item for the block being called on. Args: world, x, y, z
*/
@SideOnly(Side.CLIENT)
public Item getItem(World worldIn, int x, int y, int z)
{
return Item.getItemById(0);
}
public static class Size
{
private final World field_150867_a;
private final int field_150865_b;
private final int field_150866_c;
private final int field_150863_d;
private int field_150864_e = 0;
private ChunkCoordinates field_150861_f;
private int field_150862_g;
private int field_150868_h;
private static final String __OBFID = "CL_00000285";
public Size(World p_i45415_1_, int p_i45415_2_, int p_i45415_3_, int p_i45415_4_, int p_i45415_5_)
{
this.field_150867_a = p_i45415_1_;
this.field_150865_b = p_i45415_5_;
this.field_150863_d = BlockPortal.field_150001_a[p_i45415_5_][0];
this.field_150866_c = BlockPortal.field_150001_a[p_i45415_5_][1];
for (int i1 = p_i45415_3_; p_i45415_3_ > i1 - 21 && p_i45415_3_ > 0 && this.func_150857_a(p_i45415_1_.getBlock(p_i45415_2_, p_i45415_3_ - 1, p_i45415_4_)); --p_i45415_3_)
{
;
}
int j1 = this.func_150853_a(p_i45415_2_, p_i45415_3_, p_i45415_4_, this.field_150863_d) - 1;
if (j1 >= 0)
{
this.field_150861_f = new ChunkCoordinates(p_i45415_2_ + j1 * Direction.offsetX[this.field_150863_d], p_i45415_3_, p_i45415_4_ + j1 * Direction.offsetZ[this.field_150863_d]);
this.field_150868_h = this.func_150853_a(this.field_150861_f.posX, this.field_150861_f.posY, this.field_150861_f.posZ, this.field_150866_c);
if (this.field_150868_h < 2 || this.field_150868_h > 21)
{
this.field_150861_f = null;
this.field_150868_h = 0;
}
}
if (this.field_150861_f != null)
{
this.field_150862_g = this.func_150858_a();
}
}
protected int func_150853_a(int p_150853_1_, int p_150853_2_, int p_150853_3_, int p_150853_4_)
{
int j1 = Direction.offsetX[p_150853_4_];
int k1 = Direction.offsetZ[p_150853_4_];
int i1;
Block block;
for (i1 = 0; i1 < 22; ++i1)
{
block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
if (!this.func_150857_a(block))
{
break;
}
Block block1 = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_ - 1, p_150853_3_ + k1 * i1);
if (block1 != Blocks.obsidian)
{
break;
}
}
block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
return block == Blocks.obsidian ? i1 : 0;
}
protected int func_150858_a()
{
int i;
int j;
int k;
int l;
label56:
for (this.field_150862_g = 0; this.field_150862_g < 21; ++this.field_150862_g)
{
i = this.field_150861_f.posY + this.field_150862_g;
for (j = 0; j < this.field_150868_h; ++j)
{
k = this.field_150861_f.posX + j * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
l = this.field_150861_f.posZ + j * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
Block block = this.field_150867_a.getBlock(k, i, l);
if (!this.func_150857_a(block))
{
break label56;
}
if (block == Blocks.portal)
{
++this.field_150864_e;
}
if (j == 0)
{
block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][0]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][0]]);
if (block != Blocks.obsidian)
{
break label56;
}
}
else if (j == this.field_150868_h - 1)
{
block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]]);
if (block != Blocks.obsidian)
{
break label56;
}
}
}
}
for (i = 0; i < this.field_150868_h; ++i)
{
j = this.field_150861_f.posX + i * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
k = this.field_150861_f.posY + this.field_150862_g;
l = this.field_150861_f.posZ + i * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
if (this.field_150867_a.getBlock(j, k, l) != Blocks.obsidian)
{
this.field_150862_g = 0;
break;
}
}
if (this.field_150862_g <= 21 && this.field_150862_g >= 3)
{
return this.field_150862_g;
}
else
{
this.field_150861_f = null;
this.field_150868_h = 0;
this.field_150862_g = 0;
return 0;
}
}
protected boolean func_150857_a(Block p_150857_1_)
{
return p_150857_1_.blockMaterial == Material.air || p_150857_1_ == Blocks.fire || p_150857_1_ == Blocks.portal;
}
public boolean func_150860_b()
{
return this.field_150861_f != null && this.field_150868_h >= 2 && this.field_150868_h <= 21 && this.field_150862_g >= 3 && this.field_150862_g <= 21;
}
public void func_150859_c()
{
for (int i = 0; i < this.field_150868_h; ++i)
{
int j = this.field_150861_f.posX + Direction.offsetX[this.field_150866_c] * i;
int k = this.field_150861_f.posZ + Direction.offsetZ[this.field_150866_c] * i;
for (int l = 0; l < this.field_150862_g; ++l)
{
int i1 = this.field_150861_f.posY + l;
this.field_150867_a.setBlock(j, i1, k, Blocks.portal, this.field_150865_b, 2);
}
}
}
}
}