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 net.minecraft.block.material.Material; 007 import net.minecraft.creativetab.CreativeTabs; 008 import net.minecraft.item.ItemStack; 009 import net.minecraft.util.AxisAlignedBB; 010 import net.minecraft.world.IBlockAccess; 011 import net.minecraft.world.World; 012 013 public class BlockWall extends Block 014 { 015 /** The types of the wall. */ 016 public static final String[] types = new String[] {"normal", "mossy"}; 017 018 public BlockWall(int par1, Block par2Block) 019 { 020 super(par1, par2Block.blockIndexInTexture, par2Block.blockMaterial); 021 this.setHardness(par2Block.blockHardness); 022 this.setResistance(par2Block.blockResistance / 3.0F); 023 this.setStepSound(par2Block.stepSound); 024 this.setCreativeTab(CreativeTabs.tabBlock); 025 } 026 027 /** 028 * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata 029 */ 030 public int getBlockTextureFromSideAndMetadata(int par1, int par2) 031 { 032 return par2 == 1 ? Block.cobblestoneMossy.blockIndexInTexture : super.getBlockTextureFromSide(par1); 033 } 034 035 /** 036 * The type of render function that is called for this block 037 */ 038 public int getRenderType() 039 { 040 return 32; 041 } 042 043 /** 044 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 045 */ 046 public boolean renderAsNormalBlock() 047 { 048 return false; 049 } 050 051 public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 052 { 053 return false; 054 } 055 056 /** 057 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 058 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 059 */ 060 public boolean isOpaqueCube() 061 { 062 return false; 063 } 064 065 /** 066 * Updates the blocks bounds based on its current state. Args: world, x, y, z 067 */ 068 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 069 { 070 boolean var5 = this.canConnectWallTo(par1IBlockAccess, par2, par3, par4 - 1); 071 boolean var6 = this.canConnectWallTo(par1IBlockAccess, par2, par3, par4 + 1); 072 boolean var7 = this.canConnectWallTo(par1IBlockAccess, par2 - 1, par3, par4); 073 boolean var8 = this.canConnectWallTo(par1IBlockAccess, par2 + 1, par3, par4); 074 float var9 = 0.25F; 075 float var10 = 0.75F; 076 float var11 = 0.25F; 077 float var12 = 0.75F; 078 float var13 = 1.0F; 079 080 if (var5) 081 { 082 var11 = 0.0F; 083 } 084 085 if (var6) 086 { 087 var12 = 1.0F; 088 } 089 090 if (var7) 091 { 092 var9 = 0.0F; 093 } 094 095 if (var8) 096 { 097 var10 = 1.0F; 098 } 099 100 if (var5 && var6 && !var7 && !var8) 101 { 102 var13 = 0.8125F; 103 var9 = 0.3125F; 104 var10 = 0.6875F; 105 } 106 else if (!var5 && !var6 && var7 && var8) 107 { 108 var13 = 0.8125F; 109 var11 = 0.3125F; 110 var12 = 0.6875F; 111 } 112 113 this.setBlockBounds(var9, 0.0F, var11, var10, var13, var12); 114 } 115 116 /** 117 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been 118 * cleared to be reused) 119 */ 120 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) 121 { 122 this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); 123 this.maxY = 1.5D; 124 return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); 125 } 126 127 /** 128 * Return whether an adjacent block can connect to a wall. 129 */ 130 public boolean canConnectWallTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 131 { 132 int var5 = par1IBlockAccess.getBlockId(par2, par3, par4); 133 134 if (var5 != this.blockID && var5 != Block.fenceGate.blockID) 135 { 136 Block var6 = Block.blocksList[var5]; 137 return var6 != null && var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock() ? var6.blockMaterial != Material.pumpkin : false; 138 } 139 else 140 { 141 return true; 142 } 143 } 144 145 @SideOnly(Side.CLIENT) 146 147 /** 148 * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) 149 */ 150 public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) 151 { 152 par3List.add(new ItemStack(par1, 1, 0)); 153 par3List.add(new ItemStack(par1, 1, 1)); 154 } 155 156 /** 157 * Determines the damage on the item the block drops. Used in cloth and wood. 158 */ 159 public int damageDropped(int par1) 160 { 161 return par1; 162 } 163 164 @SideOnly(Side.CLIENT) 165 166 /** 167 * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given 168 * coordinates. Args: blockAccess, x, y, z, side 169 */ 170 public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) 171 { 172 return par5 == 0 ? super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) : true; 173 } 174 }