    001package net.minecraftforge.client;
    002
    003import java.awt.Color;
    004import java.util.ArrayList;
    005import java.util.Collection;
    006import java.util.Iterator;
    007import java.util.List;
    008import java.util.Random;
    009
    010import org.lwjgl.opengl.GL11;
    011import org.lwjgl.opengl.GL12;
    012
    013import cpw.mods.fml.common.FMLCommonHandler;
    014
    015import net.minecraft.block.Block;
    016import net.minecraft.block.material.Material;
    017import net.minecraft.client.Minecraft;
    018import net.minecraft.client.gui.FontRenderer;
    019import net.minecraft.client.gui.GuiIngame;
    020import net.minecraft.client.gui.GuiNewChat;
    021import net.minecraft.client.gui.GuiPlayerInfo;
    022import net.minecraft.client.gui.ScaledResolution;
    023import net.minecraft.client.multiplayer.NetClientHandler;
    024import net.minecraft.client.renderer.RenderHelper;
    025import net.minecraft.client.renderer.Tessellator;
    026import net.minecraft.client.renderer.entity.RenderItem;
    027import net.minecraft.entity.boss.BossStatus;
    028import net.minecraft.entity.player.InventoryPlayer;
    029import net.minecraft.item.ItemStack;
    030import net.minecraft.potion.Potion;
    031import net.minecraft.scoreboard.Score;
    032import net.minecraft.scoreboard.ScoreObjective;
    033import net.minecraft.scoreboard.ScorePlayerTeam;
    034import net.minecraft.scoreboard.Scoreboard;
    035import net.minecraft.util.Direction;
    036import net.minecraft.util.EnumChatFormatting;
    037import net.minecraft.util.FoodStats;
    038import net.minecraft.util.Icon;
    039import net.minecraft.util.MathHelper;
    040import net.minecraft.util.StatCollector;
    041import net.minecraft.util.StringUtils;
    042import net.minecraft.world.EnumSkyBlock;
    043import net.minecraft.world.chunk.Chunk;
    044import net.minecraftforge.client.event.RenderGameOverlayEvent;
    045import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    046import net.minecraftforge.common.ForgeHooks;
    047import net.minecraftforge.common.MinecraftForge;
    048import static net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType.*;
    049
    050public class GuiIngameForge extends GuiIngame
    051{
    052    private static final int WHITE = 0xFFFFFF;
    053
    054    //Flags to toggle the rendering of certain aspects of the HUD, valid conditions
    055    //must be met for them to render normally. If those conditions are met, but this flag
    056    //is false, they will not be rendered.
    057    public static boolean renderHelmet = true;
    058    public static boolean renderPortal = true;
    059    public static boolean renderHotbar = true;
    060    public static boolean renderCrosshairs = true;
    061    public static boolean renderBossHealth = true;
    062    public static boolean renderHealth = true;
    063    public static boolean renderArmor = true;
    064    public static boolean renderFood = true;
    065    public static boolean renderAir = true;
    066    public static boolean renderExperiance = true;
    067    public static boolean renderObjective = true;
    068
    069    private ScaledResolution res = null;
    070    private FontRenderer fontrenderer = null;
    071    private RenderGameOverlayEvent eventParent;
    072
    073    public GuiIngameForge(Minecraft mc)
    074    {
    075        super(mc);
    076    }
    077
    078    @Override
    079    public void renderGameOverlay(float partialTicks, boolean hasScreen, int mouseX, int mouseY)
    080    {
    081        res = new ScaledResolution(mc.gameSettings, mc.displayWidth, mc.displayHeight);
    082        eventParent = new RenderGameOverlayEvent(partialTicks, res, mouseX, mouseY);
    083        int width = res.getScaledWidth();
    084        int height = res.getScaledHeight();
    085
    086        if (pre(ALL)) return;
    087
    088        fontrenderer = mc.fontRenderer;
    089        mc.entityRenderer.setupOverlayRendering();
    090        GL11.glEnable(GL11.GL_BLEND);
    091
    092        if (Minecraft.isFancyGraphicsEnabled())
    093        {
    094            renderVignette(mc.thePlayer.getBrightness(partialTicks), width, height);
    095        }
    096        else
    097        {
    098            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    099        }
    100
    101        if (renderHelmet) renderHelmet(res, partialTicks, hasScreen, mouseX, mouseY);
    102
    103        if (renderPortal && !mc.thePlayer.isPotionActive(Potion.confusion))
    104        {
    105            renderPortal(width, height, partialTicks);
    106        }
    107
    108        if (!mc.playerController.enableEverythingIsScrewedUpMode())
    109        {
    110            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    111            zLevel = -90.0F;
    112            rand.setSeed((long)(updateCounter * 312871));
    113            mc.renderEngine.bindTexture("/gui/icons.png");
    114
    115            if (renderCrosshairs) renderCrosshairs(width, height);
    116            if (renderBossHealth) renderBossHealth();
    117
    118            if (this.mc.playerController.shouldDrawHUD())
    119            {
    120                if (renderArmor)  renderArmor(width, height);
    121                if (renderHealth) renderHealth(width, height);
    122                if (renderFood)   renderFood(width, height);
    123                if (renderAir)    renderAir(width, height);
    124            }
    125            if (renderHotbar) renderHotbar(width, height, partialTicks);
    126        }
    127
    128        if (renderExperiance) renderExperience(width, height);
    129        renderSleepFade(width, height);
    130        renderToolHightlight(width, height);
    131        renderHUDText(width, height);
    132        renderRecordOverlay(width, height, partialTicks);
    133
    134        ScoreObjective objective = mc.theWorld.getScoreboard().func_96539_a(1);
    135        if (renderObjective && objective != null)
    136        {
    137            this.func_96136_a(objective, height, width, fontrenderer);
    138        }
    139
    140        GL11.glEnable(GL11.GL_BLEND);
    141        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    142        GL11.glDisable(GL11.GL_ALPHA_TEST);
    143
    144        renderChat(width, height);
    145
    146        renderPlayerList(width, height);
    147
    148        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    149        GL11.glDisable(GL11.GL_LIGHTING);
    150        GL11.glEnable(GL11.GL_ALPHA_TEST);
    151    }
    152
    153    public ScaledResolution getResolution()
    154    {
    155        return res;
    156    }
    157
    158    protected void renderHotbar(int width, int height, float partialTicks)
    159    {
    160        if (pre(HOTBAR)) return;
    161        mc.mcProfiler.startSection("actionBar");
    162
    163        mc.renderEngine.bindTexture("/gui/gui.png");
    164
    165        InventoryPlayer inv = mc.thePlayer.inventory;
    166        drawTexturedModalRect(width / 2 - 91, height - 22, 0, 0, 182, 22);
    167        drawTexturedModalRect(width / 2 - 91 - 1 + inv.currentItem * 20, height - 22 - 1, 0, 22, 24, 22);
    168
    169        GL11.glDisable(GL11.GL_BLEND);
    170        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
    171        RenderHelper.enableGUIStandardItemLighting();
    172
    173        for (int i = 0; i < 9; ++i)
    174        {
    175            int x = width / 2 - 90 + i * 20 + 2;
    176            int z = height - 16 - 3;
    177            renderInventorySlot(i, x, z, partialTicks);
    178        }
    179
    180        RenderHelper.disableStandardItemLighting();
    181        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
    182        mc.mcProfiler.endSection();
    183        post(HOTBAR);
    184    }
    185
    186    protected void renderCrosshairs(int width, int height)
    187    {
    188        if (pre(CROSSHAIRS)) return;
    189        GL11.glEnable(GL11.GL_BLEND);
    190        GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR);
    191        drawTexturedModalRect(width / 2 - 7, height / 2 - 7, 0, 0, 16, 16);
    192        GL11.glDisable(GL11.GL_BLEND);
    193        post(CROSSHAIRS);
    194    }
    195
    196    @Override
    197    protected void renderBossHealth()
    198    {
    199        if (pre(BOSSHEALTH)) return;
    200        mc.mcProfiler.startSection("bossHealth");
    201        super.renderBossHealth();
    202        mc.mcProfiler.endSection();
    203        post(BOSSHEALTH);
    204    }
    205
    206    private void renderHelmet(ScaledResolution res, float partialTicks, boolean hasScreen, int mouseX, int mouseY)
    207    {
    208        if (pre(HELMET)) return;
    209
    210        ItemStack itemstack = this.mc.thePlayer.inventory.armorItemInSlot(3);
    211
    212        if (this.mc.gameSettings.thirdPersonView == 0 && itemstack != null && itemstack.getItem() != null)
    213        {
    214            if (itemstack.itemID == Block.pumpkin.blockID)
    215            {
    216                renderPumpkinBlur(res.getScaledWidth(), res.getScaledHeight());
    217            }
    218            else
    219            {
    220                itemstack.getItem().renderHelmetOverlay(itemstack, mc.thePlayer, res, partialTicks, hasScreen, mouseX, mouseY);
    221            }
    222        }
    223
    224        post(HELMET);
    225    }
    226
    227    protected void renderArmor(int width, int height)
    228    {
    229        if (pre(ARMOR)) return;
    230        mc.mcProfiler.startSection("armor");
    231
    232        int left = width / 2 - 91;
    233        int top = height - 49;
    234
    235        int level = ForgeHooks.getTotalArmorValue(mc.thePlayer);
    236        for (int i = 1; level > 0 && i < 20; i += 2)
    237        {
    238            if (i < level)
    239            {
    240                drawTexturedModalRect(left, top, 34, 9, 9, 9);
    241            }
    242            else if (i == level)
    243            {
    244                drawTexturedModalRect(left, top, 25, 9, 9, 9);
    245            }
    246            else if (i > level)
    247            {
    248                drawTexturedModalRect(left, top, 16, 9, 9, 9);
    249            }
    250            left += 8;
    251        }
    252
    253        mc.mcProfiler.endSection();
    254        post(ARMOR);
    255    }
    256
    257    protected void renderPortal(int width, int height, float partialTicks)
    258    {
    259        if (pre(PORTAL)) return;
    260
    261        float f1 = mc.thePlayer.prevTimeInPortal + (mc.thePlayer.timeInPortal - mc.thePlayer.prevTimeInPortal) * partialTicks;
    262
    263        if (f1 > 0.0F)
    264        {
    265            renderPortalOverlay(f1, width, height);
    266        }
    267
    268        post(PORTAL);
    269    }
    270
    271    protected void renderAir(int width, int height)
    272    {
    273        if (pre(AIR)) return;
    274        mc.mcProfiler.startSection("air");
    275        int left = width / 2 + 91;
    276        int top = height - 49;
    277
    278        if (mc.thePlayer.isInsideOfMaterial(Material.water))
    279        {
    280            int air = mc.thePlayer.getAir();
    281            int full = MathHelper.ceiling_double_int((double)(air - 2) * 10.0D / 300.0D);
    282            int partial = MathHelper.ceiling_double_int((double)air * 10.0D / 300.0D) - full;
    283
    284            for (int i = 0; i < full + partial; ++i)
    285            {
    286                drawTexturedModalRect(left - i * 8 - 9, top, (i < full ? 16 : 25), 18, 9, 9);
    287            }
    288        }
    289
    290        mc.mcProfiler.endSection();
    291        post(AIR);
    292    }
    293
    294    public void renderHealth(int width, int height)
    295    {
    296        if (pre(HEALTH)) return;
    297        mc.mcProfiler.startSection("health");
    298
    299        boolean highlight = mc.thePlayer.hurtResistantTime / 3 % 2 == 1;
    300
    301        if (mc.thePlayer.hurtResistantTime < 10)
    302        {
    303            highlight = false;
    304        }
    305
    306        int health = mc.thePlayer.getHealth();
    307        int healthLast = mc.thePlayer.prevHealth;
    308        int left = width / 2 - 91;
    309        int top = height - 39;
    310
    311        int regen = -1;
    312        if (mc.thePlayer.isPotionActive(Potion.regeneration))
    313        {
    314            regen = this.updateCounter % 25;
    315        }
    316
    317        for (int i = 0; i < 10; ++i)
    318        {
    319            int idx = i * 2 + 1;
    320            int iconX = 16;
    321            if (mc.thePlayer.isPotionActive(Potion.poison)) iconX += 36;
    322            else if (mc.thePlayer.isPotionActive(Potion.wither)) iconX += 72;
    323
    324            int x = left + i * 8;
    325            int y = top;
    326            if (health <= 4) y = top + rand.nextInt(2);
    327            if (i == regen) y -= 2;
    328
    329            byte iconY = 0;
    330            if (mc.theWorld.getWorldInfo().isHardcoreModeEnabled()) iconY = 5;
    331
    332            drawTexturedModalRect(x, y, 16 + (highlight ? 9 : 0), 9 * iconY, 9, 9);
    333
    334            if (highlight)
    335            {
    336                if (idx < healthLast)
    337                    drawTexturedModalRect(x, y, iconX + 54, 9 * iconY, 9, 9);
    338                else if (idx == healthLast)
    339                    drawTexturedModalRect(x, y, iconX + 63, 9 * iconY, 9, 9);
    340            }
    341
    342            if (idx < health)
    343                drawTexturedModalRect(x, y, iconX + 36, 9 * iconY, 9, 9);
    344            else if (idx == health)
    345                drawTexturedModalRect(x, y, iconX + 45, 9 * iconY, 9, 9);
    346        }
    347        mc.mcProfiler.endSection();
    348        post(HEALTH);
    349    }
    350
    351    public void renderFood(int width, int height)
    352    {
    353        if (pre(FOOD)) return;
    354        mc.mcProfiler.startSection("food");
    355
    356        int left = width / 2 + 91;
    357        int top = height - 39;
    358        boolean unused = false;// Unused flag in vanilla, seems to be part of a 'fade out' mechanic
    359
    360        FoodStats stats = mc.thePlayer.getFoodStats();
    361        int level = stats.getFoodLevel();
    362        int levelLast = stats.getPrevFoodLevel();
    363
    364        for (int i = 0; i < 10; ++i)
    365        {
    366            int idx = i * 2 + 1;
    367            int x = left - i * 8 - 9;
    368            int y = top;
    369            int icon = 16;
    370            byte backgound = 0;
    371
    372            if (mc.thePlayer.isPotionActive(Potion.hunger))
    373            {
    374                icon += 36;
    375                backgound = 13;
    376            }
    377            if (unused) backgound = 1; //Probably should be a += 1 but vanilla never uses this
    378
    379            if (mc.thePlayer.getFoodStats().getSaturationLevel() <= 0.0F && updateCounter % (level * 3 + 1) == 0)
    380            {
    381                y = top + (rand.nextInt(3) - 1);
    382            }
    383
    384            this.drawTexturedModalRect(x, y, 16 + backgound * 9, 27, 9, 9);
    385
    386            if (unused)
    387            {
    388                if (idx < levelLast)
    389                {
    390                    drawTexturedModalRect(x, y, icon + 54, 27, 9, 9);
    391                }
    392
    393                if (idx == levelLast)
    394                {
    395                    drawTexturedModalRect(x, y, icon + 63, 27, 9, 9);
    396                }
    397            }
    398
    399            if (idx < level)
    400            {
    401                drawTexturedModalRect(x, y, icon + 36, 27, 9, 9);
    402            }
    403
    404            if (idx == level)
    405            {
    406                drawTexturedModalRect(x, y, icon + 45, 27, 9, 9);
    407            }
    408        }
    409        mc.mcProfiler.endSection();
    410        post(FOOD);
    411    }
    412
    413    protected void renderSleepFade(int width, int height)
    414    {
    415        if (mc.thePlayer.getSleepTimer() > 0)
    416        {
    417            mc.mcProfiler.startSection("sleep");
    418            GL11.glDisable(GL11.GL_DEPTH_TEST);
    419            GL11.glDisable(GL11.GL_ALPHA_TEST);
    420            int sleepTime = mc.thePlayer.getSleepTimer();
    421            float opacity = (float)sleepTime / 100.0F;
    422
    423            if (opacity > 1.0F)
    424            {
    425                opacity = 1.0F - (float)(sleepTime - 100) / 10.0F;
    426            }
    427
    428            int color = (int)(220.0F * opacity) << 24 | 1052704;
    429            drawRect(0, 0, width, height, color);
    430            GL11.glEnable(GL11.GL_ALPHA_TEST);
    431            GL11.glEnable(GL11.GL_DEPTH_TEST);
    432            mc.mcProfiler.endSection();
    433        }
    434    }
    435
    436    protected void renderExperience(int width, int height)
    437    {
    438        if (pre(EXPERIENCE)) return;
    439        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    440        if (mc.playerController.shouldDrawHUD())
    441        {
    442            mc.mcProfiler.startSection("expBar");
    443            mc.renderEngine.bindTexture("/gui/icons.png");
    444            int cap = this.mc.thePlayer.xpBarCap();
    445            int left = width / 2 - 91;
    446
    447            if (cap > 0)
    448            {
    449                short short1 = 182;
    450                int l2 = (int)(this.mc.thePlayer.experience * (float)(short1 + 1));
    451                int k2 = height - 32 + 3;
    452                this.drawTexturedModalRect(left, k2, 0, 64, short1, 5);
    453
    454                if (l2 > 0)
    455                {
    456                    this.drawTexturedModalRect(left, k2, 0, 69, l2, 5);
    457                }
    458            }
    459            mc.mcProfiler.endSection();
    460        }
    461
    462        if (mc.playerController.func_78763_f() && mc.thePlayer.experienceLevel > 0)
    463        {
    464            mc.mcProfiler.startSection("expLevel");
    465            boolean flag1 = false;
    466            int color = flag1 ? 16777215 : 8453920;
    467            String text = "" + mc.thePlayer.experienceLevel;
    468            int x = (width - fontrenderer.getStringWidth(text)) / 2;
    469            int y = height - 31 - 4;
    470            fontrenderer.drawString(text, x + 1, y, 0);
    471            fontrenderer.drawString(text, x - 1, y, 0);
    472            fontrenderer.drawString(text, x, y + 1, 0);
    473            fontrenderer.drawString(text, x, y - 1, 0);
    474            fontrenderer.drawString(text, x, y, color);
    475            mc.mcProfiler.endSection();
    476        }
    477        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    478
    479        post(EXPERIENCE);
    480    }
    481
    482    protected void renderToolHightlight(int width, int height)
    483    {
    484        if (this.mc.gameSettings.heldItemTooltips)
    485        {
    486            mc.mcProfiler.startSection("toolHighlight");
    487
    488            if (this.field_92017_k > 0 && this.field_92016_l != null)
    489            {
    490                String name = this.field_92016_l.getDisplayName();
    491
    492                int opacity = (int)((float)this.field_92017_k * 256.0F / 10.0F);
    493                if (opacity > 255) opacity = 255;
    494
    495                if (opacity > 0)
    496                {
    497                    int y = height - 59;
    498                    if (!mc.playerController.shouldDrawHUD()) y += 14;
    499
    500                    GL11.glPushMatrix();
    501                    GL11.glEnable(GL11.GL_BLEND);
    502                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    503                    FontRenderer font = field_92016_l.getItem().getFontRenderer(field_92016_l);
    504                    if (font != null)
    505                    {
    506                        int x = (width - font.getStringWidth(name)) / 2;
    507                        font.drawStringWithShadow(name, x, y, WHITE | (opacity << 24));
    508                    }
    509                    else
    510                    {
    511                        int x = (width - fontrenderer.getStringWidth(name)) / 2;
    512                        fontrenderer.drawStringWithShadow(name, x, y, WHITE | (opacity << 24));
    513                    }
    514                    GL11.glDisable(GL11.GL_BLEND);
    515                    GL11.glPopMatrix();
    516                }
    517            }
    518
    519            mc.mcProfiler.endSection();
    520        }
    521    }
    522
    523    protected void renderHUDText(int width, int height)
    524    {
    525        mc.mcProfiler.startSection("forgeHudText");
    526        ArrayList<String> left = new ArrayList<String>();
    527        ArrayList<String> right = new ArrayList<String>();
    528
    529        if (mc.isDemo())
    530        {
    531            long time = mc.theWorld.getTotalWorldTime();
    532            if (time >= 120500L)
    533            {
    534                right.add(StatCollector.translateToLocal("demo.demoExpired"));
    535            }
    536            else
    537            {
    538                right.add(String.format(StatCollector.translateToLocal("demo.remainingTime"), StringUtils.ticksToElapsedTime((int)(120500L - time))));
    539            }
    540        }
    541
    542
    543        if (this.mc.gameSettings.showDebugInfo)
    544        {
    545            mc.mcProfiler.startSection("debug");
    546            GL11.glPushMatrix();
    547            left.add("Minecraft 1.5.1 (" + this.mc.debug + ")");
    548            left.add(mc.debugInfoRenders());
    549            left.add(mc.getEntityDebug());
    550            left.add(mc.debugInfoEntities());
    551            left.add(mc.getWorldProviderName());
    552            left.add(null); //Spacer
    553
    554            long max = Runtime.getRuntime().maxMemory();
    555            long total = Runtime.getRuntime().totalMemory();
    556            long free = Runtime.getRuntime().freeMemory();
    557            long used = total - free;
    558
    559            right.add("Used memory: " + used * 100L / max + "% (" + used / 1024L / 1024L + "MB) of " + max / 1024L / 1024L + "MB");
    560            right.add("Allocated memory: " + total * 100L / max + "% (" + total / 1024L / 1024L + "MB)");
    561
    562            int x = MathHelper.floor_double(mc.thePlayer.posX);
    563            int y = MathHelper.floor_double(mc.thePlayer.posY);
    564            int z = MathHelper.floor_double(mc.thePlayer.posZ);
    565            float yaw = mc.thePlayer.rotationYaw;
    566            int heading = MathHelper.floor_double((double)(mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
    567
    568            left.add(String.format("x: %.5f (%d) // c: %d (%d)", mc.thePlayer.posX, x, x >> 4, x & 15));
    569            left.add(String.format("y: %.3f (feet pos, %.3f eyes pos)", mc.thePlayer.boundingBox.minY, mc.thePlayer.posY));
    570            left.add(String.format("z: %.5f (%d) // c: %d (%d)", mc.thePlayer.posZ, z, z >> 4, z & 15));
    571            left.add(String.format("f: %d (%s) / %f", heading, Direction.directions[heading], MathHelper.wrapAngleTo180_float(yaw)));
    572
    573            if (mc.theWorld != null && mc.theWorld.blockExists(x, y, z))
    574            {
    575                Chunk chunk = this.mc.theWorld.getChunkFromBlockCoords(x, z);
    576                left.add(String.format("lc: %d b: %s bl: %d sl: %d rl: %d",
    577                  chunk.getTopFilledSegment() + 15,
    578                  chunk.getBiomeGenForWorldCoords(x & 15, z & 15, mc.theWorld.getWorldChunkManager()).biomeName,
    579                  chunk.getSavedLightValue(EnumSkyBlock.Block, x & 15, y, z & 15),
    580                  chunk.getSavedLightValue(EnumSkyBlock.Sky, x & 15, y, z & 15),
    581                  chunk.getBlockLightValue(x & 15, y, z & 15, 0)));
    582            }
    583            else
    584            {
    585                left.add(null);
    586            }
    587
    588            left.add(String.format("ws: %.3f, fs: %.3f, g: %b, fl: %d", mc.thePlayer.capabilities.getWalkSpeed(), mc.thePlayer.capabilities.getFlySpeed(), mc.thePlayer.onGround, mc.theWorld.getHeightValue(x, z)));
    589            right.add(null);
    590            for (String s : FMLCommonHandler.instance().getBrandings().subList(1, FMLCommonHandler.instance().getBrandings().size()))
    591            {
    592                right.add(s);
    593            }
    594            GL11.glPopMatrix();
    595            mc.mcProfiler.endSection();
    596        }
    597
    598        RenderGameOverlayEvent.Text event = new RenderGameOverlayEvent.Text(eventParent, left, right);
    599        if (!MinecraftForge.EVENT_BUS.post(event))
    600        {
    601            for (int x = 0; x < left.size(); x++)
    602            {
    603                String msg = left.get(x);
    604                if (msg == null) continue;
    605                fontrenderer.drawStringWithShadow(msg, 2, 2 + x * 10, WHITE);
    606            }
    607
    608            for (int x = 0; x < right.size(); x++)
    609            {
    610                String msg = right.get(x);
    611                if (msg == null) continue;
    612                int w = fontrenderer.getStringWidth(msg);
    613                fontrenderer.drawStringWithShadow(msg, width - w - 10, 2 + x * 10, WHITE);
    614            }
    615        }
    616
    617        mc.mcProfiler.endSection();
    618        post(TEXT);
    619    }
    620
    621    protected void renderRecordOverlay(int width, int height, float partialTicks)
    622    {
    623        if (recordPlayingUpFor > 0)
    624        {
    625            mc.mcProfiler.startSection("overlayMessage");
    626            float hue = (float)recordPlayingUpFor - partialTicks;
    627            int opacity = (int)(hue * 256.0F / 20.0F);
    628            if (opacity > 255) opacity = 255;
    629
    630            if (opacity > 0)
    631            {
    632                GL11.glPushMatrix();
    633                GL11.glTranslatef((float)(width / 2), (float)(height - 48), 0.0F);
    634                GL11.glEnable(GL11.GL_BLEND);
    635                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    636                int color = (recordIsPlaying ? Color.HSBtoRGB(hue / 50.0F, 0.7F, 0.6F) & WHITE : WHITE);
    637                fontrenderer.drawString(recordPlaying, -fontrenderer.getStringWidth(recordPlaying) / 2, -4, color | (opacity << 24));
    638                GL11.glDisable(GL11.GL_BLEND);
    639                GL11.glPopMatrix();
    640            }
    641
    642            mc.mcProfiler.endSection();
    643        }
    644    }
    645
    646    protected void renderChat(int width, int height)
    647    {
    648        GL11.glPushMatrix();
    649        GL11.glTranslatef(0.0F, (float)(height - 48), 0.0F);
    650        mc.mcProfiler.startSection("chat");
    651        persistantChatGUI.drawChat(updateCounter);
    652        mc.mcProfiler.endSection();
    653        GL11.glPopMatrix();
    654    }
    655
    656    protected void renderPlayerList(int width, int height)
    657    {
    658        ScoreObjective scoreobjective = this.mc.theWorld.getScoreboard().func_96539_a(0);
    659        NetClientHandler handler = mc.thePlayer.sendQueue;
    660
    661        if (mc.gameSettings.keyBindPlayerList.pressed && (!mc.isIntegratedServerRunning() || handler.playerInfoList.size() > 1 || scoreobjective != null))
    662        {
    663            this.mc.mcProfiler.startSection("playerList");
    664            List players = handler.playerInfoList;
    665            int maxPlayers = handler.currentServerMaxPlayers;
    666            int rows = maxPlayers;
    667            int columns = 1;
    668
    669            for (columns = 1; rows > 20; rows = (maxPlayers + columns - 1) / columns)
    670            {
    671                columns++;
    672            }
    673
    674            int columnWidth = 300 / columns;
    675
    676            if (columnWidth > 150)
    677            {
    678                columnWidth = 150;
    679            }
    680
    681            int left = (width - columns * columnWidth) / 2;
    682            byte border = 10;
    683            drawRect(left - 1, border - 1, left + columnWidth * columns, border + 9 * rows, Integer.MIN_VALUE);
    684
    685            for (int i = 0; i < maxPlayers; i++)
    686            {
    687                int xPos = left + i % columns * columnWidth;
    688                int yPos = border + i / columns * 9;
    689                drawRect(xPos, yPos, xPos + columnWidth - 1, yPos + 8, 553648127);
    690                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    691                GL11.glEnable(GL11.GL_ALPHA_TEST);
    692
    693                if (i < players.size())
    694                {
    695                    GuiPlayerInfo player = (GuiPlayerInfo)players.get(i);
    696                    ScorePlayerTeam team = mc.theWorld.getScoreboard().func_96509_i(player.name);
    697                    String displayName = ScorePlayerTeam.func_96667_a(team, player.name);
    698                    fontrenderer.drawStringWithShadow(displayName, xPos, yPos, 16777215);
    699
    700                    if (scoreobjective != null)
    701                    {
    702                        int endX = xPos + fontrenderer.getStringWidth(displayName) + 5;
    703                        int maxX = xPos + columnWidth - 12 - 5;
    704
    705                        if (maxX - endX > 5)
    706                        {
    707                            Score score = scoreobjective.getScoreboard().func_96529_a(player.name, scoreobjective);
    708                            String scoreDisplay = EnumChatFormatting.YELLOW + "" + score.func_96652_c();
    709                            fontrenderer.drawStringWithShadow(scoreDisplay, maxX - fontrenderer.getStringWidth(scoreDisplay), yPos, 16777215);
    710                        }
    711                    }
    712
    713                    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    714
    715                    mc.renderEngine.bindTexture("/gui/icons.png");
    716                    int pingIndex = 4;
    717                    int ping = player.responseTime;
    718                    if (ping < 0) pingIndex = 5;
    719                    else if (ping < 150) pingIndex = 0;
    720                    else if (ping < 300) pingIndex = 1;
    721                    else if (ping < 600) pingIndex = 2;
    722                    else if (ping < 1000) pingIndex = 3;
    723
    724                    zLevel += 100.0F;
    725                    drawTexturedModalRect(xPos + columnWidth - 12, yPos, 0, 176 + pingIndex * 8, 10, 8);
    726                    zLevel -= 100.0F;
    727                }
    728            }
    729        }
    730    }
    731
    732    //Helper macros
    733    private boolean pre(ElementType type)
    734    {
    735        return MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Pre(eventParent, type));
    736    }
    737    private void post(ElementType type)
    738    {
    739        MinecraftForge.EVENT_BUS.post(new RenderGameOverlayEvent.Post(eventParent, type));
    740    }
    741}