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 import net.minecraftforge.common.ForgeDirection;
007 import static net.minecraftforge.common.ForgeDirection.*;
008
009 public class BlockTorch extends Block
010 {
011 protected BlockTorch(int par1, int par2)
012 {
013 super(par1, par2, Material.circuits);
014 this.setTickRandomly(true);
015 this.setCreativeTab(CreativeTabs.tabDecorations);
016 }
017
018 /**
019 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
020 * cleared to be reused)
021 */
022 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
023 {
024 return null;
025 }
026
027 /**
028 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
029 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
030 */
031 public boolean isOpaqueCube()
032 {
033 return false;
034 }
035
036 /**
037 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
038 */
039 public boolean renderAsNormalBlock()
040 {
041 return false;
042 }
043
044 /**
045 * The type of render function that is called for this block
046 */
047 public int getRenderType()
048 {
049 return 2;
050 }
051
052 /**
053 * Gets if we can place a torch on a block.
054 */
055 private boolean canPlaceTorchOn(World par1World, int par2, int par3, int par4)
056 {
057 if (par1World.doesBlockHaveSolidTopSurface(par2, par3, par4))
058 {
059 return true;
060 }
061 else
062 {
063 int var5 = par1World.getBlockId(par2, par3, par4);
064 return (Block.blocksList[var5] != null && Block.blocksList[var5].canPlaceTorchOnTop(par1World, par2, par3, par4));
065 }
066 }
067
068 /**
069 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
070 */
071 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
072 {
073 return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, EAST, true) ||
074 par1World.isBlockSolidOnSide(par2 + 1, par3, par4, WEST, true) ||
075 par1World.isBlockSolidOnSide(par2, par3, par4 - 1, SOUTH, true) ||
076 par1World.isBlockSolidOnSide(par2, par3, par4 + 1, NORTH, true) ||
077 canPlaceTorchOn(par1World, par2, par3 - 1, par4);
078 }
079
080 public int func_85104_a(World par1World, int par2, int par3, int par4, int par5, float par6, float par7, float par8, int par9)
081 {
082 int var10 = par9;
083
084 if (par5 == 1 && this.canPlaceTorchOn(par1World, par2, par3 - 1, par4))
085 {
086 var10 = 5;
087 }
088
089 if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, NORTH, true))
090 {
091 var10 = 4;
092 }
093
094 if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, SOUTH, true))
095 {
096 var10 = 3;
097 }
098
099 if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, WEST, true))
100 {
101 var10 = 2;
102 }
103
104 if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, EAST, true))
105 {
106 var10 = 1;
107 }
108
109 return var10;
110 }
111
112 /**
113 * Ticks the block if it's been scheduled
114 */
115 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
116 {
117 super.updateTick(par1World, par2, par3, par4, par5Random);
118
119 if (par1World.getBlockMetadata(par2, par3, par4) == 0)
120 {
121 this.onBlockAdded(par1World, par2, par3, par4);
122 }
123 }
124
125 /**
126 * Called whenever the block is added into the world. Args: world, x, y, z
127 */
128 public void onBlockAdded(World par1World, int par2, int par3, int par4)
129 {
130 if (par1World.isBlockSolidOnSide(par2 - 1, par3, par4, EAST, true))
131 {
132 par1World.setBlockMetadataWithNotify(par2, par3, par4, 1);
133 }
134 else if (par1World.isBlockSolidOnSide(par2 + 1, par3, par4, WEST, true))
135 {
136 par1World.setBlockMetadataWithNotify(par2, par3, par4, 2);
137 }
138 else if (par1World.isBlockSolidOnSide(par2, par3, par4 - 1, SOUTH, true))
139 {
140 par1World.setBlockMetadataWithNotify(par2, par3, par4, 3);
141 }
142 else if (par1World.isBlockSolidOnSide(par2, par3, par4 + 1, NORTH, true))
143 {
144 par1World.setBlockMetadataWithNotify(par2, par3, par4, 4);
145 }
146 else if (this.canPlaceTorchOn(par1World, par2, par3 - 1, par4))
147 {
148 par1World.setBlockMetadataWithNotify(par2, par3, par4, 5);
149 }
150
151 this.dropTorchIfCantStay(par1World, par2, par3, par4);
152 }
153
154 /**
155 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
156 * their own) Args: x, y, z, neighbor blockID
157 */
158 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
159 {
160 if (this.dropTorchIfCantStay(par1World, par2, par3, par4))
161 {
162 int var6 = par1World.getBlockMetadata(par2, par3, par4);
163 boolean var7 = false;
164
165 if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, EAST, true) && var6 == 1)
166 {
167 var7 = true;
168 }
169
170 if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, WEST, true) && var6 == 2)
171 {
172 var7 = true;
173 }
174
175 if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, SOUTH, true) && var6 == 3)
176 {
177 var7 = true;
178 }
179
180 if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, NORTH, true) && var6 == 4)
181 {
182 var7 = true;
183 }
184
185 if (!this.canPlaceTorchOn(par1World, par2, par3 - 1, par4) && var6 == 5)
186 {
187 var7 = true;
188 }
189
190 if (var7)
191 {
192 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
193 par1World.setBlockWithNotify(par2, par3, par4, 0);
194 }
195 }
196 }
197
198 /**
199 * Tests if the block can remain at its current location and will drop as an item if it is unable to stay. Returns
200 * True if it can stay and False if it drops. Args: world, x, y, z
201 */
202 private boolean dropTorchIfCantStay(World par1World, int par2, int par3, int par4)
203 {
204 if (!this.canPlaceBlockAt(par1World, par2, par3, par4))
205 {
206 if (par1World.getBlockId(par2, par3, par4) == this.blockID)
207 {
208 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
209 par1World.setBlockWithNotify(par2, par3, par4, 0);
210 }
211
212 return false;
213 }
214 else
215 {
216 return true;
217 }
218 }
219
220 /**
221 * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world,
222 * x, y, z, startVec, endVec
223 */
224 public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3)
225 {
226 int var7 = par1World.getBlockMetadata(par2, par3, par4) & 7;
227 float var8 = 0.15F;
228
229 if (var7 == 1)
230 {
231 this.setBlockBounds(0.0F, 0.2F, 0.5F - var8, var8 * 2.0F, 0.8F, 0.5F + var8);
232 }
233 else if (var7 == 2)
234 {
235 this.setBlockBounds(1.0F - var8 * 2.0F, 0.2F, 0.5F - var8, 1.0F, 0.8F, 0.5F + var8);
236 }
237 else if (var7 == 3)
238 {
239 this.setBlockBounds(0.5F - var8, 0.2F, 0.0F, 0.5F + var8, 0.8F, var8 * 2.0F);
240 }
241 else if (var7 == 4)
242 {
243 this.setBlockBounds(0.5F - var8, 0.2F, 1.0F - var8 * 2.0F, 0.5F + var8, 0.8F, 1.0F);
244 }
245 else
246 {
247 var8 = 0.1F;
248 this.setBlockBounds(0.5F - var8, 0.0F, 0.5F - var8, 0.5F + var8, 0.6F, 0.5F + var8);
249 }
250
251 return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3);
252 }
253
254 @SideOnly(Side.CLIENT)
255
256 /**
257 * A randomly called display update to be able to add particles or other items for display
258 */
259 public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
260 {
261 int var6 = par1World.getBlockMetadata(par2, par3, par4);
262 double var7 = (double)((float)par2 + 0.5F);
263 double var9 = (double)((float)par3 + 0.7F);
264 double var11 = (double)((float)par4 + 0.5F);
265 double var13 = 0.2199999988079071D;
266 double var15 = 0.27000001072883606D;
267
268 if (var6 == 1)
269 {
270 par1World.spawnParticle("smoke", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
271 par1World.spawnParticle("flame", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
272 }
273 else if (var6 == 2)
274 {
275 par1World.spawnParticle("smoke", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
276 par1World.spawnParticle("flame", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
277 }
278 else if (var6 == 3)
279 {
280 par1World.spawnParticle("smoke", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D);
281 par1World.spawnParticle("flame", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D);
282 }
283 else if (var6 == 4)
284 {
285 par1World.spawnParticle("smoke", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D);
286 par1World.spawnParticle("flame", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D);
287 }
288 else
289 {
290 par1World.spawnParticle("smoke", var7, var9, var11, 0.0D, 0.0D, 0.0D);
291 par1World.spawnParticle("flame", var7, var9, var11, 0.0D, 0.0D, 0.0D);
292 }
293 }
294 }