001 package net.minecraft.client.renderer;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.nio.IntBuffer;
006 import java.util.ArrayList;
007 import java.util.Arrays;
008 import java.util.Collections;
009 import java.util.HashMap;
010 import java.util.Iterator;
011 import java.util.List;
012 import java.util.Map;
013 import java.util.Random;
014 import net.minecraft.block.Block;
015 import net.minecraft.block.material.Material;
016 import net.minecraft.client.Minecraft;
017 import net.minecraft.client.multiplayer.WorldClient;
018 import net.minecraft.client.particle.EntityAuraFX;
019 import net.minecraft.client.particle.EntityBreakingFX;
020 import net.minecraft.client.particle.EntityBubbleFX;
021 import net.minecraft.client.particle.EntityCloudFX;
022 import net.minecraft.client.particle.EntityCritFX;
023 import net.minecraft.client.particle.EntityDiggingFX;
024 import net.minecraft.client.particle.EntityDropParticleFX;
025 import net.minecraft.client.particle.EntityEnchantmentTableParticleFX;
026 import net.minecraft.client.particle.EntityExplodeFX;
027 import net.minecraft.client.particle.EntityFX;
028 import net.minecraft.client.particle.EntityFireworkSparkFX;
029 import net.minecraft.client.particle.EntityFlameFX;
030 import net.minecraft.client.particle.EntityFootStepFX;
031 import net.minecraft.client.particle.EntityHeartFX;
032 import net.minecraft.client.particle.EntityHugeExplodeFX;
033 import net.minecraft.client.particle.EntityLargeExplodeFX;
034 import net.minecraft.client.particle.EntityLavaFX;
035 import net.minecraft.client.particle.EntityNoteFX;
036 import net.minecraft.client.particle.EntityPortalFX;
037 import net.minecraft.client.particle.EntityReddustFX;
038 import net.minecraft.client.particle.EntitySmokeFX;
039 import net.minecraft.client.particle.EntitySnowShovelFX;
040 import net.minecraft.client.particle.EntitySpellParticleFX;
041 import net.minecraft.client.particle.EntitySplashFX;
042 import net.minecraft.client.particle.EntitySuspendFX;
043 import net.minecraft.client.renderer.culling.ICamera;
044 import net.minecraft.client.renderer.entity.RenderManager;
045 import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
046 import net.minecraft.crash.CrashReport;
047 import net.minecraft.crash.CrashReportCategory;
048 import net.minecraft.entity.Entity;
049 import net.minecraft.entity.EntityLiving;
050 import net.minecraft.entity.player.EntityPlayer;
051 import net.minecraft.item.Item;
052 import net.minecraft.item.ItemRecord;
053 import net.minecraft.item.ItemStack;
054 import net.minecraft.tileentity.TileEntity;
055 import net.minecraft.util.AxisAlignedBB;
056 import net.minecraft.util.EnumMovingObjectType;
057 import net.minecraft.util.MathHelper;
058 import net.minecraft.util.MovingObjectPosition;
059 import net.minecraft.util.ReportedException;
060 import net.minecraft.util.Vec3;
061 import net.minecraft.world.IWorldAccess;
062 import org.lwjgl.opengl.ARBOcclusionQuery;
063 import org.lwjgl.opengl.GL11;
064
065 import net.minecraftforge.client.IRenderHandler;
066
067 @SideOnly(Side.CLIENT)
068 public class RenderGlobal implements IWorldAccess
069 {
070 public List tileEntities = new ArrayList();
071 public WorldClient theWorld;
072
073 /** The RenderEngine instance used by RenderGlobal */
074 public final RenderEngine renderEngine;
075 private List worldRenderersToUpdate = new ArrayList();
076 private WorldRenderer[] sortedWorldRenderers;
077 private WorldRenderer[] worldRenderers;
078 private int renderChunksWide;
079 private int renderChunksTall;
080 private int renderChunksDeep;
081
082 /** OpenGL render lists base */
083 private int glRenderListBase;
084
085 /** A reference to the Minecraft object. */
086 public Minecraft mc;
087
088 /** Global render blocks */
089 public RenderBlocks globalRenderBlocks;
090
091 /** OpenGL occlusion query base */
092 private IntBuffer glOcclusionQueryBase;
093
094 /** Is occlusion testing enabled */
095 private boolean occlusionEnabled = false;
096
097 /**
098 * counts the cloud render updates. Used with mod to stagger some updates
099 */
100 private int cloudTickCounter = 0;
101
102 /** The star GL Call list */
103 private int starGLCallList;
104
105 /** OpenGL sky list */
106 private int glSkyList;
107
108 /** OpenGL sky list 2 */
109 private int glSkyList2;
110
111 /** Minimum block X */
112 private int minBlockX;
113
114 /** Minimum block Y */
115 private int minBlockY;
116
117 /** Minimum block Z */
118 private int minBlockZ;
119
120 /** Maximum block X */
121 private int maxBlockX;
122
123 /** Maximum block Y */
124 private int maxBlockY;
125
126 /** Maximum block Z */
127 private int maxBlockZ;
128
129 /**
130 * Stores blocks currently being broken. Key is entity ID of the thing doing the breaking. Value is a
131 * DestroyBlockProgress
132 */
133 public Map damagedBlocks = new HashMap();
134 private int renderDistance = -1;
135
136 /** Render entities startup counter (init value=2) */
137 private int renderEntitiesStartupCounter = 2;
138
139 /** Count entities total */
140 private int countEntitiesTotal;
141
142 /** Count entities rendered */
143 private int countEntitiesRendered;
144
145 /** Count entities hidden */
146 private int countEntitiesHidden;
147
148 /** Dummy buffer (50k) not used */
149 int[] dummyBuf50k = new int[50000];
150
151 /** Occlusion query result */
152 IntBuffer occlusionResult = GLAllocation.createDirectIntBuffer(64);
153
154 /** How many renderers are loaded this frame that try to be rendered */
155 private int renderersLoaded;
156
157 /** How many renderers are being clipped by the frustrum this frame */
158 private int renderersBeingClipped;
159
160 /** How many renderers are being occluded this frame */
161 private int renderersBeingOccluded;
162
163 /** How many renderers are actually being rendered this frame */
164 private int renderersBeingRendered;
165
166 /**
167 * How many renderers are skipping rendering due to not having a render pass this frame
168 */
169 private int renderersSkippingRenderPass;
170
171 /** Dummy render int */
172 private int dummyRenderInt;
173
174 /** World renderers check index */
175 private int worldRenderersCheckIndex;
176
177 /** List of OpenGL lists for the current render pass */
178 private List glRenderLists = new ArrayList();
179
180 /** All render lists (fixed length 4) */
181 private RenderList[] allRenderLists = new RenderList[] {new RenderList(), new RenderList(), new RenderList(), new RenderList()};
182
183 /**
184 * Previous x position when the renderers were sorted. (Once the distance moves more than 4 units they will be
185 * resorted)
186 */
187 double prevSortX = -9999.0D;
188
189 /**
190 * Previous y position when the renderers were sorted. (Once the distance moves more than 4 units they will be
191 * resorted)
192 */
193 double prevSortY = -9999.0D;
194
195 /**
196 * Previous Z position when the renderers were sorted. (Once the distance moves more than 4 units they will be
197 * resorted)
198 */
199 double prevSortZ = -9999.0D;
200
201 /**
202 * The offset used to determine if a renderer is one of the sixteenth that are being updated this frame
203 */
204 int frustumCheckOffset = 0;
205
206 public RenderGlobal(Minecraft par1Minecraft, RenderEngine par2RenderEngine)
207 {
208 this.mc = par1Minecraft;
209 this.renderEngine = par2RenderEngine;
210 byte var3 = 34;
211 byte var4 = 32;
212 this.glRenderListBase = GLAllocation.generateDisplayLists(var3 * var3 * var4 * 3);
213 this.occlusionEnabled = OpenGlCapsChecker.checkARBOcclusion();
214
215 if (this.occlusionEnabled)
216 {
217 this.occlusionResult.clear();
218 this.glOcclusionQueryBase = GLAllocation.createDirectIntBuffer(var3 * var3 * var4);
219 this.glOcclusionQueryBase.clear();
220 this.glOcclusionQueryBase.position(0);
221 this.glOcclusionQueryBase.limit(var3 * var3 * var4);
222 ARBOcclusionQuery.glGenQueriesARB(this.glOcclusionQueryBase);
223 }
224
225 this.starGLCallList = GLAllocation.generateDisplayLists(3);
226 GL11.glPushMatrix();
227 GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE);
228 this.renderStars();
229 GL11.glEndList();
230 GL11.glPopMatrix();
231 Tessellator var5 = Tessellator.instance;
232 this.glSkyList = this.starGLCallList + 1;
233 GL11.glNewList(this.glSkyList, GL11.GL_COMPILE);
234 byte var7 = 64;
235 int var8 = 256 / var7 + 2;
236 float var6 = 16.0F;
237 int var9;
238 int var10;
239
240 for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7)
241 {
242 for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7)
243 {
244 var5.startDrawingQuads();
245 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0));
246 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0));
247 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7));
248 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7));
249 var5.draw();
250 }
251 }
252
253 GL11.glEndList();
254 this.glSkyList2 = this.starGLCallList + 2;
255 GL11.glNewList(this.glSkyList2, GL11.GL_COMPILE);
256 var6 = -16.0F;
257 var5.startDrawingQuads();
258
259 for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7)
260 {
261 for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7)
262 {
263 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0));
264 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0));
265 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7));
266 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7));
267 }
268 }
269
270 var5.draw();
271 GL11.glEndList();
272 }
273
274 private void renderStars()
275 {
276 Random var1 = new Random(10842L);
277 Tessellator var2 = Tessellator.instance;
278 var2.startDrawingQuads();
279
280 for (int var3 = 0; var3 < 1500; ++var3)
281 {
282 double var4 = (double)(var1.nextFloat() * 2.0F - 1.0F);
283 double var6 = (double)(var1.nextFloat() * 2.0F - 1.0F);
284 double var8 = (double)(var1.nextFloat() * 2.0F - 1.0F);
285 double var10 = (double)(0.15F + var1.nextFloat() * 0.1F);
286 double var12 = var4 * var4 + var6 * var6 + var8 * var8;
287
288 if (var12 < 1.0D && var12 > 0.01D)
289 {
290 var12 = 1.0D / Math.sqrt(var12);
291 var4 *= var12;
292 var6 *= var12;
293 var8 *= var12;
294 double var14 = var4 * 100.0D;
295 double var16 = var6 * 100.0D;
296 double var18 = var8 * 100.0D;
297 double var20 = Math.atan2(var4, var8);
298 double var22 = Math.sin(var20);
299 double var24 = Math.cos(var20);
300 double var26 = Math.atan2(Math.sqrt(var4 * var4 + var8 * var8), var6);
301 double var28 = Math.sin(var26);
302 double var30 = Math.cos(var26);
303 double var32 = var1.nextDouble() * Math.PI * 2.0D;
304 double var34 = Math.sin(var32);
305 double var36 = Math.cos(var32);
306
307 for (int var38 = 0; var38 < 4; ++var38)
308 {
309 double var39 = 0.0D;
310 double var41 = (double)((var38 & 2) - 1) * var10;
311 double var43 = (double)((var38 + 1 & 2) - 1) * var10;
312 double var47 = var41 * var36 - var43 * var34;
313 double var49 = var43 * var36 + var41 * var34;
314 double var53 = var47 * var28 + var39 * var30;
315 double var55 = var39 * var28 - var47 * var30;
316 double var57 = var55 * var22 - var49 * var24;
317 double var61 = var49 * var22 + var55 * var24;
318 var2.addVertex(var14 + var57, var16 + var53, var18 + var61);
319 }
320 }
321 }
322
323 var2.draw();
324 }
325
326 /**
327 * set null to clear
328 */
329 public void setWorldAndLoadRenderers(WorldClient par1WorldClient)
330 {
331 if (this.theWorld != null)
332 {
333 this.theWorld.removeWorldAccess(this);
334 }
335
336 this.prevSortX = -9999.0D;
337 this.prevSortY = -9999.0D;
338 this.prevSortZ = -9999.0D;
339 RenderManager.instance.set(par1WorldClient);
340 this.theWorld = par1WorldClient;
341 this.globalRenderBlocks = new RenderBlocks(par1WorldClient);
342
343 if (par1WorldClient != null)
344 {
345 par1WorldClient.addWorldAccess(this);
346 this.loadRenderers();
347 }
348 }
349
350 /**
351 * Loads all the renderers and sets up the basic settings usage
352 */
353 public void loadRenderers()
354 {
355 if (this.theWorld != null)
356 {
357 Block.leaves.setGraphicsLevel(this.mc.gameSettings.fancyGraphics);
358 this.renderDistance = this.mc.gameSettings.renderDistance;
359 int var1;
360
361 if (this.worldRenderers != null)
362 {
363 for (var1 = 0; var1 < this.worldRenderers.length; ++var1)
364 {
365 this.worldRenderers[var1].stopRendering();
366 }
367 }
368
369 var1 = 64 << 3 - this.renderDistance;
370
371 if (var1 > 400)
372 {
373 var1 = 400;
374 }
375
376 this.renderChunksWide = var1 / 16 + 1;
377 this.renderChunksTall = 16;
378 this.renderChunksDeep = var1 / 16 + 1;
379 this.worldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep];
380 this.sortedWorldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep];
381 int var2 = 0;
382 int var3 = 0;
383 this.minBlockX = 0;
384 this.minBlockY = 0;
385 this.minBlockZ = 0;
386 this.maxBlockX = this.renderChunksWide;
387 this.maxBlockY = this.renderChunksTall;
388 this.maxBlockZ = this.renderChunksDeep;
389 int var4;
390
391 for (var4 = 0; var4 < this.worldRenderersToUpdate.size(); ++var4)
392 {
393 ((WorldRenderer)this.worldRenderersToUpdate.get(var4)).needsUpdate = false;
394 }
395
396 this.worldRenderersToUpdate.clear();
397 this.tileEntities.clear();
398
399 for (var4 = 0; var4 < this.renderChunksWide; ++var4)
400 {
401 for (int var5 = 0; var5 < this.renderChunksTall; ++var5)
402 {
403 for (int var6 = 0; var6 < this.renderChunksDeep; ++var6)
404 {
405 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4] = new WorldRenderer(this.theWorld, this.tileEntities, var4 * 16, var5 * 16, var6 * 16, this.glRenderListBase + var2);
406
407 if (this.occlusionEnabled)
408 {
409 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].glOcclusionQuery = this.glOcclusionQueryBase.get(var3);
410 }
411
412 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].isWaitingOnOcclusionQuery = false;
413 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].isVisible = true;
414 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].isInFrustum = true;
415 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].chunkIndex = var3++;
416 this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4].markDirty();
417 this.sortedWorldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4] = this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4];
418 this.worldRenderersToUpdate.add(this.worldRenderers[(var6 * this.renderChunksTall + var5) * this.renderChunksWide + var4]);
419 var2 += 3;
420 }
421 }
422 }
423
424 if (this.theWorld != null)
425 {
426 EntityLiving var7 = this.mc.renderViewEntity;
427
428 if (var7 != null)
429 {
430 this.markRenderersForNewPosition(MathHelper.floor_double(var7.posX), MathHelper.floor_double(var7.posY), MathHelper.floor_double(var7.posZ));
431 Arrays.sort(this.sortedWorldRenderers, new EntitySorter(var7));
432 }
433 }
434
435 this.renderEntitiesStartupCounter = 2;
436 }
437 }
438
439 /**
440 * Renders all entities within range and within the frustrum. Args: pos, frustrum, partialTickTime
441 */
442 public void renderEntities(Vec3 par1Vec3, ICamera par2ICamera, float par3)
443 {
444 if (this.renderEntitiesStartupCounter > 0)
445 {
446 --this.renderEntitiesStartupCounter;
447 }
448 else
449 {
450 this.theWorld.theProfiler.startSection("prepare");
451 TileEntityRenderer.instance.cacheActiveRenderInfo(this.theWorld, this.renderEngine, this.mc.fontRenderer, this.mc.renderViewEntity, par3);
452 RenderManager.instance.cacheActiveRenderInfo(this.theWorld, this.renderEngine, this.mc.fontRenderer, this.mc.renderViewEntity, this.mc.gameSettings, par3);
453 this.countEntitiesTotal = 0;
454 this.countEntitiesRendered = 0;
455 this.countEntitiesHidden = 0;
456 EntityLiving var4 = this.mc.renderViewEntity;
457 RenderManager.renderPosX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)par3;
458 RenderManager.renderPosY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)par3;
459 RenderManager.renderPosZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)par3;
460 TileEntityRenderer.staticPlayerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)par3;
461 TileEntityRenderer.staticPlayerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)par3;
462 TileEntityRenderer.staticPlayerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)par3;
463 this.mc.entityRenderer.enableLightmap((double)par3);
464 this.theWorld.theProfiler.endStartSection("global");
465 List var5 = this.theWorld.getLoadedEntityList();
466 this.countEntitiesTotal = var5.size();
467 int var6;
468 Entity var7;
469
470 for (var6 = 0; var6 < this.theWorld.weatherEffects.size(); ++var6)
471 {
472 var7 = (Entity)this.theWorld.weatherEffects.get(var6);
473 ++this.countEntitiesRendered;
474
475 if (var7.isInRangeToRenderVec3D(par1Vec3))
476 {
477 RenderManager.instance.renderEntity(var7, par3);
478 }
479 }
480
481 this.theWorld.theProfiler.endStartSection("entities");
482
483 for (var6 = 0; var6 < var5.size(); ++var6)
484 {
485 var7 = (Entity)var5.get(var6);
486
487 if (var7.isInRangeToRenderVec3D(par1Vec3) && (var7.ignoreFrustumCheck || par2ICamera.isBoundingBoxInFrustum(var7.boundingBox) || var7.riddenByEntity == this.mc.thePlayer) && (var7 != this.mc.renderViewEntity || this.mc.gameSettings.thirdPersonView != 0 || this.mc.renderViewEntity.isPlayerSleeping()) && this.theWorld.blockExists(MathHelper.floor_double(var7.posX), 0, MathHelper.floor_double(var7.posZ)))
488 {
489 ++this.countEntitiesRendered;
490 RenderManager.instance.renderEntity(var7, par3);
491 }
492 }
493
494 this.theWorld.theProfiler.endStartSection("tileentities");
495 RenderHelper.enableStandardItemLighting();
496
497 for (var6 = 0; var6 < this.tileEntities.size(); ++var6)
498 {
499 TileEntityRenderer.instance.renderTileEntity((TileEntity)this.tileEntities.get(var6), par3);
500 }
501
502 this.mc.entityRenderer.disableLightmap((double)par3);
503 this.theWorld.theProfiler.endSection();
504 }
505 }
506
507 /**
508 * Gets the render info for use on the Debug screen
509 */
510 public String getDebugInfoRenders()
511 {
512 return "C: " + this.renderersBeingRendered + "/" + this.renderersLoaded + ". F: " + this.renderersBeingClipped + ", O: " + this.renderersBeingOccluded + ", E: " + this.renderersSkippingRenderPass;
513 }
514
515 /**
516 * Gets the entities info for use on the Debug screen
517 */
518 public String getDebugInfoEntities()
519 {
520 return "E: " + this.countEntitiesRendered + "/" + this.countEntitiesTotal + ". B: " + this.countEntitiesHidden + ", I: " + (this.countEntitiesTotal - this.countEntitiesHidden - this.countEntitiesRendered);
521 }
522
523 /**
524 * Goes through all the renderers setting new positions on them and those that have their position changed are
525 * adding to be updated
526 */
527 private void markRenderersForNewPosition(int par1, int par2, int par3)
528 {
529 par1 -= 8;
530 par2 -= 8;
531 par3 -= 8;
532 this.minBlockX = Integer.MAX_VALUE;
533 this.minBlockY = Integer.MAX_VALUE;
534 this.minBlockZ = Integer.MAX_VALUE;
535 this.maxBlockX = Integer.MIN_VALUE;
536 this.maxBlockY = Integer.MIN_VALUE;
537 this.maxBlockZ = Integer.MIN_VALUE;
538 int var4 = this.renderChunksWide * 16;
539 int var5 = var4 / 2;
540
541 for (int var6 = 0; var6 < this.renderChunksWide; ++var6)
542 {
543 int var7 = var6 * 16;
544 int var8 = var7 + var5 - par1;
545
546 if (var8 < 0)
547 {
548 var8 -= var4 - 1;
549 }
550
551 var8 /= var4;
552 var7 -= var8 * var4;
553
554 if (var7 < this.minBlockX)
555 {
556 this.minBlockX = var7;
557 }
558
559 if (var7 > this.maxBlockX)
560 {
561 this.maxBlockX = var7;
562 }
563
564 for (int var9 = 0; var9 < this.renderChunksDeep; ++var9)
565 {
566 int var10 = var9 * 16;
567 int var11 = var10 + var5 - par3;
568
569 if (var11 < 0)
570 {
571 var11 -= var4 - 1;
572 }
573
574 var11 /= var4;
575 var10 -= var11 * var4;
576
577 if (var10 < this.minBlockZ)
578 {
579 this.minBlockZ = var10;
580 }
581
582 if (var10 > this.maxBlockZ)
583 {
584 this.maxBlockZ = var10;
585 }
586
587 for (int var12 = 0; var12 < this.renderChunksTall; ++var12)
588 {
589 int var13 = var12 * 16;
590
591 if (var13 < this.minBlockY)
592 {
593 this.minBlockY = var13;
594 }
595
596 if (var13 > this.maxBlockY)
597 {
598 this.maxBlockY = var13;
599 }
600
601 WorldRenderer var14 = this.worldRenderers[(var9 * this.renderChunksTall + var12) * this.renderChunksWide + var6];
602 boolean var15 = var14.needsUpdate;
603 var14.setPosition(var7, var13, var10);
604
605 if (!var15 && var14.needsUpdate)
606 {
607 this.worldRenderersToUpdate.add(var14);
608 }
609 }
610 }
611 }
612 }
613
614 /**
615 * Sorts all renderers based on the passed in entity. Args: entityLiving, renderPass, partialTickTime
616 */
617 public int sortAndRender(EntityLiving par1EntityLiving, int par2, double par3)
618 {
619 this.theWorld.theProfiler.startSection("sortchunks");
620
621 for (int var5 = 0; var5 < 10; ++var5)
622 {
623 this.worldRenderersCheckIndex = (this.worldRenderersCheckIndex + 1) % this.worldRenderers.length;
624 WorldRenderer var6 = this.worldRenderers[this.worldRenderersCheckIndex];
625
626 if (var6.needsUpdate && !this.worldRenderersToUpdate.contains(var6))
627 {
628 this.worldRenderersToUpdate.add(var6);
629 }
630 }
631
632 if (this.mc.gameSettings.renderDistance != this.renderDistance)
633 {
634 this.loadRenderers();
635 }
636
637 if (par2 == 0)
638 {
639 this.renderersLoaded = 0;
640 this.dummyRenderInt = 0;
641 this.renderersBeingClipped = 0;
642 this.renderersBeingOccluded = 0;
643 this.renderersBeingRendered = 0;
644 this.renderersSkippingRenderPass = 0;
645 }
646
647 double var33 = par1EntityLiving.lastTickPosX + (par1EntityLiving.posX - par1EntityLiving.lastTickPosX) * par3;
648 double var7 = par1EntityLiving.lastTickPosY + (par1EntityLiving.posY - par1EntityLiving.lastTickPosY) * par3;
649 double var9 = par1EntityLiving.lastTickPosZ + (par1EntityLiving.posZ - par1EntityLiving.lastTickPosZ) * par3;
650 double var11 = par1EntityLiving.posX - this.prevSortX;
651 double var13 = par1EntityLiving.posY - this.prevSortY;
652 double var15 = par1EntityLiving.posZ - this.prevSortZ;
653
654 if (var11 * var11 + var13 * var13 + var15 * var15 > 16.0D)
655 {
656 this.prevSortX = par1EntityLiving.posX;
657 this.prevSortY = par1EntityLiving.posY;
658 this.prevSortZ = par1EntityLiving.posZ;
659 this.markRenderersForNewPosition(MathHelper.floor_double(par1EntityLiving.posX), MathHelper.floor_double(par1EntityLiving.posY), MathHelper.floor_double(par1EntityLiving.posZ));
660 Arrays.sort(this.sortedWorldRenderers, new EntitySorter(par1EntityLiving));
661 }
662
663 RenderHelper.disableStandardItemLighting();
664 byte var17 = 0;
665 int var34;
666
667 if (this.occlusionEnabled && this.mc.gameSettings.advancedOpengl && !this.mc.gameSettings.anaglyph && par2 == 0)
668 {
669 byte var18 = 0;
670 int var19 = 16;
671 this.checkOcclusionQueryResult(var18, var19);
672
673 for (int var20 = var18; var20 < var19; ++var20)
674 {
675 this.sortedWorldRenderers[var20].isVisible = true;
676 }
677
678 this.theWorld.theProfiler.endStartSection("render");
679 var34 = var17 + this.renderSortedRenderers(var18, var19, par2, par3);
680
681 do
682 {
683 this.theWorld.theProfiler.endStartSection("occ");
684 int var35 = var19;
685 var19 *= 2;
686
687 if (var19 > this.sortedWorldRenderers.length)
688 {
689 var19 = this.sortedWorldRenderers.length;
690 }
691
692 GL11.glDisable(GL11.GL_TEXTURE_2D);
693 GL11.glDisable(GL11.GL_LIGHTING);
694 GL11.glDisable(GL11.GL_ALPHA_TEST);
695 GL11.glDisable(GL11.GL_FOG);
696 GL11.glColorMask(false, false, false, false);
697 GL11.glDepthMask(false);
698 this.theWorld.theProfiler.startSection("check");
699 this.checkOcclusionQueryResult(var35, var19);
700 this.theWorld.theProfiler.endSection();
701 GL11.glPushMatrix();
702 float var36 = 0.0F;
703 float var21 = 0.0F;
704 float var22 = 0.0F;
705
706 for (int var23 = var35; var23 < var19; ++var23)
707 {
708 if (this.sortedWorldRenderers[var23].skipAllRenderPasses())
709 {
710 this.sortedWorldRenderers[var23].isInFrustum = false;
711 }
712 else
713 {
714 if (!this.sortedWorldRenderers[var23].isInFrustum)
715 {
716 this.sortedWorldRenderers[var23].isVisible = true;
717 }
718
719 if (this.sortedWorldRenderers[var23].isInFrustum && !this.sortedWorldRenderers[var23].isWaitingOnOcclusionQuery)
720 {
721 float var24 = MathHelper.sqrt_float(this.sortedWorldRenderers[var23].distanceToEntitySquared(par1EntityLiving));
722 int var25 = (int)(1.0F + var24 / 128.0F);
723
724 if (this.cloudTickCounter % var25 == var23 % var25)
725 {
726 WorldRenderer var26 = this.sortedWorldRenderers[var23];
727 float var27 = (float)((double)var26.posXMinus - var33);
728 float var28 = (float)((double)var26.posYMinus - var7);
729 float var29 = (float)((double)var26.posZMinus - var9);
730 float var30 = var27 - var36;
731 float var31 = var28 - var21;
732 float var32 = var29 - var22;
733
734 if (var30 != 0.0F || var31 != 0.0F || var32 != 0.0F)
735 {
736 GL11.glTranslatef(var30, var31, var32);
737 var36 += var30;
738 var21 += var31;
739 var22 += var32;
740 }
741
742 this.theWorld.theProfiler.startSection("bb");
743 ARBOcclusionQuery.glBeginQueryARB(ARBOcclusionQuery.GL_SAMPLES_PASSED_ARB, this.sortedWorldRenderers[var23].glOcclusionQuery);
744 this.sortedWorldRenderers[var23].callOcclusionQueryList();
745 ARBOcclusionQuery.glEndQueryARB(ARBOcclusionQuery.GL_SAMPLES_PASSED_ARB);
746 this.theWorld.theProfiler.endSection();
747 this.sortedWorldRenderers[var23].isWaitingOnOcclusionQuery = true;
748 }
749 }
750 }
751 }
752
753 GL11.glPopMatrix();
754
755 if (this.mc.gameSettings.anaglyph)
756 {
757 if (EntityRenderer.anaglyphField == 0)
758 {
759 GL11.glColorMask(false, true, true, true);
760 }
761 else
762 {
763 GL11.glColorMask(true, false, false, true);
764 }
765 }
766 else
767 {
768 GL11.glColorMask(true, true, true, true);
769 }
770
771 GL11.glDepthMask(true);
772 GL11.glEnable(GL11.GL_TEXTURE_2D);
773 GL11.glEnable(GL11.GL_ALPHA_TEST);
774 GL11.glEnable(GL11.GL_FOG);
775 this.theWorld.theProfiler.endStartSection("render");
776 var34 += this.renderSortedRenderers(var35, var19, par2, par3);
777 }
778 while (var19 < this.sortedWorldRenderers.length);
779 }
780 else
781 {
782 this.theWorld.theProfiler.endStartSection("render");
783 var34 = var17 + this.renderSortedRenderers(0, this.sortedWorldRenderers.length, par2, par3);
784 }
785
786 this.theWorld.theProfiler.endSection();
787 return var34;
788 }
789
790 private void checkOcclusionQueryResult(int par1, int par2)
791 {
792 for (int var3 = par1; var3 < par2; ++var3)
793 {
794 if (this.sortedWorldRenderers[var3].isWaitingOnOcclusionQuery)
795 {
796 this.occlusionResult.clear();
797 ARBOcclusionQuery.glGetQueryObjectuARB(this.sortedWorldRenderers[var3].glOcclusionQuery, ARBOcclusionQuery.GL_QUERY_RESULT_AVAILABLE_ARB, this.occlusionResult);
798
799 if (this.occlusionResult.get(0) != 0)
800 {
801 this.sortedWorldRenderers[var3].isWaitingOnOcclusionQuery = false;
802 this.occlusionResult.clear();
803 ARBOcclusionQuery.glGetQueryObjectuARB(this.sortedWorldRenderers[var3].glOcclusionQuery, ARBOcclusionQuery.GL_QUERY_RESULT_ARB, this.occlusionResult);
804 this.sortedWorldRenderers[var3].isVisible = this.occlusionResult.get(0) != 0;
805 }
806 }
807 }
808 }
809
810 /**
811 * Renders the sorted renders for the specified render pass. Args: startRenderer, numRenderers, renderPass,
812 * partialTickTime
813 */
814 private int renderSortedRenderers(int par1, int par2, int par3, double par4)
815 {
816 this.glRenderLists.clear();
817 int var6 = 0;
818
819 for (int var7 = par1; var7 < par2; ++var7)
820 {
821 if (par3 == 0)
822 {
823 ++this.renderersLoaded;
824
825 if (this.sortedWorldRenderers[var7].skipRenderPass[par3])
826 {
827 ++this.renderersSkippingRenderPass;
828 }
829 else if (!this.sortedWorldRenderers[var7].isInFrustum)
830 {
831 ++this.renderersBeingClipped;
832 }
833 else if (this.occlusionEnabled && !this.sortedWorldRenderers[var7].isVisible)
834 {
835 ++this.renderersBeingOccluded;
836 }
837 else
838 {
839 ++this.renderersBeingRendered;
840 }
841 }
842
843 if (!this.sortedWorldRenderers[var7].skipRenderPass[par3] && this.sortedWorldRenderers[var7].isInFrustum && (!this.occlusionEnabled || this.sortedWorldRenderers[var7].isVisible))
844 {
845 int var8 = this.sortedWorldRenderers[var7].getGLCallListForPass(par3);
846
847 if (var8 >= 0)
848 {
849 this.glRenderLists.add(this.sortedWorldRenderers[var7]);
850 ++var6;
851 }
852 }
853 }
854
855 EntityLiving var19 = this.mc.renderViewEntity;
856 double var20 = var19.lastTickPosX + (var19.posX - var19.lastTickPosX) * par4;
857 double var10 = var19.lastTickPosY + (var19.posY - var19.lastTickPosY) * par4;
858 double var12 = var19.lastTickPosZ + (var19.posZ - var19.lastTickPosZ) * par4;
859 int var14 = 0;
860 int var15;
861
862 for (var15 = 0; var15 < this.allRenderLists.length; ++var15)
863 {
864 this.allRenderLists[var15].func_78421_b();
865 }
866
867 for (var15 = 0; var15 < this.glRenderLists.size(); ++var15)
868 {
869 WorldRenderer var16 = (WorldRenderer)this.glRenderLists.get(var15);
870 int var17 = -1;
871
872 for (int var18 = 0; var18 < var14; ++var18)
873 {
874 if (this.allRenderLists[var18].func_78418_a(var16.posXMinus, var16.posYMinus, var16.posZMinus))
875 {
876 var17 = var18;
877 }
878 }
879
880 if (var17 < 0)
881 {
882 var17 = var14++;
883 this.allRenderLists[var17].func_78422_a(var16.posXMinus, var16.posYMinus, var16.posZMinus, var20, var10, var12);
884 }
885
886 this.allRenderLists[var17].func_78420_a(var16.getGLCallListForPass(par3));
887 }
888
889 this.renderAllRenderLists(par3, par4);
890 return var6;
891 }
892
893 /**
894 * Render all render lists
895 */
896 public void renderAllRenderLists(int par1, double par2)
897 {
898 this.mc.entityRenderer.enableLightmap(par2);
899
900 for (int var4 = 0; var4 < this.allRenderLists.length; ++var4)
901 {
902 this.allRenderLists[var4].func_78419_a();
903 }
904
905 this.mc.entityRenderer.disableLightmap(par2);
906 }
907
908 public void updateClouds()
909 {
910 ++this.cloudTickCounter;
911
912 if (this.cloudTickCounter % 20 == 0)
913 {
914 Iterator var1 = this.damagedBlocks.values().iterator();
915
916 while (var1.hasNext())
917 {
918 DestroyBlockProgress var2 = (DestroyBlockProgress)var1.next();
919 int var3 = var2.getCreationCloudUpdateTick();
920
921 if (this.cloudTickCounter - var3 > 400)
922 {
923 var1.remove();
924 }
925 }
926 }
927 }
928
929 /**
930 * Renders the sky with the partial tick time. Args: partialTickTime
931 */
932 public void renderSky(float par1)
933 {
934 IRenderHandler skyProvider = null;
935 if ((skyProvider = this.mc.theWorld.provider.getSkyRenderer()) != null)
936 {
937 skyProvider.render(par1, this.theWorld, mc);
938 return;
939 }
940 if (this.mc.theWorld.provider.dimensionId == 1)
941 {
942 GL11.glDisable(GL11.GL_FOG);
943 GL11.glDisable(GL11.GL_ALPHA_TEST);
944 GL11.glEnable(GL11.GL_BLEND);
945 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
946 RenderHelper.disableStandardItemLighting();
947 GL11.glDepthMask(false);
948 this.renderEngine.bindTexture(this.renderEngine.getTexture("/misc/tunnel.png"));
949 Tessellator var21 = Tessellator.instance;
950
951 for (int var22 = 0; var22 < 6; ++var22)
952 {
953 GL11.glPushMatrix();
954
955 if (var22 == 1)
956 {
957 GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
958 }
959
960 if (var22 == 2)
961 {
962 GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
963 }
964
965 if (var22 == 3)
966 {
967 GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F);
968 }
969
970 if (var22 == 4)
971 {
972 GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F);
973 }
974
975 if (var22 == 5)
976 {
977 GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F);
978 }
979
980 var21.startDrawingQuads();
981 var21.setColorOpaque_I(2631720);
982 var21.addVertexWithUV(-100.0D, -100.0D, -100.0D, 0.0D, 0.0D);
983 var21.addVertexWithUV(-100.0D, -100.0D, 100.0D, 0.0D, 16.0D);
984 var21.addVertexWithUV(100.0D, -100.0D, 100.0D, 16.0D, 16.0D);
985 var21.addVertexWithUV(100.0D, -100.0D, -100.0D, 16.0D, 0.0D);
986 var21.draw();
987 GL11.glPopMatrix();
988 }
989
990 GL11.glDepthMask(true);
991 GL11.glEnable(GL11.GL_TEXTURE_2D);
992 GL11.glEnable(GL11.GL_ALPHA_TEST);
993 }
994 else if (this.mc.theWorld.provider.isSurfaceWorld())
995 {
996 GL11.glDisable(GL11.GL_TEXTURE_2D);
997 Vec3 var2 = this.theWorld.getSkyColor(this.mc.renderViewEntity, par1);
998 float var3 = (float)var2.xCoord;
999 float var4 = (float)var2.yCoord;
1000 float var5 = (float)var2.zCoord;
1001 float var8;
1002
1003 if (this.mc.gameSettings.anaglyph)
1004 {
1005 float var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F;
1006 float var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F;
1007 var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F;
1008 var3 = var6;
1009 var4 = var7;
1010 var5 = var8;
1011 }
1012
1013 GL11.glColor3f(var3, var4, var5);
1014 Tessellator var23 = Tessellator.instance;
1015 GL11.glDepthMask(false);
1016 GL11.glEnable(GL11.GL_FOG);
1017 GL11.glColor3f(var3, var4, var5);
1018 GL11.glCallList(this.glSkyList);
1019 GL11.glDisable(GL11.GL_FOG);
1020 GL11.glDisable(GL11.GL_ALPHA_TEST);
1021 GL11.glEnable(GL11.GL_BLEND);
1022 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1023 RenderHelper.disableStandardItemLighting();
1024 float[] var24 = this.theWorld.provider.calcSunriseSunsetColors(this.theWorld.getCelestialAngle(par1), par1);
1025 float var9;
1026 float var10;
1027 float var11;
1028 float var12;
1029
1030 if (var24 != null)
1031 {
1032 GL11.glDisable(GL11.GL_TEXTURE_2D);
1033 GL11.glShadeModel(GL11.GL_SMOOTH);
1034 GL11.glPushMatrix();
1035 GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
1036 GL11.glRotatef(MathHelper.sin(this.theWorld.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F);
1037 GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F);
1038 var8 = var24[0];
1039 var9 = var24[1];
1040 var10 = var24[2];
1041 float var13;
1042
1043 if (this.mc.gameSettings.anaglyph)
1044 {
1045 var11 = (var8 * 30.0F + var9 * 59.0F + var10 * 11.0F) / 100.0F;
1046 var12 = (var8 * 30.0F + var9 * 70.0F) / 100.0F;
1047 var13 = (var8 * 30.0F + var10 * 70.0F) / 100.0F;
1048 var8 = var11;
1049 var9 = var12;
1050 var10 = var13;
1051 }
1052
1053 var23.startDrawing(6);
1054 var23.setColorRGBA_F(var8, var9, var10, var24[3]);
1055 var23.addVertex(0.0D, 100.0D, 0.0D);
1056 byte var26 = 16;
1057 var23.setColorRGBA_F(var24[0], var24[1], var24[2], 0.0F);
1058
1059 for (int var27 = 0; var27 <= var26; ++var27)
1060 {
1061 var13 = (float)var27 * (float)Math.PI * 2.0F / (float)var26;
1062 float var14 = MathHelper.sin(var13);
1063 float var15 = MathHelper.cos(var13);
1064 var23.addVertex((double)(var14 * 120.0F), (double)(var15 * 120.0F), (double)(-var15 * 40.0F * var24[3]));
1065 }
1066
1067 var23.draw();
1068 GL11.glPopMatrix();
1069 GL11.glShadeModel(GL11.GL_FLAT);
1070 }
1071
1072 GL11.glEnable(GL11.GL_TEXTURE_2D);
1073 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
1074 GL11.glPushMatrix();
1075 var8 = 1.0F - this.theWorld.getRainStrength(par1);
1076 var9 = 0.0F;
1077 var10 = 0.0F;
1078 var11 = 0.0F;
1079 GL11.glColor4f(1.0F, 1.0F, 1.0F, var8);
1080 GL11.glTranslatef(var9, var10, var11);
1081 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
1082 GL11.glRotatef(this.theWorld.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F);
1083 var12 = 30.0F;
1084 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png"));
1085 var23.startDrawingQuads();
1086 var23.addVertexWithUV((double)(-var12), 100.0D, (double)(-var12), 0.0D, 0.0D);
1087 var23.addVertexWithUV((double)var12, 100.0D, (double)(-var12), 1.0D, 0.0D);
1088 var23.addVertexWithUV((double)var12, 100.0D, (double)var12, 1.0D, 1.0D);
1089 var23.addVertexWithUV((double)(-var12), 100.0D, (double)var12, 0.0D, 1.0D);
1090 var23.draw();
1091 var12 = 20.0F;
1092 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon_phases.png"));
1093 int var28 = this.theWorld.getMoonPhase(par1);
1094 int var30 = var28 % 4;
1095 int var29 = var28 / 4 % 2;
1096 float var16 = (float)(var30 + 0) / 4.0F;
1097 float var17 = (float)(var29 + 0) / 2.0F;
1098 float var18 = (float)(var30 + 1) / 4.0F;
1099 float var19 = (float)(var29 + 1) / 2.0F;
1100 var23.startDrawingQuads();
1101 var23.addVertexWithUV((double)(-var12), -100.0D, (double)var12, (double)var18, (double)var19);
1102 var23.addVertexWithUV((double)var12, -100.0D, (double)var12, (double)var16, (double)var19);
1103 var23.addVertexWithUV((double)var12, -100.0D, (double)(-var12), (double)var16, (double)var17);
1104 var23.addVertexWithUV((double)(-var12), -100.0D, (double)(-var12), (double)var18, (double)var17);
1105 var23.draw();
1106 GL11.glDisable(GL11.GL_TEXTURE_2D);
1107 float var20 = this.theWorld.getStarBrightness(par1) * var8;
1108
1109 if (var20 > 0.0F)
1110 {
1111 GL11.glColor4f(var20, var20, var20, var20);
1112 GL11.glCallList(this.starGLCallList);
1113 }
1114
1115 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
1116 GL11.glDisable(GL11.GL_BLEND);
1117 GL11.glEnable(GL11.GL_ALPHA_TEST);
1118 GL11.glEnable(GL11.GL_FOG);
1119 GL11.glPopMatrix();
1120 GL11.glDisable(GL11.GL_TEXTURE_2D);
1121 GL11.glColor3f(0.0F, 0.0F, 0.0F);
1122 double var25 = this.mc.thePlayer.getPosition(par1).yCoord - this.theWorld.getHorizon();
1123
1124 if (var25 < 0.0D)
1125 {
1126 GL11.glPushMatrix();
1127 GL11.glTranslatef(0.0F, 12.0F, 0.0F);
1128 GL11.glCallList(this.glSkyList2);
1129 GL11.glPopMatrix();
1130 var10 = 1.0F;
1131 var11 = -((float)(var25 + 65.0D));
1132 var12 = -var10;
1133 var23.startDrawingQuads();
1134 var23.setColorRGBA_I(0, 255);
1135 var23.addVertex((double)(-var10), (double)var11, (double)var10);
1136 var23.addVertex((double)var10, (double)var11, (double)var10);
1137 var23.addVertex((double)var10, (double)var12, (double)var10);
1138 var23.addVertex((double)(-var10), (double)var12, (double)var10);
1139 var23.addVertex((double)(-var10), (double)var12, (double)(-var10));
1140 var23.addVertex((double)var10, (double)var12, (double)(-var10));
1141 var23.addVertex((double)var10, (double)var11, (double)(-var10));
1142 var23.addVertex((double)(-var10), (double)var11, (double)(-var10));
1143 var23.addVertex((double)var10, (double)var12, (double)(-var10));
1144 var23.addVertex((double)var10, (double)var12, (double)var10);
1145 var23.addVertex((double)var10, (double)var11, (double)var10);
1146 var23.addVertex((double)var10, (double)var11, (double)(-var10));
1147 var23.addVertex((double)(-var10), (double)var11, (double)(-var10));
1148 var23.addVertex((double)(-var10), (double)var11, (double)var10);
1149 var23.addVertex((double)(-var10), (double)var12, (double)var10);
1150 var23.addVertex((double)(-var10), (double)var12, (double)(-var10));
1151 var23.addVertex((double)(-var10), (double)var12, (double)(-var10));
1152 var23.addVertex((double)(-var10), (double)var12, (double)var10);
1153 var23.addVertex((double)var10, (double)var12, (double)var10);
1154 var23.addVertex((double)var10, (double)var12, (double)(-var10));
1155 var23.draw();
1156 }
1157
1158 if (this.theWorld.provider.isSkyColored())
1159 {
1160 GL11.glColor3f(var3 * 0.2F + 0.04F, var4 * 0.2F + 0.04F, var5 * 0.6F + 0.1F);
1161 }
1162 else
1163 {
1164 GL11.glColor3f(var3, var4, var5);
1165 }
1166
1167 GL11.glPushMatrix();
1168 GL11.glTranslatef(0.0F, -((float)(var25 - 16.0D)), 0.0F);
1169 GL11.glCallList(this.glSkyList2);
1170 GL11.glPopMatrix();
1171 GL11.glEnable(GL11.GL_TEXTURE_2D);
1172 GL11.glDepthMask(true);
1173 }
1174 }
1175
1176 public void renderClouds(float par1)
1177 {
1178 IRenderHandler renderer = null;
1179 if ((renderer = theWorld.provider.getCloudRenderer()) != null)
1180 {
1181 renderer.render(par1, theWorld, mc);
1182 return;
1183 }
1184
1185 if (this.mc.theWorld.provider.isSurfaceWorld())
1186 {
1187 if (this.mc.gameSettings.fancyGraphics)
1188 {
1189 this.renderCloudsFancy(par1);
1190 }
1191 else
1192 {
1193 GL11.glDisable(GL11.GL_CULL_FACE);
1194 float var2 = (float)(this.mc.renderViewEntity.lastTickPosY + (this.mc.renderViewEntity.posY - this.mc.renderViewEntity.lastTickPosY) * (double)par1);
1195 byte var3 = 32;
1196 int var4 = 256 / var3;
1197 Tessellator var5 = Tessellator.instance;
1198 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png"));
1199 GL11.glEnable(GL11.GL_BLEND);
1200 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1201 Vec3 var6 = this.theWorld.drawClouds(par1);
1202 float var7 = (float)var6.xCoord;
1203 float var8 = (float)var6.yCoord;
1204 float var9 = (float)var6.zCoord;
1205 float var10;
1206
1207 if (this.mc.gameSettings.anaglyph)
1208 {
1209 var10 = (var7 * 30.0F + var8 * 59.0F + var9 * 11.0F) / 100.0F;
1210 float var11 = (var7 * 30.0F + var8 * 70.0F) / 100.0F;
1211 float var12 = (var7 * 30.0F + var9 * 70.0F) / 100.0F;
1212 var7 = var10;
1213 var8 = var11;
1214 var9 = var12;
1215 }
1216
1217 var10 = 4.8828125E-4F;
1218 double var24 = (double)((float)this.cloudTickCounter + par1);
1219 double var13 = this.mc.renderViewEntity.prevPosX + (this.mc.renderViewEntity.posX - this.mc.renderViewEntity.prevPosX) * (double)par1 + var24 * 0.029999999329447746D;
1220 double var15 = this.mc.renderViewEntity.prevPosZ + (this.mc.renderViewEntity.posZ - this.mc.renderViewEntity.prevPosZ) * (double)par1;
1221 int var17 = MathHelper.floor_double(var13 / 2048.0D);
1222 int var18 = MathHelper.floor_double(var15 / 2048.0D);
1223 var13 -= (double)(var17 * 2048);
1224 var15 -= (double)(var18 * 2048);
1225 float var19 = this.theWorld.provider.getCloudHeight() - var2 + 0.33F;
1226 float var20 = (float)(var13 * (double)var10);
1227 float var21 = (float)(var15 * (double)var10);
1228 var5.startDrawingQuads();
1229 var5.setColorRGBA_F(var7, var8, var9, 0.8F);
1230
1231 for (int var22 = -var3 * var4; var22 < var3 * var4; var22 += var3)
1232 {
1233 for (int var23 = -var3 * var4; var23 < var3 * var4; var23 += var3)
1234 {
1235 var5.addVertexWithUV((double)(var22 + 0), (double)var19, (double)(var23 + var3), (double)((float)(var22 + 0) * var10 + var20), (double)((float)(var23 + var3) * var10 + var21));
1236 var5.addVertexWithUV((double)(var22 + var3), (double)var19, (double)(var23 + var3), (double)((float)(var22 + var3) * var10 + var20), (double)((float)(var23 + var3) * var10 + var21));
1237 var5.addVertexWithUV((double)(var22 + var3), (double)var19, (double)(var23 + 0), (double)((float)(var22 + var3) * var10 + var20), (double)((float)(var23 + 0) * var10 + var21));
1238 var5.addVertexWithUV((double)(var22 + 0), (double)var19, (double)(var23 + 0), (double)((float)(var22 + 0) * var10 + var20), (double)((float)(var23 + 0) * var10 + var21));
1239 }
1240 }
1241
1242 var5.draw();
1243 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
1244 GL11.glDisable(GL11.GL_BLEND);
1245 GL11.glEnable(GL11.GL_CULL_FACE);
1246 }
1247 }
1248 }
1249
1250 /**
1251 * Checks if the given position is to be rendered with cloud fog
1252 */
1253 public boolean hasCloudFog(double par1, double par3, double par5, float par7)
1254 {
1255 return false;
1256 }
1257
1258 /**
1259 * Renders the 3d fancy clouds
1260 */
1261 public void renderCloudsFancy(float par1)
1262 {
1263 GL11.glDisable(GL11.GL_CULL_FACE);
1264 float var2 = (float)(this.mc.renderViewEntity.lastTickPosY + (this.mc.renderViewEntity.posY - this.mc.renderViewEntity.lastTickPosY) * (double)par1);
1265 Tessellator var3 = Tessellator.instance;
1266 float var4 = 12.0F;
1267 float var5 = 4.0F;
1268 double var6 = (double)((float)this.cloudTickCounter + par1);
1269 double var8 = (this.mc.renderViewEntity.prevPosX + (this.mc.renderViewEntity.posX - this.mc.renderViewEntity.prevPosX) * (double)par1 + var6 * 0.029999999329447746D) / (double)var4;
1270 double var10 = (this.mc.renderViewEntity.prevPosZ + (this.mc.renderViewEntity.posZ - this.mc.renderViewEntity.prevPosZ) * (double)par1) / (double)var4 + 0.33000001311302185D;
1271 float var12 = this.theWorld.provider.getCloudHeight() - var2 + 0.33F;
1272 int var13 = MathHelper.floor_double(var8 / 2048.0D);
1273 int var14 = MathHelper.floor_double(var10 / 2048.0D);
1274 var8 -= (double)(var13 * 2048);
1275 var10 -= (double)(var14 * 2048);
1276 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png"));
1277 GL11.glEnable(GL11.GL_BLEND);
1278 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1279 Vec3 var15 = this.theWorld.drawClouds(par1);
1280 float var16 = (float)var15.xCoord;
1281 float var17 = (float)var15.yCoord;
1282 float var18 = (float)var15.zCoord;
1283 float var19;
1284 float var21;
1285 float var20;
1286
1287 if (this.mc.gameSettings.anaglyph)
1288 {
1289 var19 = (var16 * 30.0F + var17 * 59.0F + var18 * 11.0F) / 100.0F;
1290 var20 = (var16 * 30.0F + var17 * 70.0F) / 100.0F;
1291 var21 = (var16 * 30.0F + var18 * 70.0F) / 100.0F;
1292 var16 = var19;
1293 var17 = var20;
1294 var18 = var21;
1295 }
1296
1297 var19 = (float)(var8 * 0.0D);
1298 var20 = (float)(var10 * 0.0D);
1299 var21 = 0.00390625F;
1300 var19 = (float)MathHelper.floor_double(var8) * var21;
1301 var20 = (float)MathHelper.floor_double(var10) * var21;
1302 float var22 = (float)(var8 - (double)MathHelper.floor_double(var8));
1303 float var23 = (float)(var10 - (double)MathHelper.floor_double(var10));
1304 byte var24 = 8;
1305 byte var25 = 4;
1306 float var26 = 9.765625E-4F;
1307 GL11.glScalef(var4, 1.0F, var4);
1308
1309 for (int var27 = 0; var27 < 2; ++var27)
1310 {
1311 if (var27 == 0)
1312 {
1313 GL11.glColorMask(false, false, false, false);
1314 }
1315 else if (this.mc.gameSettings.anaglyph)
1316 {
1317 if (EntityRenderer.anaglyphField == 0)
1318 {
1319 GL11.glColorMask(false, true, true, true);
1320 }
1321 else
1322 {
1323 GL11.glColorMask(true, false, false, true);
1324 }
1325 }
1326 else
1327 {
1328 GL11.glColorMask(true, true, true, true);
1329 }
1330
1331 for (int var28 = -var25 + 1; var28 <= var25; ++var28)
1332 {
1333 for (int var29 = -var25 + 1; var29 <= var25; ++var29)
1334 {
1335 var3.startDrawingQuads();
1336 float var30 = (float)(var28 * var24);
1337 float var31 = (float)(var29 * var24);
1338 float var32 = var30 - var22;
1339 float var33 = var31 - var23;
1340
1341 if (var12 > -var5 - 1.0F)
1342 {
1343 var3.setColorRGBA_F(var16 * 0.7F, var17 * 0.7F, var18 * 0.7F, 0.8F);
1344 var3.setNormal(0.0F, -1.0F, 0.0F);
1345 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1346 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1347 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1348 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1349 }
1350
1351 if (var12 <= var5 + 1.0F)
1352 {
1353 var3.setColorRGBA_F(var16, var17, var18, 0.8F);
1354 var3.setNormal(0.0F, 1.0F, 0.0F);
1355 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5 - var26), (double)(var33 + (float)var24), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1356 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5 - var26), (double)(var33 + (float)var24), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1357 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5 - var26), (double)(var33 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1358 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5 - var26), (double)(var33 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1359 }
1360
1361 var3.setColorRGBA_F(var16 * 0.9F, var17 * 0.9F, var18 * 0.9F, 0.8F);
1362 int var34;
1363
1364 if (var28 > -1)
1365 {
1366 var3.setNormal(-1.0F, 0.0F, 0.0F);
1367
1368 for (var34 = 0; var34 < var24; ++var34)
1369 {
1370 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1371 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1372 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + var5), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1373 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1374 }
1375 }
1376
1377 if (var28 <= 1)
1378 {
1379 var3.setNormal(1.0F, 0.0F, 0.0F);
1380
1381 for (var34 = 0; var34 < var24; ++var34)
1382 {
1383 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1384 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + var5), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20));
1385 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + var5), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1386 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20));
1387 }
1388 }
1389
1390 var3.setColorRGBA_F(var16 * 0.8F, var17 * 0.8F, var18 * 0.8F, 0.8F);
1391
1392 if (var29 > -1)
1393 {
1394 var3.setNormal(0.0F, 0.0F, -1.0F);
1395
1396 for (var34 = 0; var34 < var24; ++var34)
1397 {
1398 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1399 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1400 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1401 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1402 }
1403 }
1404
1405 if (var29 <= 1)
1406 {
1407 var3.setNormal(0.0F, 0.0F, 1.0F);
1408
1409 for (var34 = 0; var34 < var24; ++var34)
1410 {
1411 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1412 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1413 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1414 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20));
1415 }
1416 }
1417
1418 var3.draw();
1419 }
1420 }
1421 }
1422
1423 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
1424 GL11.glDisable(GL11.GL_BLEND);
1425 GL11.glEnable(GL11.GL_CULL_FACE);
1426 }
1427
1428 /**
1429 * Updates some of the renderers sorted by distance from the player
1430 */
1431 public boolean updateRenderers(EntityLiving par1EntityLiving, boolean par2)
1432 {
1433 byte var3 = 2;
1434 RenderSorter var4 = new RenderSorter(par1EntityLiving);
1435 WorldRenderer[] var5 = new WorldRenderer[var3];
1436 ArrayList var6 = null;
1437 int var7 = this.worldRenderersToUpdate.size();
1438 int var8 = 0;
1439 this.theWorld.theProfiler.startSection("nearChunksSearch");
1440 int var9;
1441 WorldRenderer var10;
1442 int var11;
1443 int var12;
1444 label136:
1445
1446 for (var9 = 0; var9 < var7; ++var9)
1447 {
1448 var10 = (WorldRenderer)this.worldRenderersToUpdate.get(var9);
1449
1450 if (var10 != null)
1451 {
1452 if (!par2)
1453 {
1454 if (var10.distanceToEntitySquared(par1EntityLiving) > 256.0F)
1455 {
1456 for (var11 = 0; var11 < var3 && (var5[var11] == null || var4.doCompare(var5[var11], var10) <= 0); ++var11)
1457 {
1458 ;
1459 }
1460
1461 --var11;
1462
1463 if (var11 > 0)
1464 {
1465 var12 = var11;
1466
1467 while (true)
1468 {
1469 --var12;
1470
1471 if (var12 == 0)
1472 {
1473 var5[var11] = var10;
1474 continue label136;
1475 }
1476
1477 var5[var12 - 1] = var5[var12];
1478 }
1479 }
1480
1481 continue;
1482 }
1483 }
1484 else if (!var10.isInFrustum)
1485 {
1486 continue;
1487 }
1488
1489 if (var6 == null)
1490 {
1491 var6 = new ArrayList();
1492 }
1493
1494 ++var8;
1495 var6.add(var10);
1496 this.worldRenderersToUpdate.set(var9, (Object)null);
1497 }
1498 }
1499
1500 this.theWorld.theProfiler.endSection();
1501 this.theWorld.theProfiler.startSection("sort");
1502
1503 if (var6 != null)
1504 {
1505 if (var6.size() > 1)
1506 {
1507 Collections.sort(var6, var4);
1508 }
1509
1510 for (var9 = var6.size() - 1; var9 >= 0; --var9)
1511 {
1512 var10 = (WorldRenderer)var6.get(var9);
1513 var10.updateRenderer();
1514 var10.needsUpdate = false;
1515 }
1516 }
1517
1518 this.theWorld.theProfiler.endSection();
1519 var9 = 0;
1520 this.theWorld.theProfiler.startSection("rebuild");
1521 int var16;
1522
1523 for (var16 = var3 - 1; var16 >= 0; --var16)
1524 {
1525 WorldRenderer var17 = var5[var16];
1526
1527 if (var17 != null)
1528 {
1529 if (!var17.isInFrustum && var16 != var3 - 1)
1530 {
1531 var5[var16] = null;
1532 var5[0] = null;
1533 break;
1534 }
1535
1536 var5[var16].updateRenderer();
1537 var5[var16].needsUpdate = false;
1538 ++var9;
1539 }
1540 }
1541
1542 this.theWorld.theProfiler.endSection();
1543 this.theWorld.theProfiler.startSection("cleanup");
1544 var16 = 0;
1545 var11 = 0;
1546
1547 for (var12 = this.worldRenderersToUpdate.size(); var16 != var12; ++var16)
1548 {
1549 WorldRenderer var13 = (WorldRenderer)this.worldRenderersToUpdate.get(var16);
1550
1551 if (var13 != null)
1552 {
1553 boolean var14 = false;
1554
1555 for (int var15 = 0; var15 < var3 && !var14; ++var15)
1556 {
1557 if (var13 == var5[var15])
1558 {
1559 var14 = true;
1560 }
1561 }
1562
1563 if (!var14)
1564 {
1565 if (var11 != var16)
1566 {
1567 this.worldRenderersToUpdate.set(var11, var13);
1568 }
1569
1570 ++var11;
1571 }
1572 }
1573 }
1574
1575 this.theWorld.theProfiler.endSection();
1576 this.theWorld.theProfiler.startSection("trim");
1577
1578 while (true)
1579 {
1580 --var16;
1581
1582 if (var16 < var11)
1583 {
1584 this.theWorld.theProfiler.endSection();
1585 return var7 == var8 + var9;
1586 }
1587
1588 this.worldRenderersToUpdate.remove(var16);
1589 }
1590 }
1591
1592 public void drawBlockBreaking(EntityPlayer par1EntityPlayer, MovingObjectPosition par2MovingObjectPosition, int par3, ItemStack par4ItemStack, float par5)
1593 {
1594 Tessellator var6 = Tessellator.instance;
1595 GL11.glEnable(GL11.GL_BLEND);
1596 GL11.glEnable(GL11.GL_ALPHA_TEST);
1597 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
1598 GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)Minecraft.getSystemTime() / 100.0F) * 0.2F + 0.4F) * 0.5F);
1599
1600 if (par3 != 0 && par4ItemStack != null)
1601 {
1602 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1603 float var7 = MathHelper.sin((float)Minecraft.getSystemTime() / 100.0F) * 0.2F + 0.8F;
1604 GL11.glColor4f(var7, var7, var7, MathHelper.sin((float)Minecraft.getSystemTime() / 200.0F) * 0.2F + 0.5F);
1605 int var8 = this.renderEngine.getTexture("/terrain.png");
1606 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8);
1607 }
1608
1609 GL11.glDisable(GL11.GL_BLEND);
1610 GL11.glDisable(GL11.GL_ALPHA_TEST);
1611 }
1612
1613 public void drawBlockDamageTexture(Tessellator par1Tessellator, EntityPlayer par2EntityPlayer, float par3)
1614 {
1615 drawBlockDamageTexture(par1Tessellator, (EntityLiving)par2EntityPlayer, par3);
1616 }
1617
1618 public void drawBlockDamageTexture(Tessellator par1Tessellator, EntityLiving par2EntityPlayer, float par3)
1619 {
1620 double var4 = par2EntityPlayer.lastTickPosX + (par2EntityPlayer.posX - par2EntityPlayer.lastTickPosX) * (double)par3;
1621 double var6 = par2EntityPlayer.lastTickPosY + (par2EntityPlayer.posY - par2EntityPlayer.lastTickPosY) * (double)par3;
1622 double var8 = par2EntityPlayer.lastTickPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.lastTickPosZ) * (double)par3;
1623
1624 if (!this.damagedBlocks.isEmpty())
1625 {
1626 GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR);
1627 int var10 = this.renderEngine.getTexture("/terrain.png");
1628 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var10);
1629 GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F);
1630 GL11.glPushMatrix();
1631 GL11.glDisable(GL11.GL_ALPHA_TEST);
1632 GL11.glPolygonOffset(-3.0F, -3.0F);
1633 GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
1634 GL11.glEnable(GL11.GL_ALPHA_TEST);
1635 par1Tessellator.startDrawingQuads();
1636 par1Tessellator.setTranslation(-var4, -var6, -var8);
1637 par1Tessellator.disableColor();
1638 Iterator var11 = this.damagedBlocks.values().iterator();
1639
1640 while (var11.hasNext())
1641 {
1642 DestroyBlockProgress var12 = (DestroyBlockProgress)var11.next();
1643 double var13 = (double)var12.getPartialBlockX() - var4;
1644 double var15 = (double)var12.getPartialBlockY() - var6;
1645 double var17 = (double)var12.getPartialBlockZ() - var8;
1646
1647 if (var13 * var13 + var15 * var15 + var17 * var17 > 1024.0D)
1648 {
1649 var11.remove();
1650 }
1651 else
1652 {
1653 int var19 = this.theWorld.getBlockId(var12.getPartialBlockX(), var12.getPartialBlockY(), var12.getPartialBlockZ());
1654 Block var20 = var19 > 0 ? Block.blocksList[var19] : null;
1655
1656 if (var20 == null)
1657 {
1658 var20 = Block.stone;
1659 }
1660
1661 this.globalRenderBlocks.renderBlockUsingTexture(var20, var12.getPartialBlockX(), var12.getPartialBlockY(), var12.getPartialBlockZ(), 240 + var12.getPartialBlockDamage());
1662 }
1663 }
1664
1665 par1Tessellator.draw();
1666 par1Tessellator.setTranslation(0.0D, 0.0D, 0.0D);
1667 GL11.glDisable(GL11.GL_ALPHA_TEST);
1668 GL11.glPolygonOffset(0.0F, 0.0F);
1669 GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
1670 GL11.glEnable(GL11.GL_ALPHA_TEST);
1671 GL11.glDepthMask(true);
1672 GL11.glPopMatrix();
1673 }
1674 }
1675
1676 /**
1677 * Draws the selection box for the player. Args: entityPlayer, rayTraceHit, i, itemStack, partialTickTime
1678 */
1679 public void drawSelectionBox(EntityPlayer par1EntityPlayer, MovingObjectPosition par2MovingObjectPosition, int par3, ItemStack par4ItemStack, float par5)
1680 {
1681 if (par3 == 0 && par2MovingObjectPosition.typeOfHit == EnumMovingObjectType.TILE)
1682 {
1683 GL11.glEnable(GL11.GL_BLEND);
1684 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
1685 GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F);
1686 GL11.glLineWidth(2.0F);
1687 GL11.glDisable(GL11.GL_TEXTURE_2D);
1688 GL11.glDepthMask(false);
1689 float var6 = 0.002F;
1690 int var7 = this.theWorld.getBlockId(par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ);
1691
1692 if (var7 > 0)
1693 {
1694 Block.blocksList[var7].setBlockBoundsBasedOnState(this.theWorld, par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ);
1695 double var8 = par1EntityPlayer.lastTickPosX + (par1EntityPlayer.posX - par1EntityPlayer.lastTickPosX) * (double)par5;
1696 double var10 = par1EntityPlayer.lastTickPosY + (par1EntityPlayer.posY - par1EntityPlayer.lastTickPosY) * (double)par5;
1697 double var12 = par1EntityPlayer.lastTickPosZ + (par1EntityPlayer.posZ - par1EntityPlayer.lastTickPosZ) * (double)par5;
1698 this.drawOutlinedBoundingBox(Block.blocksList[var7].getSelectedBoundingBoxFromPool(this.theWorld, par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ).expand((double)var6, (double)var6, (double)var6).getOffsetBoundingBox(-var8, -var10, -var12));
1699 }
1700
1701 GL11.glDepthMask(true);
1702 GL11.glEnable(GL11.GL_TEXTURE_2D);
1703 GL11.glDisable(GL11.GL_BLEND);
1704 }
1705 }
1706
1707 /**
1708 * Draws lines for the edges of the bounding box.
1709 */
1710 private void drawOutlinedBoundingBox(AxisAlignedBB par1AxisAlignedBB)
1711 {
1712 Tessellator var2 = Tessellator.instance;
1713 var2.startDrawing(3);
1714 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ);
1715 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ);
1716 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ);
1717 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ);
1718 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ);
1719 var2.draw();
1720 var2.startDrawing(3);
1721 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ);
1722 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ);
1723 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ);
1724 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ);
1725 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ);
1726 var2.draw();
1727 var2.startDrawing(1);
1728 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ);
1729 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ);
1730 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ);
1731 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ);
1732 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ);
1733 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ);
1734 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ);
1735 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ);
1736 var2.draw();
1737 }
1738
1739 /**
1740 * Marks the blocks in the given range for update
1741 */
1742 public void markBlocksForUpdate(int par1, int par2, int par3, int par4, int par5, int par6)
1743 {
1744 int var7 = MathHelper.bucketInt(par1, 16);
1745 int var8 = MathHelper.bucketInt(par2, 16);
1746 int var9 = MathHelper.bucketInt(par3, 16);
1747 int var10 = MathHelper.bucketInt(par4, 16);
1748 int var11 = MathHelper.bucketInt(par5, 16);
1749 int var12 = MathHelper.bucketInt(par6, 16);
1750
1751 for (int var13 = var7; var13 <= var10; ++var13)
1752 {
1753 int var14 = var13 % this.renderChunksWide;
1754
1755 if (var14 < 0)
1756 {
1757 var14 += this.renderChunksWide;
1758 }
1759
1760 for (int var15 = var8; var15 <= var11; ++var15)
1761 {
1762 int var16 = var15 % this.renderChunksTall;
1763
1764 if (var16 < 0)
1765 {
1766 var16 += this.renderChunksTall;
1767 }
1768
1769 for (int var17 = var9; var17 <= var12; ++var17)
1770 {
1771 int var18 = var17 % this.renderChunksDeep;
1772
1773 if (var18 < 0)
1774 {
1775 var18 += this.renderChunksDeep;
1776 }
1777
1778 int var19 = (var18 * this.renderChunksTall + var16) * this.renderChunksWide + var14;
1779 WorldRenderer var20 = this.worldRenderers[var19];
1780
1781 if (var20 != null && !var20.needsUpdate)
1782 {
1783 this.worldRenderersToUpdate.add(var20);
1784 var20.markDirty();
1785 }
1786 }
1787 }
1788 }
1789 }
1790
1791 /**
1792 * On the client, re-renders the block. On the server, sends the block to the client (which will re-render it),
1793 * including the tile entity description packet if applicable. Args: x, y, z
1794 */
1795 public void markBlockForUpdate(int par1, int par2, int par3)
1796 {
1797 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par1 + 1, par2 + 1, par3 + 1);
1798 }
1799
1800 /**
1801 * On the client, re-renders this block. On the server, does nothing. Used for lighting updates.
1802 */
1803 public void markBlockForRenderUpdate(int par1, int par2, int par3)
1804 {
1805 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par1 + 1, par2 + 1, par3 + 1);
1806 }
1807
1808 /**
1809 * On the client, re-renders all blocks in this range, inclusive. On the server, does nothing. Args: min x, min y,
1810 * min z, max x, max y, max z
1811 */
1812 public void markBlockRangeForRenderUpdate(int par1, int par2, int par3, int par4, int par5, int par6)
1813 {
1814 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par4 + 1, par5 + 1, par6 + 1);
1815 }
1816
1817 /**
1818 * Checks all renderers that previously weren't in the frustum and 1/16th of those that previously were in the
1819 * frustum for frustum clipping Args: frustum, partialTickTime
1820 */
1821 public void clipRenderersByFrustum(ICamera par1ICamera, float par2)
1822 {
1823 for (int var3 = 0; var3 < this.worldRenderers.length; ++var3)
1824 {
1825 if (!this.worldRenderers[var3].skipAllRenderPasses() && (!this.worldRenderers[var3].isInFrustum || (var3 + this.frustumCheckOffset & 15) == 0))
1826 {
1827 this.worldRenderers[var3].updateInFrustum(par1ICamera);
1828 }
1829 }
1830
1831 ++this.frustumCheckOffset;
1832 }
1833
1834 /**
1835 * Plays the specified record. Arg: recordName, x, y, z
1836 */
1837 public void playRecord(String par1Str, int par2, int par3, int par4)
1838 {
1839 ItemRecord var5 = ItemRecord.getRecord(par1Str);
1840
1841 if (par1Str != null && var5 != null)
1842 {
1843 this.mc.ingameGUI.setRecordPlayingMessage(var5.getRecordTitle());
1844 }
1845
1846 this.mc.sndManager.playStreaming(par1Str, (float)par2, (float)par3, (float)par4);
1847 }
1848
1849 /**
1850 * Plays the specified sound. Arg: soundName, x, y, z, volume, pitch
1851 */
1852 public void playSound(String par1Str, double par2, double par4, double par6, float par8, float par9) {}
1853
1854 /**
1855 * Plays sound to all near players except the player reference given
1856 */
1857 public void playSoundToNearExcept(EntityPlayer par1EntityPlayer, String par2Str, double par3, double par5, double par7, float par9, float par10) {}
1858
1859 /**
1860 * Spawns a particle. Arg: particleType, x, y, z, velX, velY, velZ
1861 */
1862 public void spawnParticle(String par1Str, double par2, double par4, double par6, double par8, double par10, double par12)
1863 {
1864 try
1865 {
1866 this.doSpawnParticle(par1Str, par2, par4, par6, par8, par10, par12);
1867 }
1868 catch (Throwable var17)
1869 {
1870 CrashReport var15 = CrashReport.makeCrashReport(var17, "Exception while adding particle");
1871 CrashReportCategory var16 = var15.makeCategory("Particle being added");
1872 var16.addCrashSection("Name", par1Str);
1873 var16.addCrashSectionCallable("Position", new CallableParticlePositionInfo(this, par2, par4, par6));
1874 throw new ReportedException(var15);
1875 }
1876 }
1877
1878 /**
1879 * Spawns a particle. Arg: particleType, x, y, z, velX, velY, velZ
1880 */
1881 public EntityFX doSpawnParticle(String par1Str, double par2, double par4, double par6, double par8, double par10, double par12)
1882 {
1883 if (this.mc != null && this.mc.renderViewEntity != null && this.mc.effectRenderer != null)
1884 {
1885 int var14 = this.mc.gameSettings.particleSetting;
1886
1887 if (var14 == 1 && this.theWorld.rand.nextInt(3) == 0)
1888 {
1889 var14 = 2;
1890 }
1891
1892 double var15 = this.mc.renderViewEntity.posX - par2;
1893 double var17 = this.mc.renderViewEntity.posY - par4;
1894 double var19 = this.mc.renderViewEntity.posZ - par6;
1895 EntityFX var21 = null;
1896 Object effectObject = null;
1897
1898 if (par1Str.equals("hugeexplosion"))
1899 {
1900 this.mc.effectRenderer.addEffect(var21 = new EntityHugeExplodeFX(this.theWorld, par2, par4, par6, par8, par10, par12));
1901 }
1902 else if (par1Str.equals("largeexplode"))
1903 {
1904 this.mc.effectRenderer.addEffect(var21 = new EntityLargeExplodeFX(this.renderEngine, this.theWorld, par2, par4, par6, par8, par10, par12));
1905 }
1906 else if (par1Str.equals("fireworksSpark"))
1907 {
1908 this.mc.effectRenderer.addEffect(var21 = new EntityFireworkSparkFX(this.theWorld, par2, par4, par6, par8, par10, par12, this.mc.effectRenderer));
1909 }
1910
1911 if (var21 != null)
1912 {
1913 return (EntityFX)var21;
1914 }
1915 else
1916 {
1917 double var22 = 16.0D;
1918
1919 if (var15 * var15 + var17 * var17 + var19 * var19 > var22 * var22)
1920 {
1921 return null;
1922 }
1923 else if (var14 > 1)
1924 {
1925 return null;
1926 }
1927 else
1928 {
1929 if (par1Str.equals("bubble"))
1930 {
1931 var21 = new EntityBubbleFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1932 }
1933 else if (par1Str.equals("suspended"))
1934 {
1935 var21 = new EntitySuspendFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1936 }
1937 else if (par1Str.equals("depthsuspend"))
1938 {
1939 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1940 }
1941 else if (par1Str.equals("townaura"))
1942 {
1943 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1944 }
1945 else if (par1Str.equals("crit"))
1946 {
1947 var21 = new EntityCritFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1948 }
1949 else if (par1Str.equals("magicCrit"))
1950 {
1951 var21 = new EntityCritFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1952 ((EntityFX)var21).setRBGColorF(((EntityFX)var21).getRedColorF() * 0.3F, ((EntityFX)var21).getGreenColorF() * 0.8F, ((EntityFX)var21).getBlueColorF());
1953 ((EntityFX)var21).setParticleTextureIndex(((EntityFX)var21).getParticleTextureIndex() + 1);
1954 }
1955 else if (par1Str.equals("smoke"))
1956 {
1957 var21 = new EntitySmokeFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1958 }
1959 else if (par1Str.equals("mobSpell"))
1960 {
1961 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, 0.0D, 0.0D, 0.0D);
1962 ((EntityFX)var21).setRBGColorF((float)par8, (float)par10, (float)par12);
1963 }
1964 else if (par1Str.equals("mobSpellAmbient"))
1965 {
1966 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, 0.0D, 0.0D, 0.0D);
1967 ((EntityFX)var21).setAlphaF(0.15F);
1968 ((EntityFX)var21).setRBGColorF((float)par8, (float)par10, (float)par12);
1969 }
1970 else if (par1Str.equals("spell"))
1971 {
1972 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1973 }
1974 else if (par1Str.equals("instantSpell"))
1975 {
1976 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1977 ((EntitySpellParticleFX)var21).setBaseSpellTextureIndex(144);
1978 }
1979 else if (par1Str.equals("witchMagic"))
1980 {
1981 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1982 ((EntitySpellParticleFX)var21).setBaseSpellTextureIndex(144);
1983 float var24 = this.theWorld.rand.nextFloat() * 0.5F + 0.35F;
1984 ((EntityFX)var21).setRBGColorF(1.0F * var24, 0.0F * var24, 1.0F * var24);
1985 }
1986 else if (par1Str.equals("note"))
1987 {
1988 var21 = new EntityNoteFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1989 }
1990 else if (par1Str.equals("portal"))
1991 {
1992 var21 = new EntityPortalFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1993 }
1994 else if (par1Str.equals("enchantmenttable"))
1995 {
1996 var21 = new EntityEnchantmentTableParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12);
1997 }
1998 else if (par1Str.equals("explode"))
1999 {
2000 var21 = new EntityExplodeFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2001 }
2002 else if (par1Str.equals("flame"))
2003 {
2004 var21 = new EntityFlameFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2005 }
2006 else if (par1Str.equals("lava"))
2007 {
2008 var21 = new EntityLavaFX(this.theWorld, par2, par4, par6);
2009 }
2010 else if (par1Str.equals("footstep"))
2011 {
2012 var21 = new EntityFootStepFX(this.renderEngine, this.theWorld, par2, par4, par6);
2013 }
2014 else if (par1Str.equals("splash"))
2015 {
2016 var21 = new EntitySplashFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2017 }
2018 else if (par1Str.equals("largesmoke"))
2019 {
2020 var21 = new EntitySmokeFX(this.theWorld, par2, par4, par6, par8, par10, par12, 2.5F);
2021 }
2022 else if (par1Str.equals("cloud"))
2023 {
2024 var21 = new EntityCloudFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2025 }
2026 else if (par1Str.equals("reddust"))
2027 {
2028 var21 = new EntityReddustFX(this.theWorld, par2, par4, par6, (float)par8, (float)par10, (float)par12);
2029 }
2030 else if (par1Str.equals("snowballpoof"))
2031 {
2032 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.snowball);
2033 effectObject = Item.snowball;
2034 }
2035 else if (par1Str.equals("dripWater"))
2036 {
2037 var21 = new EntityDropParticleFX(this.theWorld, par2, par4, par6, Material.water);
2038 }
2039 else if (par1Str.equals("dripLava"))
2040 {
2041 var21 = new EntityDropParticleFX(this.theWorld, par2, par4, par6, Material.lava);
2042 }
2043 else if (par1Str.equals("snowshovel"))
2044 {
2045 var21 = new EntitySnowShovelFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2046 }
2047 else if (par1Str.equals("slime"))
2048 {
2049 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.slimeBall);
2050 effectObject = Item.slimeBall;
2051 }
2052 else if (par1Str.equals("heart"))
2053 {
2054 var21 = new EntityHeartFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2055 }
2056 else if (par1Str.equals("angryVillager"))
2057 {
2058 var21 = new EntityHeartFX(this.theWorld, par2, par4 + 0.5D, par6, par8, par10, par12);
2059 ((EntityFX)var21).setParticleTextureIndex(81);
2060 ((EntityFX)var21).setRBGColorF(1.0F, 1.0F, 1.0F);
2061 }
2062 else if (par1Str.equals("happyVillager"))
2063 {
2064 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12);
2065 ((EntityFX)var21).setParticleTextureIndex(82);
2066 ((EntityFX)var21).setRBGColorF(1.0F, 1.0F, 1.0F);
2067 }
2068 else if (par1Str.startsWith("iconcrack_"))
2069 {
2070 int var27 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1));
2071 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Item.itemsList[var27]);
2072 effectObject = Item.itemsList[var27];
2073 }
2074 else if (par1Str.startsWith("tilecrack_"))
2075 {
2076 String[] var28 = par1Str.split("_", 3);
2077 int var25 = Integer.parseInt(var28[1]);
2078 int var26 = Integer.parseInt(var28[2]);
2079 var21 = (new EntityDiggingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Block.blocksList[var25], 0, var26)).applyRenderColor(var26);
2080 effectObject = Block.blocksList[var25];
2081 }
2082
2083 if (var21 != null)
2084 {
2085 this.mc.effectRenderer.addEffect((EntityFX)var21, effectObject);
2086 }
2087
2088 return (EntityFX)var21;
2089 }
2090 }
2091 }
2092 else
2093 {
2094 return null;
2095 }
2096 }
2097
2098 /**
2099 * Start the skin for this entity downloading, if necessary, and increment its reference counter
2100 */
2101 public void obtainEntitySkin(Entity par1Entity)
2102 {
2103 par1Entity.updateCloak();
2104
2105 if (par1Entity.skinUrl != null)
2106 {
2107 this.renderEngine.obtainImageData(par1Entity.skinUrl, new ImageBufferDownload());
2108 }
2109
2110 if (par1Entity.cloakUrl != null)
2111 {
2112 this.renderEngine.obtainImageData(par1Entity.cloakUrl, new ImageBufferDownload());
2113 }
2114 }
2115
2116 /**
2117 * Decrement the reference counter for this entity's skin image data
2118 */
2119 public void releaseEntitySkin(Entity par1Entity)
2120 {
2121 if (par1Entity.skinUrl != null)
2122 {
2123 this.renderEngine.releaseImageData(par1Entity.skinUrl);
2124 }
2125
2126 if (par1Entity.cloakUrl != null)
2127 {
2128 this.renderEngine.releaseImageData(par1Entity.cloakUrl);
2129 }
2130 }
2131
2132 /**
2133 * Deletes all display lists
2134 */
2135 public void deleteAllDisplayLists()
2136 {
2137 GLAllocation.deleteDisplayLists(this.glRenderListBase);
2138 }
2139
2140 public void broadcastSound(int par1, int par2, int par3, int par4, int par5)
2141 {
2142 Random var6 = this.theWorld.rand;
2143
2144 switch (par1)
2145 {
2146 case 1013:
2147 case 1018:
2148 if (this.mc.renderViewEntity != null)
2149 {
2150 double var7 = (double)par2 - this.mc.renderViewEntity.posX;
2151 double var9 = (double)par3 - this.mc.renderViewEntity.posY;
2152 double var11 = (double)par4 - this.mc.renderViewEntity.posZ;
2153 double var13 = Math.sqrt(var7 * var7 + var9 * var9 + var11 * var11);
2154 double var15 = this.mc.renderViewEntity.posX;
2155 double var17 = this.mc.renderViewEntity.posY;
2156 double var19 = this.mc.renderViewEntity.posZ;
2157
2158 if (var13 > 0.0D)
2159 {
2160 var15 += var7 / var13 * 2.0D;
2161 var17 += var9 / var13 * 2.0D;
2162 var19 += var11 / var13 * 2.0D;
2163 }
2164
2165 if (par1 == 1013)
2166 {
2167 this.theWorld.playSound(var15, var17, var19, "mob.wither.spawn", 1.0F, 1.0F, false);
2168 }
2169 else if (par1 == 1018)
2170 {
2171 this.theWorld.playSound(var15, var17, var19, "mob.enderdragon.end", 5.0F, 1.0F, false);
2172 }
2173 }
2174 default:
2175 }
2176 }
2177
2178 /**
2179 * Plays a pre-canned sound effect along with potentially auxiliary data-driven one-shot behaviour (particles, etc).
2180 */
2181 public void playAuxSFX(EntityPlayer par1EntityPlayer, int par2, int par3, int par4, int par5, int par6)
2182 {
2183 Random var7 = this.theWorld.rand;
2184 double var8;
2185 double var10;
2186 double var12;
2187 String var14;
2188 int var15;
2189 int var20;
2190 double var23;
2191 double var25;
2192 double var27;
2193 double var29;
2194 double var39;
2195
2196 switch (par2)
2197 {
2198 case 1000:
2199 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.click", 1.0F, 1.0F, false);
2200 break;
2201 case 1001:
2202 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.click", 1.0F, 1.2F, false);
2203 break;
2204 case 1002:
2205 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.bow", 1.0F, 1.2F, false);
2206 break;
2207 case 1003:
2208 if (Math.random() < 0.5D)
2209 {
2210 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.door_open", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2211 }
2212 else
2213 {
2214 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.door_close", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2215 }
2216
2217 break;
2218 case 1004:
2219 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.fizz", 0.5F, 2.6F + (var7.nextFloat() - var7.nextFloat()) * 0.8F, false);
2220 break;
2221 case 1005:
2222 if (Item.itemsList[par6] instanceof ItemRecord)
2223 {
2224 this.theWorld.playRecord(((ItemRecord)Item.itemsList[par6]).recordName, par3, par4, par5);
2225 }
2226 else
2227 {
2228 this.theWorld.playRecord((String)null, par3, par4, par5);
2229 }
2230
2231 break;
2232 case 1007:
2233 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.charge", 10.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2234 break;
2235 case 1008:
2236 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.fireball", 10.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2237 break;
2238 case 1009:
2239 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.fireball", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2240 break;
2241 case 1010:
2242 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.wood", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2243 break;
2244 case 1011:
2245 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.metal", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2246 break;
2247 case 1012:
2248 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.woodbreak", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2249 break;
2250 case 1014:
2251 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.wither.shoot", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2252 break;
2253 case 1015:
2254 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.bat.takeoff", 0.05F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2255 break;
2256 case 1016:
2257 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.infect", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2258 break;
2259 case 1017:
2260 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.unfect", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F, false);
2261 break;
2262 case 1020:
2263 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_break", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2264 break;
2265 case 1021:
2266 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_use", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2267 break;
2268 case 1022:
2269 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_land", 0.3F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2270 break;
2271 case 2000:
2272 int var33 = par6 % 3 - 1;
2273 int var9 = par6 / 3 % 3 - 1;
2274 var10 = (double)par3 + (double)var33 * 0.6D + 0.5D;
2275 var12 = (double)par4 + 0.5D;
2276 double var34 = (double)par5 + (double)var9 * 0.6D + 0.5D;
2277
2278 for (int var35 = 0; var35 < 10; ++var35)
2279 {
2280 double var37 = var7.nextDouble() * 0.2D + 0.01D;
2281 double var38 = var10 + (double)var33 * 0.01D + (var7.nextDouble() - 0.5D) * (double)var9 * 0.5D;
2282 var39 = var12 + (var7.nextDouble() - 0.5D) * 0.5D;
2283 var23 = var34 + (double)var9 * 0.01D + (var7.nextDouble() - 0.5D) * (double)var33 * 0.5D;
2284 var25 = (double)var33 * var37 + var7.nextGaussian() * 0.01D;
2285 var27 = -0.03D + var7.nextGaussian() * 0.01D;
2286 var29 = (double)var9 * var37 + var7.nextGaussian() * 0.01D;
2287 this.spawnParticle("smoke", var38, var39, var23, var25, var27, var29);
2288 }
2289
2290 return;
2291 case 2001:
2292 var20 = par6 & 4095;
2293
2294 if (var20 > 0)
2295 {
2296 Block var40 = Block.blocksList[var20];
2297 this.mc.sndManager.playSound(var40.stepSound.getBreakSound(), (float)par3 + 0.5F, (float)par4 + 0.5F, (float)par5 + 0.5F, (var40.stepSound.getVolume() + 1.0F) / 2.0F, var40.stepSound.getPitch() * 0.8F);
2298 }
2299
2300 this.mc.effectRenderer.addBlockDestroyEffects(par3, par4, par5, par6 & 4095, par6 >> 12 & 255);
2301 break;
2302 case 2002:
2303 var8 = (double)par3;
2304 var10 = (double)par4;
2305 var12 = (double)par5;
2306 var14 = "iconcrack_" + Item.potion.itemID;
2307
2308 for (var15 = 0; var15 < 8; ++var15)
2309 {
2310 this.spawnParticle(var14, var8, var10, var12, var7.nextGaussian() * 0.15D, var7.nextDouble() * 0.2D, var7.nextGaussian() * 0.15D);
2311 }
2312
2313 var15 = Item.potion.getColorFromDamage(par6);
2314 float var16 = (float)(var15 >> 16 & 255) / 255.0F;
2315 float var17 = (float)(var15 >> 8 & 255) / 255.0F;
2316 float var18 = (float)(var15 >> 0 & 255) / 255.0F;
2317 String var19 = "spell";
2318
2319 if (Item.potion.isEffectInstant(par6))
2320 {
2321 var19 = "instantSpell";
2322 }
2323
2324 for (var20 = 0; var20 < 100; ++var20)
2325 {
2326 var39 = var7.nextDouble() * 4.0D;
2327 var23 = var7.nextDouble() * Math.PI * 2.0D;
2328 var25 = Math.cos(var23) * var39;
2329 var27 = 0.01D + var7.nextDouble() * 0.5D;
2330 var29 = Math.sin(var23) * var39;
2331 EntityFX var31 = this.doSpawnParticle(var19, var8 + var25 * 0.1D, var10 + 0.3D, var12 + var29 * 0.1D, var25, var27, var29);
2332
2333 if (var31 != null)
2334 {
2335 float var32 = 0.75F + var7.nextFloat() * 0.25F;
2336 var31.setRBGColorF(var16 * var32, var17 * var32, var18 * var32);
2337 var31.multiplyVelocity((float)var39);
2338 }
2339 }
2340
2341 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.glass", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F, false);
2342 break;
2343 case 2003:
2344 var8 = (double)par3 + 0.5D;
2345 var10 = (double)par4;
2346 var12 = (double)par5 + 0.5D;
2347 var14 = "iconcrack_" + Item.eyeOfEnder.itemID;
2348
2349 for (var15 = 0; var15 < 8; ++var15)
2350 {
2351 this.spawnParticle(var14, var8, var10, var12, var7.nextGaussian() * 0.15D, var7.nextDouble() * 0.2D, var7.nextGaussian() * 0.15D);
2352 }
2353
2354 for (double var36 = 0.0D; var36 < (Math.PI * 2D); var36 += 0.15707963267948966D)
2355 {
2356 this.spawnParticle("portal", var8 + Math.cos(var36) * 5.0D, var10 - 0.4D, var12 + Math.sin(var36) * 5.0D, Math.cos(var36) * -5.0D, 0.0D, Math.sin(var36) * -5.0D);
2357 this.spawnParticle("portal", var8 + Math.cos(var36) * 5.0D, var10 - 0.4D, var12 + Math.sin(var36) * 5.0D, Math.cos(var36) * -7.0D, 0.0D, Math.sin(var36) * -7.0D);
2358 }
2359
2360 return;
2361 case 2004:
2362 for (int var21 = 0; var21 < 20; ++var21)
2363 {
2364 double var22 = (double)par3 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
2365 double var24 = (double)par4 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
2366 double var26 = (double)par5 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D;
2367 this.theWorld.spawnParticle("smoke", var22, var24, var26, 0.0D, 0.0D, 0.0D);
2368 this.theWorld.spawnParticle("flame", var22, var24, var26, 0.0D, 0.0D, 0.0D);
2369 }
2370 }
2371 }
2372
2373 /**
2374 * Starts (or continues) destroying a block with given ID at the given coordinates for the given partially destroyed
2375 * value
2376 */
2377 public void destroyBlockPartially(int par1, int par2, int par3, int par4, int par5)
2378 {
2379 if (par5 >= 0 && par5 < 10)
2380 {
2381 DestroyBlockProgress var6 = (DestroyBlockProgress)this.damagedBlocks.get(Integer.valueOf(par1));
2382
2383 if (var6 == null || var6.getPartialBlockX() != par2 || var6.getPartialBlockY() != par3 || var6.getPartialBlockZ() != par4)
2384 {
2385 var6 = new DestroyBlockProgress(par1, par2, par3, par4);
2386 this.damagedBlocks.put(Integer.valueOf(par1), var6);
2387 }
2388
2389 var6.setPartialBlockDamage(par5);
2390 var6.setCloudUpdateTick(this.cloudTickCounter);
2391 }
2392 else
2393 {
2394 this.damagedBlocks.remove(Integer.valueOf(par1));
2395 }
2396 }
2397 }