001    package net.minecraft.client;
002    
003    import cpw.mods.fml.client.FMLClientHandler;
004    import cpw.mods.fml.common.FMLCommonHandler;
005    import cpw.mods.fml.common.Side;
006    import cpw.mods.fml.common.asm.SideOnly;
007    import cpw.mods.fml.common.registry.GameData;
008    import cpw.mods.fml.common.registry.GameRegistry;
009    import cpw.mods.fml.common.registry.ItemData;
010    import cpw.mods.fml.relauncher.ArgsWrapper;
011    import cpw.mods.fml.relauncher.FMLRelauncher;
012    
013    import java.awt.BorderLayout;
014    import java.awt.Canvas;
015    import java.awt.Color;
016    import java.awt.Component;
017    import java.awt.Dimension;
018    import java.awt.Frame;
019    import java.awt.Graphics;
020    import java.io.File;
021    import java.io.IOException;
022    import java.nio.ByteBuffer;
023    import java.text.DecimalFormat;
024    import java.util.HashMap;
025    import java.util.List;
026    import javax.swing.JPanel;
027    import net.minecraft.block.Block;
028    import net.minecraft.client.audio.SoundManager;
029    import net.minecraft.client.entity.EntityClientPlayerMP;
030    import net.minecraft.client.gui.FontRenderer;
031    import net.minecraft.client.gui.GuiChat;
032    import net.minecraft.client.gui.GuiErrorScreen;
033    import net.minecraft.client.gui.GuiGameOver;
034    import net.minecraft.client.gui.GuiIngame;
035    import net.minecraft.client.gui.GuiIngameMenu;
036    import net.minecraft.client.gui.GuiMainMenu;
037    import net.minecraft.client.gui.GuiMemoryErrorScreen;
038    import net.minecraft.client.gui.GuiScreen;
039    import net.minecraft.client.gui.GuiSleepMP;
040    import net.minecraft.client.gui.LoadingScreenRenderer;
041    import net.minecraft.client.gui.ScaledResolution;
042    import net.minecraft.client.gui.achievement.GuiAchievement;
043    import net.minecraft.client.gui.inventory.GuiInventory;
044    import net.minecraft.client.multiplayer.GuiConnecting;
045    import net.minecraft.client.multiplayer.NetClientHandler;
046    import net.minecraft.client.multiplayer.PlayerControllerMP;
047    import net.minecraft.client.multiplayer.ServerData;
048    import net.minecraft.client.multiplayer.WorldClient;
049    import net.minecraft.client.particle.EffectRenderer;
050    import net.minecraft.client.renderer.CallableParticleScreenName;
051    import net.minecraft.client.renderer.EntityRenderer;
052    import net.minecraft.client.renderer.GLAllocation;
053    import net.minecraft.client.renderer.ItemRenderer;
054    import net.minecraft.client.renderer.OpenGlHelper;
055    import net.minecraft.client.renderer.RenderBlocks;
056    import net.minecraft.client.renderer.RenderEngine;
057    import net.minecraft.client.renderer.RenderGlobal;
058    import net.minecraft.client.renderer.Tessellator;
059    import net.minecraft.client.renderer.WorldRenderer;
060    import net.minecraft.client.renderer.entity.RenderManager;
061    import net.minecraft.client.renderer.texturefx.TextureCompassFX;
062    import net.minecraft.client.renderer.texturefx.TextureFlamesFX;
063    import net.minecraft.client.renderer.texturefx.TextureLavaFX;
064    import net.minecraft.client.renderer.texturefx.TextureLavaFlowFX;
065    import net.minecraft.client.renderer.texturefx.TexturePortalFX;
066    import net.minecraft.client.renderer.texturefx.TextureWatchFX;
067    import net.minecraft.client.renderer.texturefx.TextureWaterFX;
068    import net.minecraft.client.renderer.texturefx.TextureWaterFlowFX;
069    import net.minecraft.client.settings.EnumOptions;
070    import net.minecraft.client.settings.GameSettings;
071    import net.minecraft.client.settings.KeyBinding;
072    import net.minecraft.client.texturepacks.TexturePackList;
073    import net.minecraft.crash.CrashReport;
074    import net.minecraft.crash.CrashReportCategory;
075    import net.minecraft.entity.EntityList;
076    import net.minecraft.entity.EntityLiving;
077    import net.minecraft.entity.item.EntityBoat;
078    import net.minecraft.entity.item.EntityItemFrame;
079    import net.minecraft.entity.item.EntityMinecart;
080    import net.minecraft.entity.item.EntityPainting;
081    import net.minecraft.item.Item;
082    import net.minecraft.item.ItemStack;
083    import net.minecraft.network.INetworkManager;
084    import net.minecraft.network.MemoryConnection;
085    import net.minecraft.network.packet.Packet3Chat;
086    import net.minecraft.profiler.IPlayerUsage;
087    import net.minecraft.profiler.PlayerUsageSnooper;
088    import net.minecraft.profiler.Profiler;
089    import net.minecraft.profiler.ProfilerResult;
090    import net.minecraft.server.integrated.IntegratedServer;
091    import net.minecraft.stats.AchievementList;
092    import net.minecraft.stats.StatFileWriter;
093    import net.minecraft.stats.StatList;
094    import net.minecraft.util.AxisAlignedBB;
095    import net.minecraft.util.EnumMovingObjectType;
096    import net.minecraft.util.EnumOS;
097    import net.minecraft.util.HttpUtil;
098    import net.minecraft.util.MathHelper;
099    import net.minecraft.util.MinecraftError;
100    import net.minecraft.util.MouseHelper;
101    import net.minecraft.util.MovementInputFromOptions;
102    import net.minecraft.util.MovingObjectPosition;
103    import net.minecraft.util.ReportedException;
104    import net.minecraft.util.ScreenShotHelper;
105    import net.minecraft.util.Session;
106    import net.minecraft.util.StatCollector;
107    import net.minecraft.util.StringTranslate;
108    import net.minecraft.util.ThreadDownloadResources;
109    import net.minecraft.util.Timer;
110    import net.minecraft.world.ColorizerFoliage;
111    import net.minecraft.world.ColorizerGrass;
112    import net.minecraft.world.ColorizerWater;
113    import net.minecraft.world.WorldSettings;
114    import net.minecraft.world.chunk.storage.AnvilSaveConverter;
115    import net.minecraft.world.storage.ISaveFormat;
116    import net.minecraft.world.storage.ISaveHandler;
117    import net.minecraft.world.storage.WorldInfo;
118    import org.lwjgl.LWJGLException;
119    import org.lwjgl.Sys;
120    import org.lwjgl.input.Keyboard;
121    import org.lwjgl.input.Mouse;
122    import org.lwjgl.opengl.ContextCapabilities;
123    import org.lwjgl.opengl.Display;
124    import org.lwjgl.opengl.DisplayMode;
125    import org.lwjgl.opengl.GL11;
126    import org.lwjgl.opengl.GL20;
127    import org.lwjgl.opengl.GLContext;
128    import org.lwjgl.opengl.PixelFormat;
129    import org.lwjgl.util.glu.GLU;
130    
131    import com.google.common.collect.MapDifference;
132    
133    import net.minecraftforge.common.ForgeHooks;
134    import net.minecraftforge.event.ForgeEventFactory;
135    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
136    
137    @SideOnly(Side.CLIENT)
138    public abstract class Minecraft implements Runnable, IPlayerUsage
139    {
140        /** A 10MiB preallocation to ensure the heap is reasonably sized. */
141        public static byte[] memoryReserve = new byte[10485760];
142        private ServerData currentServerData;
143    
144        /**
145         * Set to 'this' in Minecraft constructor; used by some settings get methods
146         */
147        private static Minecraft theMinecraft;
148        public PlayerControllerMP playerController;
149        private boolean fullscreen = false;
150        private boolean hasCrashed = false;
151    
152        /** Instance of CrashReport. */
153        private CrashReport crashReporter;
154        public int displayWidth;
155        public int displayHeight;
156        private Timer timer = new Timer(20.0F);
157    
158        /** Instance of PlayerUsageSnooper. */
159        private PlayerUsageSnooper usageSnooper = new PlayerUsageSnooper("client", this);
160        public WorldClient theWorld;
161        public RenderGlobal renderGlobal;
162        public EntityClientPlayerMP thePlayer;
163    
164        /**
165         * The Entity from which the renderer determines the render viewpoint. Currently is always the parent Minecraft
166         * class's 'thePlayer' instance. Modification of its location, rotation, or other settings at render time will
167         * modify the camera likewise, with the caveat of triggering chunk rebuilds as it moves, making it unsuitable for
168         * changing the viewpoint mid-render.
169         */
170        public EntityLiving renderViewEntity;
171        public EffectRenderer effectRenderer;
172        public Session session = null;
173        public String minecraftUri;
174        public Canvas mcCanvas;
175    
176        /** a boolean to hide a Quit button from the main menu */
177        public boolean hideQuitButton = false;
178        public volatile boolean isGamePaused = false;
179    
180        /** The RenderEngine instance used by Minecraft */
181        public RenderEngine renderEngine;
182    
183        /** The font renderer used for displaying and measuring text. */
184        public FontRenderer fontRenderer;
185        public FontRenderer standardGalacticFontRenderer;
186    
187        /** The GuiScreen that's being displayed at the moment. */
188        public GuiScreen currentScreen = null;
189        public LoadingScreenRenderer loadingScreen;
190        public EntityRenderer entityRenderer;
191    
192        /** Reference to the download resources thread. */
193        private ThreadDownloadResources downloadResourcesThread;
194    
195        /** Mouse left click counter */
196        private int leftClickCounter = 0;
197    
198        /** Display width */
199        private int tempDisplayWidth;
200    
201        /** Display height */
202        private int tempDisplayHeight;
203    
204        /** Instance of IntegratedServer. */
205        private IntegratedServer theIntegratedServer;
206    
207        /** Gui achievement */
208        public GuiAchievement guiAchievement = new GuiAchievement(this);
209        public GuiIngame ingameGUI;
210    
211        /** Skip render world */
212        public boolean skipRenderWorld = false;
213    
214        /** The ray trace hit that the mouse is over. */
215        public MovingObjectPosition objectMouseOver = null;
216    
217        /** The game settings that currently hold effect. */
218        public GameSettings gameSettings;
219        protected MinecraftApplet mcApplet;
220        public SoundManager sndManager = new SoundManager();
221    
222        /** Mouse helper instance. */
223        public MouseHelper mouseHelper;
224    
225        /** The TexturePackLister used by this instance of Minecraft... */
226        public TexturePackList texturePackList;
227        public File mcDataDir;
228        private ISaveFormat saveLoader;
229    
230        /**
231         * This is set to fpsCounter every debug screen update, and is shown on the debug screen. It's also sent as part of
232         * the usage snooping.
233         */
234        private static int debugFPS;
235    
236        /**
237         * When you place a block, it's set to 6, decremented once per tick, when it's 0, you can place another block.
238         */
239        private int rightClickDelayTimer = 0;
240    
241        /**
242         * Checked in Minecraft's while(running) loop, if true it's set to false and the textures refreshed.
243         */
244        private boolean refreshTexturePacksScheduled;
245    
246        /** Stat file writer */
247        public StatFileWriter statFileWriter;
248        private String serverName;
249        private int serverPort;
250        private TextureWaterFX textureWaterFX = new TextureWaterFX();
251        private TextureLavaFX textureLavaFX = new TextureLavaFX();
252    
253        /**
254         * Makes sure it doesn't keep taking screenshots when both buttons are down.
255         */
256        boolean isTakingScreenshot = false;
257    
258        /**
259         * Does the actual gameplay have focus. If so then mouse and keys will effect the player instead of menus.
260         */
261        public boolean inGameHasFocus = false;
262        long systemTime = getSystemTime();
263    
264        /** Join player counter */
265        private int joinPlayerCounter = 0;
266        private boolean isDemo;
267        private INetworkManager myNetworkManager;
268        private boolean integratedServerIsRunning;
269    
270        /** The profiler instance */
271        public final Profiler mcProfiler = new Profiler();
272        private long field_83002_am = -1L;
273    
274        /** The working dir (OS specific) for minecraft */
275        private static File minecraftDir = null;
276    
277        /**
278         * Set to true to keep the game loop running. Set to false by shutdown() to allow the game loop to exit cleanly.
279         */
280        public volatile boolean running = true;
281    
282        /** String that shows the debug information */
283        public String debug = "";
284    
285        /** Approximate time (in ms) of last update to debug string */
286        long debugUpdateTime = getSystemTime();
287    
288        /** holds the current fps */
289        int fpsCounter = 0;
290        long prevFrameTime = -1L;
291    
292        /** Profiler currently displayed in the debug screen pie chart */
293        private String debugProfilerName = "root";
294    
295        public Minecraft(Canvas par1Canvas, MinecraftApplet par2MinecraftApplet, int par3, int par4, boolean par5)
296        {
297            StatList.nopInit();
298            this.tempDisplayHeight = par4;
299            this.fullscreen = par5;
300            this.mcApplet = par2MinecraftApplet;
301            Packet3Chat.maxChatLength = 32767;
302            this.startTimerHackThread();
303            this.mcCanvas = par1Canvas;
304            this.displayWidth = par3;
305            this.displayHeight = par4;
306            this.fullscreen = par5;
307            theMinecraft = this;
308        }
309    
310        private void startTimerHackThread()
311        {
312            ThreadClientSleep var1 = new ThreadClientSleep(this, "Timer hack thread");
313            var1.setDaemon(true);
314            var1.start();
315        }
316    
317        public void crashed(CrashReport par1CrashReport)
318        {
319            this.hasCrashed = true;
320            this.crashReporter = par1CrashReport;
321        }
322    
323        /**
324         * Wrapper around displayCrashReportInternal
325         */
326        public void displayCrashReport(CrashReport par1CrashReport)
327        {
328            this.hasCrashed = true;
329            this.displayCrashReportInternal(par1CrashReport);
330        }
331    
332        public abstract void displayCrashReportInternal(CrashReport var1);
333    
334        public void setServer(String par1Str, int par2)
335        {
336            this.serverName = par1Str;
337            this.serverPort = par2;
338        }
339    
340        /**
341         * Starts the game: initializes the canvas, the title, the settings, etcetera.
342         */
343        public void startGame() throws LWJGLException
344        {
345            if (this.mcCanvas != null)
346            {
347                Graphics var1 = this.mcCanvas.getGraphics();
348    
349                if (var1 != null)
350                {
351                    var1.setColor(Color.BLACK);
352                    var1.fillRect(0, 0, this.displayWidth, this.displayHeight);
353                    var1.dispose();
354                }
355    
356                Display.setParent(this.mcCanvas);
357            }
358            else if (this.fullscreen)
359            {
360                Display.setFullscreen(true);
361                this.displayWidth = Display.getDisplayMode().getWidth();
362                this.displayHeight = Display.getDisplayMode().getHeight();
363    
364                if (this.displayWidth <= 0)
365                {
366                    this.displayWidth = 1;
367                }
368    
369                if (this.displayHeight <= 0)
370                {
371                    this.displayHeight = 1;
372                }
373            }
374            else
375            {
376                Display.setDisplayMode(new DisplayMode(this.displayWidth, this.displayHeight));
377            }
378    
379            Display.setTitle("Minecraft Minecraft 1.4.5");
380            System.out.println("LWJGL Version: " + Sys.getVersion());
381    
382            try
383            {
384                Display.create((new PixelFormat()).withDepthBits(24));
385            }
386            catch (LWJGLException var5)
387            {
388                var5.printStackTrace();
389    
390                try
391                {
392                    Thread.sleep(1000L);
393                }
394                catch (InterruptedException var4)
395                {
396                    ;
397                }
398    
399                Display.create();
400            }
401    
402            OpenGlHelper.initializeTextures();
403            this.mcDataDir = getMinecraftDir();
404            this.saveLoader = new AnvilSaveConverter(new File(this.mcDataDir, "saves"));
405            this.gameSettings = new GameSettings(this, this.mcDataDir);
406            this.texturePackList = new TexturePackList(this.mcDataDir, this);
407            this.renderEngine = new RenderEngine(this.texturePackList, this.gameSettings);
408            this.loadScreen();
409            this.fontRenderer = new FontRenderer(this.gameSettings, "/font/default.png", this.renderEngine, false);
410            this.standardGalacticFontRenderer = new FontRenderer(this.gameSettings, "/font/alternate.png", this.renderEngine, false);
411    
412            FMLClientHandler.instance().beginMinecraftLoading(this);
413    
414            if (this.gameSettings.language != null)
415            {
416                StringTranslate.getInstance().setLanguage(this.gameSettings.language);
417                this.fontRenderer.setUnicodeFlag(StringTranslate.getInstance().isUnicode());
418                this.fontRenderer.setBidiFlag(StringTranslate.isBidirectional(this.gameSettings.language));
419            }
420    
421            ColorizerWater.setWaterBiomeColorizer(this.renderEngine.getTextureContents("/misc/watercolor.png"));
422            ColorizerGrass.setGrassBiomeColorizer(this.renderEngine.getTextureContents("/misc/grasscolor.png"));
423            ColorizerFoliage.setFoliageBiomeColorizer(this.renderEngine.getTextureContents("/misc/foliagecolor.png"));
424            this.entityRenderer = new EntityRenderer(this);
425            RenderManager.instance.itemRenderer = new ItemRenderer(this);
426            this.statFileWriter = new StatFileWriter(this.session, this.mcDataDir);
427            AchievementList.openInventory.setStatStringFormatter(new StatStringFormatKeyInv(this));
428            this.loadScreen();
429            Mouse.create();
430            this.mouseHelper = new MouseHelper(this.mcCanvas, this.gameSettings);
431            this.checkGLError("Pre startup");
432            GL11.glEnable(GL11.GL_TEXTURE_2D);
433            GL11.glShadeModel(GL11.GL_SMOOTH);
434            GL11.glClearDepth(1.0D);
435            GL11.glEnable(GL11.GL_DEPTH_TEST);
436            GL11.glDepthFunc(GL11.GL_LEQUAL);
437            GL11.glEnable(GL11.GL_ALPHA_TEST);
438            GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
439            GL11.glCullFace(GL11.GL_BACK);
440            GL11.glMatrixMode(GL11.GL_PROJECTION);
441            GL11.glLoadIdentity();
442            GL11.glMatrixMode(GL11.GL_MODELVIEW);
443            this.checkGLError("Startup");
444            this.sndManager.loadSoundSettings(this.gameSettings);
445            this.renderEngine.registerTextureFX(this.textureLavaFX);
446            this.renderEngine.registerTextureFX(this.textureWaterFX);
447            this.renderEngine.registerTextureFX(new TexturePortalFX());
448            this.renderEngine.registerTextureFX(new TextureCompassFX(this));
449            this.renderEngine.registerTextureFX(new TextureWatchFX(this));
450            this.renderEngine.registerTextureFX(new TextureWaterFlowFX());
451            this.renderEngine.registerTextureFX(new TextureLavaFlowFX());
452            this.renderEngine.registerTextureFX(new TextureFlamesFX(0));
453            this.renderEngine.registerTextureFX(new TextureFlamesFX(1));
454            this.renderGlobal = new RenderGlobal(this, this.renderEngine);
455            GL11.glViewport(0, 0, this.displayWidth, this.displayHeight);
456            this.effectRenderer = new EffectRenderer(this.theWorld, this.renderEngine);
457    
458            FMLClientHandler.instance().finishMinecraftLoading();
459    
460            try
461            {
462                this.downloadResourcesThread = new ThreadDownloadResources(this.mcDataDir, this);
463                this.downloadResourcesThread.start();
464            }
465            catch (Exception var3)
466            {
467                ;
468            }
469    
470            this.checkGLError("Post startup");
471            this.ingameGUI = new GuiIngame(this);
472    
473            if (this.serverName != null)
474            {
475                this.displayGuiScreen(new GuiConnecting(this, this.serverName, this.serverPort));
476            }
477            else
478            {
479                this.displayGuiScreen(new GuiMainMenu());
480            }
481    
482            this.loadingScreen = new LoadingScreenRenderer(this);
483    
484            if (this.gameSettings.fullScreen && !this.fullscreen)
485            {
486                this.toggleFullscreen();
487            }
488    
489            FMLClientHandler.instance().onInitializationComplete();
490        }
491    
492        /**
493         * Displays a new screen.
494         */
495        private void loadScreen() throws LWJGLException
496        {
497            ScaledResolution var1 = new ScaledResolution(this.gameSettings, this.displayWidth, this.displayHeight);
498            GL11.glClear(16640);
499            GL11.glMatrixMode(GL11.GL_PROJECTION);
500            GL11.glLoadIdentity();
501            GL11.glOrtho(0.0D, var1.getScaledWidth_double(), var1.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D);
502            GL11.glMatrixMode(GL11.GL_MODELVIEW);
503            GL11.glLoadIdentity();
504            GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
505            GL11.glViewport(0, 0, this.displayWidth, this.displayHeight);
506            GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
507            GL11.glDisable(GL11.GL_LIGHTING);
508            GL11.glEnable(GL11.GL_TEXTURE_2D);
509            GL11.glDisable(GL11.GL_FOG);
510            Tessellator var2 = Tessellator.instance;
511            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/title/mojang.png"));
512            var2.startDrawingQuads();
513            var2.setColorOpaque_I(16777215);
514            var2.addVertexWithUV(0.0D, (double)this.displayHeight, 0.0D, 0.0D, 0.0D);
515            var2.addVertexWithUV((double)this.displayWidth, (double)this.displayHeight, 0.0D, 0.0D, 0.0D);
516            var2.addVertexWithUV((double)this.displayWidth, 0.0D, 0.0D, 0.0D, 0.0D);
517            var2.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
518            var2.draw();
519            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
520            var2.setColorOpaque_I(16777215);
521            short var3 = 256;
522            short var4 = 256;
523            this.scaledTessellator((var1.getScaledWidth() - var3) / 2, (var1.getScaledHeight() - var4) / 2, 0, 0, var3, var4);
524            GL11.glDisable(GL11.GL_LIGHTING);
525            GL11.glDisable(GL11.GL_FOG);
526            GL11.glEnable(GL11.GL_ALPHA_TEST);
527            GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
528            Display.swapBuffers();
529        }
530    
531        /**
532         * Loads Tessellator with a scaled resolution
533         */
534        public void scaledTessellator(int par1, int par2, int par3, int par4, int par5, int par6)
535        {
536            float var7 = 0.00390625F;
537            float var8 = 0.00390625F;
538            Tessellator var9 = Tessellator.instance;
539            var9.startDrawingQuads();
540            var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + par6), 0.0D, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + par6) * var8));
541            var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + par6), 0.0D, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + par6) * var8));
542            var9.addVertexWithUV((double)(par1 + par5), (double)(par2 + 0), 0.0D, (double)((float)(par3 + par5) * var7), (double)((float)(par4 + 0) * var8));
543            var9.addVertexWithUV((double)(par1 + 0), (double)(par2 + 0), 0.0D, (double)((float)(par3 + 0) * var7), (double)((float)(par4 + 0) * var8));
544            var9.draw();
545        }
546    
547        /**
548         * gets the working dir (OS specific) for minecraft
549         */
550        public static File getMinecraftDir()
551        {
552            if (minecraftDir == null)
553            {
554                minecraftDir = getAppDir("minecraft");
555            }
556    
557            return minecraftDir;
558        }
559    
560        /**
561         * gets the working dir (OS specific) for the specific application (which is always minecraft)
562         */
563        public static File getAppDir(String par0Str)
564        {
565            String var1 = System.getProperty("user.home", ".");
566            File var2;
567    
568            switch (EnumOSHelper.field_90049_a[getOs().ordinal()])
569            {
570                case 1:
571                case 2:
572                    var2 = new File(var1, '.' + par0Str + '/');
573                    break;
574                case 3:
575                    String var3 = System.getenv("APPDATA");
576    
577                    if (var3 != null)
578                    {
579                        var2 = new File(var3, "." + par0Str + '/');
580                    }
581                    else
582                    {
583                        var2 = new File(var1, '.' + par0Str + '/');
584                    }
585    
586                    break;
587                case 4:
588                    var2 = new File(var1, "Library/Application Support/" + par0Str);
589                    break;
590                default:
591                    var2 = new File(var1, par0Str + '/');
592            }
593    
594            if (!var2.exists() && !var2.mkdirs())
595            {
596                throw new RuntimeException("The working directory could not be created: " + var2);
597            }
598            else
599            {
600                return var2;
601            }
602        }
603    
604        public static EnumOS getOs()
605        {
606            String var0 = System.getProperty("os.name").toLowerCase();
607            return var0.contains("win") ? EnumOS.WINDOWS : (var0.contains("mac") ? EnumOS.MACOS : (var0.contains("solaris") ? EnumOS.SOLARIS : (var0.contains("sunos") ? EnumOS.SOLARIS : (var0.contains("linux") ? EnumOS.LINUX : (var0.contains("unix") ? EnumOS.LINUX : EnumOS.UNKNOWN)))));
608        }
609    
610        /**
611         * Returns the save loader that is currently being used
612         */
613        public ISaveFormat getSaveLoader()
614        {
615            return this.saveLoader;
616        }
617    
618        /**
619         * Sets the argument GuiScreen as the main (topmost visible) screen.
620         */
621        public void displayGuiScreen(GuiScreen par1GuiScreen)
622        {
623            if (!(this.currentScreen instanceof GuiErrorScreen))
624            {
625                if (this.currentScreen != null)
626                {
627                    this.currentScreen.onGuiClosed();
628                }
629    
630                this.statFileWriter.syncStats();
631    
632                if (par1GuiScreen == null && this.theWorld == null)
633                {
634                    par1GuiScreen = new GuiMainMenu();
635                }
636                else if (par1GuiScreen == null && this.thePlayer.getHealth() <= 0)
637                {
638                    par1GuiScreen = new GuiGameOver();
639                }
640    
641                if (par1GuiScreen instanceof GuiMainMenu)
642                {
643                    this.gameSettings.showDebugInfo = false;
644                    this.ingameGUI.getChatGUI().func_73761_a();
645                }
646    
647                this.currentScreen = (GuiScreen)par1GuiScreen;
648    
649                if (par1GuiScreen != null)
650                {
651                    this.setIngameNotInFocus();
652                    ScaledResolution var2 = new ScaledResolution(this.gameSettings, this.displayWidth, this.displayHeight);
653                    int var3 = var2.getScaledWidth();
654                    int var4 = var2.getScaledHeight();
655                    ((GuiScreen)par1GuiScreen).setWorldAndResolution(this, var3, var4);
656                    this.skipRenderWorld = false;
657                }
658                else
659                {
660                    this.setIngameFocus();
661                }
662            }
663        }
664    
665        /**
666         * Checks for an OpenGL error. If there is one, prints the error ID and error string.
667         */
668        private void checkGLError(String par1Str)
669        {
670            int var2 = GL11.glGetError();
671    
672            if (var2 != 0)
673            {
674                String var3 = GLU.gluErrorString(var2);
675                System.out.println("########## GL ERROR ##########");
676                System.out.println("@ " + par1Str);
677                System.out.println(var2 + ": " + var3);
678            }
679        }
680    
681        /**
682         * Shuts down the minecraft applet by stopping the resource downloads, and clearing up GL stuff; called when the
683         * application (or web page) is exited.
684         */
685        public void shutdownMinecraftApplet()
686        {
687            try
688            {
689                this.statFileWriter.syncStats();
690    
691                try
692                {
693                    if (this.downloadResourcesThread != null)
694                    {
695                        this.downloadResourcesThread.closeMinecraft();
696                    }
697                }
698                catch (Exception var9)
699                {
700                    ;
701                }
702    
703                System.out.println("Stopping!");
704    
705                try
706                {
707                    this.loadWorld((WorldClient)null);
708                }
709                catch (Throwable var8)
710                {
711                    ;
712                }
713    
714                try
715                {
716                    GLAllocation.deleteTexturesAndDisplayLists();
717                }
718                catch (Throwable var7)
719                {
720                    ;
721                }
722    
723                this.sndManager.closeMinecraft();
724                Mouse.destroy();
725                Keyboard.destroy();
726            }
727            finally
728            {
729                Display.destroy();
730    
731                if (!this.hasCrashed)
732                {
733                    System.exit(0);
734                }
735            }
736    
737            System.gc();
738        }
739    
740        public void run()
741        {
742            this.running = true;
743    
744            try
745            {
746                this.startGame();
747            }
748            catch (Exception var11)
749            {
750                var11.printStackTrace();
751                this.displayCrashReport(this.addGraphicsAndWorldToCrashReport(new CrashReport("Failed to start game", var11)));
752                return;
753            }
754    
755            try
756            {
757                while (this.running)
758                {
759                    if (this.hasCrashed && this.crashReporter != null)
760                    {
761                        this.displayCrashReport(this.crashReporter);
762                        return;
763                    }
764    
765                    if (this.refreshTexturePacksScheduled)
766                    {
767                        this.refreshTexturePacksScheduled = false;
768                        this.renderEngine.refreshTextures();
769                    }
770    
771                    try
772                    {
773                        this.runGameLoop();
774                    }
775                    catch (OutOfMemoryError var10)
776                    {
777                        this.freeMemory();
778                        this.displayGuiScreen(new GuiMemoryErrorScreen());
779                        System.gc();
780                    }
781                }
782            }
783            catch (MinecraftError var12)
784            {
785                ;
786            }
787            catch (ReportedException var13)
788            {
789                this.addGraphicsAndWorldToCrashReport(var13.getCrashReport());
790                this.freeMemory();
791                var13.printStackTrace();
792                this.displayCrashReport(var13.getCrashReport());
793            }
794            catch (Throwable var14)
795            {
796                CrashReport var2 = this.addGraphicsAndWorldToCrashReport(new CrashReport("Unexpected error", var14));
797                this.freeMemory();
798                var14.printStackTrace();
799                this.displayCrashReport(var2);
800            }
801            finally
802            {
803                this.shutdownMinecraftApplet();
804            }
805        }
806    
807        /**
808         * Called repeatedly from run()
809         */
810        private void runGameLoop()
811        {
812            if (this.mcApplet != null && !this.mcApplet.isActive())
813            {
814                this.running = false;
815            }
816            else
817            {
818                AxisAlignedBB.getAABBPool().cleanPool();
819    
820                if (this.theWorld != null)
821                {
822                    this.theWorld.getWorldVec3Pool().clear();
823                }
824    
825                this.mcProfiler.startSection("root");
826    
827                if (this.mcCanvas == null && Display.isCloseRequested())
828                {
829                    this.shutdown();
830                }
831    
832                if (this.isGamePaused && this.theWorld != null)
833                {
834                    float var1 = this.timer.renderPartialTicks;
835                    this.timer.updateTimer();
836                    this.timer.renderPartialTicks = var1;
837                }
838                else
839                {
840                    this.timer.updateTimer();
841                }
842    
843                long var6 = System.nanoTime();
844                this.mcProfiler.startSection("tick");
845    
846                for (int var3 = 0; var3 < this.timer.elapsedTicks; ++var3)
847                {
848                    this.runTick();
849                }
850    
851                this.mcProfiler.endStartSection("preRenderErrors");
852                long var7 = System.nanoTime() - var6;
853                this.checkGLError("Pre render");
854                RenderBlocks.fancyGrass = this.gameSettings.fancyGraphics;
855                this.mcProfiler.endStartSection("sound");
856                this.sndManager.setListener(this.thePlayer, this.timer.renderPartialTicks);
857                this.mcProfiler.endSection();
858                this.mcProfiler.startSection("render");
859                this.mcProfiler.startSection("display");
860                GL11.glEnable(GL11.GL_TEXTURE_2D);
861    
862                if (!Keyboard.isKeyDown(65))
863                {
864                    Display.update();
865                }
866    
867                if (this.thePlayer != null && this.thePlayer.isEntityInsideOpaqueBlock())
868                {
869                    this.gameSettings.thirdPersonView = 0;
870                }
871    
872                this.mcProfiler.endSection();
873    
874                if (!this.skipRenderWorld)
875                {
876                    FMLCommonHandler.instance().onRenderTickStart(this.timer.renderPartialTicks);
877                    this.mcProfiler.endStartSection("gameRenderer");
878                    this.entityRenderer.updateCameraAndRender(this.timer.renderPartialTicks);
879                    this.mcProfiler.endSection();
880                    FMLCommonHandler.instance().onRenderTickEnd(this.timer.renderPartialTicks);
881                }
882    
883                GL11.glFlush();
884                this.mcProfiler.endSection();
885    
886                if (!Display.isActive() && this.fullscreen)
887                {
888                    this.toggleFullscreen();
889                }
890    
891                if (this.gameSettings.showDebugInfo && this.gameSettings.showDebugProfilerChart)
892                {
893                    if (!this.mcProfiler.profilingEnabled)
894                    {
895                        this.mcProfiler.clearProfiling();
896                    }
897    
898                    this.mcProfiler.profilingEnabled = true;
899                    this.displayDebugInfo(var7);
900                }
901                else
902                {
903                    this.mcProfiler.profilingEnabled = false;
904                    this.prevFrameTime = System.nanoTime();
905                }
906    
907                this.guiAchievement.updateAchievementWindow();
908                this.mcProfiler.startSection("root");
909                Thread.yield();
910    
911                if (Keyboard.isKeyDown(65))
912                {
913                    Display.update();
914                }
915    
916                this.screenshotListener();
917    
918                if (this.mcCanvas != null && !this.fullscreen && (this.mcCanvas.getWidth() != this.displayWidth || this.mcCanvas.getHeight() != this.displayHeight))
919                {
920                    this.displayWidth = this.mcCanvas.getWidth();
921                    this.displayHeight = this.mcCanvas.getHeight();
922    
923                    if (this.displayWidth <= 0)
924                    {
925                        this.displayWidth = 1;
926                    }
927    
928                    if (this.displayHeight <= 0)
929                    {
930                        this.displayHeight = 1;
931                    }
932    
933                    this.resize(this.displayWidth, this.displayHeight);
934                }
935    
936                this.checkGLError("Post render");
937                ++this.fpsCounter;
938                boolean var5 = this.isGamePaused;
939                this.isGamePaused = this.isSingleplayer() && this.currentScreen != null && this.currentScreen.doesGuiPauseGame() && !this.theIntegratedServer.getPublic();
940    
941                if (this.isIntegratedServerRunning() && this.thePlayer != null && this.thePlayer.sendQueue != null && this.isGamePaused != var5)
942                {
943                    ((MemoryConnection)this.thePlayer.sendQueue.getNetManager()).setGamePaused(this.isGamePaused);
944                }
945    
946                while (getSystemTime() >= this.debugUpdateTime + 1000L)
947                {
948                    debugFPS = this.fpsCounter;
949                    this.debug = debugFPS + " fps, " + WorldRenderer.chunksUpdated + " chunk updates";
950                    WorldRenderer.chunksUpdated = 0;
951                    this.debugUpdateTime += 1000L;
952                    this.fpsCounter = 0;
953                    this.usageSnooper.addMemoryStatsToSnooper();
954    
955                    if (!this.usageSnooper.isSnooperRunning())
956                    {
957                        this.usageSnooper.startSnooper();
958                    }
959                }
960    
961                this.mcProfiler.endSection();
962    
963                if (this.func_90020_K() > 0)
964                {
965                    Display.sync(EntityRenderer.func_78465_a(this.func_90020_K()));
966                }
967            }
968        }
969    
970        private int func_90020_K()
971        {
972            return this.currentScreen != null && this.currentScreen instanceof GuiMainMenu ? 2 : this.gameSettings.limitFramerate;
973        }
974    
975        public void freeMemory()
976        {
977            try
978            {
979                memoryReserve = new byte[0];
980                this.renderGlobal.func_72728_f();
981            }
982            catch (Throwable var4)
983            {
984                ;
985            }
986    
987            try
988            {
989                System.gc();
990                AxisAlignedBB.getAABBPool().clearPool();
991                this.theWorld.getWorldVec3Pool().clearAndFreeCache();
992            }
993            catch (Throwable var3)
994            {
995                ;
996            }
997    
998            try
999            {
1000                System.gc();
1001                this.loadWorld((WorldClient)null);
1002            }
1003            catch (Throwable var2)
1004            {
1005                ;
1006            }
1007    
1008            System.gc();
1009        }
1010    
1011        /**
1012         * checks if keys are down
1013         */
1014        private void screenshotListener()
1015        {
1016            if (Keyboard.isKeyDown(60))
1017            {
1018                if (!this.isTakingScreenshot)
1019                {
1020                    this.isTakingScreenshot = true;
1021                    this.ingameGUI.getChatGUI().printChatMessage(ScreenShotHelper.saveScreenshot(minecraftDir, this.displayWidth, this.displayHeight));
1022                }
1023            }
1024            else
1025            {
1026                this.isTakingScreenshot = false;
1027            }
1028        }
1029    
1030        /**
1031         * Update debugProfilerName in response to number keys in debug screen
1032         */
1033        private void updateDebugProfilerName(int par1)
1034        {
1035            List var2 = this.mcProfiler.getProfilingData(this.debugProfilerName);
1036    
1037            if (var2 != null && !var2.isEmpty())
1038            {
1039                ProfilerResult var3 = (ProfilerResult)var2.remove(0);
1040    
1041                if (par1 == 0)
1042                {
1043                    if (var3.field_76331_c.length() > 0)
1044                    {
1045                        int var4 = this.debugProfilerName.lastIndexOf(".");
1046    
1047                        if (var4 >= 0)
1048                        {
1049                            this.debugProfilerName = this.debugProfilerName.substring(0, var4);
1050                        }
1051                    }
1052                }
1053                else
1054                {
1055                    --par1;
1056    
1057                    if (par1 < var2.size() && !((ProfilerResult)var2.get(par1)).field_76331_c.equals("unspecified"))
1058                    {
1059                        if (this.debugProfilerName.length() > 0)
1060                        {
1061                            this.debugProfilerName = this.debugProfilerName + ".";
1062                        }
1063    
1064                        this.debugProfilerName = this.debugProfilerName + ((ProfilerResult)var2.get(par1)).field_76331_c;
1065                    }
1066                }
1067            }
1068        }
1069    
1070        private void displayDebugInfo(long par1)
1071        {
1072            if (this.mcProfiler.profilingEnabled)
1073            {
1074                List var3 = this.mcProfiler.getProfilingData(this.debugProfilerName);
1075                ProfilerResult var4 = (ProfilerResult)var3.remove(0);
1076                GL11.glClear(256);
1077                GL11.glMatrixMode(GL11.GL_PROJECTION);
1078                GL11.glEnable(GL11.GL_COLOR_MATERIAL);
1079                GL11.glLoadIdentity();
1080                GL11.glOrtho(0.0D, (double)this.displayWidth, (double)this.displayHeight, 0.0D, 1000.0D, 3000.0D);
1081                GL11.glMatrixMode(GL11.GL_MODELVIEW);
1082                GL11.glLoadIdentity();
1083                GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
1084                GL11.glLineWidth(1.0F);
1085                GL11.glDisable(GL11.GL_TEXTURE_2D);
1086                Tessellator var5 = Tessellator.instance;
1087                short var6 = 160;
1088                int var7 = this.displayWidth - var6 - 10;
1089                int var8 = this.displayHeight - var6 * 2;
1090                GL11.glEnable(GL11.GL_BLEND);
1091                var5.startDrawingQuads();
1092                var5.setColorRGBA_I(0, 200);
1093                var5.addVertex((double)((float)var7 - (float)var6 * 1.1F), (double)((float)var8 - (float)var6 * 0.6F - 16.0F), 0.0D);
1094                var5.addVertex((double)((float)var7 - (float)var6 * 1.1F), (double)(var8 + var6 * 2), 0.0D);
1095                var5.addVertex((double)((float)var7 + (float)var6 * 1.1F), (double)(var8 + var6 * 2), 0.0D);
1096                var5.addVertex((double)((float)var7 + (float)var6 * 1.1F), (double)((float)var8 - (float)var6 * 0.6F - 16.0F), 0.0D);
1097                var5.draw();
1098                GL11.glDisable(GL11.GL_BLEND);
1099                double var9 = 0.0D;
1100                int var13;
1101    
1102                for (int var11 = 0; var11 < var3.size(); ++var11)
1103                {
1104                    ProfilerResult var12 = (ProfilerResult)var3.get(var11);
1105                    var13 = MathHelper.floor_double(var12.field_76332_a / 4.0D) + 1;
1106                    var5.startDrawing(6);
1107                    var5.setColorOpaque_I(var12.func_76329_a());
1108                    var5.addVertex((double)var7, (double)var8, 0.0D);
1109                    int var14;
1110                    float var15;
1111                    float var17;
1112                    float var16;
1113    
1114                    for (var14 = var13; var14 >= 0; --var14)
1115                    {
1116                        var15 = (float)((var9 + var12.field_76332_a * (double)var14 / (double)var13) * Math.PI * 2.0D / 100.0D);
1117                        var16 = MathHelper.sin(var15) * (float)var6;
1118                        var17 = MathHelper.cos(var15) * (float)var6 * 0.5F;
1119                        var5.addVertex((double)((float)var7 + var16), (double)((float)var8 - var17), 0.0D);
1120                    }
1121    
1122                    var5.draw();
1123                    var5.startDrawing(5);
1124                    var5.setColorOpaque_I((var12.func_76329_a() & 16711422) >> 1);
1125    
1126                    for (var14 = var13; var14 >= 0; --var14)
1127                    {
1128                        var15 = (float)((var9 + var12.field_76332_a * (double)var14 / (double)var13) * Math.PI * 2.0D / 100.0D);
1129                        var16 = MathHelper.sin(var15) * (float)var6;
1130                        var17 = MathHelper.cos(var15) * (float)var6 * 0.5F;
1131                        var5.addVertex((double)((float)var7 + var16), (double)((float)var8 - var17), 0.0D);
1132                        var5.addVertex((double)((float)var7 + var16), (double)((float)var8 - var17 + 10.0F), 0.0D);
1133                    }
1134    
1135                    var5.draw();
1136                    var9 += var12.field_76332_a;
1137                }
1138    
1139                DecimalFormat var19 = new DecimalFormat("##0.00");
1140                GL11.glEnable(GL11.GL_TEXTURE_2D);
1141                String var18 = "";
1142    
1143                if (!var4.field_76331_c.equals("unspecified"))
1144                {
1145                    var18 = var18 + "[0] ";
1146                }
1147    
1148                if (var4.field_76331_c.length() == 0)
1149                {
1150                    var18 = var18 + "ROOT ";
1151                }
1152                else
1153                {
1154                    var18 = var18 + var4.field_76331_c + " ";
1155                }
1156    
1157                var13 = 16777215;
1158                this.fontRenderer.drawStringWithShadow(var18, var7 - var6, var8 - var6 / 2 - 16, var13);
1159                this.fontRenderer.drawStringWithShadow(var18 = var19.format(var4.field_76330_b) + "%", var7 + var6 - this.fontRenderer.getStringWidth(var18), var8 - var6 / 2 - 16, var13);
1160    
1161                for (int var21 = 0; var21 < var3.size(); ++var21)
1162                {
1163                    ProfilerResult var20 = (ProfilerResult)var3.get(var21);
1164                    String var22 = "";
1165    
1166                    if (var20.field_76331_c.equals("unspecified"))
1167                    {
1168                        var22 = var22 + "[?] ";
1169                    }
1170                    else
1171                    {
1172                        var22 = var22 + "[" + (var21 + 1) + "] ";
1173                    }
1174    
1175                    var22 = var22 + var20.field_76331_c;
1176                    this.fontRenderer.drawStringWithShadow(var22, var7 - var6, var8 + var6 / 2 + var21 * 8 + 20, var20.func_76329_a());
1177                    this.fontRenderer.drawStringWithShadow(var22 = var19.format(var20.field_76332_a) + "%", var7 + var6 - 50 - this.fontRenderer.getStringWidth(var22), var8 + var6 / 2 + var21 * 8 + 20, var20.func_76329_a());
1178                    this.fontRenderer.drawStringWithShadow(var22 = var19.format(var20.field_76330_b) + "%", var7 + var6 - this.fontRenderer.getStringWidth(var22), var8 + var6 / 2 + var21 * 8 + 20, var20.func_76329_a());
1179                }
1180            }
1181        }
1182    
1183        /**
1184         * Called when the window is closing. Sets 'running' to false which allows the game loop to exit cleanly.
1185         */
1186        public void shutdown()
1187        {
1188            this.running = false;
1189        }
1190    
1191        /**
1192         * Will set the focus to ingame if the Minecraft window is the active with focus. Also clears any GUI screen
1193         * currently displayed
1194         */
1195        public void setIngameFocus()
1196        {
1197            if (Display.isActive())
1198            {
1199                if (!this.inGameHasFocus)
1200                {
1201                    this.inGameHasFocus = true;
1202                    this.mouseHelper.grabMouseCursor();
1203                    this.displayGuiScreen((GuiScreen)null);
1204                    this.leftClickCounter = 10000;
1205                }
1206            }
1207        }
1208    
1209        /**
1210         * Resets the player keystate, disables the ingame focus, and ungrabs the mouse cursor.
1211         */
1212        public void setIngameNotInFocus()
1213        {
1214            if (this.inGameHasFocus)
1215            {
1216                KeyBinding.unPressAllKeys();
1217                this.inGameHasFocus = false;
1218                this.mouseHelper.ungrabMouseCursor();
1219            }
1220        }
1221    
1222        /**
1223         * Displays the ingame menu
1224         */
1225        public void displayInGameMenu()
1226        {
1227            if (this.currentScreen == null)
1228            {
1229                this.displayGuiScreen(new GuiIngameMenu());
1230    
1231                if (this.isSingleplayer() && !this.theIntegratedServer.getPublic())
1232                {
1233                    this.sndManager.pauseAllSounds();
1234                }
1235            }
1236        }
1237    
1238        private void sendClickBlockToController(int par1, boolean par2)
1239        {
1240            if (!par2)
1241            {
1242                this.leftClickCounter = 0;
1243            }
1244    
1245            if (par1 != 0 || this.leftClickCounter <= 0)
1246            {
1247                if (par2 && this.objectMouseOver != null && this.objectMouseOver.typeOfHit == EnumMovingObjectType.TILE && par1 == 0)
1248                {
1249                    int var3 = this.objectMouseOver.blockX;
1250                    int var4 = this.objectMouseOver.blockY;
1251                    int var5 = this.objectMouseOver.blockZ;
1252                    this.playerController.onPlayerDamageBlock(var3, var4, var5, this.objectMouseOver.sideHit);
1253    
1254                    if (this.thePlayer.canCurrentToolHarvestBlock(var3, var4, var5))
1255                    {
1256                        this.effectRenderer.addBlockHitEffects(var3, var4, var5, this.objectMouseOver);
1257                        this.thePlayer.swingItem();
1258                    }
1259                }
1260                else
1261                {
1262                    this.playerController.resetBlockRemoving();
1263                }
1264            }
1265        }
1266    
1267        /**
1268         * Called whenever the mouse is clicked. Button clicked is 0 for left clicking and 1 for right clicking. Args:
1269         * buttonClicked
1270         */
1271        private void clickMouse(int par1)
1272        {
1273            if (par1 != 0 || this.leftClickCounter <= 0)
1274            {
1275                if (par1 == 0)
1276                {
1277                    this.thePlayer.swingItem();
1278                }
1279    
1280                if (par1 == 1)
1281                {
1282                    this.rightClickDelayTimer = 4;
1283                }
1284    
1285                boolean var2 = true;
1286                ItemStack var3 = this.thePlayer.inventory.getCurrentItem();
1287    
1288                if (this.objectMouseOver == null)
1289                {
1290                    if (par1 == 0 && this.playerController.isNotCreative())
1291                    {
1292                        this.leftClickCounter = 10;
1293                    }
1294                }
1295                else if (this.objectMouseOver.typeOfHit == EnumMovingObjectType.ENTITY)
1296                {
1297                    if (par1 == 0)
1298                    {
1299                        this.playerController.attackEntity(this.thePlayer, this.objectMouseOver.entityHit);
1300                    }
1301    
1302                    if (par1 == 1 && this.playerController.func_78768_b(this.thePlayer, this.objectMouseOver.entityHit))
1303                    {
1304                        var2 = false;
1305                    }
1306                }
1307                else if (this.objectMouseOver.typeOfHit == EnumMovingObjectType.TILE)
1308                {
1309                    int var4 = this.objectMouseOver.blockX;
1310                    int var5 = this.objectMouseOver.blockY;
1311                    int var6 = this.objectMouseOver.blockZ;
1312                    int var7 = this.objectMouseOver.sideHit;
1313    
1314                    if (par1 == 0)
1315                    {
1316                        this.playerController.clickBlock(var4, var5, var6, this.objectMouseOver.sideHit);
1317                    }
1318                    else
1319                    {
1320                        int var8 = var3 != null ? var3.stackSize : 0;
1321    
1322                        boolean result = !ForgeEventFactory.onPlayerInteract(thePlayer, Action.RIGHT_CLICK_BLOCK, var4, var5, var6, var7).isCanceled();
1323                        if (result && this.playerController.onPlayerRightClick(this.thePlayer, this.theWorld, var3, var4, var5, var6, var7, this.objectMouseOver.hitVec))
1324                        {
1325                            var2 = false;
1326                            this.thePlayer.swingItem();
1327                        }
1328    
1329                        if (var3 == null)
1330                        {
1331                            return;
1332                        }
1333    
1334                        if (var3.stackSize == 0)
1335                        {
1336                            this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null;
1337                        }
1338                        else if (var3.stackSize != var8 || this.playerController.isInCreativeMode())
1339                        {
1340                            this.entityRenderer.itemRenderer.func_78444_b();
1341                        }
1342                    }
1343                }
1344    
1345                if (var2 && par1 == 1)
1346                {
1347                    ItemStack var9 = this.thePlayer.inventory.getCurrentItem();
1348    
1349                    boolean result = !ForgeEventFactory.onPlayerInteract(thePlayer, Action.RIGHT_CLICK_AIR, 0, 0, 0, -1).isCanceled();
1350                    if (result && var9 != null && this.playerController.sendUseItem(this.thePlayer, this.theWorld, var9))
1351                    {
1352                        this.entityRenderer.itemRenderer.func_78445_c();
1353                    }
1354                }
1355            }
1356        }
1357    
1358        /**
1359         * Toggles fullscreen mode.
1360         */
1361        public void toggleFullscreen()
1362        {
1363            try
1364            {
1365                this.fullscreen = !this.fullscreen;
1366    
1367                if (this.fullscreen)
1368                {
1369                    Display.setDisplayMode(Display.getDesktopDisplayMode());
1370                    this.displayWidth = Display.getDisplayMode().getWidth();
1371                    this.displayHeight = Display.getDisplayMode().getHeight();
1372    
1373                    if (this.displayWidth <= 0)
1374                    {
1375                        this.displayWidth = 1;
1376                    }
1377    
1378                    if (this.displayHeight <= 0)
1379                    {
1380                        this.displayHeight = 1;
1381                    }
1382                }
1383                else
1384                {
1385                    if (this.mcCanvas != null)
1386                    {
1387                        this.displayWidth = this.mcCanvas.getWidth();
1388                        this.displayHeight = this.mcCanvas.getHeight();
1389                    }
1390                    else
1391                    {
1392                        this.displayWidth = this.tempDisplayWidth;
1393                        this.displayHeight = this.tempDisplayHeight;
1394                    }
1395    
1396                    if (this.displayWidth <= 0)
1397                    {
1398                        this.displayWidth = 1;
1399                    }
1400    
1401                    if (this.displayHeight <= 0)
1402                    {
1403                        this.displayHeight = 1;
1404                    }
1405                }
1406    
1407                if (this.currentScreen != null)
1408                {
1409                    this.resize(this.displayWidth, this.displayHeight);
1410                }
1411    
1412                Display.setFullscreen(this.fullscreen);
1413                Display.setVSyncEnabled(this.gameSettings.enableVsync);
1414                Display.update();
1415            }
1416            catch (Exception var2)
1417            {
1418                var2.printStackTrace();
1419            }
1420        }
1421    
1422        /**
1423         * Called to resize the current screen.
1424         */
1425        private void resize(int par1, int par2)
1426        {
1427            this.displayWidth = par1 <= 0 ? 1 : par1;
1428            this.displayHeight = par2 <= 0 ? 1 : par2;
1429    
1430            if (this.currentScreen != null)
1431            {
1432                ScaledResolution var3 = new ScaledResolution(this.gameSettings, par1, par2);
1433                int var4 = var3.getScaledWidth();
1434                int var5 = var3.getScaledHeight();
1435                this.currentScreen.setWorldAndResolution(this, var4, var5);
1436            }
1437        }
1438    
1439        /**
1440         * Runs the current tick.
1441         */
1442        public void runTick()
1443        {
1444            FMLCommonHandler.instance().rescheduleTicks(Side.CLIENT);
1445    
1446            if (this.rightClickDelayTimer > 0)
1447            {
1448                --this.rightClickDelayTimer;
1449            }
1450    
1451            FMLCommonHandler.instance().onPreClientTick();
1452    
1453            this.mcProfiler.startSection("stats");
1454            this.statFileWriter.func_77449_e();
1455            this.mcProfiler.endStartSection("gui");
1456    
1457            if (!this.isGamePaused)
1458            {
1459                this.ingameGUI.updateTick();
1460            }
1461    
1462            this.mcProfiler.endStartSection("pick");
1463            this.entityRenderer.getMouseOver(1.0F);
1464            this.mcProfiler.endStartSection("gameMode");
1465    
1466            if (!this.isGamePaused && this.theWorld != null)
1467            {
1468                this.playerController.updateController();
1469            }
1470    
1471            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain.png"));
1472            this.mcProfiler.endStartSection("textures");
1473    
1474            if (!this.isGamePaused)
1475            {
1476                this.renderEngine.updateDynamicTextures();
1477            }
1478    
1479            if (this.currentScreen == null && this.thePlayer != null)
1480            {
1481                if (this.thePlayer.getHealth() <= 0)
1482                {
1483                    this.displayGuiScreen((GuiScreen)null);
1484                }
1485                else if (this.thePlayer.isPlayerSleeping() && this.theWorld != null)
1486                {
1487                    this.displayGuiScreen(new GuiSleepMP());
1488                }
1489            }
1490            else if (this.currentScreen != null && this.currentScreen instanceof GuiSleepMP && !this.thePlayer.isPlayerSleeping())
1491            {
1492                this.displayGuiScreen((GuiScreen)null);
1493            }
1494    
1495            if (this.currentScreen != null)
1496            {
1497                this.leftClickCounter = 10000;
1498            }
1499    
1500            CrashReport var2;
1501            CrashReportCategory var3;
1502    
1503            if (this.currentScreen != null)
1504            {
1505                try
1506                {
1507                    this.currentScreen.handleInput();
1508                }
1509                catch (Throwable var6)
1510                {
1511                    var2 = CrashReport.func_85055_a(var6, "Updating screen events");
1512                    var3 = var2.func_85058_a("Affected screen");
1513                    var3.addCrashSectionCallable("Screen name", new CallableUpdatingScreenName(this));
1514                    throw new ReportedException(var2);
1515                }
1516    
1517                if (this.currentScreen != null)
1518                {
1519                    try
1520                    {
1521                        this.currentScreen.guiParticles.update();
1522                    }
1523                    catch (Throwable var5)
1524                    {
1525                        var2 = CrashReport.func_85055_a(var5, "Ticking screen particles");
1526                        var3 = var2.func_85058_a("Affected screen");
1527                        var3.addCrashSectionCallable("Screen name", new CallableParticleScreenName(this));
1528                        throw new ReportedException(var2);
1529                    }
1530    
1531                    try
1532                    {
1533                        this.currentScreen.updateScreen();
1534                    }
1535                    catch (Throwable var4)
1536                    {
1537                        var2 = CrashReport.func_85055_a(var4, "Ticking screen");
1538                        var3 = var2.func_85058_a("Affected screen");
1539                        var3.addCrashSectionCallable("Screen name", new CallableTickingScreenName(this));
1540                        throw new ReportedException(var2);
1541                    }
1542                }
1543            }
1544    
1545            if (this.currentScreen == null || this.currentScreen.allowUserInput)
1546            {
1547                this.mcProfiler.endStartSection("mouse");
1548    
1549                while (Mouse.next())
1550                {
1551                    KeyBinding.setKeyBindState(Mouse.getEventButton() - 100, Mouse.getEventButtonState());
1552    
1553                    if (Mouse.getEventButtonState())
1554                    {
1555                        KeyBinding.onTick(Mouse.getEventButton() - 100);
1556                    }
1557    
1558                    long var1 = getSystemTime() - this.systemTime;
1559    
1560                    if (var1 <= 200L)
1561                    {
1562                        int var10 = Mouse.getEventDWheel();
1563    
1564                        if (var10 != 0)
1565                        {
1566                            this.thePlayer.inventory.changeCurrentItem(var10);
1567    
1568                            if (this.gameSettings.noclip)
1569                            {
1570                                if (var10 > 0)
1571                                {
1572                                    var10 = 1;
1573                                }
1574    
1575                                if (var10 < 0)
1576                                {
1577                                    var10 = -1;
1578                                }
1579    
1580                                this.gameSettings.noclipRate += (float)var10 * 0.25F;
1581                            }
1582                        }
1583    
1584                        if (this.currentScreen == null)
1585                        {
1586                            if (!this.inGameHasFocus && Mouse.getEventButtonState())
1587                            {
1588                                this.setIngameFocus();
1589                            }
1590                        }
1591                        else if (this.currentScreen != null)
1592                        {
1593                            this.currentScreen.handleMouseInput();
1594                        }
1595                    }
1596                }
1597    
1598                if (this.leftClickCounter > 0)
1599                {
1600                    --this.leftClickCounter;
1601                }
1602    
1603                this.mcProfiler.endStartSection("keyboard");
1604                boolean var8;
1605    
1606                while (Keyboard.next())
1607                {
1608                    KeyBinding.setKeyBindState(Keyboard.getEventKey(), Keyboard.getEventKeyState());
1609    
1610                    if (Keyboard.getEventKeyState())
1611                    {
1612                        KeyBinding.onTick(Keyboard.getEventKey());
1613                    }
1614    
1615                    if (this.field_83002_am > 0L)
1616                    {
1617                        if (getSystemTime() - this.field_83002_am >= 6000L)
1618                        {
1619                            throw new ReportedException(new CrashReport("Manually triggered debug crash", new Throwable()));
1620                        }
1621    
1622                        if (!Keyboard.isKeyDown(46) || !Keyboard.isKeyDown(61))
1623                        {
1624                            this.field_83002_am = -1L;
1625                        }
1626                    }
1627                    else if (Keyboard.isKeyDown(46) && Keyboard.isKeyDown(61))
1628                    {
1629                        this.field_83002_am = getSystemTime();
1630                    }
1631    
1632                    if (Keyboard.getEventKeyState())
1633                    {
1634                        if (Keyboard.getEventKey() == 87)
1635                        {
1636                            this.toggleFullscreen();
1637                        }
1638                        else
1639                        {
1640                            if (this.currentScreen != null)
1641                            {
1642                                this.currentScreen.handleKeyboardInput();
1643                            }
1644                            else
1645                            {
1646                                if (Keyboard.getEventKey() == 1)
1647                                {
1648                                    this.displayInGameMenu();
1649                                }
1650    
1651                                if (Keyboard.getEventKey() == 31 && Keyboard.isKeyDown(61))
1652                                {
1653                                    this.forceReload();
1654                                }
1655    
1656                                if (Keyboard.getEventKey() == 20 && Keyboard.isKeyDown(61))
1657                                {
1658                                    this.renderEngine.refreshTextures();
1659                                }
1660    
1661                                if (Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(61))
1662                                {
1663                                    var8 = Keyboard.isKeyDown(42) | Keyboard.isKeyDown(54);
1664                                    this.gameSettings.setOptionValue(EnumOptions.RENDER_DISTANCE, var8 ? -1 : 1);
1665                                }
1666    
1667                                if (Keyboard.getEventKey() == 30 && Keyboard.isKeyDown(61))
1668                                {
1669                                    this.renderGlobal.loadRenderers();
1670                                }
1671    
1672                                if (Keyboard.getEventKey() == 35 && Keyboard.isKeyDown(61))
1673                                {
1674                                    this.gameSettings.advancedItemTooltips = !this.gameSettings.advancedItemTooltips;
1675                                    this.gameSettings.saveOptions();
1676                                }
1677    
1678                                if (Keyboard.getEventKey() == 48 && Keyboard.isKeyDown(61))
1679                                {
1680                                    RenderManager.field_85095_o = !RenderManager.field_85095_o;
1681                                }
1682    
1683                                if (Keyboard.getEventKey() == 25 && Keyboard.isKeyDown(61))
1684                                {
1685                                    this.gameSettings.pauseOnLostFocus = !this.gameSettings.pauseOnLostFocus;
1686                                    this.gameSettings.saveOptions();
1687                                }
1688    
1689                                if (Keyboard.getEventKey() == 59)
1690                                {
1691                                    this.gameSettings.hideGUI = !this.gameSettings.hideGUI;
1692                                }
1693    
1694                                if (Keyboard.getEventKey() == 61)
1695                                {
1696                                    this.gameSettings.showDebugInfo = !this.gameSettings.showDebugInfo;
1697                                    this.gameSettings.showDebugProfilerChart = GuiScreen.isShiftKeyDown();
1698                                }
1699    
1700                                if (Keyboard.getEventKey() == 63)
1701                                {
1702                                    ++this.gameSettings.thirdPersonView;
1703    
1704                                    if (this.gameSettings.thirdPersonView > 2)
1705                                    {
1706                                        this.gameSettings.thirdPersonView = 0;
1707                                    }
1708                                }
1709    
1710                                if (Keyboard.getEventKey() == 66)
1711                                {
1712                                    this.gameSettings.smoothCamera = !this.gameSettings.smoothCamera;
1713                                }
1714                            }
1715    
1716                            int var9;
1717    
1718                            for (var9 = 0; var9 < 9; ++var9)
1719                            {
1720                                if (Keyboard.getEventKey() == 2 + var9)
1721                                {
1722                                    this.thePlayer.inventory.currentItem = var9;
1723                                }
1724                            }
1725    
1726                            if (this.gameSettings.showDebugInfo && this.gameSettings.showDebugProfilerChart)
1727                            {
1728                                if (Keyboard.getEventKey() == 11)
1729                                {
1730                                    this.updateDebugProfilerName(0);
1731                                }
1732    
1733                                for (var9 = 0; var9 < 9; ++var9)
1734                                {
1735                                    if (Keyboard.getEventKey() == 2 + var9)
1736                                    {
1737                                        this.updateDebugProfilerName(var9 + 1);
1738                                    }
1739                                }
1740                            }
1741                        }
1742                    }
1743                }
1744    
1745                var8 = this.gameSettings.chatVisibility != 2;
1746    
1747                while (this.gameSettings.keyBindInventory.isPressed())
1748                {
1749                    this.displayGuiScreen(new GuiInventory(this.thePlayer));
1750                }
1751    
1752                while (this.gameSettings.keyBindDrop.isPressed())
1753                {
1754                    this.thePlayer.dropOneItem();
1755                }
1756    
1757                while (this.gameSettings.keyBindChat.isPressed() && var8)
1758                {
1759                    this.displayGuiScreen(new GuiChat());
1760                }
1761    
1762                if (this.currentScreen == null && this.gameSettings.keyBindCommand.isPressed() && var8)
1763                {
1764                    this.displayGuiScreen(new GuiChat("/"));
1765                }
1766    
1767                if (this.thePlayer.isUsingItem())
1768                {
1769                    if (!this.gameSettings.keyBindUseItem.pressed)
1770                    {
1771                        this.playerController.onStoppedUsingItem(this.thePlayer);
1772                    }
1773    
1774                    label379:
1775    
1776                    while (true)
1777                    {
1778                        if (!this.gameSettings.keyBindAttack.isPressed())
1779                        {
1780                            while (this.gameSettings.keyBindUseItem.isPressed())
1781                            {
1782                                ;
1783                            }
1784    
1785                            while (true)
1786                            {
1787                                if (this.gameSettings.keyBindPickBlock.isPressed())
1788                                {
1789                                    continue;
1790                                }
1791    
1792                                break label379;
1793                            }
1794                        }
1795                    }
1796                }
1797                else
1798                {
1799                    while (this.gameSettings.keyBindAttack.isPressed())
1800                    {
1801                        this.clickMouse(0);
1802                    }
1803    
1804                    while (this.gameSettings.keyBindUseItem.isPressed())
1805                    {
1806                        this.clickMouse(1);
1807                    }
1808    
1809                    while (this.gameSettings.keyBindPickBlock.isPressed())
1810                    {
1811                        this.clickMiddleMouseButton();
1812                    }
1813                }
1814    
1815                if (this.gameSettings.keyBindUseItem.pressed && this.rightClickDelayTimer == 0 && !this.thePlayer.isUsingItem())
1816                {
1817                    this.clickMouse(1);
1818                }
1819    
1820                this.sendClickBlockToController(0, this.currentScreen == null && this.gameSettings.keyBindAttack.pressed && this.inGameHasFocus);
1821            }
1822    
1823            if (this.theWorld != null)
1824            {
1825                if (this.thePlayer != null)
1826                {
1827                    ++this.joinPlayerCounter;
1828    
1829                    if (this.joinPlayerCounter == 30)
1830                    {
1831                        this.joinPlayerCounter = 0;
1832                        this.theWorld.joinEntityInSurroundings(this.thePlayer);
1833                    }
1834                }
1835    
1836                this.mcProfiler.endStartSection("gameRenderer");
1837    
1838                if (!this.isGamePaused)
1839                {
1840                    this.entityRenderer.updateRenderer();
1841                }
1842    
1843                this.mcProfiler.endStartSection("levelRenderer");
1844    
1845                if (!this.isGamePaused)
1846                {
1847                    this.renderGlobal.updateClouds();
1848                }
1849    
1850                this.mcProfiler.endStartSection("level");
1851    
1852                if (!this.isGamePaused)
1853                {
1854                    if (this.theWorld.lightningFlash > 0)
1855                    {
1856                        --this.theWorld.lightningFlash;
1857                    }
1858    
1859                    this.theWorld.updateEntities();
1860                }
1861    
1862                if (!this.isGamePaused)
1863                {
1864                    this.theWorld.setAllowedSpawnTypes(this.theWorld.difficultySetting > 0, true);
1865    
1866                    try
1867                    {
1868                        this.theWorld.tick();
1869                    }
1870                    catch (Throwable var7)
1871                    {
1872                        var2 = CrashReport.func_85055_a(var7, "Exception in world tick");
1873    
1874                        if (this.theWorld == null)
1875                        {
1876                            var3 = var2.func_85058_a("Affected level");
1877                            var3.addCrashSection("Problem", "Level is null!");
1878                        }
1879                        else
1880                        {
1881                            this.theWorld.addWorldInfoToCrashReport(var2);
1882                        }
1883    
1884                        throw new ReportedException(var2);
1885                    }
1886                }
1887    
1888                this.mcProfiler.endStartSection("animateTick");
1889    
1890                if (!this.isGamePaused && this.theWorld != null)
1891                {
1892                    this.theWorld.func_73029_E(MathHelper.floor_double(this.thePlayer.posX), MathHelper.floor_double(this.thePlayer.posY), MathHelper.floor_double(this.thePlayer.posZ));
1893                }
1894    
1895                this.mcProfiler.endStartSection("particles");
1896    
1897                if (!this.isGamePaused)
1898                {
1899                    this.effectRenderer.updateEffects();
1900                }
1901            }
1902            else if (this.myNetworkManager != null)
1903            {
1904                this.mcProfiler.endStartSection("pendingConnection");
1905                this.myNetworkManager.processReadPackets();
1906            }
1907    
1908            FMLCommonHandler.instance().onPostClientTick();
1909    
1910            this.mcProfiler.endSection();
1911            this.systemTime = getSystemTime();
1912        }
1913    
1914        /**
1915         * Forces a reload of the sound manager and all the resources. Called in game by holding 'F3' and pressing 'S'.
1916         */
1917        private void forceReload()
1918        {
1919            System.out.println("FORCING RELOAD!");
1920    
1921            if (this.sndManager != null)
1922            {
1923                this.sndManager.stopAllSounds();
1924            }
1925    
1926            this.sndManager = new SoundManager();
1927            this.sndManager.loadSoundSettings(this.gameSettings);
1928            this.downloadResourcesThread.reloadResources();
1929        }
1930    
1931        /**
1932         * Arguments: World foldername,  World ingame name, WorldSettings
1933         */
1934        public void launchIntegratedServer(String par1Str, String par2Str, WorldSettings par3WorldSettings)
1935        {
1936            this.loadWorld((WorldClient)null);
1937            System.gc();
1938            ISaveHandler var4 = this.saveLoader.getSaveLoader(par1Str, false);
1939            WorldInfo var5 = var4.loadWorldInfo();
1940    
1941            if (var5 == null && par3WorldSettings != null)
1942            {
1943                this.statFileWriter.readStat(StatList.createWorldStat, 1);
1944                var5 = new WorldInfo(par3WorldSettings, par1Str);
1945                var4.saveWorldInfo(var5);
1946            }
1947    
1948            if (par3WorldSettings == null)
1949            {
1950                par3WorldSettings = new WorldSettings(var5);
1951            }
1952    
1953            this.statFileWriter.readStat(StatList.startGameStat, 1);
1954    
1955            GameData.initializeServerGate(2);
1956    
1957            this.theIntegratedServer = new IntegratedServer(this, par1Str, par2Str, par3WorldSettings);
1958            this.theIntegratedServer.startServerThread();
1959    
1960            MapDifference<Integer, ItemData> idDifferences = GameData.gateWorldLoadingForValidation();
1961            if (idDifferences!=null)
1962            {
1963                FMLClientHandler.instance().warnIDMismatch(idDifferences, true);
1964            }
1965            else
1966            {
1967                GameData.releaseGate(true);
1968                continueWorldLoading();
1969            }
1970    
1971        }
1972    
1973        public void continueWorldLoading()
1974        {
1975            this.integratedServerIsRunning = true;
1976            this.loadingScreen.displayProgressMessage(StatCollector.translateToLocal("menu.loadingLevel"));
1977    
1978            while (!this.theIntegratedServer.serverIsInRunLoop())
1979            {
1980                String var6 = this.theIntegratedServer.getUserMessage();
1981    
1982                if (var6 != null)
1983                {
1984                    this.loadingScreen.resetProgresAndWorkingMessage(StatCollector.translateToLocal(var6));
1985                }
1986                else
1987                {
1988                    this.loadingScreen.resetProgresAndWorkingMessage("");
1989                }
1990    
1991                try
1992                {
1993                    Thread.sleep(200L);
1994                }
1995                catch (InterruptedException var9)
1996                {
1997                    ;
1998                }
1999            }
2000    
2001            this.displayGuiScreen((GuiScreen)null);
2002    
2003            try
2004            {
2005                NetClientHandler var10 = new NetClientHandler(this, this.theIntegratedServer);
2006                this.myNetworkManager = var10.getNetManager();
2007            }
2008            catch (IOException var8)
2009            {
2010                this.displayCrashReport(this.addGraphicsAndWorldToCrashReport(new CrashReport("Connecting to integrated server", var8)));
2011            }
2012        }
2013    
2014        /**
2015         * unloads the current world first
2016         */
2017        public void loadWorld(WorldClient par1WorldClient)
2018        {
2019            this.loadWorld(par1WorldClient, "");
2020        }
2021    
2022        /**
2023         * par2Str is displayed on the loading screen to the user unloads the current world first
2024         */
2025        public void loadWorld(WorldClient par1WorldClient, String par2Str)
2026        {
2027            this.statFileWriter.syncStats();
2028    
2029            if (par1WorldClient == null)
2030            {
2031                NetClientHandler var3 = this.getSendQueue();
2032    
2033                if (var3 != null)
2034                {
2035                    var3.cleanup();
2036                }
2037    
2038                if (this.myNetworkManager != null)
2039                {
2040                    this.myNetworkManager.closeConnections();
2041                }
2042    
2043                if (this.theIntegratedServer != null)
2044                {
2045                    this.theIntegratedServer.initiateShutdown();
2046                    if (loadingScreen!=null)
2047                    {
2048                        this.loadingScreen.resetProgresAndWorkingMessage("Shutting down internal server...");
2049                    }
2050                    while (!theIntegratedServer.isServerStopped())
2051                    {
2052                        try
2053                        {
2054                            Thread.sleep(10);
2055                        }
2056                        catch (InterruptedException ie) {}
2057                    }
2058                }
2059    
2060                this.theIntegratedServer = null;
2061            }
2062    
2063            this.renderViewEntity = null;
2064            this.myNetworkManager = null;
2065    
2066            if (this.loadingScreen != null)
2067            {
2068                this.loadingScreen.resetProgressAndMessage(par2Str);
2069                this.loadingScreen.resetProgresAndWorkingMessage("");
2070            }
2071    
2072            if (par1WorldClient == null && this.theWorld != null)
2073            {
2074                if (this.texturePackList.getIsDownloading())
2075                {
2076                    this.texturePackList.onDownloadFinished();
2077                }
2078    
2079                this.setServerData((ServerData)null);
2080                this.integratedServerIsRunning = false;
2081            }
2082    
2083            this.sndManager.playStreaming((String)null, 0.0F, 0.0F, 0.0F);
2084            this.sndManager.stopAllSounds();
2085            this.theWorld = par1WorldClient;
2086    
2087            if (par1WorldClient != null)
2088            {
2089                if (this.renderGlobal != null)
2090                {
2091                    this.renderGlobal.setWorldAndLoadRenderers(par1WorldClient);
2092                }
2093    
2094                if (this.effectRenderer != null)
2095                {
2096                    this.effectRenderer.clearEffects(par1WorldClient);
2097                }
2098    
2099                if (this.thePlayer == null)
2100                {
2101                    this.thePlayer = this.playerController.func_78754_a(par1WorldClient);
2102                    this.playerController.flipPlayer(this.thePlayer);
2103                }
2104    
2105                this.thePlayer.preparePlayerToSpawn();
2106                par1WorldClient.spawnEntityInWorld(this.thePlayer);
2107                this.thePlayer.movementInput = new MovementInputFromOptions(this.gameSettings);
2108                this.playerController.setPlayerCapabilities(this.thePlayer);
2109                this.renderViewEntity = this.thePlayer;
2110            }
2111            else
2112            {
2113                this.saveLoader.flushCache();
2114                this.thePlayer = null;
2115            }
2116    
2117            System.gc();
2118            this.systemTime = 0L;
2119        }
2120    
2121        /**
2122         * Installs a resource. Currently only sounds are download so this method just adds them to the SoundManager.
2123         */
2124        public void installResource(String par1Str, File par2File)
2125        {
2126            int var3 = par1Str.indexOf("/");
2127            String var4 = par1Str.substring(0, var3);
2128            par1Str = par1Str.substring(var3 + 1);
2129    
2130            if (var4.equalsIgnoreCase("sound3"))
2131            {
2132                this.sndManager.addSound(par1Str, par2File);
2133            }
2134            else if (var4.equalsIgnoreCase("streaming"))
2135            {
2136                this.sndManager.addStreaming(par1Str, par2File);
2137            }
2138            else if (var4.equalsIgnoreCase("music") || var4.equalsIgnoreCase("newmusic"))
2139            {
2140                this.sndManager.addMusic(par1Str, par2File);
2141            }
2142        }
2143    
2144        /**
2145         * A String of renderGlobal.getDebugInfoRenders
2146         */
2147        public String debugInfoRenders()
2148        {
2149            return this.renderGlobal.getDebugInfoRenders();
2150        }
2151    
2152        /**
2153         * Gets the information in the F3 menu about how many entities are infront/around you
2154         */
2155        public String getEntityDebug()
2156        {
2157            return this.renderGlobal.getDebugInfoEntities();
2158        }
2159    
2160        /**
2161         * Gets the name of the world's current chunk provider
2162         */
2163        public String getWorldProviderName()
2164        {
2165            return this.theWorld.getProviderName();
2166        }
2167    
2168        /**
2169         * A String of how many entities are in the world
2170         */
2171        public String debugInfoEntities()
2172        {
2173            return "P: " + this.effectRenderer.getStatistics() + ". T: " + this.theWorld.getDebugLoadedEntities();
2174        }
2175    
2176        public void setDimensionAndSpawnPlayer(int par1)
2177        {
2178            this.theWorld.setSpawnLocation();
2179            this.theWorld.removeAllEntities();
2180            int var2 = 0;
2181    
2182            if (this.thePlayer != null)
2183            {
2184                var2 = this.thePlayer.entityId;
2185                this.theWorld.setEntityDead(this.thePlayer);
2186            }
2187    
2188            this.renderViewEntity = null;
2189            this.thePlayer = this.playerController.func_78754_a(this.theWorld);
2190            this.thePlayer.dimension = par1;
2191            this.renderViewEntity = this.thePlayer;
2192            this.thePlayer.preparePlayerToSpawn();
2193            this.theWorld.spawnEntityInWorld(this.thePlayer);
2194            this.playerController.flipPlayer(this.thePlayer);
2195            this.thePlayer.movementInput = new MovementInputFromOptions(this.gameSettings);
2196            this.thePlayer.entityId = var2;
2197            this.playerController.setPlayerCapabilities(this.thePlayer);
2198    
2199            if (this.currentScreen instanceof GuiGameOver)
2200            {
2201                this.displayGuiScreen((GuiScreen)null);
2202            }
2203        }
2204    
2205        /**
2206         * Sets whether this is a demo or not.
2207         */
2208        void setDemo(boolean par1)
2209        {
2210            this.isDemo = par1;
2211        }
2212    
2213        /**
2214         * Gets whether this is a demo or not.
2215         */
2216        public final boolean isDemo()
2217        {
2218            return this.isDemo;
2219        }
2220    
2221        /**
2222         * get the client packet send queue
2223         */
2224        public NetClientHandler getSendQueue()
2225        {
2226            return this.thePlayer != null ? this.thePlayer.sendQueue : null;
2227        }
2228    
2229        public static void main(String[] par0ArrayOfStr)
2230        {
2231            FMLRelauncher.handleClientRelaunch(new ArgsWrapper(par0ArrayOfStr));
2232        }
2233    
2234        public static void fmlReentry(ArgsWrapper wrapper)
2235        {
2236            String[] par0ArrayOfStr = wrapper.args;
2237            HashMap var1 = new HashMap();
2238            boolean var2 = false;
2239            boolean var3 = true;
2240            boolean var4 = false;
2241            String var5 = "Player" + getSystemTime() % 1000L;
2242    
2243            if (par0ArrayOfStr.length > 0)
2244            {
2245                var5 = par0ArrayOfStr[0];
2246            }
2247    
2248            String var6 = "-";
2249    
2250            if (par0ArrayOfStr.length > 1)
2251            {
2252                var6 = par0ArrayOfStr[1];
2253            }
2254    
2255            for (int var7 = 2; var7 < par0ArrayOfStr.length; ++var7)
2256            {
2257                String var8 = par0ArrayOfStr[var7];
2258                String var9 = var7 == par0ArrayOfStr.length - 1 ? null : par0ArrayOfStr[var7 + 1];
2259                boolean var10 = false;
2260    
2261                if (!var8.equals("-demo") && !var8.equals("--demo"))
2262                {
2263                    if (var8.equals("--applet"))
2264                    {
2265                        var3 = false;
2266                    }
2267                    else if (var8.equals("--password") && var9 != null)
2268                    {
2269                        String[] var11 = HttpUtil.func_82718_a(var5, var9);
2270    
2271                        if (var11 != null)
2272                        {
2273                            var5 = var11[0];
2274                            var6 = var11[1];
2275                            System.out.println("Logged in insecurely as " + var5 + " - sessionId is " + var6);
2276                        }
2277                        else
2278                        {
2279                            System.out.println("Could not log in as " + var5 + " with given password");
2280                        }
2281    
2282                        var10 = true;
2283                    }
2284                }
2285                else
2286                {
2287                    var2 = true;
2288                }
2289    
2290                if (var10)
2291                {
2292                    ++var7;
2293                }
2294            }
2295    
2296            var1.put("demo", "" + var2);
2297            var1.put("stand-alone", "" + var3);
2298            var1.put("username", var5);
2299            var1.put("fullscreen", "" + var4);
2300            var1.put("sessionid", var6);
2301            Frame var13 = new Frame();
2302            var13.setTitle("Minecraft");
2303            var13.setBackground(Color.BLACK);
2304            JPanel var12 = new JPanel();
2305            var13.setLayout(new BorderLayout());
2306            var12.setPreferredSize(new Dimension(854, 480));
2307            var13.add(var12, "Center");
2308            var13.pack();
2309            var13.setLocationRelativeTo((Component)null);
2310            var13.setVisible(true);
2311            var13.addWindowListener(new GameWindowListener());
2312            MinecraftFakeLauncher var14 = new MinecraftFakeLauncher(var1);
2313            MinecraftApplet var15 = new MinecraftApplet();
2314            var15.setStub(var14);
2315            var14.setLayout(new BorderLayout());
2316            var14.add(var15, "Center");
2317            var14.validate();
2318            var13.removeAll();
2319            var13.setLayout(new BorderLayout());
2320            var13.add(var14, "Center");
2321            var13.validate();
2322            var15.init();
2323            var15.start();
2324            Runtime.getRuntime().addShutdownHook(new ThreadShutdown());
2325        }
2326    
2327        public static boolean isGuiEnabled()
2328        {
2329            return theMinecraft == null || !theMinecraft.gameSettings.hideGUI;
2330        }
2331    
2332        public static boolean isFancyGraphicsEnabled()
2333        {
2334            return theMinecraft != null && theMinecraft.gameSettings.fancyGraphics;
2335        }
2336    
2337        /**
2338         * Returns if ambient occlusion is enabled
2339         */
2340        public static boolean isAmbientOcclusionEnabled()
2341        {
2342            return theMinecraft != null && theMinecraft.gameSettings.ambientOcclusion;
2343        }
2344    
2345        public static boolean isDebugInfoEnabled()
2346        {
2347            return theMinecraft != null && theMinecraft.gameSettings.showDebugInfo;
2348        }
2349    
2350        /**
2351         * Returns true if the message is a client command and should not be sent to the server. However there are no such
2352         * commands at this point in time.
2353         */
2354        public boolean handleClientCommand(String par1Str)
2355        {
2356            return !par1Str.startsWith("/") ? false : false;
2357        }
2358    
2359        /**
2360         * Called when the middle mouse button gets clicked
2361         */
2362        private void clickMiddleMouseButton()
2363        {
2364            if (this.objectMouseOver != null)
2365            {
2366                boolean var1 = this.thePlayer.capabilities.isCreativeMode;
2367                int var5;
2368    
2369                if (!ForgeHooks.onPickBlock(this.objectMouseOver, this.thePlayer, this.theWorld))
2370                {
2371                    return;
2372                }
2373    
2374                if (var1)
2375                {
2376                    var5 = this.thePlayer.inventoryContainer.inventorySlots.size() - 9 + this.thePlayer.inventory.currentItem;
2377                    this.playerController.sendSlotPacket(this.thePlayer.inventory.getStackInSlot(this.thePlayer.inventory.currentItem), var5);
2378                }
2379            }
2380        }
2381    
2382        /**
2383         * adds core server Info (GL version , Texture pack, isModded, type), and the worldInfo to the crash report
2384         */
2385        public CrashReport addGraphicsAndWorldToCrashReport(CrashReport par1CrashReport)
2386        {
2387            par1CrashReport.func_85056_g().addCrashSectionCallable("LWJGL", new CallableLWJGLVersion(this));
2388            par1CrashReport.func_85056_g().addCrashSectionCallable("OpenGL", new CallableGLInfo(this));
2389            par1CrashReport.func_85056_g().addCrashSectionCallable("Is Modded", new CallableModded(this));
2390            par1CrashReport.func_85056_g().addCrashSectionCallable("Type", new CallableType2(this));
2391            par1CrashReport.func_85056_g().addCrashSectionCallable("Texture Pack", new CallableTexturePack(this));
2392            par1CrashReport.func_85056_g().addCrashSectionCallable("Profiler Position", new CallableClientProfiler(this));
2393            par1CrashReport.func_85056_g().addCrashSectionCallable("Vec3 Pool Size", new CallableClientMemoryStats(this));
2394    
2395            if (this.theWorld != null)
2396            {
2397                this.theWorld.addWorldInfoToCrashReport(par1CrashReport);
2398            }
2399    
2400            return par1CrashReport;
2401        }
2402    
2403        /**
2404         * Return the singleton Minecraft instance for the game
2405         */
2406        public static Minecraft getMinecraft()
2407        {
2408            return theMinecraft;
2409        }
2410    
2411        /**
2412         * Sets refreshTexturePacksScheduled to true, triggering a texture pack refresh next time the while(running) loop is
2413         * run
2414         */
2415        public void scheduleTexturePackRefresh()
2416        {
2417            this.refreshTexturePacksScheduled = true;
2418        }
2419    
2420        public void addServerStatsToSnooper(PlayerUsageSnooper par1PlayerUsageSnooper)
2421        {
2422            par1PlayerUsageSnooper.addData("fps", Integer.valueOf(debugFPS));
2423            par1PlayerUsageSnooper.addData("texpack_name", this.texturePackList.getSelectedTexturePack().getTexturePackFileName());
2424            par1PlayerUsageSnooper.addData("texpack_resolution", Integer.valueOf(this.texturePackList.getSelectedTexturePack().getTexturePackResolution()));
2425            par1PlayerUsageSnooper.addData("vsync_enabled", Boolean.valueOf(this.gameSettings.enableVsync));
2426            par1PlayerUsageSnooper.addData("display_frequency", Integer.valueOf(Display.getDisplayMode().getFrequency()));
2427            par1PlayerUsageSnooper.addData("display_type", this.fullscreen ? "fullscreen" : "windowed");
2428    
2429            if (this.theIntegratedServer != null && this.theIntegratedServer.getPlayerUsageSnooper() != null)
2430            {
2431                par1PlayerUsageSnooper.addData("snooper_partner", this.theIntegratedServer.getPlayerUsageSnooper().getUniqueID());
2432            }
2433        }
2434    
2435        public void addServerTypeToSnooper(PlayerUsageSnooper par1PlayerUsageSnooper)
2436        {
2437            par1PlayerUsageSnooper.addData("opengl_version", GL11.glGetString(GL11.GL_VERSION));
2438            par1PlayerUsageSnooper.addData("opengl_vendor", GL11.glGetString(GL11.GL_VENDOR));
2439            par1PlayerUsageSnooper.addData("client_brand", ClientBrandRetriever.getClientModName());
2440            par1PlayerUsageSnooper.addData("applet", Boolean.valueOf(this.hideQuitButton));
2441            ContextCapabilities var2 = GLContext.getCapabilities();
2442            par1PlayerUsageSnooper.addData("gl_caps[ARB_multitexture]", Boolean.valueOf(var2.GL_ARB_multitexture));
2443            par1PlayerUsageSnooper.addData("gl_caps[ARB_multisample]", Boolean.valueOf(var2.GL_ARB_multisample));
2444            par1PlayerUsageSnooper.addData("gl_caps[ARB_texture_cube_map]", Boolean.valueOf(var2.GL_ARB_texture_cube_map));
2445            par1PlayerUsageSnooper.addData("gl_caps[ARB_vertex_blend]", Boolean.valueOf(var2.GL_ARB_vertex_blend));
2446            par1PlayerUsageSnooper.addData("gl_caps[ARB_matrix_palette]", Boolean.valueOf(var2.GL_ARB_matrix_palette));
2447            par1PlayerUsageSnooper.addData("gl_caps[ARB_vertex_program]", Boolean.valueOf(var2.GL_ARB_vertex_program));
2448            par1PlayerUsageSnooper.addData("gl_caps[ARB_vertex_shader]", Boolean.valueOf(var2.GL_ARB_vertex_shader));
2449            par1PlayerUsageSnooper.addData("gl_caps[ARB_fragment_program]", Boolean.valueOf(var2.GL_ARB_fragment_program));
2450            par1PlayerUsageSnooper.addData("gl_caps[ARB_fragment_shader]", Boolean.valueOf(var2.GL_ARB_fragment_shader));
2451            par1PlayerUsageSnooper.addData("gl_caps[ARB_shader_objects]", Boolean.valueOf(var2.GL_ARB_shader_objects));
2452            par1PlayerUsageSnooper.addData("gl_caps[ARB_vertex_buffer_object]", Boolean.valueOf(var2.GL_ARB_vertex_buffer_object));
2453            par1PlayerUsageSnooper.addData("gl_caps[ARB_framebuffer_object]", Boolean.valueOf(var2.GL_ARB_framebuffer_object));
2454            par1PlayerUsageSnooper.addData("gl_caps[ARB_pixel_buffer_object]", Boolean.valueOf(var2.GL_ARB_pixel_buffer_object));
2455            par1PlayerUsageSnooper.addData("gl_caps[ARB_uniform_buffer_object]", Boolean.valueOf(var2.GL_ARB_uniform_buffer_object));
2456            par1PlayerUsageSnooper.addData("gl_caps[ARB_texture_non_power_of_two]", Boolean.valueOf(var2.GL_ARB_texture_non_power_of_two));
2457            par1PlayerUsageSnooper.addData("gl_caps[gl_max_vertex_uniforms]", Integer.valueOf(GL11.glGetInteger(GL20.GL_MAX_VERTEX_UNIFORM_COMPONENTS)));
2458            par1PlayerUsageSnooper.addData("gl_caps[gl_max_fragment_uniforms]", Integer.valueOf(GL11.glGetInteger(GL20.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS)));
2459            par1PlayerUsageSnooper.addData("gl_max_texture_size", Integer.valueOf(getGLMaximumTextureSize()));
2460        }
2461    
2462        /**
2463         * Used in the usage snooper.
2464         */
2465        private static int getGLMaximumTextureSize()
2466        {
2467            for (int var0 = 16384; var0 > 0; var0 >>= 1)
2468            {
2469                GL11.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, var0, var0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)null);
2470                int var1 = GL11.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
2471    
2472                if (var1 != 0)
2473                {
2474                    return var0;
2475                }
2476            }
2477    
2478            return -1;
2479        }
2480    
2481        /**
2482         * Returns whether snooping is enabled or not.
2483         */
2484        public boolean isSnooperEnabled()
2485        {
2486            return this.gameSettings.snooperEnabled;
2487        }
2488    
2489        /**
2490         * Set the current ServerData instance.
2491         */
2492        public void setServerData(ServerData par1ServerData)
2493        {
2494            this.currentServerData = par1ServerData;
2495        }
2496    
2497        /**
2498         * Get the current ServerData instance.
2499         */
2500        public ServerData getServerData()
2501        {
2502            return this.currentServerData;
2503        }
2504    
2505        public boolean isIntegratedServerRunning()
2506        {
2507            return this.integratedServerIsRunning;
2508        }
2509    
2510        /**
2511         * Returns true if there is only one player playing, and the current server is the integrated one.
2512         */
2513        public boolean isSingleplayer()
2514        {
2515            return this.integratedServerIsRunning && this.theIntegratedServer != null;
2516        }
2517    
2518        /**
2519         * Returns the currently running integrated server
2520         */
2521        public IntegratedServer getIntegratedServer()
2522        {
2523            return this.theIntegratedServer;
2524        }
2525    
2526        public static void stopIntegratedServer()
2527        {
2528            if (theMinecraft != null)
2529            {
2530                IntegratedServer var0 = theMinecraft.getIntegratedServer();
2531    
2532                if (var0 != null)
2533                {
2534                    var0.stopServer();
2535                }
2536            }
2537        }
2538    
2539        /**
2540         * Returns the PlayerUsageSnooper instance.
2541         */
2542        public PlayerUsageSnooper getPlayerUsageSnooper()
2543        {
2544            return this.usageSnooper;
2545        }
2546    
2547        /**
2548         * Gets the system time in milliseconds.
2549         */
2550        public static long getSystemTime()
2551        {
2552            return Sys.getTime() * 1000L / Sys.getTimerResolution();
2553        }
2554    
2555        /**
2556         * Returns whether we're in full screen or not.
2557         */
2558        public boolean isFullScreen()
2559        {
2560            return this.fullscreen;
2561        }
2562    }