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