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