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