001 package net.minecraft.block; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.List; 006 import java.util.Random; 007 import net.minecraft.block.material.Material; 008 import net.minecraft.creativetab.CreativeTabs; 009 import net.minecraft.entity.Entity; 010 import net.minecraft.item.ItemStack; 011 import net.minecraft.util.AxisAlignedBB; 012 import net.minecraft.world.IBlockAccess; 013 import net.minecraft.world.World; 014 015 public class BlockPane extends Block 016 { 017 /** 018 * Holds the texture index of the side of the pane (the thin lateral side) 019 */ 020 private int sideTextureIndex; 021 022 /** 023 * If this field is true, the pane block drops itself when destroyed (like the iron fences), otherwise, it's just 024 * destroyed (like glass panes) 025 */ 026 private final boolean canDropItself; 027 028 protected BlockPane(int par1, int par2, int par3, Material par4Material, boolean par5) 029 { 030 super(par1, par2, par4Material); 031 this.sideTextureIndex = par3; 032 this.canDropItself = par5; 033 this.setCreativeTab(CreativeTabs.tabDecorations); 034 } 035 036 /** 037 * Returns the ID of the items to drop on destruction. 038 */ 039 public int idDropped(int par1, Random par2Random, int par3) 040 { 041 return !this.canDropItself ? 0 : super.idDropped(par1, par2Random, par3); 042 } 043 044 /** 045 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 046 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 047 */ 048 public boolean isOpaqueCube() 049 { 050 return false; 051 } 052 053 /** 054 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 055 */ 056 public boolean renderAsNormalBlock() 057 { 058 return false; 059 } 060 061 /** 062 * The type of render function that is called for this block 063 */ 064 public int getRenderType() 065 { 066 return 18; 067 } 068 069 @SideOnly(Side.CLIENT) 070 071 /** 072 * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given 073 * coordinates. Args: blockAccess, x, y, z, side 074 */ 075 public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) 076 { 077 int var6 = par1IBlockAccess.getBlockId(par2, par3, par4); 078 return var6 == this.blockID ? false : super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5); 079 } 080 081 /** 082 * if the specified block is in the given AABB, add its collision bounding box to the given list 083 */ 084 public void addCollidingBlockToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) 085 { 086 boolean var8 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2, par3, par4 - 1)); 087 boolean var9 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2, par3, par4 + 1)); 088 boolean var10 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2 - 1, par3, par4)); 089 boolean var11 = this.canThisPaneConnectToThisBlockID(par1World.getBlockId(par2 + 1, par3, par4)); 090 091 if ((!var10 || !var11) && (var10 || var11 || var8 || var9)) 092 { 093 if (var10 && !var11) 094 { 095 this.setBlockBounds(0.0F, 0.0F, 0.4375F, 0.5F, 1.0F, 0.5625F); 096 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 097 } 098 else if (!var10 && var11) 099 { 100 this.setBlockBounds(0.5F, 0.0F, 0.4375F, 1.0F, 1.0F, 0.5625F); 101 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 102 } 103 } 104 else 105 { 106 this.setBlockBounds(0.0F, 0.0F, 0.4375F, 1.0F, 1.0F, 0.5625F); 107 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 108 } 109 110 if ((!var8 || !var9) && (var10 || var11 || var8 || var9)) 111 { 112 if (var8 && !var9) 113 { 114 this.setBlockBounds(0.4375F, 0.0F, 0.0F, 0.5625F, 1.0F, 0.5F); 115 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 116 } 117 else if (!var8 && var9) 118 { 119 this.setBlockBounds(0.4375F, 0.0F, 0.5F, 0.5625F, 1.0F, 1.0F); 120 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 121 } 122 } 123 else 124 { 125 this.setBlockBounds(0.4375F, 0.0F, 0.0F, 0.5625F, 1.0F, 1.0F); 126 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 127 } 128 } 129 130 /** 131 * Sets the block's bounds for rendering it as an item 132 */ 133 public void setBlockBoundsForItemRender() 134 { 135 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 136 } 137 138 /** 139 * Updates the blocks bounds based on its current state. Args: world, x, y, z 140 */ 141 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 142 { 143 float var5 = 0.4375F; 144 float var6 = 0.5625F; 145 float var7 = 0.4375F; 146 float var8 = 0.5625F; 147 boolean var9 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2, par3, par4 - 1)); 148 boolean var10 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2, par3, par4 + 1)); 149 boolean var11 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2 - 1, par3, par4)); 150 boolean var12 = this.canThisPaneConnectToThisBlockID(par1IBlockAccess.getBlockId(par2 + 1, par3, par4)); 151 152 if ((!var11 || !var12) && (var11 || var12 || var9 || var10)) 153 { 154 if (var11 && !var12) 155 { 156 var5 = 0.0F; 157 } 158 else if (!var11 && var12) 159 { 160 var6 = 1.0F; 161 } 162 } 163 else 164 { 165 var5 = 0.0F; 166 var6 = 1.0F; 167 } 168 169 if ((!var9 || !var10) && (var11 || var12 || var9 || var10)) 170 { 171 if (var9 && !var10) 172 { 173 var7 = 0.0F; 174 } 175 else if (!var9 && var10) 176 { 177 var8 = 1.0F; 178 } 179 } 180 else 181 { 182 var7 = 0.0F; 183 var8 = 1.0F; 184 } 185 186 this.setBlockBounds(var5, 0.0F, var7, var6, 1.0F, var8); 187 } 188 189 @SideOnly(Side.CLIENT) 190 191 /** 192 * Returns the texture index of the thin side of the pane. 193 */ 194 public int getSideTextureIndex() 195 { 196 return this.sideTextureIndex; 197 } 198 199 /** 200 * Gets passed in the blockID of the block adjacent and supposed to return true if its allowed to connect to the 201 * type of blockID passed in. Args: blockID 202 */ 203 public final boolean canThisPaneConnectToThisBlockID(int par1) 204 { 205 return Block.opaqueCubeLookup[par1] || par1 == this.blockID || par1 == Block.glass.blockID; 206 } 207 208 /** 209 * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops. 210 */ 211 protected boolean canSilkHarvest() 212 { 213 return true; 214 } 215 216 /** 217 * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage 218 * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null. 219 */ 220 protected ItemStack createStackedBlock(int par1) 221 { 222 return new ItemStack(this.blockID, 1, par1); 223 } 224 }