001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.util.List; 006 import java.util.Random; 007 008 public abstract class BlockHalfSlab extends Block 009 { 010 private final boolean isDoubleSlab; 011 012 public BlockHalfSlab(int par1, boolean par2, Material par3Material) 013 { 014 super(par1, 6, par3Material); 015 this.isDoubleSlab = par2; 016 017 if (par2) 018 { 019 opaqueCubeLookup[par1] = true; 020 } 021 else 022 { 023 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); 024 } 025 026 this.setLightOpacity(255); 027 } 028 029 /** 030 * Updates the blocks bounds based on its current state. Args: world, x, y, z 031 */ 032 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 033 { 034 if (this.isDoubleSlab) 035 { 036 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 037 } 038 else 039 { 040 boolean var5 = (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) != 0; 041 042 if (var5) 043 { 044 this.setBlockBounds(0.0F, 0.5F, 0.0F, 1.0F, 1.0F, 1.0F); 045 } 046 else 047 { 048 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); 049 } 050 } 051 } 052 053 /** 054 * Sets the block's bounds for rendering it as an item 055 */ 056 public void setBlockBoundsForItemRender() 057 { 058 if (this.isDoubleSlab) 059 { 060 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 061 } 062 else 063 { 064 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); 065 } 066 } 067 068 /** 069 * if the specified block is in the given AABB, add its collision bounding box to the given list 070 */ 071 public void addCollidingBlockToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) 072 { 073 this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); 074 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 075 } 076 077 /** 078 * Returns the block texture based on the side being looked at. Args: side 079 */ 080 public int getBlockTextureFromSide(int par1) 081 { 082 return this.getBlockTextureFromSideAndMetadata(par1, 0); 083 } 084 085 /** 086 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 087 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 088 */ 089 public boolean isOpaqueCube() 090 { 091 return this.isDoubleSlab; 092 } 093 094 public int func_85104_a(World par1World, int par2, int par3, int par4, int par5, float par6, float par7, float par8, int par9) 095 { 096 return this.isDoubleSlab ? 0 : (par5 != 0 && (par5 == 1 || (double)par7 <= 0.5D) ? par9 : par9 | 8); 097 } 098 099 /** 100 * Returns the quantity of items to drop on block destruction. 101 */ 102 public int quantityDropped(Random par1Random) 103 { 104 return this.isDoubleSlab ? 2 : 1; 105 } 106 107 /** 108 * Determines the damage on the item the block drops. Used in cloth and wood. 109 */ 110 public int damageDropped(int par1) 111 { 112 return par1 & 7; 113 } 114 115 /** 116 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 117 */ 118 public boolean renderAsNormalBlock() 119 { 120 return this.isDoubleSlab; 121 } 122 123 @SideOnly(Side.CLIENT) 124 125 /** 126 * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given 127 * coordinates. Args: blockAccess, x, y, z, side 128 */ 129 public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) 130 { 131 if (this.isDoubleSlab) 132 { 133 return super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5); 134 } 135 else if (par5 != 1 && par5 != 0 && !super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5)) 136 { 137 return false; 138 } 139 else 140 { 141 int var6 = par2 + Facing.offsetsXForSide[Facing.faceToSide[par5]]; 142 int var7 = par3 + Facing.offsetsYForSide[Facing.faceToSide[par5]]; 143 int var8 = par4 + Facing.offsetsZForSide[Facing.faceToSide[par5]]; 144 boolean var9 = (par1IBlockAccess.getBlockMetadata(var6, var7, var8) & 8) != 0; 145 return var9 ? (par5 == 0 ? true : (par5 == 1 && super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) ? true : !isBlockSingleSlab(par1IBlockAccess.getBlockId(par2, par3, par4)) || (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) == 0)) : (par5 == 1 ? true : (par5 == 0 && super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) ? true : !isBlockSingleSlab(par1IBlockAccess.getBlockId(par2, par3, par4)) || (par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 8) != 0)); 146 } 147 } 148 149 @SideOnly(Side.CLIENT) 150 151 /** 152 * Takes a block ID, returns true if it's the same as the ID for a stone or wooden single slab. 153 */ 154 private static boolean isBlockSingleSlab(int par0) 155 { 156 return par0 == Block.stoneSingleSlab.blockID || par0 == Block.woodSingleSlab.blockID; 157 } 158 159 /** 160 * Returns the slab block name with step type. 161 */ 162 public abstract String getFullSlabName(int var1); 163 }