001 package net.minecraft.block;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.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 }