    001package net.minecraft.client.gui;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.client.Minecraft;
    006import net.minecraft.client.renderer.Tessellator;
    007import net.minecraft.util.IProgressUpdate;
    008import net.minecraft.util.MinecraftError;
    009import org.lwjgl.opengl.Display;
    010import org.lwjgl.opengl.GL11;
    011
    012@SideOnly(Side.CLIENT)
    013public class LoadingScreenRenderer implements IProgressUpdate
    014{
    015    private String field_73727_a = "";
    016
    017    /** A reference to the Minecraft object. */
    018    private Minecraft mc;
    019
    020    /**
    021     * The text currently displayed (i.e. the argument to the last call to printText or func_73722_d)
    022     */
    023    private String currentlyDisplayedText = "";
    024    private long field_73723_d = Minecraft.getSystemTime();
    025    private boolean field_73724_e = false;
    026
    027    public LoadingScreenRenderer(Minecraft par1Minecraft)
    028    {
    029        this.mc = par1Minecraft;
    030    }
    031
    032    /**
    033     * this string, followed by "working..." and then the "% complete" are the 3 lines shown. This resets progress to 0,
    034     * and the WorkingString to "working...".
    035     */
    036    public void resetProgressAndMessage(String par1Str)
    037    {
    038        this.field_73724_e = false;
    039        this.func_73722_d(par1Str);
    040    }
    041
    042    /**
    043     * "Saving level", or the loading,or downloading equivelent
    044     */
    045    public void displayProgressMessage(String par1Str)
    046    {
    047        this.field_73724_e = true;
    048        this.func_73722_d(par1Str);
    049    }
    050
    051    public void func_73722_d(String par1Str)
    052    {
    053        this.currentlyDisplayedText = par1Str;
    054
    055        if (!this.mc.running)
    056        {
    057            if (!this.field_73724_e)
    058            {
    059                throw new MinecraftError();
    060            }
    061        }
    062        else
    063        {
    064            ScaledResolution scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
    065            GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
    066            GL11.glMatrixMode(GL11.GL_PROJECTION);
    067            GL11.glLoadIdentity();
    068            GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D);
    069            GL11.glMatrixMode(GL11.GL_MODELVIEW);
    070            GL11.glLoadIdentity();
    071            GL11.glTranslatef(0.0F, 0.0F, -200.0F);
    072        }
    073    }
    074
    075    /**
    076     * This is called with "Working..." by resetProgressAndMessage
    077     */
    078    public void resetProgresAndWorkingMessage(String par1Str)
    079    {
    080        if (!this.mc.running)
    081        {
    082            if (!this.field_73724_e)
    083            {
    084                throw new MinecraftError();
    085            }
    086        }
    087        else
    088        {
    089            this.field_73723_d = 0L;
    090            this.field_73727_a = par1Str;
    091            this.setLoadingProgress(-1);
    092            this.field_73723_d = 0L;
    093        }
    094    }
    095
    096    /**
    097     * Updates the progress bar on the loading screen to the specified amount. Args: loadProgress
    098     */
    099    public void setLoadingProgress(int par1)
    100    {
    101        if (!this.mc.running)
    102        {
    103            if (!this.field_73724_e)
    104            {
    105                throw new MinecraftError();
    106            }
    107        }
    108        else
    109        {
    110            long j = Minecraft.getSystemTime();
    111
    112            if (j - this.field_73723_d >= 100L)
    113            {
    114                this.field_73723_d = j;
    115                ScaledResolution scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
    116                int k = scaledresolution.getScaledWidth();
    117                int l = scaledresolution.getScaledHeight();
    118                GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
    119                GL11.glMatrixMode(GL11.GL_PROJECTION);
    120                GL11.glLoadIdentity();
    121                GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D);
    122                GL11.glMatrixMode(GL11.GL_MODELVIEW);
    123                GL11.glLoadIdentity();
    124                GL11.glTranslatef(0.0F, 0.0F, -200.0F);
    125                GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    126                Tessellator tessellator = Tessellator.instance;
    127                this.mc.renderEngine.bindTexture("/gui/background.png");
    128                float f = 32.0F;
    129                tessellator.startDrawingQuads();
    130                tessellator.setColorOpaque_I(4210752);
    131                tessellator.addVertexWithUV(0.0D, (double)l, 0.0D, 0.0D, (double)((float)l / f));
    132                tessellator.addVertexWithUV((double)k, (double)l, 0.0D, (double)((float)k / f), (double)((float)l / f));
    133                tessellator.addVertexWithUV((double)k, 0.0D, 0.0D, (double)((float)k / f), 0.0D);
    134                tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
    135                tessellator.draw();
    136
    137                if (par1 >= 0)
    138                {
    139                    byte b0 = 100;
    140                    byte b1 = 2;
    141                    int i1 = k / 2 - b0 / 2;
    142                    int j1 = l / 2 + 16;
    143                    GL11.glDisable(GL11.GL_TEXTURE_2D);
    144                    tessellator.startDrawingQuads();
    145                    tessellator.setColorOpaque_I(8421504);
    146                    tessellator.addVertex((double)i1, (double)j1, 0.0D);
    147                    tessellator.addVertex((double)i1, (double)(j1 + b1), 0.0D);
    148                    tessellator.addVertex((double)(i1 + b0), (double)(j1 + b1), 0.0D);
    149                    tessellator.addVertex((double)(i1 + b0), (double)j1, 0.0D);
    150                    tessellator.setColorOpaque_I(8454016);
    151                    tessellator.addVertex((double)i1, (double)j1, 0.0D);
    152                    tessellator.addVertex((double)i1, (double)(j1 + b1), 0.0D);
    153                    tessellator.addVertex((double)(i1 + par1), (double)(j1 + b1), 0.0D);
    154                    tessellator.addVertex((double)(i1 + par1), (double)j1, 0.0D);
    155                    tessellator.draw();
    156                    GL11.glEnable(GL11.GL_TEXTURE_2D);
    157                }
    158
    159                this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (k - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, l / 2 - 4 - 16, 16777215);
    160                this.mc.fontRenderer.drawStringWithShadow(this.field_73727_a, (k - this.mc.fontRenderer.getStringWidth(this.field_73727_a)) / 2, l / 2 - 4 + 8, 16777215);
    161                Display.update();
    162
    163                try
    164                {
    165                    Thread.yield();
    166                }
    167                catch (Exception exception)
    168                {
    169                    ;
    170                }
    171            }
    172        }
    173    }
    174
    175    /**
    176     * called when there is no more progress to be had, both on completion and failure
    177     */
    178    public void onNoMoreProgress() {}
    179}