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