    001    package net.minecraft.block;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import net.minecraft.block.material.Material;
    006    import net.minecraft.creativetab.CreativeTabs;
    007    import net.minecraft.util.AxisAlignedBB;
    008    import net.minecraft.world.IBlockAccess;
    009    import net.minecraft.world.World;
    010
    011    public class BlockFence extends Block
    012    {
    013        public BlockFence(int par1, int par2)
    014        {
    015            super(par1, par2, Material.wood);
    016            this.setCreativeTab(CreativeTabs.tabDecorations);
    017        }
    018
    019        public BlockFence(int par1, int par2, Material par3Material)
    020        {
    021            super(par1, par2, par3Material);
    022            this.setCreativeTab(CreativeTabs.tabDecorations);
    023        }
    024
    025        /**
    026         * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
    027         * cleared to be reused)
    028         */
    029        public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    030        {
    031            boolean var5 = this.canConnectFenceTo(par1World, par2, par3, par4 - 1);
    032            boolean var6 = this.canConnectFenceTo(par1World, par2, par3, par4 + 1);
    033            boolean var7 = this.canConnectFenceTo(par1World, par2 - 1, par3, par4);
    034            boolean var8 = this.canConnectFenceTo(par1World, par2 + 1, par3, par4);
    035            float var9 = 0.375F;
    036            float var10 = 0.625F;
    037            float var11 = 0.375F;
    038            float var12 = 0.625F;
    039
    040            if (var5)
    041            {
    042                var11 = 0.0F;
    043            }
    044
    045            if (var6)
    046            {
    047                var12 = 1.0F;
    048            }
    049
    050            if (var7)
    051            {
    052                var9 = 0.0F;
    053            }
    054
    055            if (var8)
    056            {
    057                var10 = 1.0F;
    058            }
    059
    060            return AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var9), (double)par3, (double)((float)par4 + var11), (double)((float)par2 + var10), (double)((float)par3 + 1.5F), (double)((float)par4 + var12));
    061        }
    062
    063        /**
    064         * Updates the blocks bounds based on its current state. Args: world, x, y, z
    065         */
    066        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    067        {
    068            boolean var5 = this.canConnectFenceTo(par1IBlockAccess, par2, par3, par4 - 1);
    069            boolean var6 = this.canConnectFenceTo(par1IBlockAccess, par2, par3, par4 + 1);
    070            boolean var7 = this.canConnectFenceTo(par1IBlockAccess, par2 - 1, par3, par4);
    071            boolean var8 = this.canConnectFenceTo(par1IBlockAccess, par2 + 1, par3, par4);
    072            float var9 = 0.375F;
    073            float var10 = 0.625F;
    074            float var11 = 0.375F;
    075            float var12 = 0.625F;
    076
    077            if (var5)
    078            {
    079                var11 = 0.0F;
    080            }
    081
    082            if (var6)
    083            {
    084                var12 = 1.0F;
    085            }
    086
    087            if (var7)
    088            {
    089                var9 = 0.0F;
    090            }
    091
    092            if (var8)
    093            {
    094                var10 = 1.0F;
    095            }
    096
    097            this.setBlockBounds(var9, 0.0F, var11, var10, 1.0F, var12);
    098        }
    099
    100        /**
    101         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
    102         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    103         */
    104        public boolean isOpaqueCube()
    105        {
    106            return false;
    107        }
    108
    109        /**
    110         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    111         */
    112        public boolean renderAsNormalBlock()
    113        {
    114            return false;
    115        }
    116
    117        public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    118        {
    119            return false;
    120        }
    121
    122        /**
    123         * The type of render function that is called for this block
    124         */
    125        public int getRenderType()
    126        {
    127            return 11;
    128        }
    129
    130        /**
    131         * Returns true if the specified block can be connected by a fence
    132         */
    133        public boolean canConnectFenceTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    134        {
    135            int var5 = par1IBlockAccess.getBlockId(par2, par3, par4);
    136
    137            if (var5 != this.blockID && var5 != Block.fenceGate.blockID)
    138            {
    139                Block var6 = Block.blocksList[var5];
    140                return var6 != null && var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock() ? var6.blockMaterial != Material.pumpkin : false;
    141            }
    142            else
    143            {
    144                return true;
    145            }
    146        }
    147
    148        public static boolean isIdAFence(int par0)
    149        {
    150            return par0 == Block.fence.blockID || par0 == Block.netherFence.blockID;
    151        }
    152
    153        @SideOnly(Side.CLIENT)
    154
    155        /**
    156         * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
    157         * coordinates.  Args: blockAccess, x, y, z, side
    158         */
    159        public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
    160        {
    161            return true;
    162        }
    163    }