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