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