001    package net.minecraft.client.gui;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.client.Minecraft;
006    import net.minecraft.client.renderer.Tessellator;
007    import net.minecraft.util.IProgressUpdate;
008    import net.minecraft.util.MinecraftError;
009    import org.lwjgl.opengl.Display;
010    import org.lwjgl.opengl.GL11;
011    
012    @SideOnly(Side.CLIENT)
013    public 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 var2 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
065                GL11.glClear(256);
066                GL11.glMatrixMode(GL11.GL_PROJECTION);
067                GL11.glLoadIdentity();
068                GL11.glOrtho(0.0D, var2.getScaledWidth_double(), var2.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 var2 = Minecraft.getSystemTime();
111    
112                if (var2 - this.field_73723_d >= 100L)
113                {
114                    this.field_73723_d = var2;
115                    ScaledResolution var4 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
116                    int var5 = var4.getScaledWidth();
117                    int var6 = var4.getScaledHeight();
118                    GL11.glClear(256);
119                    GL11.glMatrixMode(GL11.GL_PROJECTION);
120                    GL11.glLoadIdentity();
121                    GL11.glOrtho(0.0D, var4.getScaledWidth_double(), var4.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(16640);
126                    Tessellator var7 = Tessellator.instance;
127                    int var8 = this.mc.renderEngine.getTexture("/gui/background.png");
128                    GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8);
129                    float var9 = 32.0F;
130                    var7.startDrawingQuads();
131                    var7.setColorOpaque_I(4210752);
132                    var7.addVertexWithUV(0.0D, (double)var6, 0.0D, 0.0D, (double)((float)var6 / var9));
133                    var7.addVertexWithUV((double)var5, (double)var6, 0.0D, (double)((float)var5 / var9), (double)((float)var6 / var9));
134                    var7.addVertexWithUV((double)var5, 0.0D, 0.0D, (double)((float)var5 / var9), 0.0D);
135                    var7.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
136                    var7.draw();
137    
138                    if (par1 >= 0)
139                    {
140                        byte var10 = 100;
141                        byte var11 = 2;
142                        int var12 = var5 / 2 - var10 / 2;
143                        int var13 = var6 / 2 + 16;
144                        GL11.glDisable(GL11.GL_TEXTURE_2D);
145                        var7.startDrawingQuads();
146                        var7.setColorOpaque_I(8421504);
147                        var7.addVertex((double)var12, (double)var13, 0.0D);
148                        var7.addVertex((double)var12, (double)(var13 + var11), 0.0D);
149                        var7.addVertex((double)(var12 + var10), (double)(var13 + var11), 0.0D);
150                        var7.addVertex((double)(var12 + var10), (double)var13, 0.0D);
151                        var7.setColorOpaque_I(8454016);
152                        var7.addVertex((double)var12, (double)var13, 0.0D);
153                        var7.addVertex((double)var12, (double)(var13 + var11), 0.0D);
154                        var7.addVertex((double)(var12 + par1), (double)(var13 + var11), 0.0D);
155                        var7.addVertex((double)(var12 + par1), (double)var13, 0.0D);
156                        var7.draw();
157                        GL11.glEnable(GL11.GL_TEXTURE_2D);
158                    }
159    
160                    this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (var5 - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, var6 / 2 - 4 - 16, 16777215);
161                    this.mc.fontRenderer.drawStringWithShadow(this.field_73727_a, (var5 - this.mc.fontRenderer.getStringWidth(this.field_73727_a)) / 2, var6 / 2 - 4 + 8, 16777215);
162                    Display.update();
163    
164                    try
165                    {
166                        Thread.yield();
167                    }
168                    catch (Exception var14)
169                    {
170                        ;
171                    }
172                }
173            }
174        }
175    
176        /**
177         * called when there is no more progress to be had, both on completion and failure
178         */
179        public void onNoMoreProgress() {}
180    }