001package net.minecraft.client.gui;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.awt.Color;
006import java.util.Collection;
007import java.util.Iterator;
008import java.util.List;
009import java.util.Random;
010import net.minecraft.block.Block;
011import net.minecraft.block.material.Material;
012import net.minecraft.client.Minecraft;
013import net.minecraft.client.multiplayer.NetClientHandler;
014import net.minecraft.client.renderer.RenderHelper;
015import net.minecraft.client.renderer.Tessellator;
016import net.minecraft.client.renderer.entity.RenderItem;
017import net.minecraft.entity.boss.BossStatus;
018import net.minecraft.entity.player.InventoryPlayer;
019import net.minecraft.item.ItemStack;
020import net.minecraft.potion.Potion;
021import net.minecraft.scoreboard.Score;
022import net.minecraft.scoreboard.ScoreObjective;
023import net.minecraft.scoreboard.ScorePlayerTeam;
024import net.minecraft.scoreboard.Scoreboard;
025import net.minecraft.util.Direction;
026import net.minecraft.util.EnumChatFormatting;
027import net.minecraft.util.FoodStats;
028import net.minecraft.util.Icon;
029import net.minecraft.util.MathHelper;
030import net.minecraft.util.StatCollector;
031import net.minecraft.util.StringUtils;
032import net.minecraft.world.EnumSkyBlock;
033import net.minecraft.world.chunk.Chunk;
034import org.lwjgl.opengl.GL11;
035import org.lwjgl.opengl.GL12;
036
037import net.minecraftforge.common.ForgeHooks;
038
039@SideOnly(Side.CLIENT)
040public class GuiIngame extends Gui
041{
042    protected static final RenderItem itemRenderer = new RenderItem();
043    protected final Random rand = new Random();
044    protected final Minecraft mc;
045
046    /** ChatGUI instance that retains all previous chat data */
047    protected final GuiNewChat persistantChatGUI;
048    protected int updateCounter = 0;
049
050    /** The string specifying which record music is playing */
051    protected String recordPlaying = "";
052
053    /** How many ticks the record playing message will be displayed */
054    protected int recordPlayingUpFor = 0;
055    protected boolean recordIsPlaying = false;
056
057    /** Previous frame vignette brightness (slowly changes by 1% each frame) */
058    public float prevVignetteBrightness = 1.0F;
059    protected int field_92017_k;
060    protected ItemStack field_92016_l;
061
062    public GuiIngame(Minecraft par1Minecraft)
063    {
064        this.mc = par1Minecraft;
065        this.persistantChatGUI = new GuiNewChat(par1Minecraft);
066    }
067
068    /**
069     * Render the ingame overlay with quick icon bar, ...
070     */
071    public void renderGameOverlay(float par1, boolean par2, int par3, int par4)
072    {
073        ScaledResolution scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
074        int k = scaledresolution.getScaledWidth();
075        int l = scaledresolution.getScaledHeight();
076        FontRenderer fontrenderer = this.mc.fontRenderer;
077        this.mc.entityRenderer.setupOverlayRendering();
078        GL11.glEnable(GL11.GL_BLEND);
079
080        if (Minecraft.isFancyGraphicsEnabled())
081        {
082            this.renderVignette(this.mc.thePlayer.getBrightness(par1), k, l);
083        }
084        else
085        {
086            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
087        }
088
089        ItemStack itemstack = this.mc.thePlayer.inventory.armorItemInSlot(3);
090
091        if (this.mc.gameSettings.thirdPersonView == 0 && itemstack != null && itemstack.getItem() != null)
092        {
093            if (itemstack.itemID == Block.pumpkin.blockID)
094            {
095                this.renderPumpkinBlur(k, l);
096            }
097            else
098            {
099                itemstack.getItem().renderHelmetOverlay(itemstack, mc.thePlayer, scaledresolution, par1, par2, par3, par4);
100            }
101        }
102
103        if (!this.mc.thePlayer.isPotionActive(Potion.confusion))
104        {
105            float f1 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1;
106
107            if (f1 > 0.0F)
108            {
109                this.renderPortalOverlay(f1, k, l);
110            }
111        }
112
113        boolean flag1;
114        int i1;
115        int j1;
116        int k1;
117        int l1;
118        int i2;
119        int j2;
120        int k2;
121        int l2;
122        int i3;
123        byte b0;
124        int j3;
125        int k3;
126        int l3;
127
128        if (!this.mc.playerController.enableEverythingIsScrewedUpMode())
129        {
130            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
131            this.mc.renderEngine.bindTexture("/gui/gui.png");
132            InventoryPlayer inventoryplayer = this.mc.thePlayer.inventory;
133            this.zLevel = -90.0F;
134            this.drawTexturedModalRect(k / 2 - 91, l - 22, 0, 0, 182, 22);
135            this.drawTexturedModalRect(k / 2 - 91 - 1 + inventoryplayer.currentItem * 20, l - 22 - 1, 0, 22, 24, 22);
136            this.mc.renderEngine.bindTexture("/gui/icons.png");
137            GL11.glEnable(GL11.GL_BLEND);
138            GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR);
139            this.drawTexturedModalRect(k / 2 - 7, l / 2 - 7, 0, 0, 16, 16);
140            GL11.glDisable(GL11.GL_BLEND);
141            flag1 = this.mc.thePlayer.hurtResistantTime / 3 % 2 == 1;
142
143            if (this.mc.thePlayer.hurtResistantTime < 10)
144            {
145                flag1 = false;
146            }
147
148            i1 = this.mc.thePlayer.getHealth();
149            j1 = this.mc.thePlayer.prevHealth;
150            this.rand.setSeed((long)(this.updateCounter * 312871));
151            boolean flag2 = false;
152            FoodStats foodstats = this.mc.thePlayer.getFoodStats();
153            l1 = foodstats.getFoodLevel();
154            k1 = foodstats.getPrevFoodLevel();
155            this.mc.mcProfiler.startSection("bossHealth");
156            this.renderBossHealth();
157            this.mc.mcProfiler.endSection();
158            int i4;
159
160            if (this.mc.playerController.shouldDrawHUD())
161            {
162                i2 = k / 2 - 91;
163                i4 = k / 2 + 91;
164                this.mc.mcProfiler.startSection("expBar");
165                j2 = this.mc.thePlayer.xpBarCap();
166
167                if (j2 > 0)
168                {
169                    short short1 = 182;
170                    l2 = (int)(this.mc.thePlayer.experience * (float)(short1 + 1));
171                    k2 = l - 32 + 3;
172                    this.drawTexturedModalRect(i2, k2, 0, 64, short1, 5);
173
174                    if (l2 > 0)
175                    {
176                        this.drawTexturedModalRect(i2, k2, 0, 69, l2, 5);
177                    }
178                }
179
180                k3 = l - 39;
181                l2 = k3 - 10;
182                k2 = ForgeHooks.getTotalArmorValue(mc.thePlayer);
183                i3 = -1;
184
185                if (this.mc.thePlayer.isPotionActive(Potion.regeneration))
186                {
187                    i3 = this.updateCounter % 25;
188                }
189
190                this.mc.mcProfiler.endStartSection("healthArmor");
191                int j4;
192                int k4;
193                int l4;
194
195                for (j4 = 0; j4 < 10; ++j4)
196                {
197                    if (k2 > 0)
198                    {
199                        j3 = i2 + j4 * 8;
200
201                        if (j4 * 2 + 1 < k2)
202                        {
203                            this.drawTexturedModalRect(j3, l2, 34, 9, 9, 9);
204                        }
205
206                        if (j4 * 2 + 1 == k2)
207                        {
208                            this.drawTexturedModalRect(j3, l2, 25, 9, 9, 9);
209                        }
210
211                        if (j4 * 2 + 1 > k2)
212                        {
213                            this.drawTexturedModalRect(j3, l2, 16, 9, 9, 9);
214                        }
215                    }
216
217                    j3 = 16;
218
219                    if (this.mc.thePlayer.isPotionActive(Potion.poison))
220                    {
221                        j3 += 36;
222                    }
223                    else if (this.mc.thePlayer.isPotionActive(Potion.wither))
224                    {
225                        j3 += 72;
226                    }
227
228                    b0 = 0;
229
230                    if (flag1)
231                    {
232                        b0 = 1;
233                    }
234
235                    l4 = i2 + j4 * 8;
236                    k4 = k3;
237
238                    if (i1 <= 4)
239                    {
240                        k4 = k3 + this.rand.nextInt(2);
241                    }
242
243                    if (j4 == i3)
244                    {
245                        k4 -= 2;
246                    }
247
248                    byte b1 = 0;
249
250                    if (this.mc.theWorld.getWorldInfo().isHardcoreModeEnabled())
251                    {
252                        b1 = 5;
253                    }
254
255                    this.drawTexturedModalRect(l4, k4, 16 + b0 * 9, 9 * b1, 9, 9);
256
257                    if (flag1)
258                    {
259                        if (j4 * 2 + 1 < j1)
260                        {
261                            this.drawTexturedModalRect(l4, k4, j3 + 54, 9 * b1, 9, 9);
262                        }
263
264                        if (j4 * 2 + 1 == j1)
265                        {
266                            this.drawTexturedModalRect(l4, k4, j3 + 63, 9 * b1, 9, 9);
267                        }
268                    }
269
270                    if (j4 * 2 + 1 < i1)
271                    {
272                        this.drawTexturedModalRect(l4, k4, j3 + 36, 9 * b1, 9, 9);
273                    }
274
275                    if (j4 * 2 + 1 == i1)
276                    {
277                        this.drawTexturedModalRect(l4, k4, j3 + 45, 9 * b1, 9, 9);
278                    }
279                }
280
281                this.mc.mcProfiler.endStartSection("food");
282
283                for (j4 = 0; j4 < 10; ++j4)
284                {
285                    j3 = k3;
286                    l3 = 16;
287                    byte b2 = 0;
288
289                    if (this.mc.thePlayer.isPotionActive(Potion.hunger))
290                    {
291                        l3 += 36;
292                        b2 = 13;
293                    }
294
295                    if (this.mc.thePlayer.getFoodStats().getSaturationLevel() <= 0.0F && this.updateCounter % (l1 * 3 + 1) == 0)
296                    {
297                        j3 = k3 + (this.rand.nextInt(3) - 1);
298                    }
299
300                    if (flag2)
301                    {
302                        b2 = 1;
303                    }
304
305                    k4 = i4 - j4 * 8 - 9;
306                    this.drawTexturedModalRect(k4, j3, 16 + b2 * 9, 27, 9, 9);
307
308                    if (flag2)
309                    {
310                        if (j4 * 2 + 1 < k1)
311                        {
312                            this.drawTexturedModalRect(k4, j3, l3 + 54, 27, 9, 9);
313                        }
314
315                        if (j4 * 2 + 1 == k1)
316                        {
317                            this.drawTexturedModalRect(k4, j3, l3 + 63, 27, 9, 9);
318                        }
319                    }
320
321                    if (j4 * 2 + 1 < l1)
322                    {
323                        this.drawTexturedModalRect(k4, j3, l3 + 36, 27, 9, 9);
324                    }
325
326                    if (j4 * 2 + 1 == l1)
327                    {
328                        this.drawTexturedModalRect(k4, j3, l3 + 45, 27, 9, 9);
329                    }
330                }
331
332                this.mc.mcProfiler.endStartSection("air");
333
334                if (this.mc.thePlayer.isInsideOfMaterial(Material.water))
335                {
336                    j4 = this.mc.thePlayer.getAir();
337                    j3 = MathHelper.ceiling_double_int((double)(j4 - 2) * 10.0D / 300.0D);
338                    l3 = MathHelper.ceiling_double_int((double)j4 * 10.0D / 300.0D) - j3;
339
340                    for (l4 = 0; l4 < j3 + l3; ++l4)
341                    {
342                        if (l4 < j3)
343                        {
344                            this.drawTexturedModalRect(i4 - l4 * 8 - 9, l2, 16, 18, 9, 9);
345                        }
346                        else
347                        {
348                            this.drawTexturedModalRect(i4 - l4 * 8 - 9, l2, 25, 18, 9, 9);
349                        }
350                    }
351                }
352
353                this.mc.mcProfiler.endSection();
354            }
355
356            GL11.glDisable(GL11.GL_BLEND);
357            this.mc.mcProfiler.startSection("actionBar");
358            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
359            RenderHelper.enableGUIStandardItemLighting();
360
361            for (i2 = 0; i2 < 9; ++i2)
362            {
363                i4 = k / 2 - 90 + i2 * 20 + 2;
364                j2 = l - 16 - 3;
365                this.renderInventorySlot(i2, i4, j2, par1);
366            }
367
368            RenderHelper.disableStandardItemLighting();
369            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
370            this.mc.mcProfiler.endSection();
371        }
372
373        float f2;
374
375        if (this.mc.thePlayer.getSleepTimer() > 0)
376        {
377            this.mc.mcProfiler.startSection("sleep");
378            GL11.glDisable(GL11.GL_DEPTH_TEST);
379            GL11.glDisable(GL11.GL_ALPHA_TEST);
380            int i5 = this.mc.thePlayer.getSleepTimer();
381            f2 = (float)i5 / 100.0F;
382
383            if (f2 > 1.0F)
384            {
385                f2 = 1.0F - (float)(i5 - 100) / 10.0F;
386            }
387
388            i1 = (int)(220.0F * f2) << 24 | 1052704;
389            drawRect(0, 0, k, l, i1);
390            GL11.glEnable(GL11.GL_ALPHA_TEST);
391            GL11.glEnable(GL11.GL_DEPTH_TEST);
392            this.mc.mcProfiler.endSection();
393        }
394
395        int j5;
396        int k5;
397
398        if (this.mc.playerController.func_78763_f() && this.mc.thePlayer.experienceLevel > 0)
399        {
400            this.mc.mcProfiler.startSection("expLevel");
401            flag1 = false;
402            i1 = flag1 ? 16777215 : 8453920;
403            String s = "" + this.mc.thePlayer.experienceLevel;
404            j5 = (k - fontrenderer.getStringWidth(s)) / 2;
405            k5 = l - 31 - 4;
406            fontrenderer.drawString(s, j5 + 1, k5, 0);
407            fontrenderer.drawString(s, j5 - 1, k5, 0);
408            fontrenderer.drawString(s, j5, k5 + 1, 0);
409            fontrenderer.drawString(s, j5, k5 - 1, 0);
410            fontrenderer.drawString(s, j5, k5, i1);
411            this.mc.mcProfiler.endSection();
412        }
413
414        String s1;
415
416        if (this.mc.gameSettings.heldItemTooltips)
417        {
418            this.mc.mcProfiler.startSection("toolHighlight");
419
420            if (this.field_92017_k > 0 && this.field_92016_l != null)
421            {
422                s1 = this.field_92016_l.getDisplayName();
423                i1 = (k - fontrenderer.getStringWidth(s1)) / 2;
424                j1 = l - 59;
425
426                if (!this.mc.playerController.shouldDrawHUD())
427                {
428                    j1 += 14;
429                }
430
431                j5 = (int)((float)this.field_92017_k * 256.0F / 10.0F);
432
433                if (j5 > 255)
434                {
435                    j5 = 255;
436                }
437
438                if (j5 > 0)
439                {
440                    GL11.glPushMatrix();
441                    GL11.glEnable(GL11.GL_BLEND);
442                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
443                    FontRenderer font = field_92016_l.getItem().getFontRenderer(field_92016_l);
444                    if (font != null)
445                    {
446                        i1 = (k - font.getStringWidth(s1)) / 2;
447                        font.drawStringWithShadow(s1, i1, j1, 16777215 + (j5 << 24));
448                    }
449                    else
450                    {
451                        fontrenderer.drawStringWithShadow(s1, i1, j1, 16777215 + (j5 << 24));
452                    }
453                    GL11.glDisable(GL11.GL_BLEND);
454                    GL11.glPopMatrix();
455                }
456            }
457
458            this.mc.mcProfiler.endSection();
459        }
460
461        if (this.mc.isDemo())
462        {
463            this.mc.mcProfiler.startSection("demo");
464            s1 = "";
465
466            if (this.mc.theWorld.getTotalWorldTime() >= 120500L)
467            {
468                s1 = StatCollector.translateToLocal("demo.demoExpired");
469            }
470            else
471            {
472                s1 = String.format(StatCollector.translateToLocal("demo.remainingTime"), new Object[] {StringUtils.ticksToElapsedTime((int)(120500L - this.mc.theWorld.getTotalWorldTime()))});
473            }
474
475            i1 = fontrenderer.getStringWidth(s1);
476            fontrenderer.drawStringWithShadow(s1, k - i1 - 10, 5, 16777215);
477            this.mc.mcProfiler.endSection();
478        }
479
480        if (this.mc.gameSettings.showDebugInfo)
481        {
482            this.mc.mcProfiler.startSection("debug");
483            GL11.glPushMatrix();
484            fontrenderer.drawStringWithShadow("Minecraft 1.5.1 (" + this.mc.debug + ")", 2, 2, 16777215);
485            fontrenderer.drawStringWithShadow(this.mc.debugInfoRenders(), 2, 12, 16777215);
486            fontrenderer.drawStringWithShadow(this.mc.getEntityDebug(), 2, 22, 16777215);
487            fontrenderer.drawStringWithShadow(this.mc.debugInfoEntities(), 2, 32, 16777215);
488            fontrenderer.drawStringWithShadow(this.mc.getWorldProviderName(), 2, 42, 16777215);
489            long l5 = Runtime.getRuntime().maxMemory();
490            long i6 = Runtime.getRuntime().totalMemory();
491            long j6 = Runtime.getRuntime().freeMemory();
492            long k6 = i6 - j6;
493            String s2 = "Used memory: " + k6 * 100L / l5 + "% (" + k6 / 1024L / 1024L + "MB) of " + l5 / 1024L / 1024L + "MB";
494            this.drawString(fontrenderer, s2, k - fontrenderer.getStringWidth(s2) - 2, 2, 14737632);
495            s2 = "Allocated memory: " + i6 * 100L / l5 + "% (" + i6 / 1024L / 1024L + "MB)";
496            this.drawString(fontrenderer, s2, k - fontrenderer.getStringWidth(s2) - 2, 12, 14737632);
497            k3 = MathHelper.floor_double(this.mc.thePlayer.posX);
498            l2 = MathHelper.floor_double(this.mc.thePlayer.posY);
499            k2 = MathHelper.floor_double(this.mc.thePlayer.posZ);
500            this.drawString(fontrenderer, String.format("x: %.5f (%d) // c: %d (%d)", new Object[] {Double.valueOf(this.mc.thePlayer.posX), Integer.valueOf(k3), Integer.valueOf(k3 >> 4), Integer.valueOf(k3 & 15)}), 2, 64, 14737632);
501            this.drawString(fontrenderer, String.format("y: %.3f (feet pos, %.3f eyes pos)", new Object[] {Double.valueOf(this.mc.thePlayer.boundingBox.minY), Double.valueOf(this.mc.thePlayer.posY)}), 2, 72, 14737632);
502            this.drawString(fontrenderer, String.format("z: %.5f (%d) // c: %d (%d)", new Object[] {Double.valueOf(this.mc.thePlayer.posZ), Integer.valueOf(k2), Integer.valueOf(k2 >> 4), Integer.valueOf(k2 & 15)}), 2, 80, 14737632);
503            i3 = MathHelper.floor_double((double)(this.mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
504            this.drawString(fontrenderer, "f: " + i3 + " (" + Direction.directions[i3] + ") / " + MathHelper.wrapAngleTo180_float(this.mc.thePlayer.rotationYaw), 2, 88, 14737632);
505
506            if (this.mc.theWorld != null && this.mc.theWorld.blockExists(k3, l2, k2))
507            {
508                Chunk chunk = this.mc.theWorld.getChunkFromBlockCoords(k3, k2);
509                this.drawString(fontrenderer, "lc: " + (chunk.getTopFilledSegment() + 15) + " b: " + chunk.getBiomeGenForWorldCoords(k3 & 15, k2 & 15, this.mc.theWorld.getWorldChunkManager()).biomeName + " bl: " + chunk.getSavedLightValue(EnumSkyBlock.Block, k3 & 15, l2, k2 & 15) + " sl: " + chunk.getSavedLightValue(EnumSkyBlock.Sky, k3 & 15, l2, k2 & 15) + " rl: " + chunk.getBlockLightValue(k3 & 15, l2, k2 & 15, 0), 2, 96, 14737632);
510            }
511
512            this.drawString(fontrenderer, String.format("ws: %.3f, fs: %.3f, g: %b, fl: %d", new Object[] {Float.valueOf(this.mc.thePlayer.capabilities.getWalkSpeed()), Float.valueOf(this.mc.thePlayer.capabilities.getFlySpeed()), Boolean.valueOf(this.mc.thePlayer.onGround), Integer.valueOf(this.mc.theWorld.getHeightValue(k3, k2))}), 2, 104, 14737632);
513            GL11.glPopMatrix();
514            this.mc.mcProfiler.endSection();
515        }
516
517        if (this.recordPlayingUpFor > 0)
518        {
519            this.mc.mcProfiler.startSection("overlayMessage");
520            f2 = (float)this.recordPlayingUpFor - par1;
521            i1 = (int)(f2 * 256.0F / 20.0F);
522
523            if (i1 > 255)
524            {
525                i1 = 255;
526            }
527
528            if (i1 > 0)
529            {
530                GL11.glPushMatrix();
531                GL11.glTranslatef((float)(k / 2), (float)(l - 48), 0.0F);
532                GL11.glEnable(GL11.GL_BLEND);
533                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
534                j1 = 16777215;
535
536                if (this.recordIsPlaying)
537                {
538                    j1 = Color.HSBtoRGB(f2 / 50.0F, 0.7F, 0.6F) & 16777215;
539                }
540
541                fontrenderer.drawString(this.recordPlaying, -fontrenderer.getStringWidth(this.recordPlaying) / 2, -4, j1 + (i1 << 24));
542                GL11.glDisable(GL11.GL_BLEND);
543                GL11.glPopMatrix();
544            }
545
546            this.mc.mcProfiler.endSection();
547        }
548
549        ScoreObjective scoreobjective = this.mc.theWorld.getScoreboard().func_96539_a(1);
550
551        if (scoreobjective != null)
552        {
553            this.func_96136_a(scoreobjective, l, k, fontrenderer);
554        }
555
556        GL11.glEnable(GL11.GL_BLEND);
557        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
558        GL11.glDisable(GL11.GL_ALPHA_TEST);
559        GL11.glPushMatrix();
560        GL11.glTranslatef(0.0F, (float)(l - 48), 0.0F);
561        this.mc.mcProfiler.startSection("chat");
562        this.persistantChatGUI.drawChat(this.updateCounter);
563        this.mc.mcProfiler.endSection();
564        GL11.glPopMatrix();
565        scoreobjective = this.mc.theWorld.getScoreboard().func_96539_a(0);
566
567        if (this.mc.gameSettings.keyBindPlayerList.pressed && (!this.mc.isIntegratedServerRunning() || this.mc.thePlayer.sendQueue.playerInfoList.size() > 1 || scoreobjective != null))
568        {
569            this.mc.mcProfiler.startSection("playerList");
570            NetClientHandler netclienthandler = this.mc.thePlayer.sendQueue;
571            List list = netclienthandler.playerInfoList;
572            j5 = netclienthandler.currentServerMaxPlayers;
573            k5 = j5;
574
575            for (l1 = 1; k5 > 20; k5 = (j5 + l1 - 1) / l1)
576            {
577                ++l1;
578            }
579
580            k1 = 300 / l1;
581
582            if (k1 > 150)
583            {
584                k1 = 150;
585            }
586
587            i2 = (k - l1 * k1) / 2;
588            byte b3 = 10;
589            drawRect(i2 - 1, b3 - 1, i2 + k1 * l1, b3 + 9 * k5, Integer.MIN_VALUE);
590
591            for (j2 = 0; j2 < j5; ++j2)
592            {
593                k3 = i2 + j2 % l1 * k1;
594                l2 = b3 + j2 / l1 * 9;
595                drawRect(k3, l2, k3 + k1 - 1, l2 + 8, 553648127);
596                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
597                GL11.glEnable(GL11.GL_ALPHA_TEST);
598
599                if (j2 < list.size())
600                {
601                    GuiPlayerInfo guiplayerinfo = (GuiPlayerInfo)list.get(j2);
602                    ScorePlayerTeam scoreplayerteam = this.mc.theWorld.getScoreboard().func_96509_i(guiplayerinfo.name);
603                    String s3 = ScorePlayerTeam.func_96667_a(scoreplayerteam, guiplayerinfo.name);
604                    fontrenderer.drawStringWithShadow(s3, k3, l2, 16777215);
605
606                    if (scoreobjective != null)
607                    {
608                        j3 = k3 + fontrenderer.getStringWidth(s3) + 5;
609                        l3 = k3 + k1 - 12 - 5;
610
611                        if (l3 - j3 > 5)
612                        {
613                            Score score = scoreobjective.getScoreboard().func_96529_a(guiplayerinfo.name, scoreobjective);
614                            String s4 = EnumChatFormatting.YELLOW + "" + score.func_96652_c();
615                            fontrenderer.drawStringWithShadow(s4, l3 - fontrenderer.getStringWidth(s4), l2, 16777215);
616                        }
617                    }
618
619                    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
620                    this.mc.renderEngine.bindTexture("/gui/icons.png");
621                    byte b4 = 0;
622                    boolean flag3 = false;
623
624                    if (guiplayerinfo.responseTime < 0)
625                    {
626                        b0 = 5;
627                    }
628                    else if (guiplayerinfo.responseTime < 150)
629                    {
630                        b0 = 0;
631                    }
632                    else if (guiplayerinfo.responseTime < 300)
633                    {
634                        b0 = 1;
635                    }
636                    else if (guiplayerinfo.responseTime < 600)
637                    {
638                        b0 = 2;
639                    }
640                    else if (guiplayerinfo.responseTime < 1000)
641                    {
642                        b0 = 3;
643                    }
644                    else
645                    {
646                        b0 = 4;
647                    }
648
649                    this.zLevel += 100.0F;
650                    this.drawTexturedModalRect(k3 + k1 - 12, l2, 0 + b4 * 10, 176 + b0 * 8, 10, 8);
651                    this.zLevel -= 100.0F;
652                }
653            }
654        }
655
656        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
657        GL11.glDisable(GL11.GL_LIGHTING);
658        GL11.glEnable(GL11.GL_ALPHA_TEST);
659    }
660
661    protected void func_96136_a(ScoreObjective par1ScoreObjective, int par2, int par3, FontRenderer par4FontRenderer)
662    {
663        Scoreboard scoreboard = par1ScoreObjective.getScoreboard();
664        Collection collection = scoreboard.func_96534_i(par1ScoreObjective);
665
666        if (collection.size() <= 15)
667        {
668            int k = par4FontRenderer.getStringWidth(par1ScoreObjective.getDisplayName());
669            String s;
670
671            for (Iterator iterator = collection.iterator(); iterator.hasNext(); k = Math.max(k, par4FontRenderer.getStringWidth(s)))
672            {
673                Score score = (Score)iterator.next();
674                ScorePlayerTeam scoreplayerteam = scoreboard.func_96509_i(score.func_96653_e());
675                s = ScorePlayerTeam.func_96667_a(scoreplayerteam, score.func_96653_e()) + ": " + EnumChatFormatting.RED + score.func_96652_c();
676            }
677
678            int l = collection.size() * par4FontRenderer.FONT_HEIGHT;
679            int i1 = par2 / 2 + l / 3;
680            byte b0 = 3;
681            int j1 = par3 - k - b0;
682            int k1 = 0;
683            Iterator iterator1 = collection.iterator();
684
685            while (iterator1.hasNext())
686            {
687                Score score1 = (Score)iterator1.next();
688                ++k1;
689                ScorePlayerTeam scoreplayerteam1 = scoreboard.func_96509_i(score1.func_96653_e());
690                String s1 = ScorePlayerTeam.func_96667_a(scoreplayerteam1, score1.func_96653_e());
691                String s2 = EnumChatFormatting.RED + "" + score1.func_96652_c();
692                int l1 = i1 - k1 * par4FontRenderer.FONT_HEIGHT;
693                int i2 = par3 - b0 + 2;
694                drawRect(j1 - 2, l1, i2, l1 + par4FontRenderer.FONT_HEIGHT, 1342177280);
695                par4FontRenderer.drawString(s1, j1, l1, 553648127);
696                par4FontRenderer.drawString(s2, i2 - par4FontRenderer.getStringWidth(s2), l1, 553648127);
697
698                if (k1 == collection.size())
699                {
700                    String s3 = par1ScoreObjective.getDisplayName();
701                    drawRect(j1 - 2, l1 - par4FontRenderer.FONT_HEIGHT - 1, i2, l1 - 1, 1610612736);
702                    drawRect(j1 - 2, l1 - 1, i2, l1, 1342177280);
703                    par4FontRenderer.drawString(s3, j1 + k / 2 - par4FontRenderer.getStringWidth(s3) / 2, l1 - par4FontRenderer.FONT_HEIGHT, 553648127);
704                }
705            }
706        }
707    }
708
709    /**
710     * Renders dragon's (boss) health on the HUD
711     */
712    protected void renderBossHealth()
713    {
714        if (BossStatus.bossName != null && BossStatus.statusBarLength > 0)
715        {
716            --BossStatus.statusBarLength;
717            FontRenderer fontrenderer = this.mc.fontRenderer;
718            ScaledResolution scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
719            int i = scaledresolution.getScaledWidth();
720            short short1 = 182;
721            int j = i / 2 - short1 / 2;
722            int k = (int)(BossStatus.healthScale * (float)(short1 + 1));
723            byte b0 = 12;
724            this.drawTexturedModalRect(j, b0, 0, 74, short1, 5);
725            this.drawTexturedModalRect(j, b0, 0, 74, short1, 5);
726
727            if (k > 0)
728            {
729                this.drawTexturedModalRect(j, b0, 0, 79, k, 5);
730            }
731
732            String s = BossStatus.bossName;
733            fontrenderer.drawStringWithShadow(s, i / 2 - fontrenderer.getStringWidth(s) / 2, b0 - 10, 16777215);
734            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
735            this.mc.renderEngine.bindTexture("/gui/icons.png");
736        }
737    }
738
739    protected void renderPumpkinBlur(int par1, int par2)
740    {
741        GL11.glDisable(GL11.GL_DEPTH_TEST);
742        GL11.glDepthMask(false);
743        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
744        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
745        GL11.glDisable(GL11.GL_ALPHA_TEST);
746        this.mc.renderEngine.bindTexture("%blur%/misc/pumpkinblur.png");
747        Tessellator tessellator = Tessellator.instance;
748        tessellator.startDrawingQuads();
749        tessellator.addVertexWithUV(0.0D, (double)par2, -90.0D, 0.0D, 1.0D);
750        tessellator.addVertexWithUV((double)par1, (double)par2, -90.0D, 1.0D, 1.0D);
751        tessellator.addVertexWithUV((double)par1, 0.0D, -90.0D, 1.0D, 0.0D);
752        tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
753        tessellator.draw();
754        GL11.glDepthMask(true);
755        GL11.glEnable(GL11.GL_DEPTH_TEST);
756        GL11.glEnable(GL11.GL_ALPHA_TEST);
757        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
758    }
759
760    /**
761     * Renders the vignette. Args: vignetteBrightness, width, height
762     */
763    protected void renderVignette(float par1, int par2, int par3)
764    {
765        par1 = 1.0F - par1;
766
767        if (par1 < 0.0F)
768        {
769            par1 = 0.0F;
770        }
771
772        if (par1 > 1.0F)
773        {
774            par1 = 1.0F;
775        }
776
777        this.prevVignetteBrightness = (float)((double)this.prevVignetteBrightness + (double)(par1 - this.prevVignetteBrightness) * 0.01D);
778        GL11.glDisable(GL11.GL_DEPTH_TEST);
779        GL11.glDepthMask(false);
780        GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_COLOR);
781        GL11.glColor4f(this.prevVignetteBrightness, this.prevVignetteBrightness, this.prevVignetteBrightness, 1.0F);
782        this.mc.renderEngine.bindTexture("%blur%/misc/vignette.png");
783        Tessellator tessellator = Tessellator.instance;
784        tessellator.startDrawingQuads();
785        tessellator.addVertexWithUV(0.0D, (double)par3, -90.0D, 0.0D, 1.0D);
786        tessellator.addVertexWithUV((double)par2, (double)par3, -90.0D, 1.0D, 1.0D);
787        tessellator.addVertexWithUV((double)par2, 0.0D, -90.0D, 1.0D, 0.0D);
788        tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
789        tessellator.draw();
790        GL11.glDepthMask(true);
791        GL11.glEnable(GL11.GL_DEPTH_TEST);
792        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
793        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
794    }
795
796    /**
797     * Renders the portal overlay. Args: portalStrength, width, height
798     */
799    protected void renderPortalOverlay(float par1, int par2, int par3)
800    {
801        if (par1 < 1.0F)
802        {
803            par1 *= par1;
804            par1 *= par1;
805            par1 = par1 * 0.8F + 0.2F;
806        }
807
808        GL11.glDisable(GL11.GL_ALPHA_TEST);
809        GL11.glDisable(GL11.GL_DEPTH_TEST);
810        GL11.glDepthMask(false);
811        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
812        GL11.glColor4f(1.0F, 1.0F, 1.0F, par1);
813        this.mc.renderEngine.bindTexture("/terrain.png");
814        Icon icon = Block.portal.getBlockTextureFromSide(1);
815        float f1 = icon.getMinU();
816        float f2 = icon.getMinV();
817        float f3 = icon.getMaxU();
818        float f4 = icon.getMaxV();
819        Tessellator tessellator = Tessellator.instance;
820        tessellator.startDrawingQuads();
821        tessellator.addVertexWithUV(0.0D, (double)par3, -90.0D, (double)f1, (double)f4);
822        tessellator.addVertexWithUV((double)par2, (double)par3, -90.0D, (double)f3, (double)f4);
823        tessellator.addVertexWithUV((double)par2, 0.0D, -90.0D, (double)f3, (double)f2);
824        tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, (double)f1, (double)f2);
825        tessellator.draw();
826        GL11.glDepthMask(true);
827        GL11.glEnable(GL11.GL_DEPTH_TEST);
828        GL11.glEnable(GL11.GL_ALPHA_TEST);
829        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
830    }
831
832    /**
833     * Renders the specified item of the inventory slot at the specified location. Args: slot, x, y, partialTick
834     */
835    protected void renderInventorySlot(int par1, int par2, int par3, float par4)
836    {
837        ItemStack itemstack = this.mc.thePlayer.inventory.mainInventory[par1];
838
839        if (itemstack != null)
840        {
841            float f1 = (float)itemstack.animationsToGo - par4;
842
843            if (f1 > 0.0F)
844            {
845                GL11.glPushMatrix();
846                float f2 = 1.0F + f1 / 5.0F;
847                GL11.glTranslatef((float)(par2 + 8), (float)(par3 + 12), 0.0F);
848                GL11.glScalef(1.0F / f2, (f2 + 1.0F) / 2.0F, 1.0F);
849                GL11.glTranslatef((float)(-(par2 + 8)), (float)(-(par3 + 12)), 0.0F);
850            }
851
852            itemRenderer.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, itemstack, par2, par3);
853
854            if (f1 > 0.0F)
855            {
856                GL11.glPopMatrix();
857            }
858
859            itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, itemstack, par2, par3);
860        }
861    }
862
863    /**
864     * The update tick for the ingame UI
865     */
866    public void updateTick()
867    {
868        if (this.recordPlayingUpFor > 0)
869        {
870            --this.recordPlayingUpFor;
871        }
872
873        ++this.updateCounter;
874
875        if (this.mc.thePlayer != null)
876        {
877            ItemStack itemstack = this.mc.thePlayer.inventory.getCurrentItem();
878
879            if (itemstack == null)
880            {
881                this.field_92017_k = 0;
882            }
883            else if (this.field_92016_l != null && itemstack.itemID == this.field_92016_l.itemID && ItemStack.areItemStackTagsEqual(itemstack, this.field_92016_l) && (itemstack.isItemStackDamageable() || itemstack.getItemDamage() == this.field_92016_l.getItemDamage()))
884            {
885                if (this.field_92017_k > 0)
886                {
887                    --this.field_92017_k;
888                }
889            }
890            else
891            {
892                this.field_92017_k = 40;
893            }
894
895            this.field_92016_l = itemstack;
896        }
897    }
898
899    public void setRecordPlayingMessage(String par1Str)
900    {
901        this.recordPlaying = "Now playing: " + par1Str;
902        this.recordPlayingUpFor = 60;
903        this.recordIsPlaying = true;
904    }
905
906    /**
907     * returns a pointer to the persistant Chat GUI, containing all previous chat messages and such
908     */
909    public GuiNewChat getChatGUI()
910    {
911        return this.persistantChatGUI;
912    }
913
914    public int getUpdateCounter()
915    {
916        return this.updateCounter;
917    }
918}