package net.minecraft.block;
import java.util.List;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockPistonStructureHelper;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityPiston;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockPistonBase extends Block
{
public static final PropertyDirection FACING = PropertyDirection.create("facing");
public static final PropertyBool EXTENDED = PropertyBool.create("extended");
/** This piston is the sticky one? */
private final boolean isSticky;
private static final String __OBFID = "CL_00000366";
public BlockPistonBase(boolean p_i45443_1_)
{
super(Material.piston);
this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(EXTENDED, Boolean.valueOf(false)));
this.isSticky = p_i45443_1_;
this.setStepSound(soundTypePiston);
this.setHardness(0.5F);
this.setCreativeTab(CreativeTabs.tabRedstone);
}
public boolean isOpaqueCube()
{
return false;
}
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
{
worldIn.setBlockState(pos, state.withProperty(FACING, func_180695_a(worldIn, pos, placer)), 2);
if (!worldIn.isRemote)
{
this.func_176316_e(worldIn, pos, state);
}
}
public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock)
{
if (!worldIn.isRemote)
{
this.func_176316_e(worldIn, pos, state);
}
}
public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state)
{
if (!worldIn.isRemote && worldIn.getTileEntity(pos) == null)
{
this.func_176316_e(worldIn, pos, state);
}
}
public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
{
return this.getDefaultState().withProperty(FACING, func_180695_a(worldIn, pos, placer)).withProperty(EXTENDED, Boolean.valueOf(false));
}
private void func_176316_e(World worldIn, BlockPos p_176316_2_, IBlockState p_176316_3_)
{
EnumFacing var4 = (EnumFacing)p_176316_3_.getValue(FACING);
boolean var5 = this.func_176318_b(worldIn, p_176316_2_, var4);
if (var5 && !((Boolean)p_176316_3_.getValue(EXTENDED)).booleanValue())
{
if ((new BlockPistonStructureHelper(worldIn, p_176316_2_, var4, true)).func_177253_a())
{
worldIn.addBlockEvent(p_176316_2_, this, 0, var4.getIndex());
}
}
else if (!var5 && ((Boolean)p_176316_3_.getValue(EXTENDED)).booleanValue())
{
worldIn.setBlockState(p_176316_2_, p_176316_3_.withProperty(EXTENDED, Boolean.valueOf(false)), 2);
worldIn.addBlockEvent(p_176316_2_, this, 1, var4.getIndex());
}
}
private boolean func_176318_b(World worldIn, BlockPos p_176318_2_, EnumFacing p_176318_3_)
{
EnumFacing[] var4 = EnumFacing.values();
int var5 = var4.length;
int var6;
for (var6 = 0; var6 < var5; ++var6)
{
EnumFacing var7 = var4[var6];
if (var7 != p_176318_3_ && worldIn.func_175709_b(p_176318_2_.offset(var7), var7))
{
return true;
}
}
if (worldIn.func_175709_b(p_176318_2_, EnumFacing.NORTH))
{
return true;
}
else
{
BlockPos var9 = p_176318_2_.offsetUp();
EnumFacing[] var10 = EnumFacing.values();
var6 = var10.length;
for (int var11 = 0; var11 < var6; ++var11)
{
EnumFacing var8 = var10[var11];
if (var8 != EnumFacing.DOWN && worldIn.func_175709_b(var9.offset(var8), var8))
{
return true;
}
}
return false;
}
}
/**
* Called on both Client and Server when World#addBlockEvent is called
*/
public boolean onBlockEventReceived(World worldIn, BlockPos pos, IBlockState state, int eventID, int eventParam)
{
EnumFacing var6 = (EnumFacing)state.getValue(FACING);
if (!worldIn.isRemote)
{
boolean var7 = this.func_176318_b(worldIn, pos, var6);
if (var7 && eventID == 1)
{
worldIn.setBlockState(pos, state.withProperty(EXTENDED, Boolean.valueOf(true)), 2);
return false;
}
if (!var7 && eventID == 0)
{
return false;
}
}
if (eventID == 0)
{
if (!this.func_176319_a(worldIn, pos, var6, true))
{
return false;
}
worldIn.setBlockState(pos, state.withProperty(EXTENDED, Boolean.valueOf(true)), 2);
worldIn.playSoundEffect((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, "tile.piston.out", 0.5F, worldIn.rand.nextFloat() * 0.25F + 0.6F);
}
else if (eventID == 1)
{
TileEntity var13 = worldIn.getTileEntity(pos.offset(var6));
if (var13 instanceof TileEntityPiston)
{
((TileEntityPiston)var13).clearPistonTileEntity();
}
worldIn.setBlockState(pos, Blocks.piston_extension.getDefaultState().withProperty(BlockPistonMoving.field_176426_a, var6).withProperty(BlockPistonMoving.field_176425_b, this.isSticky ? BlockPistonExtension.EnumPistonType.STICKY : BlockPistonExtension.EnumPistonType.DEFAULT), 3);
worldIn.setTileEntity(pos, BlockPistonMoving.func_176423_a(this.getStateFromMeta(eventParam), var6, false, true));
if (this.isSticky)
{
BlockPos var8 = pos.add(var6.getFrontOffsetX() * 2, var6.getFrontOffsetY() * 2, var6.getFrontOffsetZ() * 2);
Block var9 = worldIn.getBlockState(var8).getBlock();
boolean var10 = false;
if (var9 == Blocks.piston_extension)
{
TileEntity var11 = worldIn.getTileEntity(var8);
if (var11 instanceof TileEntityPiston)
{
TileEntityPiston var12 = (TileEntityPiston)var11;
if (var12.func_174930_e() == var6 && var12.isExtending())
{
var12.clearPistonTileEntity();
var10 = true;
}
}
}
if (!var10 && var9.getMaterial() != Material.air && func_180696_a(var9, worldIn, var8, var6.getOpposite(), false) && (var9.getMobilityFlag() == 0 || var9 == Blocks.piston || var9 == Blocks.sticky_piston))
{
this.func_176319_a(worldIn, pos, var6, false);
}
}
else
{
worldIn.setBlockToAir(pos.offset(var6));
}
worldIn.playSoundEffect((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, "tile.piston.in", 0.5F, worldIn.rand.nextFloat() * 0.15F + 0.6F);
}
return true;
}
public void setBlockBoundsBasedOnState(IBlockAccess access, BlockPos pos)
{
IBlockState var3 = access.getBlockState(pos);
if (var3.getBlock() == this && ((Boolean)var3.getValue(EXTENDED)).booleanValue())
{
float var4 = 0.25F;
EnumFacing var5 = (EnumFacing)var3.getValue(FACING);
if (var5 != null)
{
switch (BlockPistonBase.SwitchEnumFacing.field_177243_a[var5.ordinal()])
{
case 1:
this.setBlockBounds(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F);
break;
case 2:
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F);
break;
case 3:
this.setBlockBounds(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F);
break;
case 4:
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F);
break;
case 5:
this.setBlockBounds(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
break;
case 6:
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F);
}
}
}
else
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
}
/**
* Sets the block's bounds for rendering it as an item
*/
public void setBlockBoundsForItemRender()
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
/**
* Add all collision boxes of this Block to the list that intersect with the given mask.
*
* @param collidingEntity the Entity colliding with this Block
*/
public void addCollisionBoxesToList(World worldIn, BlockPos pos, IBlockState state, AxisAlignedBB mask, List list, Entity collidingEntity)
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
super.addCollisionBoxesToList(worldIn, pos, state, mask, list, collidingEntity);
}
public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state)
{
this.setBlockBoundsBasedOnState(worldIn, pos);
return super.getCollisionBoundingBox(worldIn, pos, state);
}
public boolean isFullCube()
{
return false;
}
public static EnumFacing func_176317_b(int p_176317_0_)
{
int var1 = p_176317_0_ & 7;
return var1 > 5 ? null : EnumFacing.getFront(var1);
}
public static EnumFacing func_180695_a(World worldIn, BlockPos p_180695_1_, EntityLivingBase p_180695_2_)
{
if (MathHelper.abs((float)p_180695_2_.posX - (float)p_180695_1_.getX()) < 2.0F && MathHelper.abs((float)p_180695_2_.posZ - (float)p_180695_1_.getZ()) < 2.0F)
{
double var3 = p_180695_2_.posY + (double)p_180695_2_.getEyeHeight();
if (var3 - (double)p_180695_1_.getY() > 2.0D)
{
return EnumFacing.UP;
}
if ((double)p_180695_1_.getY() - var3 > 0.0D)
{
return EnumFacing.DOWN;
}
}
return p_180695_2_.func_174811_aO().getOpposite();
}
public static boolean func_180696_a(Block p_180696_0_, World worldIn, BlockPos p_180696_2_, EnumFacing p_180696_3_, boolean p_180696_4_)
{
if (p_180696_0_ == Blocks.obsidian)
{
return false;
}
else if (!worldIn.getWorldBorder().contains(p_180696_2_))
{
return false;
}
else if (p_180696_2_.getY() >= 0 && (p_180696_3_ != EnumFacing.DOWN || p_180696_2_.getY() != 0))
{
if (p_180696_2_.getY() <= worldIn.getHeight() - 1 && (p_180696_3_ != EnumFacing.UP || p_180696_2_.getY() != worldIn.getHeight() - 1))
{
if (p_180696_0_ != Blocks.piston && p_180696_0_ != Blocks.sticky_piston)
{
if (p_180696_0_.getBlockHardness(worldIn, p_180696_2_) == -1.0F)
{
return false;
}
if (p_180696_0_.getMobilityFlag() == 2)
{
return false;
}
if (p_180696_0_.getMobilityFlag() == 1)
{
if (!p_180696_4_)
{
return false;
}
return true;
}
}
else if (((Boolean)worldIn.getBlockState(p_180696_2_).getValue(EXTENDED)).booleanValue())
{
return false;
}
return !(p_180696_0_ instanceof ITileEntityProvider);
}
else
{
return false;
}
}
else
{
return false;
}
}
private boolean func_176319_a(World worldIn, BlockPos p_176319_2_, EnumFacing p_176319_3_, boolean p_176319_4_)
{
if (!p_176319_4_)
{
worldIn.setBlockToAir(p_176319_2_.offset(p_176319_3_));
}
BlockPistonStructureHelper var5 = new BlockPistonStructureHelper(worldIn, p_176319_2_, p_176319_3_, p_176319_4_);
List var6 = var5.func_177254_c();
List var7 = var5.func_177252_d();
if (!var5.func_177253_a())
{
return false;
}
else
{
int var8 = var6.size() + var7.size();
Block[] var9 = new Block[var8];
EnumFacing var10 = p_176319_4_ ? p_176319_3_ : p_176319_3_.getOpposite();
int var11;
BlockPos var12;
for (var11 = var7.size() - 1; var11 >= 0; --var11)
{
var12 = (BlockPos)var7.get(var11);
Block var13 = worldIn.getBlockState(var12).getBlock();
var13.dropBlockAsItem(worldIn, var12, worldIn.getBlockState(var12), 0);
worldIn.setBlockToAir(var12);
--var8;
var9[var8] = var13;
}
IBlockState var19;
for (var11 = var6.size() - 1; var11 >= 0; --var11)
{
var12 = (BlockPos)var6.get(var11);
var19 = worldIn.getBlockState(var12);
Block var14 = var19.getBlock();
var14.getMetaFromState(var19);
worldIn.setBlockToAir(var12);
var12 = var12.offset(var10);
worldIn.setBlockState(var12, Blocks.piston_extension.getDefaultState().withProperty(FACING, p_176319_3_), 4);
worldIn.setTileEntity(var12, BlockPistonMoving.func_176423_a(var19, p_176319_3_, p_176319_4_, false));
--var8;
var9[var8] = var14;
}
BlockPos var16 = p_176319_2_.offset(p_176319_3_);
if (p_176319_4_)
{
BlockPistonExtension.EnumPistonType var17 = this.isSticky ? BlockPistonExtension.EnumPistonType.STICKY : BlockPistonExtension.EnumPistonType.DEFAULT;
var19 = Blocks.piston_head.getDefaultState().withProperty(BlockPistonExtension.field_176326_a, p_176319_3_).withProperty(BlockPistonExtension.field_176325_b, var17);
IBlockState var20 = Blocks.piston_extension.getDefaultState().withProperty(BlockPistonMoving.field_176426_a, p_176319_3_).withProperty(BlockPistonMoving.field_176425_b, this.isSticky ? BlockPistonExtension.EnumPistonType.STICKY : BlockPistonExtension.EnumPistonType.DEFAULT);
worldIn.setBlockState(var16, var20, 4);
worldIn.setTileEntity(var16, BlockPistonMoving.func_176423_a(var19, p_176319_3_, true, false));
}
int var18;
for (var18 = var7.size() - 1; var18 >= 0; --var18)
{
worldIn.notifyNeighborsOfStateChange((BlockPos)var7.get(var18), var9[var8++]);
}
for (var18 = var6.size() - 1; var18 >= 0; --var18)
{
worldIn.notifyNeighborsOfStateChange((BlockPos)var6.get(var18), var9[var8++]);
}
if (p_176319_4_)
{
worldIn.notifyNeighborsOfStateChange(var16, Blocks.piston_head);
worldIn.notifyNeighborsOfStateChange(p_176319_2_, this);
}
return true;
}
}
/**
* Convert the given metadata into a BlockState for this Block
*/
public IBlockState getStateFromMeta(int meta)
{
return this.getDefaultState().withProperty(FACING, func_176317_b(meta)).withProperty(EXTENDED, Boolean.valueOf((meta & 8) > 0));
}
/**
* Convert the BlockState into the correct metadata value
*/
public int getMetaFromState(IBlockState state)
{
byte var2 = 0;
int var3 = var2 | ((EnumFacing)state.getValue(FACING)).getIndex();
if (((Boolean)state.getValue(EXTENDED)).booleanValue())
{
var3 |= 8;
}
return var3;
}
protected BlockState createBlockState()
{
return new BlockState(this, new IProperty[] {FACING, EXTENDED});
}
static final class SwitchEnumFacing
{
static final int[] field_177243_a = new int[EnumFacing.values().length];
private static final String __OBFID = "CL_00002037";
static
{
try
{
field_177243_a[EnumFacing.DOWN.ordinal()] = 1;
}
catch (NoSuchFieldError var6)
{
;
}
try
{
field_177243_a[EnumFacing.UP.ordinal()] = 2;
}
catch (NoSuchFieldError var5)
{
;
}
try
{
field_177243_a[EnumFacing.NORTH.ordinal()] = 3;
}
catch (NoSuchFieldError var4)
{
;
}
try
{
field_177243_a[EnumFacing.SOUTH.ordinal()] = 4;
}
catch (NoSuchFieldError var3)
{
;
}
try
{
field_177243_a[EnumFacing.WEST.ordinal()] = 5;
}
catch (NoSuchFieldError var2)
{
;
}
try
{
field_177243_a[EnumFacing.EAST.ordinal()] = 6;
}
catch (NoSuchFieldError var1)
{
;
}
}
}
}