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 }