001package net.minecraft.block;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.util.List;
006import net.minecraft.block.material.Material;
007import net.minecraft.client.renderer.texture.IconRegister;
008import net.minecraft.creativetab.CreativeTabs;
009import net.minecraft.entity.Entity;
010import net.minecraft.util.AxisAlignedBB;
011import net.minecraft.world.IBlockAccess;
012import net.minecraft.world.World;
013
014public class BlockFence extends Block
015{
016    private final String field_94464_a;
017
018    public BlockFence(int par1, String par2Str, Material par3Material)
019    {
020        super(par1, par3Material);
021        this.field_94464_a = par2Str;
022        this.setCreativeTab(CreativeTabs.tabDecorations);
023    }
024
025    /**
026     * Adds all intersecting collision boxes to a list. (Be sure to only add boxes to the list if they intersect the
027     * mask.) Parameters: World, X, Y, Z, mask, list, colliding entity
028     */
029    public void addCollisionBoxesToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity)
030    {
031        boolean flag = this.canConnectFenceTo(par1World, par2, par3, par4 - 1);
032        boolean flag1 = this.canConnectFenceTo(par1World, par2, par3, par4 + 1);
033        boolean flag2 = this.canConnectFenceTo(par1World, par2 - 1, par3, par4);
034        boolean flag3 = this.canConnectFenceTo(par1World, par2 + 1, par3, par4);
035        float f = 0.375F;
036        float f1 = 0.625F;
037        float f2 = 0.375F;
038        float f3 = 0.625F;
039
040        if (flag)
041        {
042            f2 = 0.0F;
043        }
044
045        if (flag1)
046        {
047            f3 = 1.0F;
048        }
049
050        if (flag || flag1)
051        {
052            this.setBlockBounds(f, 0.0F, f2, f1, 1.5F, f3);
053            super.addCollisionBoxesToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
054        }
055
056        f2 = 0.375F;
057        f3 = 0.625F;
058
059        if (flag2)
060        {
061            f = 0.0F;
062        }
063
064        if (flag3)
065        {
066            f1 = 1.0F;
067        }
068
069        if (flag2 || flag3 || !flag && !flag1)
070        {
071            this.setBlockBounds(f, 0.0F, f2, f1, 1.5F, f3);
072            super.addCollisionBoxesToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
073        }
074
075        if (flag)
076        {
077            f2 = 0.0F;
078        }
079
080        if (flag1)
081        {
082            f3 = 1.0F;
083        }
084
085        this.setBlockBounds(f, 0.0F, f2, f1, 1.0F, f3);
086    }
087
088    /**
089     * Updates the blocks bounds based on its current state. Args: world, x, y, z
090     */
091    public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
092    {
093        boolean flag = this.canConnectFenceTo(par1IBlockAccess, par2, par3, par4 - 1);
094        boolean flag1 = this.canConnectFenceTo(par1IBlockAccess, par2, par3, par4 + 1);
095        boolean flag2 = this.canConnectFenceTo(par1IBlockAccess, par2 - 1, par3, par4);
096        boolean flag3 = this.canConnectFenceTo(par1IBlockAccess, par2 + 1, par3, par4);
097        float f = 0.375F;
098        float f1 = 0.625F;
099        float f2 = 0.375F;
100        float f3 = 0.625F;
101
102        if (flag)
103        {
104            f2 = 0.0F;
105        }
106
107        if (flag1)
108        {
109            f3 = 1.0F;
110        }
111
112        if (flag2)
113        {
114            f = 0.0F;
115        }
116
117        if (flag3)
118        {
119            f1 = 1.0F;
120        }
121
122        this.setBlockBounds(f, 0.0F, f2, f1, 1.0F, f3);
123    }
124
125    /**
126     * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
127     * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
128     */
129    public boolean isOpaqueCube()
130    {
131        return false;
132    }
133
134    /**
135     * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
136     */
137    public boolean renderAsNormalBlock()
138    {
139        return false;
140    }
141
142    public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
143    {
144        return false;
145    }
146
147    /**
148     * The type of render function that is called for this block
149     */
150    public int getRenderType()
151    {
152        return 11;
153    }
154
155    /**
156     * Returns true if the specified block can be connected by a fence
157     */
158    public boolean canConnectFenceTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
159    {
160        int l = par1IBlockAccess.getBlockId(par2, par3, par4);
161
162        if (l != this.blockID && l != Block.fenceGate.blockID)
163        {
164            Block block = Block.blocksList[l];
165            return block != null && block.blockMaterial.isOpaque() && block.renderAsNormalBlock() ? block.blockMaterial != Material.pumpkin : false;
166        }
167        else
168        {
169            return true;
170        }
171    }
172
173    public static boolean isIdAFence(int par0)
174    {
175        return par0 == Block.fence.blockID || par0 == Block.netherFence.blockID;
176    }
177
178    @SideOnly(Side.CLIENT)
179
180    /**
181     * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
182     * coordinates.  Args: blockAccess, x, y, z, side
183     */
184    public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
185    {
186        return true;
187    }
188
189    @SideOnly(Side.CLIENT)
190
191    /**
192     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
193     * is the only chance you get to register icons.
194     */
195    public void registerIcons(IconRegister par1IconRegister)
196    {
197        this.blockIcon = par1IconRegister.registerIcon(this.field_94464_a);
198    }
199}