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