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