001 package net.minecraft.block; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.Random; 006 import net.minecraft.block.material.Material; 007 import net.minecraft.item.Item; 008 import net.minecraft.util.AxisAlignedBB; 009 import net.minecraft.world.World; 010 011 import net.minecraftforge.common.EnumPlantType; 012 import net.minecraftforge.common.ForgeDirection; 013 import net.minecraftforge.common.IPlantable; 014 015 public class BlockReed extends Block implements IPlantable 016 { 017 protected BlockReed(int par1, int par2) 018 { 019 super(par1, Material.plants); 020 this.blockIndexInTexture = par2; 021 float var3 = 0.375F; 022 this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 1.0F, 0.5F + var3); 023 this.setTickRandomly(true); 024 } 025 026 /** 027 * Ticks the block if it's been scheduled 028 */ 029 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) 030 { 031 if (par1World.isAirBlock(par2, par3 + 1, par4)) 032 { 033 int var6; 034 035 for (var6 = 1; par1World.getBlockId(par2, par3 - var6, par4) == this.blockID; ++var6) 036 { 037 ; 038 } 039 040 if (var6 < 3) 041 { 042 int var7 = par1World.getBlockMetadata(par2, par3, par4); 043 044 if (var7 == 15) 045 { 046 par1World.setBlockWithNotify(par2, par3 + 1, par4, this.blockID); 047 par1World.setBlockMetadataWithNotify(par2, par3, par4, 0); 048 } 049 else 050 { 051 par1World.setBlockMetadataWithNotify(par2, par3, par4, var7 + 1); 052 } 053 } 054 } 055 } 056 057 /** 058 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z 059 */ 060 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) 061 { 062 Block block = Block.blocksList[par1World.getBlockId(par2, par3 - 1, par4)]; 063 return (block != null && block.canSustainPlant(par1World, par2, par3 - 1, par4, ForgeDirection.UP, this)); 064 } 065 066 /** 067 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are 068 * their own) Args: x, y, z, neighbor blockID 069 */ 070 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) 071 { 072 this.checkBlockCoordValid(par1World, par2, par3, par4); 073 } 074 075 /** 076 * Checks if current block pos is valid, if not, breaks the block as dropable item. Used for reed and cactus. 077 */ 078 protected final void checkBlockCoordValid(World par1World, int par2, int par3, int par4) 079 { 080 if (!this.canBlockStay(par1World, par2, par3, par4)) 081 { 082 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); 083 par1World.setBlockWithNotify(par2, par3, par4, 0); 084 } 085 } 086 087 /** 088 * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. 089 */ 090 public boolean canBlockStay(World par1World, int par2, int par3, int par4) 091 { 092 return this.canPlaceBlockAt(par1World, par2, par3, par4); 093 } 094 095 /** 096 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been 097 * cleared to be reused) 098 */ 099 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) 100 { 101 return null; 102 } 103 104 /** 105 * Returns the ID of the items to drop on destruction. 106 */ 107 public int idDropped(int par1, Random par2Random, int par3) 108 { 109 return Item.reed.itemID; 110 } 111 112 /** 113 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 114 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 115 */ 116 public boolean isOpaqueCube() 117 { 118 return false; 119 } 120 121 /** 122 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 123 */ 124 public boolean renderAsNormalBlock() 125 { 126 return false; 127 } 128 129 /** 130 * The type of render function that is called for this block 131 */ 132 public int getRenderType() 133 { 134 return 1; 135 } 136 137 @SideOnly(Side.CLIENT) 138 139 /** 140 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) 141 */ 142 public int idPicked(World par1World, int par2, int par3, int par4) 143 { 144 return Item.reed.itemID; 145 } 146 147 @Override 148 public EnumPlantType getPlantType(World world, int x, int y, int z) 149 { 150 return EnumPlantType.Beach; 151 } 152 153 @Override 154 public int getPlantID(World world, int x, int y, int z) 155 { 156 return blockID; 157 } 158 159 @Override 160 public int getPlantMetadata(World world, int x, int y, int z) 161 { 162 return world.getBlockMetadata(x, y, z); 163 } 164 }