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