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    }