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.Entity;
008    import net.minecraft.entity.player.EntityPlayer;
009    import net.minecraft.item.Item;
010    import net.minecraft.item.ItemStack;
011    import net.minecraft.world.World;
012    
013    public class BlockRedstoneOre extends Block
014    {
015        private boolean glowing;
016    
017        public BlockRedstoneOre(int par1, int par2, boolean par3)
018        {
019            super(par1, par2, Material.rock);
020    
021            if (par3)
022            {
023                this.setTickRandomly(true);
024            }
025    
026            this.glowing = par3;
027        }
028    
029        /**
030         * How many world ticks before ticking
031         */
032        public int tickRate()
033        {
034            return 30;
035        }
036    
037        /**
038         * Called when the block is clicked by a player. Args: x, y, z, entityPlayer
039         */
040        public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer)
041        {
042            this.glow(par1World, par2, par3, par4);
043            super.onBlockClicked(par1World, par2, par3, par4, par5EntityPlayer);
044        }
045    
046        /**
047         * Called whenever an entity is walking on top of this block. Args: world, x, y, z, entity
048         */
049        public void onEntityWalking(World par1World, int par2, int par3, int par4, Entity par5Entity)
050        {
051            this.glow(par1World, par2, par3, par4);
052            super.onEntityWalking(par1World, par2, par3, par4, par5Entity);
053        }
054    
055        /**
056         * Called upon block activation (right click on the block.)
057         */
058        public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
059        {
060            this.glow(par1World, par2, par3, par4);
061            return super.onBlockActivated(par1World, par2, par3, par4, par5EntityPlayer, par6, par7, par8, par9);
062        }
063    
064        /**
065         * The redstone ore glows.
066         */
067        private void glow(World par1World, int par2, int par3, int par4)
068        {
069            this.sparkle(par1World, par2, par3, par4);
070    
071            if (this.blockID == Block.oreRedstone.blockID)
072            {
073                par1World.setBlockWithNotify(par2, par3, par4, Block.oreRedstoneGlowing.blockID);
074            }
075        }
076    
077        /**
078         * Ticks the block if it's been scheduled
079         */
080        public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
081        {
082            if (this.blockID == Block.oreRedstoneGlowing.blockID)
083            {
084                par1World.setBlockWithNotify(par2, par3, par4, Block.oreRedstone.blockID);
085            }
086        }
087    
088        /**
089         * Returns the ID of the items to drop on destruction.
090         */
091        public int idDropped(int par1, Random par2Random, int par3)
092        {
093            return Item.redstone.itemID;
094        }
095    
096        /**
097         * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' (inclusive).
098         */
099        public int quantityDroppedWithBonus(int par1, Random par2Random)
100        {
101            return this.quantityDropped(par2Random) + par2Random.nextInt(par1 + 1);
102        }
103    
104        /**
105         * Returns the quantity of items to drop on block destruction.
106         */
107        public int quantityDropped(Random par1Random)
108        {
109            return 4 + par1Random.nextInt(2);
110        }
111    
112        /**
113         * Drops the block items with a specified chance of dropping the specified items
114         */
115        public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
116        {
117            super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, par7);
118    
119            if (this.idDropped(par5, par1World.rand, par7) != this.blockID)
120            {
121                int var8 = 1 + par1World.rand.nextInt(5);
122                this.dropXpOnBlockBreak(par1World, par2, par3, par4, var8);
123            }
124        }
125    
126        @SideOnly(Side.CLIENT)
127    
128        /**
129         * A randomly called display update to be able to add particles or other items for display
130         */
131        public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
132        {
133            if (this.glowing)
134            {
135                this.sparkle(par1World, par2, par3, par4);
136            }
137        }
138    
139        /**
140         * The redstone ore sparkles.
141         */
142        private void sparkle(World par1World, int par2, int par3, int par4)
143        {
144            Random var5 = par1World.rand;
145            double var6 = 0.0625D;
146    
147            for (int var8 = 0; var8 < 6; ++var8)
148            {
149                double var9 = (double)((float)par2 + var5.nextFloat());
150                double var11 = (double)((float)par3 + var5.nextFloat());
151                double var13 = (double)((float)par4 + var5.nextFloat());
152    
153                if (var8 == 0 && !par1World.isBlockOpaqueCube(par2, par3 + 1, par4))
154                {
155                    var11 = (double)(par3 + 1) + var6;
156                }
157    
158                if (var8 == 1 && !par1World.isBlockOpaqueCube(par2, par3 - 1, par4))
159                {
160                    var11 = (double)(par3 + 0) - var6;
161                }
162    
163                if (var8 == 2 && !par1World.isBlockOpaqueCube(par2, par3, par4 + 1))
164                {
165                    var13 = (double)(par4 + 1) + var6;
166                }
167    
168                if (var8 == 3 && !par1World.isBlockOpaqueCube(par2, par3, par4 - 1))
169                {
170                    var13 = (double)(par4 + 0) - var6;
171                }
172    
173                if (var8 == 4 && !par1World.isBlockOpaqueCube(par2 + 1, par3, par4))
174                {
175                    var9 = (double)(par2 + 1) + var6;
176                }
177    
178                if (var8 == 5 && !par1World.isBlockOpaqueCube(par2 - 1, par3, par4))
179                {
180                    var9 = (double)(par2 + 0) - var6;
181                }
182    
183                if (var9 < (double)par2 || var9 > (double)(par2 + 1) || var11 < 0.0D || var11 > (double)(par3 + 1) || var13 < (double)par4 || var13 > (double)(par4 + 1))
184                {
185                    par1World.spawnParticle("reddust", var9, var11, var13, 0.0D, 0.0D, 0.0D);
186                }
187            }
188        }
189    
190        /**
191         * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage
192         * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null.
193         */
194        protected ItemStack createStackedBlock(int par1)
195        {
196            return new ItemStack(Block.oreRedstone);
197        }
198    }