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.entity.player.EntityPlayer;
008    import net.minecraft.item.Item;
009    import net.minecraft.item.ItemStack;
010    import net.minecraft.world.World;
011    
012    public class BlockFlowerPot extends Block
013    {
014        public BlockFlowerPot(int par1)
015        {
016            super(par1, Material.circuits);
017            this.blockIndexInTexture = 186;
018            this.setBlockBoundsForItemRender();
019            this.setRequiresSelfNotify();
020        }
021    
022        /**
023         * Sets the block's bounds for rendering it as an item
024         */
025        public void setBlockBoundsForItemRender()
026        {
027            float var1 = 0.375F;
028            float var2 = var1 / 2.0F;
029            this.setBlockBounds(0.5F - var2, 0.0F, 0.5F - var2, 0.5F + var2, var1, 0.5F + var2);
030        }
031    
032        /**
033         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
034         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
035         */
036        public boolean isOpaqueCube()
037        {
038            return false;
039        }
040    
041        /**
042         * The type of render function that is called for this block
043         */
044        public int getRenderType()
045        {
046            return 33;
047        }
048    
049        /**
050         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
051         */
052        public boolean renderAsNormalBlock()
053        {
054            return false;
055        }
056    
057        /**
058         * Called upon block activation (right click on the block.)
059         */
060        public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
061        {
062            ItemStack var10 = par5EntityPlayer.inventory.getCurrentItem();
063    
064            if (var10 == null)
065            {
066                return false;
067            }
068            else if (par1World.getBlockMetadata(par2, par3, par4) != 0)
069            {
070                return false;
071            }
072            else
073            {
074                int var11 = getMetaForPlant(var10);
075    
076                if (var11 > 0)
077                {
078                    par1World.setBlockMetadataWithNotify(par2, par3, par4, var11);
079    
080                    if (!par5EntityPlayer.capabilities.isCreativeMode && --var10.stackSize <= 0)
081                    {
082                        par5EntityPlayer.inventory.setInventorySlotContents(par5EntityPlayer.inventory.currentItem, (ItemStack)null);
083                    }
084    
085                    return true;
086                }
087                else
088                {
089                    return false;
090                }
091            }
092        }
093    
094        @SideOnly(Side.CLIENT)
095    
096        /**
097         * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
098         */
099        public int idPicked(World par1World, int par2, int par3, int par4)
100        {
101            ItemStack var5 = getPlantForMeta(par1World.getBlockMetadata(par2, par3, par4));
102            return var5 == null ? Item.flowerPot.itemID : var5.itemID;
103        }
104    
105        /**
106         * Get the block's damage value (for use with pick block).
107         */
108        public int getDamageValue(World par1World, int par2, int par3, int par4)
109        {
110            ItemStack var5 = getPlantForMeta(par1World.getBlockMetadata(par2, par3, par4));
111            return var5 == null ? Item.flowerPot.itemID : var5.getItemDamage();
112        }
113    
114        @SideOnly(Side.CLIENT)
115        public boolean func_82505_u_()
116        {
117            return true;
118        }
119    
120        /**
121         * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
122         */
123        public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
124        {
125            return super.canPlaceBlockAt(par1World, par2, par3, par4) && par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4);
126        }
127    
128        /**
129         * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
130         * their own) Args: x, y, z, neighbor blockID
131         */
132        public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
133        {
134            if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4))
135            {
136                this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
137                par1World.setBlockWithNotify(par2, par3, par4, 0);
138            }
139        }
140    
141        /**
142         * Drops the block items with a specified chance of dropping the specified items
143         */
144        public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
145        {
146            super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, par7);
147    
148            if (par5 > 0)
149            {
150                ItemStack var8 = getPlantForMeta(par5);
151    
152                if (var8 != null)
153                {
154                    this.dropBlockAsItem_do(par1World, par2, par3, par4, var8);
155                }
156            }
157        }
158    
159        /**
160         * Returns the ID of the items to drop on destruction.
161         */
162        public int idDropped(int par1, Random par2Random, int par3)
163        {
164            return Item.flowerPot.itemID;
165        }
166    
167        /**
168         * Return the item associated with the specified flower pot metadata value.
169         */
170        public static ItemStack getPlantForMeta(int par0)
171        {
172            switch (par0)
173            {
174                case 1:
175                    return new ItemStack(Block.plantRed);
176                case 2:
177                    return new ItemStack(Block.plantYellow);
178                case 3:
179                    return new ItemStack(Block.sapling, 1, 0);
180                case 4:
181                    return new ItemStack(Block.sapling, 1, 1);
182                case 5:
183                    return new ItemStack(Block.sapling, 1, 2);
184                case 6:
185                    return new ItemStack(Block.sapling, 1, 3);
186                case 7:
187                    return new ItemStack(Block.mushroomRed);
188                case 8:
189                    return new ItemStack(Block.mushroomBrown);
190                case 9:
191                    return new ItemStack(Block.cactus);
192                case 10:
193                    return new ItemStack(Block.deadBush);
194                case 11:
195                    return new ItemStack(Block.tallGrass, 1, 2);
196                default:
197                    return null;
198            }
199        }
200    
201        /**
202         * Return the flower pot metadata value associated with the specified item.
203         */
204        public static int getMetaForPlant(ItemStack par0ItemStack)
205        {
206            int var1 = par0ItemStack.getItem().itemID;
207    
208            if (var1 == Block.plantRed.blockID)
209            {
210                return 1;
211            }
212            else if (var1 == Block.plantYellow.blockID)
213            {
214                return 2;
215            }
216            else if (var1 == Block.cactus.blockID)
217            {
218                return 9;
219            }
220            else if (var1 == Block.mushroomBrown.blockID)
221            {
222                return 8;
223            }
224            else if (var1 == Block.mushroomRed.blockID)
225            {
226                return 7;
227            }
228            else if (var1 == Block.deadBush.blockID)
229            {
230                return 10;
231            }
232            else
233            {
234                if (var1 == Block.sapling.blockID)
235                {
236                    switch (par0ItemStack.getItemDamage())
237                    {
238                        case 0:
239                            return 3;
240                        case 1:
241                            return 4;
242                        case 2:
243                            return 5;
244                        case 3:
245                            return 6;
246                    }
247                }
248    
249                if (var1 == Block.tallGrass.blockID)
250                {
251                    switch (par0ItemStack.getItemDamage())
252                    {
253                        case 2:
254                            return 11;
255                    }
256                }
257    
258                return 0;
259            }
260        }
261    }