001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.nio.IntBuffer; 006 import java.util.ArrayList; 007 import java.util.Arrays; 008 import java.util.Collections; 009 import java.util.HashMap; 010 import java.util.Iterator; 011 import java.util.List; 012 import java.util.Map; 013 import java.util.Random; 014 015 import net.minecraft.client.Minecraft; 016 import net.minecraftforge.client.SkyProvider; 017 018 import org.lwjgl.opengl.ARBOcclusionQuery; 019 import org.lwjgl.opengl.GL11; 020 021 @SideOnly(Side.CLIENT) 022 public class RenderGlobal implements IWorldAccess 023 { 024 public List tileEntities = new ArrayList(); 025 public WorldClient theWorld; 026 027 /** The RenderEngine instance used by RenderGlobal */ 028 public final RenderEngine renderEngine; 029 private List worldRenderersToUpdate = new ArrayList(); 030 private WorldRenderer[] sortedWorldRenderers; 031 private WorldRenderer[] worldRenderers; 032 private int renderChunksWide; 033 private int renderChunksTall; 034 private int renderChunksDeep; 035 036 /** OpenGL render lists base */ 037 private int glRenderListBase; 038 039 /** A reference to the Minecraft object. */ 040 public Minecraft mc; 041 042 /** Global render blocks */ 043 public RenderBlocks globalRenderBlocks; 044 045 /** OpenGL occlusion query base */ 046 private IntBuffer glOcclusionQueryBase; 047 048 /** Is occlusion testing enabled */ 049 private boolean occlusionEnabled = false; 050 051 /** 052 * counts the cloud render updates. Used with mod to stagger some updates 053 */ 054 private int cloudTickCounter = 0; 055 056 /** The star GL Call list */ 057 private int starGLCallList; 058 059 /** OpenGL sky list */ 060 private int glSkyList; 061 062 /** OpenGL sky list 2 */ 063 private int glSkyList2; 064 065 /** Minimum block X */ 066 private int minBlockX; 067 068 /** Minimum block Y */ 069 private int minBlockY; 070 071 /** Minimum block Z */ 072 private int minBlockZ; 073 074 /** Maximum block X */ 075 private int maxBlockX; 076 077 /** Maximum block Y */ 078 private int maxBlockY; 079 080 /** Maximum block Z */ 081 private int maxBlockZ; 082 083 /** 084 * Stores blocks currently being broken. Key is entity ID of the thing doing the breaking. Value is a 085 * DestroyBlockProgress 086 */ 087 private Map damagedBlocks = new HashMap(); 088 private int renderDistance = -1; 089 090 /** Render entities startup counter (init value=2) */ 091 private int renderEntitiesStartupCounter = 2; 092 093 /** Count entities total */ 094 private int countEntitiesTotal; 095 096 /** Count entities rendered */ 097 private int countEntitiesRendered; 098 099 /** Count entities hidden */ 100 private int countEntitiesHidden; 101 102 /** Dummy buffer (50k) not used */ 103 int[] dummyBuf50k = new int[50000]; 104 105 /** Occlusion query result */ 106 IntBuffer occlusionResult = GLAllocation.createDirectIntBuffer(64); 107 108 /** How many renderers are loaded this frame that try to be rendered */ 109 private int renderersLoaded; 110 111 /** How many renderers are being clipped by the frustrum this frame */ 112 private int renderersBeingClipped; 113 114 /** How many renderers are being occluded this frame */ 115 private int renderersBeingOccluded; 116 117 /** How many renderers are actually being rendered this frame */ 118 private int renderersBeingRendered; 119 120 /** 121 * How many renderers are skipping rendering due to not having a render pass this frame 122 */ 123 private int renderersSkippingRenderPass; 124 125 /** Dummy render int */ 126 private int dummyRenderInt; 127 128 /** World renderers check index */ 129 private int worldRenderersCheckIndex; 130 131 /** List of OpenGL lists for the current render pass */ 132 private List glRenderLists = new ArrayList(); 133 134 /** All render lists (fixed length 4) */ 135 private RenderList[] allRenderLists = new RenderList[] {new RenderList(), new RenderList(), new RenderList(), new RenderList()}; 136 137 /** 138 * Previous x position when the renderers were sorted. (Once the distance moves more than 4 units they will be 139 * resorted) 140 */ 141 double prevSortX = -9999.0D; 142 143 /** 144 * Previous y position when the renderers were sorted. (Once the distance moves more than 4 units they will be 145 * resorted) 146 */ 147 double prevSortY = -9999.0D; 148 149 /** 150 * Previous Z position when the renderers were sorted. (Once the distance moves more than 4 units they will be 151 * resorted) 152 */ 153 double prevSortZ = -9999.0D; 154 155 /** 156 * The offset used to determine if a renderer is one of the sixteenth that are being updated this frame 157 */ 158 int frustumCheckOffset = 0; 159 160 public RenderGlobal(Minecraft par1Minecraft, RenderEngine par2RenderEngine) 161 { 162 this.mc = par1Minecraft; 163 this.renderEngine = par2RenderEngine; 164 byte var3 = 34; 165 byte var4 = 32; 166 this.glRenderListBase = GLAllocation.generateDisplayLists(var3 * var3 * var4 * 3); 167 this.occlusionEnabled = OpenGlCapsChecker.checkARBOcclusion(); 168 169 if (this.occlusionEnabled) 170 { 171 this.occlusionResult.clear(); 172 this.glOcclusionQueryBase = GLAllocation.createDirectIntBuffer(var3 * var3 * var4); 173 this.glOcclusionQueryBase.clear(); 174 this.glOcclusionQueryBase.position(0); 175 this.glOcclusionQueryBase.limit(var3 * var3 * var4); 176 ARBOcclusionQuery.glGenQueriesARB(this.glOcclusionQueryBase); 177 } 178 179 this.starGLCallList = GLAllocation.generateDisplayLists(3); 180 GL11.glPushMatrix(); 181 GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE); 182 this.renderStars(); 183 GL11.glEndList(); 184 GL11.glPopMatrix(); 185 Tessellator var5 = Tessellator.instance; 186 this.glSkyList = this.starGLCallList + 1; 187 GL11.glNewList(this.glSkyList, GL11.GL_COMPILE); 188 byte var7 = 64; 189 int var8 = 256 / var7 + 2; 190 float var6 = 16.0F; 191 int var9; 192 int var10; 193 194 for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7) 195 { 196 for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7) 197 { 198 var5.startDrawingQuads(); 199 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0)); 200 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0)); 201 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7)); 202 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7)); 203 var5.draw(); 204 } 205 } 206 207 GL11.glEndList(); 208 this.glSkyList2 = this.starGLCallList + 2; 209 GL11.glNewList(this.glSkyList2, GL11.GL_COMPILE); 210 var6 = -16.0F; 211 var5.startDrawingQuads(); 212 213 for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7) 214 { 215 for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7) 216 { 217 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0)); 218 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0)); 219 var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7)); 220 var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7)); 221 } 222 } 223 224 var5.draw(); 225 GL11.glEndList(); 226 } 227 228 private void renderStars() 229 { 230 Random var1 = new Random(10842L); 231 Tessellator var2 = Tessellator.instance; 232 var2.startDrawingQuads(); 233 234 for (int var3 = 0; var3 < 1500; ++var3) 235 { 236 double var4 = (double)(var1.nextFloat() * 2.0F - 1.0F); 237 double var6 = (double)(var1.nextFloat() * 2.0F - 1.0F); 238 double var8 = (double)(var1.nextFloat() * 2.0F - 1.0F); 239 double var10 = (double)(0.15F + var1.nextFloat() * 0.1F); 240 double var12 = var4 * var4 + var6 * var6 + var8 * var8; 241 242 if (var12 < 1.0D && var12 > 0.01D) 243 { 244 var12 = 1.0D / Math.sqrt(var12); 245 var4 *= var12; 246 var6 *= var12; 247 var8 *= var12; 248 double var14 = var4 * 100.0D; 249 double var16 = var6 * 100.0D; 250 double var18 = var8 * 100.0D; 251 double var20 = Math.atan2(var4, var8); 252 double var22 = Math.sin(var20); 253 double var24 = Math.cos(var20); 254 double var26 = Math.atan2(Math.sqrt(var4 * var4 + var8 * var8), var6); 255 double var28 = Math.sin(var26); 256 double var30 = Math.cos(var26); 257 double var32 = var1.nextDouble() * Math.PI * 2.0D; 258 double var34 = Math.sin(var32); 259 double var36 = Math.cos(var32); 260 261 for (int var38 = 0; var38 < 4; ++var38) 262 { 263 double var39 = 0.0D; 264 double var41 = (double)((var38 & 2) - 1) * var10; 265 double var43 = (double)((var38 + 1 & 2) - 1) * var10; 266 double var47 = var41 * var36 - var43 * var34; 267 double var49 = var43 * var36 + var41 * var34; 268 double var53 = var47 * var28 + var39 * var30; 269 double var55 = var39 * var28 - var47 * var30; 270 double var57 = var55 * var22 - var49 * var24; 271 double var61 = var49 * var22 + var55 * var24; 272 var2.addVertex(var14 + var57, var16 + var53, var18 + var61); 273 } 274 } 275 } 276 277 var2.draw(); 278 } 279 280 /** 281 * set null to clear 282 */ 283 public void setWorldAndLoadRenderers(WorldClient par1WorldClient) 284 { 285 if (this.theWorld != null) 286 { 287 this.theWorld.removeWorldAccess(this); 288 } 289 290 this.prevSortX = -9999.0D; 291 this.prevSortY = -9999.0D; 292 this.prevSortZ = -9999.0D; 293 RenderManager.instance.set(par1WorldClient); 294 this.theWorld = par1WorldClient; 295 this.globalRenderBlocks = new RenderBlocks(par1WorldClient); 296 297 if (par1WorldClient != null) 298 { 299 par1WorldClient.addWorldAccess(this); 300 this.loadRenderers(); 301 } 302 } 303 304 /** 305 * Loads all the renderers and sets up the basic settings usage 306 */ 307 public void loadRenderers() 308 { 309 if (this.theWorld != null) 310 { 311 Block.leaves.setGraphicsLevel(this.mc.gameSettings.fancyGraphics); 312 this.renderDistance = this.mc.gameSettings.renderDistance; 313 int var2; 314 int var3; 315 316 if (this.worldRenderers != null) 317 { 318 WorldRenderer[] var1 = this.worldRenderers; 319 var2 = var1.length; 320 321 for (var3 = 0; var3 < var2; ++var3) 322 { 323 WorldRenderer var4 = var1[var3]; 324 var4.stopRendering(); 325 } 326 } 327 328 int var7 = 64 << 3 - this.renderDistance; 329 330 if (var7 > 400) 331 { 332 var7 = 400; 333 } 334 335 this.renderChunksWide = var7 / 16 + 1; 336 this.renderChunksTall = 16; 337 this.renderChunksDeep = var7 / 16 + 1; 338 this.worldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep]; 339 this.sortedWorldRenderers = new WorldRenderer[this.renderChunksWide * this.renderChunksTall * this.renderChunksDeep]; 340 var2 = 0; 341 var3 = 0; 342 this.minBlockX = 0; 343 this.minBlockY = 0; 344 this.minBlockZ = 0; 345 this.maxBlockX = this.renderChunksWide; 346 this.maxBlockY = this.renderChunksTall; 347 this.maxBlockZ = this.renderChunksDeep; 348 WorldRenderer var5; 349 350 for (Iterator var8 = this.worldRenderersToUpdate.iterator(); var8.hasNext(); var5.needsUpdate = false) 351 { 352 var5 = (WorldRenderer)var8.next(); 353 } 354 355 this.worldRenderersToUpdate.clear(); 356 this.tileEntities.clear(); 357 358 for (int var9 = 0; var9 < this.renderChunksWide; ++var9) 359 { 360 for (int var10 = 0; var10 < this.renderChunksTall; ++var10) 361 { 362 for (int var6 = 0; var6 < this.renderChunksDeep; ++var6) 363 { 364 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9] = new WorldRenderer(this.theWorld, this.tileEntities, var9 * 16, var10 * 16, var6 * 16, this.glRenderListBase + var2); 365 366 if (this.occlusionEnabled) 367 { 368 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].glOcclusionQuery = this.glOcclusionQueryBase.get(var3); 369 } 370 371 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].isWaitingOnOcclusionQuery = false; 372 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].isVisible = true; 373 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].isInFrustum = true; 374 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].chunkIndex = var3++; 375 this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9].markDirty(); 376 this.sortedWorldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9] = this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9]; 377 this.worldRenderersToUpdate.add(this.worldRenderers[(var6 * this.renderChunksTall + var10) * this.renderChunksWide + var9]); 378 var2 += 3; 379 } 380 } 381 } 382 383 if (this.theWorld != null) 384 { 385 EntityLiving var11 = this.mc.renderViewEntity; 386 387 if (var11 != null) 388 { 389 this.markRenderersForNewPosition(MathHelper.floor_double(var11.posX), MathHelper.floor_double(var11.posY), MathHelper.floor_double(var11.posZ)); 390 Arrays.sort(this.sortedWorldRenderers, new EntitySorter(var11)); 391 } 392 } 393 394 this.renderEntitiesStartupCounter = 2; 395 } 396 } 397 398 /** 399 * Renders all entities within range and within the frustrum. Args: pos, frustrum, partialTickTime 400 */ 401 public void renderEntities(Vec3 par1Vec3, ICamera par2ICamera, float par3) 402 { 403 if (this.renderEntitiesStartupCounter > 0) 404 { 405 --this.renderEntitiesStartupCounter; 406 } 407 else 408 { 409 this.theWorld.theProfiler.startSection("prepare"); 410 TileEntityRenderer.instance.cacheActiveRenderInfo(this.theWorld, this.renderEngine, this.mc.fontRenderer, this.mc.renderViewEntity, par3); 411 RenderManager.instance.cacheActiveRenderInfo(this.theWorld, this.renderEngine, this.mc.fontRenderer, this.mc.renderViewEntity, this.mc.gameSettings, par3); 412 this.countEntitiesTotal = 0; 413 this.countEntitiesRendered = 0; 414 this.countEntitiesHidden = 0; 415 EntityLiving var4 = this.mc.renderViewEntity; 416 RenderManager.renderPosX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)par3; 417 RenderManager.renderPosY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)par3; 418 RenderManager.renderPosZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)par3; 419 TileEntityRenderer.staticPlayerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)par3; 420 TileEntityRenderer.staticPlayerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)par3; 421 TileEntityRenderer.staticPlayerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)par3; 422 this.mc.entityRenderer.enableLightmap((double)par3); 423 this.theWorld.theProfiler.endStartSection("global"); 424 List var5 = this.theWorld.getLoadedEntityList(); 425 this.countEntitiesTotal = var5.size(); 426 int var6; 427 Entity var7; 428 429 for (var6 = 0; var6 < this.theWorld.weatherEffects.size(); ++var6) 430 { 431 var7 = (Entity)this.theWorld.weatherEffects.get(var6); 432 ++this.countEntitiesRendered; 433 434 if (var7.isInRangeToRenderVec3D(par1Vec3)) 435 { 436 RenderManager.instance.renderEntity(var7, par3); 437 } 438 } 439 440 this.theWorld.theProfiler.endStartSection("entities"); 441 442 for (var6 = 0; var6 < var5.size(); ++var6) 443 { 444 var7 = (Entity)var5.get(var6); 445 446 if (var7.isInRangeToRenderVec3D(par1Vec3) && (var7.ignoreFrustumCheck || par2ICamera.isBoundingBoxInFrustum(var7.boundingBox)) && (var7 != this.mc.renderViewEntity || this.mc.gameSettings.thirdPersonView != 0 || this.mc.renderViewEntity.isPlayerSleeping()) && this.theWorld.blockExists(MathHelper.floor_double(var7.posX), 0, MathHelper.floor_double(var7.posZ))) 447 { 448 ++this.countEntitiesRendered; 449 RenderManager.instance.renderEntity(var7, par3); 450 } 451 } 452 453 this.theWorld.theProfiler.endStartSection("tileentities"); 454 RenderHelper.enableStandardItemLighting(); 455 Iterator var8 = this.tileEntities.iterator(); 456 457 while (var8.hasNext()) 458 { 459 TileEntity var9 = (TileEntity)var8.next(); 460 TileEntityRenderer.instance.renderTileEntity(var9, par3); 461 } 462 463 this.mc.entityRenderer.disableLightmap((double)par3); 464 this.theWorld.theProfiler.endSection(); 465 } 466 } 467 468 /** 469 * Gets the render info for use on the Debug screen 470 */ 471 public String getDebugInfoRenders() 472 { 473 return "C: " + this.renderersBeingRendered + "/" + this.renderersLoaded + ". F: " + this.renderersBeingClipped + ", O: " + this.renderersBeingOccluded + ", E: " + this.renderersSkippingRenderPass; 474 } 475 476 /** 477 * Gets the entities info for use on the Debug screen 478 */ 479 public String getDebugInfoEntities() 480 { 481 return "E: " + this.countEntitiesRendered + "/" + this.countEntitiesTotal + ". B: " + this.countEntitiesHidden + ", I: " + (this.countEntitiesTotal - this.countEntitiesHidden - this.countEntitiesRendered); 482 } 483 484 /** 485 * Goes through all the renderers setting new positions on them and those that have their position changed are 486 * adding to be updated 487 */ 488 private void markRenderersForNewPosition(int par1, int par2, int par3) 489 { 490 par1 -= 8; 491 par2 -= 8; 492 par3 -= 8; 493 this.minBlockX = Integer.MAX_VALUE; 494 this.minBlockY = Integer.MAX_VALUE; 495 this.minBlockZ = Integer.MAX_VALUE; 496 this.maxBlockX = Integer.MIN_VALUE; 497 this.maxBlockY = Integer.MIN_VALUE; 498 this.maxBlockZ = Integer.MIN_VALUE; 499 int var4 = this.renderChunksWide * 16; 500 int var5 = var4 / 2; 501 502 for (int var6 = 0; var6 < this.renderChunksWide; ++var6) 503 { 504 int var7 = var6 * 16; 505 int var8 = var7 + var5 - par1; 506 507 if (var8 < 0) 508 { 509 var8 -= var4 - 1; 510 } 511 512 var8 /= var4; 513 var7 -= var8 * var4; 514 515 if (var7 < this.minBlockX) 516 { 517 this.minBlockX = var7; 518 } 519 520 if (var7 > this.maxBlockX) 521 { 522 this.maxBlockX = var7; 523 } 524 525 for (int var9 = 0; var9 < this.renderChunksDeep; ++var9) 526 { 527 int var10 = var9 * 16; 528 int var11 = var10 + var5 - par3; 529 530 if (var11 < 0) 531 { 532 var11 -= var4 - 1; 533 } 534 535 var11 /= var4; 536 var10 -= var11 * var4; 537 538 if (var10 < this.minBlockZ) 539 { 540 this.minBlockZ = var10; 541 } 542 543 if (var10 > this.maxBlockZ) 544 { 545 this.maxBlockZ = var10; 546 } 547 548 for (int var12 = 0; var12 < this.renderChunksTall; ++var12) 549 { 550 int var13 = var12 * 16; 551 552 if (var13 < this.minBlockY) 553 { 554 this.minBlockY = var13; 555 } 556 557 if (var13 > this.maxBlockY) 558 { 559 this.maxBlockY = var13; 560 } 561 562 WorldRenderer var14 = this.worldRenderers[(var9 * this.renderChunksTall + var12) * this.renderChunksWide + var6]; 563 boolean var15 = var14.needsUpdate; 564 var14.setPosition(var7, var13, var10); 565 566 if (!var15 && var14.needsUpdate) 567 { 568 this.worldRenderersToUpdate.add(var14); 569 } 570 } 571 } 572 } 573 } 574 575 /** 576 * Sorts all renderers based on the passed in entity. Args: entityLiving, renderPass, partialTickTime 577 */ 578 public int sortAndRender(EntityLiving par1EntityLiving, int par2, double par3) 579 { 580 this.theWorld.theProfiler.startSection("sortchunks"); 581 582 for (int var5 = 0; var5 < 10; ++var5) 583 { 584 this.worldRenderersCheckIndex = (this.worldRenderersCheckIndex + 1) % this.worldRenderers.length; 585 WorldRenderer var6 = this.worldRenderers[this.worldRenderersCheckIndex]; 586 587 if (var6.needsUpdate && !this.worldRenderersToUpdate.contains(var6)) 588 { 589 this.worldRenderersToUpdate.add(var6); 590 } 591 } 592 593 if (this.mc.gameSettings.renderDistance != this.renderDistance) 594 { 595 this.loadRenderers(); 596 } 597 598 if (par2 == 0) 599 { 600 this.renderersLoaded = 0; 601 this.dummyRenderInt = 0; 602 this.renderersBeingClipped = 0; 603 this.renderersBeingOccluded = 0; 604 this.renderersBeingRendered = 0; 605 this.renderersSkippingRenderPass = 0; 606 } 607 608 double var33 = par1EntityLiving.lastTickPosX + (par1EntityLiving.posX - par1EntityLiving.lastTickPosX) * par3; 609 double var7 = par1EntityLiving.lastTickPosY + (par1EntityLiving.posY - par1EntityLiving.lastTickPosY) * par3; 610 double var9 = par1EntityLiving.lastTickPosZ + (par1EntityLiving.posZ - par1EntityLiving.lastTickPosZ) * par3; 611 double var11 = par1EntityLiving.posX - this.prevSortX; 612 double var13 = par1EntityLiving.posY - this.prevSortY; 613 double var15 = par1EntityLiving.posZ - this.prevSortZ; 614 615 if (var11 * var11 + var13 * var13 + var15 * var15 > 16.0D) 616 { 617 this.prevSortX = par1EntityLiving.posX; 618 this.prevSortY = par1EntityLiving.posY; 619 this.prevSortZ = par1EntityLiving.posZ; 620 this.markRenderersForNewPosition(MathHelper.floor_double(par1EntityLiving.posX), MathHelper.floor_double(par1EntityLiving.posY), MathHelper.floor_double(par1EntityLiving.posZ)); 621 Arrays.sort(this.sortedWorldRenderers, new EntitySorter(par1EntityLiving)); 622 } 623 624 RenderHelper.disableStandardItemLighting(); 625 byte var17 = 0; 626 int var34; 627 628 if (this.occlusionEnabled && this.mc.gameSettings.advancedOpengl && !this.mc.gameSettings.anaglyph && par2 == 0) 629 { 630 byte var18 = 0; 631 int var19 = 16; 632 this.checkOcclusionQueryResult(var18, var19); 633 634 for (int var20 = var18; var20 < var19; ++var20) 635 { 636 this.sortedWorldRenderers[var20].isVisible = true; 637 } 638 639 this.theWorld.theProfiler.endStartSection("render"); 640 var34 = var17 + this.renderSortedRenderers(var18, var19, par2, par3); 641 642 do 643 { 644 this.theWorld.theProfiler.endStartSection("occ"); 645 int var35 = var19; 646 var19 *= 2; 647 648 if (var19 > this.sortedWorldRenderers.length) 649 { 650 var19 = this.sortedWorldRenderers.length; 651 } 652 653 GL11.glDisable(GL11.GL_TEXTURE_2D); 654 GL11.glDisable(GL11.GL_LIGHTING); 655 GL11.glDisable(GL11.GL_ALPHA_TEST); 656 GL11.glDisable(GL11.GL_FOG); 657 GL11.glColorMask(false, false, false, false); 658 GL11.glDepthMask(false); 659 this.theWorld.theProfiler.startSection("check"); 660 this.checkOcclusionQueryResult(var35, var19); 661 this.theWorld.theProfiler.endSection(); 662 GL11.glPushMatrix(); 663 float var36 = 0.0F; 664 float var21 = 0.0F; 665 float var22 = 0.0F; 666 667 for (int var23 = var35; var23 < var19; ++var23) 668 { 669 if (this.sortedWorldRenderers[var23].skipAllRenderPasses()) 670 { 671 this.sortedWorldRenderers[var23].isInFrustum = false; 672 } 673 else 674 { 675 if (!this.sortedWorldRenderers[var23].isInFrustum) 676 { 677 this.sortedWorldRenderers[var23].isVisible = true; 678 } 679 680 if (this.sortedWorldRenderers[var23].isInFrustum && !this.sortedWorldRenderers[var23].isWaitingOnOcclusionQuery) 681 { 682 float var24 = MathHelper.sqrt_float(this.sortedWorldRenderers[var23].distanceToEntitySquared(par1EntityLiving)); 683 int var25 = (int)(1.0F + var24 / 128.0F); 684 685 if (this.cloudTickCounter % var25 == var23 % var25) 686 { 687 WorldRenderer var26 = this.sortedWorldRenderers[var23]; 688 float var27 = (float)((double)var26.posXMinus - var33); 689 float var28 = (float)((double)var26.posYMinus - var7); 690 float var29 = (float)((double)var26.posZMinus - var9); 691 float var30 = var27 - var36; 692 float var31 = var28 - var21; 693 float var32 = var29 - var22; 694 695 if (var30 != 0.0F || var31 != 0.0F || var32 != 0.0F) 696 { 697 GL11.glTranslatef(var30, var31, var32); 698 var36 += var30; 699 var21 += var31; 700 var22 += var32; 701 } 702 703 this.theWorld.theProfiler.startSection("bb"); 704 ARBOcclusionQuery.glBeginQueryARB(ARBOcclusionQuery.GL_SAMPLES_PASSED_ARB, this.sortedWorldRenderers[var23].glOcclusionQuery); 705 this.sortedWorldRenderers[var23].callOcclusionQueryList(); 706 ARBOcclusionQuery.glEndQueryARB(ARBOcclusionQuery.GL_SAMPLES_PASSED_ARB); 707 this.theWorld.theProfiler.endSection(); 708 this.sortedWorldRenderers[var23].isWaitingOnOcclusionQuery = true; 709 } 710 } 711 } 712 } 713 714 GL11.glPopMatrix(); 715 716 if (this.mc.gameSettings.anaglyph) 717 { 718 if (EntityRenderer.anaglyphField == 0) 719 { 720 GL11.glColorMask(false, true, true, true); 721 } 722 else 723 { 724 GL11.glColorMask(true, false, false, true); 725 } 726 } 727 else 728 { 729 GL11.glColorMask(true, true, true, true); 730 } 731 732 GL11.glDepthMask(true); 733 GL11.glEnable(GL11.GL_TEXTURE_2D); 734 GL11.glEnable(GL11.GL_ALPHA_TEST); 735 GL11.glEnable(GL11.GL_FOG); 736 this.theWorld.theProfiler.endStartSection("render"); 737 var34 += this.renderSortedRenderers(var35, var19, par2, par3); 738 } 739 while (var19 < this.sortedWorldRenderers.length); 740 } 741 else 742 { 743 this.theWorld.theProfiler.endStartSection("render"); 744 var34 = var17 + this.renderSortedRenderers(0, this.sortedWorldRenderers.length, par2, par3); 745 } 746 747 this.theWorld.theProfiler.endSection(); 748 return var34; 749 } 750 751 private void checkOcclusionQueryResult(int par1, int par2) 752 { 753 for (int var3 = par1; var3 < par2; ++var3) 754 { 755 if (this.sortedWorldRenderers[var3].isWaitingOnOcclusionQuery) 756 { 757 this.occlusionResult.clear(); 758 ARBOcclusionQuery.glGetQueryObjectuARB(this.sortedWorldRenderers[var3].glOcclusionQuery, ARBOcclusionQuery.GL_QUERY_RESULT_AVAILABLE_ARB, this.occlusionResult); 759 760 if (this.occlusionResult.get(0) != 0) 761 { 762 this.sortedWorldRenderers[var3].isWaitingOnOcclusionQuery = false; 763 this.occlusionResult.clear(); 764 ARBOcclusionQuery.glGetQueryObjectuARB(this.sortedWorldRenderers[var3].glOcclusionQuery, ARBOcclusionQuery.GL_QUERY_RESULT_ARB, this.occlusionResult); 765 this.sortedWorldRenderers[var3].isVisible = this.occlusionResult.get(0) != 0; 766 } 767 } 768 } 769 } 770 771 /** 772 * Renders the sorted renders for the specified render pass. Args: startRenderer, numRenderers, renderPass, 773 * partialTickTime 774 */ 775 private int renderSortedRenderers(int par1, int par2, int par3, double par4) 776 { 777 this.glRenderLists.clear(); 778 int var6 = 0; 779 780 for (int var7 = par1; var7 < par2; ++var7) 781 { 782 if (par3 == 0) 783 { 784 ++this.renderersLoaded; 785 786 if (this.sortedWorldRenderers[var7].skipRenderPass[par3]) 787 { 788 ++this.renderersSkippingRenderPass; 789 } 790 else if (!this.sortedWorldRenderers[var7].isInFrustum) 791 { 792 ++this.renderersBeingClipped; 793 } 794 else if (this.occlusionEnabled && !this.sortedWorldRenderers[var7].isVisible) 795 { 796 ++this.renderersBeingOccluded; 797 } 798 else 799 { 800 ++this.renderersBeingRendered; 801 } 802 } 803 804 if (!this.sortedWorldRenderers[var7].skipRenderPass[par3] && this.sortedWorldRenderers[var7].isInFrustum && (!this.occlusionEnabled || this.sortedWorldRenderers[var7].isVisible)) 805 { 806 int var8 = this.sortedWorldRenderers[var7].getGLCallListForPass(par3); 807 808 if (var8 >= 0) 809 { 810 this.glRenderLists.add(this.sortedWorldRenderers[var7]); 811 ++var6; 812 } 813 } 814 } 815 816 EntityLiving var19 = this.mc.renderViewEntity; 817 double var20 = var19.lastTickPosX + (var19.posX - var19.lastTickPosX) * par4; 818 double var10 = var19.lastTickPosY + (var19.posY - var19.lastTickPosY) * par4; 819 double var12 = var19.lastTickPosZ + (var19.posZ - var19.lastTickPosZ) * par4; 820 int var14 = 0; 821 RenderList[] var15 = this.allRenderLists; 822 int var16 = var15.length; 823 int var17; 824 825 for (var17 = 0; var17 < var16; ++var17) 826 { 827 RenderList var18 = var15[var17]; 828 var18.func_78421_b(); 829 } 830 831 WorldRenderer var22; 832 833 for (Iterator var21 = this.glRenderLists.iterator(); var21.hasNext(); this.allRenderLists[var17].func_78420_a(var22.getGLCallListForPass(par3))) 834 { 835 var22 = (WorldRenderer)var21.next(); 836 var17 = -1; 837 838 for (int var23 = 0; var23 < var14; ++var23) 839 { 840 if (this.allRenderLists[var23].func_78418_a(var22.posXMinus, var22.posYMinus, var22.posZMinus)) 841 { 842 var17 = var23; 843 } 844 } 845 846 if (var17 < 0) 847 { 848 var17 = var14++; 849 this.allRenderLists[var17].func_78422_a(var22.posXMinus, var22.posYMinus, var22.posZMinus, var20, var10, var12); 850 } 851 } 852 853 this.renderAllRenderLists(par3, par4); 854 return var6; 855 } 856 857 /** 858 * Render all render lists 859 */ 860 public void renderAllRenderLists(int par1, double par2) 861 { 862 this.mc.entityRenderer.enableLightmap(par2); 863 RenderList[] var4 = this.allRenderLists; 864 int var5 = var4.length; 865 866 for (int var6 = 0; var6 < var5; ++var6) 867 { 868 RenderList var7 = var4[var6]; 869 var7.func_78419_a(); 870 } 871 872 this.mc.entityRenderer.disableLightmap(par2); 873 } 874 875 public void updateClouds() 876 { 877 ++this.cloudTickCounter; 878 879 if (this.cloudTickCounter % 20 == 0) 880 { 881 Iterator var1 = this.damagedBlocks.values().iterator(); 882 883 while (var1.hasNext()) 884 { 885 DestroyBlockProgress var2 = (DestroyBlockProgress)var1.next(); 886 int var3 = var2.getCreationCloudUpdateTick(); 887 888 if (this.cloudTickCounter - var3 > 400) 889 { 890 var1.remove(); 891 } 892 } 893 } 894 } 895 896 /** 897 * Renders the sky with the partial tick time. Args: partialTickTime 898 */ 899 public void renderSky(float par1) 900 { 901 SkyProvider skyProvider = null; 902 if ((skyProvider = this.mc.theWorld.provider.getSkyProvider()) != null) 903 { 904 skyProvider.render(par1, this.theWorld, mc); 905 return; 906 } 907 if (this.mc.theWorld.provider.dimensionId == 1) 908 { 909 GL11.glDisable(GL11.GL_FOG); 910 GL11.glDisable(GL11.GL_ALPHA_TEST); 911 GL11.glEnable(GL11.GL_BLEND); 912 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 913 RenderHelper.disableStandardItemLighting(); 914 GL11.glDepthMask(false); 915 this.renderEngine.bindTexture(this.renderEngine.getTexture("/misc/tunnel.png")); 916 Tessellator var21 = Tessellator.instance; 917 918 for (int var22 = 0; var22 < 6; ++var22) 919 { 920 GL11.glPushMatrix(); 921 922 if (var22 == 1) 923 { 924 GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); 925 } 926 927 if (var22 == 2) 928 { 929 GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); 930 } 931 932 if (var22 == 3) 933 { 934 GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); 935 } 936 937 if (var22 == 4) 938 { 939 GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); 940 } 941 942 if (var22 == 5) 943 { 944 GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F); 945 } 946 947 var21.startDrawingQuads(); 948 var21.setColorOpaque_I(2631720); 949 var21.addVertexWithUV(-100.0D, -100.0D, -100.0D, 0.0D, 0.0D); 950 var21.addVertexWithUV(-100.0D, -100.0D, 100.0D, 0.0D, 16.0D); 951 var21.addVertexWithUV(100.0D, -100.0D, 100.0D, 16.0D, 16.0D); 952 var21.addVertexWithUV(100.0D, -100.0D, -100.0D, 16.0D, 0.0D); 953 var21.draw(); 954 GL11.glPopMatrix(); 955 } 956 957 GL11.glDepthMask(true); 958 GL11.glEnable(GL11.GL_TEXTURE_2D); 959 GL11.glEnable(GL11.GL_ALPHA_TEST); 960 } 961 else if (this.mc.theWorld.provider.isSurfaceWorld()) 962 { 963 GL11.glDisable(GL11.GL_TEXTURE_2D); 964 Vec3 var2 = this.theWorld.getSkyColor(this.mc.renderViewEntity, par1); 965 float var3 = (float)var2.xCoord; 966 float var4 = (float)var2.yCoord; 967 float var5 = (float)var2.zCoord; 968 float var8; 969 970 if (this.mc.gameSettings.anaglyph) 971 { 972 float var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F; 973 float var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; 974 var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F; 975 var3 = var6; 976 var4 = var7; 977 var5 = var8; 978 } 979 980 GL11.glColor3f(var3, var4, var5); 981 Tessellator var23 = Tessellator.instance; 982 GL11.glDepthMask(false); 983 GL11.glEnable(GL11.GL_FOG); 984 GL11.glColor3f(var3, var4, var5); 985 GL11.glCallList(this.glSkyList); 986 GL11.glDisable(GL11.GL_FOG); 987 GL11.glDisable(GL11.GL_ALPHA_TEST); 988 GL11.glEnable(GL11.GL_BLEND); 989 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 990 RenderHelper.disableStandardItemLighting(); 991 float[] var24 = this.theWorld.provider.calcSunriseSunsetColors(this.theWorld.getCelestialAngle(par1), par1); 992 float var9; 993 float var10; 994 float var11; 995 float var12; 996 997 if (var24 != null) 998 { 999 GL11.glDisable(GL11.GL_TEXTURE_2D); 1000 GL11.glShadeModel(GL11.GL_SMOOTH); 1001 GL11.glPushMatrix(); 1002 GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); 1003 GL11.glRotatef(MathHelper.sin(this.theWorld.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); 1004 GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); 1005 var8 = var24[0]; 1006 var9 = var24[1]; 1007 var10 = var24[2]; 1008 float var13; 1009 1010 if (this.mc.gameSettings.anaglyph) 1011 { 1012 var11 = (var8 * 30.0F + var9 * 59.0F + var10 * 11.0F) / 100.0F; 1013 var12 = (var8 * 30.0F + var9 * 70.0F) / 100.0F; 1014 var13 = (var8 * 30.0F + var10 * 70.0F) / 100.0F; 1015 var8 = var11; 1016 var9 = var12; 1017 var10 = var13; 1018 } 1019 1020 var23.startDrawing(6); 1021 var23.setColorRGBA_F(var8, var9, var10, var24[3]); 1022 var23.addVertex(0.0D, 100.0D, 0.0D); 1023 byte var26 = 16; 1024 var23.setColorRGBA_F(var24[0], var24[1], var24[2], 0.0F); 1025 1026 for (int var27 = 0; var27 <= var26; ++var27) 1027 { 1028 var13 = (float)var27 * (float)Math.PI * 2.0F / (float)var26; 1029 float var14 = MathHelper.sin(var13); 1030 float var15 = MathHelper.cos(var13); 1031 var23.addVertex((double)(var14 * 120.0F), (double)(var15 * 120.0F), (double)(-var15 * 40.0F * var24[3])); 1032 } 1033 1034 var23.draw(); 1035 GL11.glPopMatrix(); 1036 GL11.glShadeModel(GL11.GL_FLAT); 1037 } 1038 1039 GL11.glEnable(GL11.GL_TEXTURE_2D); 1040 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); 1041 GL11.glPushMatrix(); 1042 var8 = 1.0F - this.theWorld.getRainStrength(par1); 1043 var9 = 0.0F; 1044 var10 = 0.0F; 1045 var11 = 0.0F; 1046 GL11.glColor4f(1.0F, 1.0F, 1.0F, var8); 1047 GL11.glTranslatef(var9, var10, var11); 1048 GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); 1049 GL11.glRotatef(this.theWorld.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F); 1050 var12 = 30.0F; 1051 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png")); 1052 var23.startDrawingQuads(); 1053 var23.addVertexWithUV((double)(-var12), 100.0D, (double)(-var12), 0.0D, 0.0D); 1054 var23.addVertexWithUV((double)var12, 100.0D, (double)(-var12), 1.0D, 0.0D); 1055 var23.addVertexWithUV((double)var12, 100.0D, (double)var12, 1.0D, 1.0D); 1056 var23.addVertexWithUV((double)(-var12), 100.0D, (double)var12, 0.0D, 1.0D); 1057 var23.draw(); 1058 var12 = 20.0F; 1059 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon_phases.png")); 1060 int var28 = this.theWorld.getMoonPhase(par1); 1061 int var30 = var28 % 4; 1062 int var29 = var28 / 4 % 2; 1063 float var16 = (float)(var30 + 0) / 4.0F; 1064 float var17 = (float)(var29 + 0) / 2.0F; 1065 float var18 = (float)(var30 + 1) / 4.0F; 1066 float var19 = (float)(var29 + 1) / 2.0F; 1067 var23.startDrawingQuads(); 1068 var23.addVertexWithUV((double)(-var12), -100.0D, (double)var12, (double)var18, (double)var19); 1069 var23.addVertexWithUV((double)var12, -100.0D, (double)var12, (double)var16, (double)var19); 1070 var23.addVertexWithUV((double)var12, -100.0D, (double)(-var12), (double)var16, (double)var17); 1071 var23.addVertexWithUV((double)(-var12), -100.0D, (double)(-var12), (double)var18, (double)var17); 1072 var23.draw(); 1073 GL11.glDisable(GL11.GL_TEXTURE_2D); 1074 float var20 = this.theWorld.getStarBrightness(par1) * var8; 1075 1076 if (var20 > 0.0F) 1077 { 1078 GL11.glColor4f(var20, var20, var20, var20); 1079 GL11.glCallList(this.starGLCallList); 1080 } 1081 1082 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 1083 GL11.glDisable(GL11.GL_BLEND); 1084 GL11.glEnable(GL11.GL_ALPHA_TEST); 1085 GL11.glEnable(GL11.GL_FOG); 1086 GL11.glPopMatrix(); 1087 GL11.glDisable(GL11.GL_TEXTURE_2D); 1088 GL11.glColor3f(0.0F, 0.0F, 0.0F); 1089 double var25 = this.mc.thePlayer.getPosition(par1).yCoord - this.theWorld.getHorizon(); 1090 1091 if (var25 < 0.0D) 1092 { 1093 GL11.glPushMatrix(); 1094 GL11.glTranslatef(0.0F, 12.0F, 0.0F); 1095 GL11.glCallList(this.glSkyList2); 1096 GL11.glPopMatrix(); 1097 var10 = 1.0F; 1098 var11 = -((float)(var25 + 65.0D)); 1099 var12 = -var10; 1100 var23.startDrawingQuads(); 1101 var23.setColorRGBA_I(0, 255); 1102 var23.addVertex((double)(-var10), (double)var11, (double)var10); 1103 var23.addVertex((double)var10, (double)var11, (double)var10); 1104 var23.addVertex((double)var10, (double)var12, (double)var10); 1105 var23.addVertex((double)(-var10), (double)var12, (double)var10); 1106 var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); 1107 var23.addVertex((double)var10, (double)var12, (double)(-var10)); 1108 var23.addVertex((double)var10, (double)var11, (double)(-var10)); 1109 var23.addVertex((double)(-var10), (double)var11, (double)(-var10)); 1110 var23.addVertex((double)var10, (double)var12, (double)(-var10)); 1111 var23.addVertex((double)var10, (double)var12, (double)var10); 1112 var23.addVertex((double)var10, (double)var11, (double)var10); 1113 var23.addVertex((double)var10, (double)var11, (double)(-var10)); 1114 var23.addVertex((double)(-var10), (double)var11, (double)(-var10)); 1115 var23.addVertex((double)(-var10), (double)var11, (double)var10); 1116 var23.addVertex((double)(-var10), (double)var12, (double)var10); 1117 var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); 1118 var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); 1119 var23.addVertex((double)(-var10), (double)var12, (double)var10); 1120 var23.addVertex((double)var10, (double)var12, (double)var10); 1121 var23.addVertex((double)var10, (double)var12, (double)(-var10)); 1122 var23.draw(); 1123 } 1124 1125 if (this.theWorld.provider.isSkyColored()) 1126 { 1127 GL11.glColor3f(var3 * 0.2F + 0.04F, var4 * 0.2F + 0.04F, var5 * 0.6F + 0.1F); 1128 } 1129 else 1130 { 1131 GL11.glColor3f(var3, var4, var5); 1132 } 1133 1134 GL11.glPushMatrix(); 1135 GL11.glTranslatef(0.0F, -((float)(var25 - 16.0D)), 0.0F); 1136 GL11.glCallList(this.glSkyList2); 1137 GL11.glPopMatrix(); 1138 GL11.glEnable(GL11.GL_TEXTURE_2D); 1139 GL11.glDepthMask(true); 1140 } 1141 } 1142 1143 public void renderClouds(float par1) 1144 { 1145 if (this.mc.theWorld.provider.isSurfaceWorld()) 1146 { 1147 if (this.mc.gameSettings.fancyGraphics) 1148 { 1149 this.renderCloudsFancy(par1); 1150 } 1151 else 1152 { 1153 GL11.glDisable(GL11.GL_CULL_FACE); 1154 float var2 = (float)(this.mc.renderViewEntity.lastTickPosY + (this.mc.renderViewEntity.posY - this.mc.renderViewEntity.lastTickPosY) * (double)par1); 1155 byte var3 = 32; 1156 int var4 = 256 / var3; 1157 Tessellator var5 = Tessellator.instance; 1158 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png")); 1159 GL11.glEnable(GL11.GL_BLEND); 1160 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 1161 Vec3 var6 = this.theWorld.drawClouds(par1); 1162 float var7 = (float)var6.xCoord; 1163 float var8 = (float)var6.yCoord; 1164 float var9 = (float)var6.zCoord; 1165 float var10; 1166 1167 if (this.mc.gameSettings.anaglyph) 1168 { 1169 var10 = (var7 * 30.0F + var8 * 59.0F + var9 * 11.0F) / 100.0F; 1170 float var11 = (var7 * 30.0F + var8 * 70.0F) / 100.0F; 1171 float var12 = (var7 * 30.0F + var9 * 70.0F) / 100.0F; 1172 var7 = var10; 1173 var8 = var11; 1174 var9 = var12; 1175 } 1176 1177 var10 = 4.8828125E-4F; 1178 double var24 = (double)((float)this.cloudTickCounter + par1); 1179 double var13 = this.mc.renderViewEntity.prevPosX + (this.mc.renderViewEntity.posX - this.mc.renderViewEntity.prevPosX) * (double)par1 + var24 * 0.029999999329447746D; 1180 double var15 = this.mc.renderViewEntity.prevPosZ + (this.mc.renderViewEntity.posZ - this.mc.renderViewEntity.prevPosZ) * (double)par1; 1181 int var17 = MathHelper.floor_double(var13 / 2048.0D); 1182 int var18 = MathHelper.floor_double(var15 / 2048.0D); 1183 var13 -= (double)(var17 * 2048); 1184 var15 -= (double)(var18 * 2048); 1185 float var19 = this.theWorld.provider.getCloudHeight() - var2 + 0.33F; 1186 float var20 = (float)(var13 * (double)var10); 1187 float var21 = (float)(var15 * (double)var10); 1188 var5.startDrawingQuads(); 1189 var5.setColorRGBA_F(var7, var8, var9, 0.8F); 1190 1191 for (int var22 = -var3 * var4; var22 < var3 * var4; var22 += var3) 1192 { 1193 for (int var23 = -var3 * var4; var23 < var3 * var4; var23 += var3) 1194 { 1195 var5.addVertexWithUV((double)(var22 + 0), (double)var19, (double)(var23 + var3), (double)((float)(var22 + 0) * var10 + var20), (double)((float)(var23 + var3) * var10 + var21)); 1196 var5.addVertexWithUV((double)(var22 + var3), (double)var19, (double)(var23 + var3), (double)((float)(var22 + var3) * var10 + var20), (double)((float)(var23 + var3) * var10 + var21)); 1197 var5.addVertexWithUV((double)(var22 + var3), (double)var19, (double)(var23 + 0), (double)((float)(var22 + var3) * var10 + var20), (double)((float)(var23 + 0) * var10 + var21)); 1198 var5.addVertexWithUV((double)(var22 + 0), (double)var19, (double)(var23 + 0), (double)((float)(var22 + 0) * var10 + var20), (double)((float)(var23 + 0) * var10 + var21)); 1199 } 1200 } 1201 1202 var5.draw(); 1203 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 1204 GL11.glDisable(GL11.GL_BLEND); 1205 GL11.glEnable(GL11.GL_CULL_FACE); 1206 } 1207 } 1208 } 1209 1210 public boolean func_72721_a(double par1, double par3, double par5, float par7) 1211 { 1212 return false; 1213 } 1214 1215 /** 1216 * Renders the 3d fancy clouds 1217 */ 1218 public void renderCloudsFancy(float par1) 1219 { 1220 GL11.glDisable(GL11.GL_CULL_FACE); 1221 float var2 = (float)(this.mc.renderViewEntity.lastTickPosY + (this.mc.renderViewEntity.posY - this.mc.renderViewEntity.lastTickPosY) * (double)par1); 1222 Tessellator var3 = Tessellator.instance; 1223 float var4 = 12.0F; 1224 float var5 = 4.0F; 1225 double var6 = (double)((float)this.cloudTickCounter + par1); 1226 double var8 = (this.mc.renderViewEntity.prevPosX + (this.mc.renderViewEntity.posX - this.mc.renderViewEntity.prevPosX) * (double)par1 + var6 * 0.029999999329447746D) / (double)var4; 1227 double var10 = (this.mc.renderViewEntity.prevPosZ + (this.mc.renderViewEntity.posZ - this.mc.renderViewEntity.prevPosZ) * (double)par1) / (double)var4 + 0.33000001311302185D; 1228 float var12 = this.theWorld.provider.getCloudHeight() - var2 + 0.33F; 1229 int var13 = MathHelper.floor_double(var8 / 2048.0D); 1230 int var14 = MathHelper.floor_double(var10 / 2048.0D); 1231 var8 -= (double)(var13 * 2048); 1232 var10 -= (double)(var14 * 2048); 1233 GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png")); 1234 GL11.glEnable(GL11.GL_BLEND); 1235 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 1236 Vec3 var15 = this.theWorld.drawClouds(par1); 1237 float var16 = (float)var15.xCoord; 1238 float var17 = (float)var15.yCoord; 1239 float var18 = (float)var15.zCoord; 1240 float var19; 1241 float var21; 1242 float var20; 1243 1244 if (this.mc.gameSettings.anaglyph) 1245 { 1246 var19 = (var16 * 30.0F + var17 * 59.0F + var18 * 11.0F) / 100.0F; 1247 var20 = (var16 * 30.0F + var17 * 70.0F) / 100.0F; 1248 var21 = (var16 * 30.0F + var18 * 70.0F) / 100.0F; 1249 var16 = var19; 1250 var17 = var20; 1251 var18 = var21; 1252 } 1253 1254 var19 = (float)(var8 * 0.0D); 1255 var20 = (float)(var10 * 0.0D); 1256 var21 = 0.00390625F; 1257 var19 = (float)MathHelper.floor_double(var8) * var21; 1258 var20 = (float)MathHelper.floor_double(var10) * var21; 1259 float var22 = (float)(var8 - (double)MathHelper.floor_double(var8)); 1260 float var23 = (float)(var10 - (double)MathHelper.floor_double(var10)); 1261 byte var24 = 8; 1262 byte var25 = 4; 1263 float var26 = 9.765625E-4F; 1264 GL11.glScalef(var4, 1.0F, var4); 1265 1266 for (int var27 = 0; var27 < 2; ++var27) 1267 { 1268 if (var27 == 0) 1269 { 1270 GL11.glColorMask(false, false, false, false); 1271 } 1272 else if (this.mc.gameSettings.anaglyph) 1273 { 1274 if (EntityRenderer.anaglyphField == 0) 1275 { 1276 GL11.glColorMask(false, true, true, true); 1277 } 1278 else 1279 { 1280 GL11.glColorMask(true, false, false, true); 1281 } 1282 } 1283 else 1284 { 1285 GL11.glColorMask(true, true, true, true); 1286 } 1287 1288 for (int var28 = -var25 + 1; var28 <= var25; ++var28) 1289 { 1290 for (int var29 = -var25 + 1; var29 <= var25; ++var29) 1291 { 1292 var3.startDrawingQuads(); 1293 float var30 = (float)(var28 * var24); 1294 float var31 = (float)(var29 * var24); 1295 float var32 = var30 - var22; 1296 float var33 = var31 - var23; 1297 1298 if (var12 > -var5 - 1.0F) 1299 { 1300 var3.setColorRGBA_F(var16 * 0.7F, var17 * 0.7F, var18 * 0.7F, 0.8F); 1301 var3.setNormal(0.0F, -1.0F, 0.0F); 1302 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1303 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1304 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1305 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1306 } 1307 1308 if (var12 <= var5 + 1.0F) 1309 { 1310 var3.setColorRGBA_F(var16, var17, var18, 0.8F); 1311 var3.setNormal(0.0F, 1.0F, 0.0F); 1312 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5 - var26), (double)(var33 + (float)var24), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1313 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5 - var26), (double)(var33 + (float)var24), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1314 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5 - var26), (double)(var33 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1315 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5 - var26), (double)(var33 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1316 } 1317 1318 var3.setColorRGBA_F(var16 * 0.9F, var17 * 0.9F, var18 * 0.9F, 0.8F); 1319 int var34; 1320 1321 if (var28 > -1) 1322 { 1323 var3.setNormal(-1.0F, 0.0F, 0.0F); 1324 1325 for (var34 = 0; var34 < var24; ++var34) 1326 { 1327 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1328 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1329 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + var5), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1330 var3.addVertexWithUV((double)(var32 + (float)var34 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1331 } 1332 } 1333 1334 if (var28 <= 1) 1335 { 1336 var3.setNormal(1.0F, 0.0F, 0.0F); 1337 1338 for (var34 = 0; var34 < var24; ++var34) 1339 { 1340 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + 0.0F), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1341 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + var5), (double)(var33 + (float)var24), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + (float)var24) * var21 + var20)); 1342 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + var5), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1343 var3.addVertexWithUV((double)(var32 + (float)var34 + 1.0F - var26), (double)(var12 + 0.0F), (double)(var33 + 0.0F), (double)((var30 + (float)var34 + 0.5F) * var21 + var19), (double)((var31 + 0.0F) * var21 + var20)); 1344 } 1345 } 1346 1347 var3.setColorRGBA_F(var16 * 0.8F, var17 * 0.8F, var18 * 0.8F, 0.8F); 1348 1349 if (var29 > -1) 1350 { 1351 var3.setNormal(0.0F, 0.0F, -1.0F); 1352 1353 for (var34 = 0; var34 < var24; ++var34) 1354 { 1355 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1356 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1357 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1358 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 0.0F), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1359 } 1360 } 1361 1362 if (var29 <= 1) 1363 { 1364 var3.setNormal(0.0F, 0.0F, 1.0F); 1365 1366 for (var34 = 0; var34 < var24; ++var34) 1367 { 1368 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + var5), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1369 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + var5), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1370 var3.addVertexWithUV((double)(var32 + (float)var24), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + (float)var24) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1371 var3.addVertexWithUV((double)(var32 + 0.0F), (double)(var12 + 0.0F), (double)(var33 + (float)var34 + 1.0F - var26), (double)((var30 + 0.0F) * var21 + var19), (double)((var31 + (float)var34 + 0.5F) * var21 + var20)); 1372 } 1373 } 1374 1375 var3.draw(); 1376 } 1377 } 1378 } 1379 1380 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 1381 GL11.glDisable(GL11.GL_BLEND); 1382 GL11.glEnable(GL11.GL_CULL_FACE); 1383 } 1384 1385 /** 1386 * Updates some of the renderers sorted by distance from the player 1387 */ 1388 public boolean updateRenderers(EntityLiving par1EntityLiving, boolean par2) 1389 { 1390 byte var3 = 2; 1391 RenderSorter var4 = new RenderSorter(par1EntityLiving); 1392 WorldRenderer[] var5 = new WorldRenderer[var3]; 1393 ArrayList var6 = null; 1394 int var7 = this.worldRenderersToUpdate.size(); 1395 int var8 = 0; 1396 this.theWorld.theProfiler.startSection("nearChunksSearch"); 1397 int var9; 1398 WorldRenderer var10; 1399 int var11; 1400 int var12; 1401 label136: 1402 1403 for (var9 = 0; var9 < var7; ++var9) 1404 { 1405 var10 = (WorldRenderer)this.worldRenderersToUpdate.get(var9); 1406 1407 if (var10 != null) 1408 { 1409 if (!par2) 1410 { 1411 if (var10.distanceToEntitySquared(par1EntityLiving) > 256.0F) 1412 { 1413 for (var11 = 0; var11 < var3 && (var5[var11] == null || var4.doCompare(var5[var11], var10) <= 0); ++var11) 1414 { 1415 ; 1416 } 1417 1418 --var11; 1419 1420 if (var11 > 0) 1421 { 1422 var12 = var11; 1423 1424 while (true) 1425 { 1426 --var12; 1427 1428 if (var12 == 0) 1429 { 1430 var5[var11] = var10; 1431 continue label136; 1432 } 1433 1434 var5[var12 - 1] = var5[var12]; 1435 } 1436 } 1437 1438 continue; 1439 } 1440 } 1441 else if (!var10.isInFrustum) 1442 { 1443 continue; 1444 } 1445 1446 if (var6 == null) 1447 { 1448 var6 = new ArrayList(); 1449 } 1450 1451 ++var8; 1452 var6.add(var10); 1453 this.worldRenderersToUpdate.set(var9, (Object)null); 1454 } 1455 } 1456 1457 this.theWorld.theProfiler.endSection(); 1458 this.theWorld.theProfiler.startSection("sort"); 1459 1460 if (var6 != null) 1461 { 1462 if (var6.size() > 1) 1463 { 1464 Collections.sort(var6, var4); 1465 } 1466 1467 for (var9 = var6.size() - 1; var9 >= 0; --var9) 1468 { 1469 var10 = (WorldRenderer)var6.get(var9); 1470 var10.updateRenderer(); 1471 var10.needsUpdate = false; 1472 } 1473 } 1474 1475 this.theWorld.theProfiler.endSection(); 1476 var9 = 0; 1477 this.theWorld.theProfiler.startSection("rebuild"); 1478 int var16; 1479 1480 for (var16 = var3 - 1; var16 >= 0; --var16) 1481 { 1482 WorldRenderer var17 = var5[var16]; 1483 1484 if (var17 != null) 1485 { 1486 if (!var17.isInFrustum && var16 != var3 - 1) 1487 { 1488 var5[var16] = null; 1489 var5[0] = null; 1490 break; 1491 } 1492 1493 var5[var16].updateRenderer(); 1494 var5[var16].needsUpdate = false; 1495 ++var9; 1496 } 1497 } 1498 1499 this.theWorld.theProfiler.endSection(); 1500 this.theWorld.theProfiler.startSection("cleanup"); 1501 var16 = 0; 1502 var11 = 0; 1503 1504 for (var12 = this.worldRenderersToUpdate.size(); var16 != var12; ++var16) 1505 { 1506 WorldRenderer var13 = (WorldRenderer)this.worldRenderersToUpdate.get(var16); 1507 1508 if (var13 != null) 1509 { 1510 boolean var14 = false; 1511 1512 for (int var15 = 0; var15 < var3 && !var14; ++var15) 1513 { 1514 if (var13 == var5[var15]) 1515 { 1516 var14 = true; 1517 } 1518 } 1519 1520 if (!var14) 1521 { 1522 if (var11 != var16) 1523 { 1524 this.worldRenderersToUpdate.set(var11, var13); 1525 } 1526 1527 ++var11; 1528 } 1529 } 1530 } 1531 1532 this.theWorld.theProfiler.endSection(); 1533 this.theWorld.theProfiler.startSection("trim"); 1534 1535 while (true) 1536 { 1537 --var16; 1538 1539 if (var16 < var11) 1540 { 1541 this.theWorld.theProfiler.endSection(); 1542 return var7 == var8 + var9; 1543 } 1544 1545 this.worldRenderersToUpdate.remove(var16); 1546 } 1547 } 1548 1549 public void drawBlockBreaking(EntityPlayer par1EntityPlayer, MovingObjectPosition par2MovingObjectPosition, int par3, ItemStack par4ItemStack, float par5) 1550 { 1551 Tessellator var6 = Tessellator.instance; 1552 GL11.glEnable(GL11.GL_BLEND); 1553 GL11.glEnable(GL11.GL_ALPHA_TEST); 1554 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); 1555 GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)Minecraft.getSystemTime() / 100.0F) * 0.2F + 0.4F) * 0.5F); 1556 1557 if (par3 != 0 && par4ItemStack != null) 1558 { 1559 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 1560 float var7 = MathHelper.sin((float)Minecraft.getSystemTime() / 100.0F) * 0.2F + 0.8F; 1561 GL11.glColor4f(var7, var7, var7, MathHelper.sin((float)Minecraft.getSystemTime() / 200.0F) * 0.2F + 0.5F); 1562 int var8 = this.renderEngine.getTexture("/terrain.png"); 1563 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8); 1564 } 1565 1566 GL11.glDisable(GL11.GL_BLEND); 1567 GL11.glDisable(GL11.GL_ALPHA_TEST); 1568 } 1569 1570 public void drawBlockDamageTexture(Tessellator par1Tessellator, EntityPlayer par2EntityPlayer, float par3) 1571 { 1572 drawBlockDamageTexture(par1Tessellator, (EntityLiving)par2EntityPlayer, par3); 1573 } 1574 1575 public void drawBlockDamageTexture(Tessellator par1Tessellator, EntityLiving par2EntityPlayer, float par3) 1576 { 1577 double var4 = par2EntityPlayer.lastTickPosX + (par2EntityPlayer.posX - par2EntityPlayer.lastTickPosX) * (double)par3; 1578 double var6 = par2EntityPlayer.lastTickPosY + (par2EntityPlayer.posY - par2EntityPlayer.lastTickPosY) * (double)par3; 1579 double var8 = par2EntityPlayer.lastTickPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.lastTickPosZ) * (double)par3; 1580 1581 if (!this.damagedBlocks.isEmpty()) 1582 { 1583 GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR); 1584 int var10 = this.renderEngine.getTexture("/terrain.png"); 1585 GL11.glBindTexture(GL11.GL_TEXTURE_2D, var10); 1586 GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); 1587 GL11.glPushMatrix(); 1588 GL11.glDisable(GL11.GL_ALPHA_TEST); 1589 GL11.glPolygonOffset(-3.0F, -3.0F); 1590 GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); 1591 GL11.glEnable(GL11.GL_ALPHA_TEST); 1592 par1Tessellator.startDrawingQuads(); 1593 par1Tessellator.setTranslation(-var4, -var6, -var8); 1594 par1Tessellator.disableColor(); 1595 Iterator var11 = this.damagedBlocks.values().iterator(); 1596 1597 while (var11.hasNext()) 1598 { 1599 DestroyBlockProgress var12 = (DestroyBlockProgress)var11.next(); 1600 double var13 = (double)var12.getPartialBlockX() - var4; 1601 double var15 = (double)var12.getPartialBlockY() - var6; 1602 double var17 = (double)var12.getPartialBlockZ() - var8; 1603 1604 if (var13 * var13 + var15 * var15 + var17 * var17 > 1024.0D) 1605 { 1606 var11.remove(); 1607 } 1608 else 1609 { 1610 int var19 = this.theWorld.getBlockId(var12.getPartialBlockX(), var12.getPartialBlockY(), var12.getPartialBlockZ()); 1611 Block var20 = var19 > 0 ? Block.blocksList[var19] : null; 1612 1613 if (var20 == null) 1614 { 1615 var20 = Block.stone; 1616 } 1617 1618 this.globalRenderBlocks.renderBlockUsingTexture(var20, var12.getPartialBlockX(), var12.getPartialBlockY(), var12.getPartialBlockZ(), 240 + var12.getPartialBlockDamage()); 1619 } 1620 } 1621 1622 par1Tessellator.draw(); 1623 par1Tessellator.setTranslation(0.0D, 0.0D, 0.0D); 1624 GL11.glDisable(GL11.GL_ALPHA_TEST); 1625 GL11.glPolygonOffset(0.0F, 0.0F); 1626 GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL); 1627 GL11.glEnable(GL11.GL_ALPHA_TEST); 1628 GL11.glDepthMask(true); 1629 GL11.glPopMatrix(); 1630 } 1631 } 1632 1633 /** 1634 * Draws the selection box for the player. Args: entityPlayer, rayTraceHit, i, itemStack, partialTickTime 1635 */ 1636 public void drawSelectionBox(EntityPlayer par1EntityPlayer, MovingObjectPosition par2MovingObjectPosition, int par3, ItemStack par4ItemStack, float par5) 1637 { 1638 if (par3 == 0 && par2MovingObjectPosition.typeOfHit == EnumMovingObjectType.TILE) 1639 { 1640 GL11.glEnable(GL11.GL_BLEND); 1641 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 1642 GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); 1643 GL11.glLineWidth(2.0F); 1644 GL11.glDisable(GL11.GL_TEXTURE_2D); 1645 GL11.glDepthMask(false); 1646 float var6 = 0.002F; 1647 int var7 = this.theWorld.getBlockId(par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ); 1648 1649 if (var7 > 0) 1650 { 1651 Block.blocksList[var7].setBlockBoundsBasedOnState(this.theWorld, par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ); 1652 double var8 = par1EntityPlayer.lastTickPosX + (par1EntityPlayer.posX - par1EntityPlayer.lastTickPosX) * (double)par5; 1653 double var10 = par1EntityPlayer.lastTickPosY + (par1EntityPlayer.posY - par1EntityPlayer.lastTickPosY) * (double)par5; 1654 double var12 = par1EntityPlayer.lastTickPosZ + (par1EntityPlayer.posZ - par1EntityPlayer.lastTickPosZ) * (double)par5; 1655 this.drawOutlinedBoundingBox(Block.blocksList[var7].getSelectedBoundingBoxFromPool(this.theWorld, par2MovingObjectPosition.blockX, par2MovingObjectPosition.blockY, par2MovingObjectPosition.blockZ).expand((double)var6, (double)var6, (double)var6).getOffsetBoundingBox(-var8, -var10, -var12)); 1656 } 1657 1658 GL11.glDepthMask(true); 1659 GL11.glEnable(GL11.GL_TEXTURE_2D); 1660 GL11.glDisable(GL11.GL_BLEND); 1661 } 1662 } 1663 1664 /** 1665 * Draws lines for the edges of the bounding box. 1666 */ 1667 private void drawOutlinedBoundingBox(AxisAlignedBB par1AxisAlignedBB) 1668 { 1669 Tessellator var2 = Tessellator.instance; 1670 var2.startDrawing(3); 1671 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ); 1672 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ); 1673 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ); 1674 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ); 1675 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ); 1676 var2.draw(); 1677 var2.startDrawing(3); 1678 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ); 1679 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ); 1680 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ); 1681 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ); 1682 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ); 1683 var2.draw(); 1684 var2.startDrawing(1); 1685 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ); 1686 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ); 1687 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.minZ); 1688 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.minZ); 1689 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ); 1690 var2.addVertex(par1AxisAlignedBB.maxX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ); 1691 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.minY, par1AxisAlignedBB.maxZ); 1692 var2.addVertex(par1AxisAlignedBB.minX, par1AxisAlignedBB.maxY, par1AxisAlignedBB.maxZ); 1693 var2.draw(); 1694 } 1695 1696 /** 1697 * Marks the blocks in the given range for update 1698 */ 1699 public void markBlocksForUpdate(int par1, int par2, int par3, int par4, int par5, int par6) 1700 { 1701 int var7 = MathHelper.bucketInt(par1, 16); 1702 int var8 = MathHelper.bucketInt(par2, 16); 1703 int var9 = MathHelper.bucketInt(par3, 16); 1704 int var10 = MathHelper.bucketInt(par4, 16); 1705 int var11 = MathHelper.bucketInt(par5, 16); 1706 int var12 = MathHelper.bucketInt(par6, 16); 1707 1708 for (int var13 = var7; var13 <= var10; ++var13) 1709 { 1710 int var14 = var13 % this.renderChunksWide; 1711 1712 if (var14 < 0) 1713 { 1714 var14 += this.renderChunksWide; 1715 } 1716 1717 for (int var15 = var8; var15 <= var11; ++var15) 1718 { 1719 int var16 = var15 % this.renderChunksTall; 1720 1721 if (var16 < 0) 1722 { 1723 var16 += this.renderChunksTall; 1724 } 1725 1726 for (int var17 = var9; var17 <= var12; ++var17) 1727 { 1728 int var18 = var17 % this.renderChunksDeep; 1729 1730 if (var18 < 0) 1731 { 1732 var18 += this.renderChunksDeep; 1733 } 1734 1735 int var19 = (var18 * this.renderChunksTall + var16) * this.renderChunksWide + var14; 1736 WorldRenderer var20 = this.worldRenderers[var19]; 1737 1738 if (var20 != null && !var20.needsUpdate) 1739 { 1740 this.worldRenderersToUpdate.add(var20); 1741 var20.markDirty(); 1742 } 1743 } 1744 } 1745 } 1746 } 1747 1748 /** 1749 * Will mark the block and neighbors that their renderers need an update (could be all the same renderer 1750 * potentially) Args: x, y, z 1751 */ 1752 public void markBlockNeedsUpdate(int par1, int par2, int par3) 1753 { 1754 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par1 + 1, par2 + 1, par3 + 1); 1755 } 1756 1757 /** 1758 * As of mc 1.2.3 this method has exactly the same signature and does exactly the same as markBlockNeedsUpdate 1759 */ 1760 public void markBlockNeedsUpdate2(int par1, int par2, int par3) 1761 { 1762 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par1 + 1, par2 + 1, par3 + 1); 1763 } 1764 1765 /** 1766 * Called across all registered IWorldAccess instances when a block range is invalidated. Args: minX, minY, minZ, 1767 * maxX, maxY, maxZ 1768 */ 1769 public void markBlockRangeNeedsUpdate(int par1, int par2, int par3, int par4, int par5, int par6) 1770 { 1771 this.markBlocksForUpdate(par1 - 1, par2 - 1, par3 - 1, par4 + 1, par5 + 1, par6 + 1); 1772 } 1773 1774 /** 1775 * Checks all renderers that previously weren't in the frustum and 1/16th of those that previously were in the 1776 * frustum for frustum clipping Args: frustum, partialTickTime 1777 */ 1778 public void clipRenderersByFrustum(ICamera par1ICamera, float par2) 1779 { 1780 for (int var3 = 0; var3 < this.worldRenderers.length; ++var3) 1781 { 1782 if (!this.worldRenderers[var3].skipAllRenderPasses() && (!this.worldRenderers[var3].isInFrustum || (var3 + this.frustumCheckOffset & 15) == 0)) 1783 { 1784 this.worldRenderers[var3].updateInFrustum(par1ICamera); 1785 } 1786 } 1787 1788 ++this.frustumCheckOffset; 1789 } 1790 1791 /** 1792 * Plays the specified record. Arg: recordName, x, y, z 1793 */ 1794 public void playRecord(String par1Str, int par2, int par3, int par4) 1795 { 1796 if (par1Str != null) 1797 { 1798 this.mc.ingameGUI.setRecordPlayingMessage("C418 - " + par1Str); 1799 } 1800 1801 this.mc.sndManager.playStreaming(par1Str, (float)par2, (float)par3, (float)par4); 1802 } 1803 1804 /** 1805 * Plays the specified sound. Arg: soundName, x, y, z, volume, pitch 1806 */ 1807 public void playSound(String par1Str, double par2, double par4, double par6, float par8, float par9) {} 1808 1809 /** 1810 * Spawns a particle. Arg: particleType, x, y, z, velX, velY, velZ 1811 */ 1812 public void spawnParticle(String par1Str, double par2, double par4, double par6, double par8, double par10, double par12) 1813 { 1814 this.func_72726_b(par1Str, par2, par4, par6, par8, par10, par12); 1815 } 1816 1817 public EntityFX func_72726_b(String par1Str, double par2, double par4, double par6, double par8, double par10, double par12) 1818 { 1819 if (this.mc != null && this.mc.renderViewEntity != null && this.mc.effectRenderer != null) 1820 { 1821 int var14 = this.mc.gameSettings.particleSetting; 1822 1823 if (var14 == 1 && this.theWorld.rand.nextInt(3) == 0) 1824 { 1825 var14 = 2; 1826 } 1827 1828 double var15 = this.mc.renderViewEntity.posX - par2; 1829 double var17 = this.mc.renderViewEntity.posY - par4; 1830 double var19 = this.mc.renderViewEntity.posZ - par6; 1831 EntityFX var21 = null; 1832 Object effectObject = null; 1833 1834 if (par1Str.equals("hugeexplosion")) 1835 { 1836 this.mc.effectRenderer.addEffect(var21 = new EntityHugeExplodeFX(this.theWorld, par2, par4, par6, par8, par10, par12)); 1837 } 1838 else if (par1Str.equals("largeexplode")) 1839 { 1840 this.mc.effectRenderer.addEffect(var21 = new EntityLargeExplodeFX(this.renderEngine, this.theWorld, par2, par4, par6, par8, par10, par12)); 1841 } 1842 1843 if (var21 != null) 1844 { 1845 return (EntityFX)var21; 1846 } 1847 else 1848 { 1849 double var22 = 16.0D; 1850 1851 if (var15 * var15 + var17 * var17 + var19 * var19 > var22 * var22) 1852 { 1853 return null; 1854 } 1855 else if (var14 > 1) 1856 { 1857 return null; 1858 } 1859 else 1860 { 1861 if (par1Str.equals("bubble")) 1862 { 1863 var21 = new EntityBubbleFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1864 } 1865 else if (par1Str.equals("suspended")) 1866 { 1867 var21 = new EntitySuspendFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1868 } 1869 else if (par1Str.equals("depthsuspend")) 1870 { 1871 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1872 } 1873 else if (par1Str.equals("townaura")) 1874 { 1875 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1876 } 1877 else if (par1Str.equals("crit")) 1878 { 1879 var21 = new EntityCritFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1880 } 1881 else if (par1Str.equals("magicCrit")) 1882 { 1883 var21 = new EntityCritFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1884 ((EntityFX)var21).setRBGColorF(((EntityFX)var21).getRedColorF() * 0.3F, ((EntityFX)var21).getGreenColorF() * 0.8F, ((EntityFX)var21).getBlueColorF()); 1885 ((EntityFX)var21).setParticleTextureIndex(((EntityFX)var21).getParticleTextureIndex() + 1); 1886 } 1887 else if (par1Str.equals("smoke")) 1888 { 1889 var21 = new EntitySmokeFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1890 } 1891 else if (par1Str.equals("mobSpell")) 1892 { 1893 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, 0.0D, 0.0D, 0.0D); 1894 ((EntityFX)var21).setRBGColorF((float)par8, (float)par10, (float)par12); 1895 } 1896 else if (par1Str.equals("mobSpellAmbient")) 1897 { 1898 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, 0.0D, 0.0D, 0.0D); 1899 ((EntityFX)var21).func_82338_g(0.15F); 1900 ((EntityFX)var21).setRBGColorF((float)par8, (float)par10, (float)par12); 1901 } 1902 else if (par1Str.equals("spell")) 1903 { 1904 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1905 } 1906 else if (par1Str.equals("instantSpell")) 1907 { 1908 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1909 ((EntitySpellParticleFX)var21).func_70589_b(144); 1910 } 1911 else if (par1Str.equals("witchMagic")) 1912 { 1913 var21 = new EntitySpellParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1914 ((EntitySpellParticleFX)var21).func_70589_b(144); 1915 float var24 = this.theWorld.rand.nextFloat() * 0.5F + 0.35F; 1916 ((EntityFX)var21).setRBGColorF(1.0F * var24, 0.0F * var24, 1.0F * var24); 1917 } 1918 else if (par1Str.equals("note")) 1919 { 1920 var21 = new EntityNoteFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1921 } 1922 else if (par1Str.equals("portal")) 1923 { 1924 var21 = new EntityPortalFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1925 } 1926 else if (par1Str.equals("enchantmenttable")) 1927 { 1928 var21 = new EntityEnchantmentTableParticleFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1929 } 1930 else if (par1Str.equals("explode")) 1931 { 1932 var21 = new EntityExplodeFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1933 } 1934 else if (par1Str.equals("flame")) 1935 { 1936 var21 = new EntityFlameFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1937 } 1938 else if (par1Str.equals("lava")) 1939 { 1940 var21 = new EntityLavaFX(this.theWorld, par2, par4, par6); 1941 } 1942 else if (par1Str.equals("footstep")) 1943 { 1944 var21 = new EntityFootStepFX(this.renderEngine, this.theWorld, par2, par4, par6); 1945 } 1946 else if (par1Str.equals("splash")) 1947 { 1948 var21 = new EntitySplashFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1949 } 1950 else if (par1Str.equals("largesmoke")) 1951 { 1952 var21 = new EntitySmokeFX(this.theWorld, par2, par4, par6, par8, par10, par12, 2.5F); 1953 } 1954 else if (par1Str.equals("cloud")) 1955 { 1956 var21 = new EntityCloudFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1957 } 1958 else if (par1Str.equals("reddust")) 1959 { 1960 var21 = new EntityReddustFX(this.theWorld, par2, par4, par6, (float)par8, (float)par10, (float)par12); 1961 } 1962 else if (par1Str.equals("snowballpoof")) 1963 { 1964 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.snowball); 1965 effectObject = Item.snowball; 1966 } 1967 else if (par1Str.equals("dripWater")) 1968 { 1969 var21 = new EntityDropParticleFX(this.theWorld, par2, par4, par6, Material.water); 1970 } 1971 else if (par1Str.equals("dripLava")) 1972 { 1973 var21 = new EntityDropParticleFX(this.theWorld, par2, par4, par6, Material.lava); 1974 } 1975 else if (par1Str.equals("snowshovel")) 1976 { 1977 var21 = new EntitySnowShovelFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1978 } 1979 else if (par1Str.equals("slime")) 1980 { 1981 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, Item.slimeBall); 1982 effectObject = Item.slimeBall; 1983 } 1984 else if (par1Str.equals("heart")) 1985 { 1986 var21 = new EntityHeartFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1987 } 1988 else if (par1Str.equals("angryVillager")) 1989 { 1990 var21 = new EntityHeartFX(this.theWorld, par2, par4 + 0.5D, par6, par8, par10, par12); 1991 ((EntityFX)var21).setParticleTextureIndex(81); 1992 ((EntityFX)var21).setRBGColorF(1.0F, 1.0F, 1.0F); 1993 } 1994 else if (par1Str.equals("happyVillager")) 1995 { 1996 var21 = new EntityAuraFX(this.theWorld, par2, par4, par6, par8, par10, par12); 1997 ((EntityFX)var21).setParticleTextureIndex(82); 1998 ((EntityFX)var21).setRBGColorF(1.0F, 1.0F, 1.0F); 1999 } 2000 else 2001 { 2002 int var25; 2003 2004 if (par1Str.startsWith("iconcrack_")) 2005 { 2006 var25 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1)); 2007 var21 = new EntityBreakingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Item.itemsList[var25]); 2008 effectObject = Item.itemsList[var25]; 2009 } 2010 else if (par1Str.startsWith("tilecrack_")) 2011 { 2012 var25 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1)); 2013 var21 = new EntityDiggingFX(this.theWorld, par2, par4, par6, par8, par10, par12, Block.blocksList[var25], 0, 0); 2014 effectObject = Block.blocksList[var25]; 2015 } 2016 } 2017 2018 if (var21 != null) 2019 { 2020 this.mc.effectRenderer.addEffect((EntityFX)var21, effectObject); 2021 } 2022 2023 return (EntityFX)var21; 2024 } 2025 } 2026 } 2027 else 2028 { 2029 return null; 2030 } 2031 } 2032 2033 /** 2034 * Start the skin for this entity downloading, if necessary, and increment its reference counter 2035 */ 2036 public void obtainEntitySkin(Entity par1Entity) 2037 { 2038 par1Entity.updateCloak(); 2039 2040 if (par1Entity.skinUrl != null) 2041 { 2042 this.renderEngine.obtainImageData(par1Entity.skinUrl, new ImageBufferDownload()); 2043 } 2044 2045 if (par1Entity.cloakUrl != null) 2046 { 2047 this.renderEngine.obtainImageData(par1Entity.cloakUrl, new ImageBufferDownload()); 2048 } 2049 } 2050 2051 /** 2052 * Decrement the reference counter for this entity's skin image data 2053 */ 2054 public void releaseEntitySkin(Entity par1Entity) 2055 { 2056 if (par1Entity.skinUrl != null) 2057 { 2058 this.renderEngine.releaseImageData(par1Entity.skinUrl); 2059 } 2060 2061 if (par1Entity.cloakUrl != null) 2062 { 2063 this.renderEngine.releaseImageData(par1Entity.cloakUrl); 2064 } 2065 } 2066 2067 public void func_72728_f() 2068 { 2069 GLAllocation.deleteDisplayLists(this.glRenderListBase); 2070 } 2071 2072 public void func_82746_a(int par1, int par2, int par3, int par4, int par5) 2073 { 2074 Random var6 = this.theWorld.rand; 2075 2076 switch (par1) 2077 { 2078 case 1013: 2079 case 1018: 2080 if (this.mc.renderViewEntity != null) 2081 { 2082 double var7 = (double)par2 - this.mc.renderViewEntity.posX; 2083 double var9 = (double)par3 - this.mc.renderViewEntity.posY; 2084 double var11 = (double)par4 - this.mc.renderViewEntity.posZ; 2085 double var13 = Math.sqrt(var7 * var7 + var9 * var9 + var11 * var11); 2086 double var15 = this.mc.renderViewEntity.posX; 2087 double var17 = this.mc.renderViewEntity.posY; 2088 double var19 = this.mc.renderViewEntity.posZ; 2089 2090 if (var13 > 0.0D) 2091 { 2092 var15 += var7 / var13 * 2.0D; 2093 var17 += var9 / var13 * 2.0D; 2094 var19 += var11 / var13 * 2.0D; 2095 } 2096 2097 if (par1 == 1013) 2098 { 2099 this.theWorld.playSound(var15, var17, var19, "mob.wither.spawn", 1.0F, 1.0F); 2100 } 2101 else if (par1 == 1018) 2102 { 2103 this.theWorld.playSound(var15, var17, var19, "mob.enderdragon.end", 5.0F, 1.0F); 2104 } 2105 } 2106 default: 2107 } 2108 } 2109 2110 /** 2111 * Plays a pre-canned sound effect along with potentially auxiliary data-driven one-shot behaviour (particles, etc). 2112 */ 2113 public void playAuxSFX(EntityPlayer par1EntityPlayer, int par2, int par3, int par4, int par5, int par6) 2114 { 2115 Random var7 = this.theWorld.rand; 2116 double var8; 2117 double var10; 2118 double var12; 2119 String var14; 2120 int var15; 2121 int var20; 2122 double var23; 2123 double var25; 2124 double var27; 2125 double var29; 2126 double var39; 2127 2128 switch (par2) 2129 { 2130 case 1000: 2131 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.click", 1.0F, 1.0F); 2132 break; 2133 case 1001: 2134 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.click", 1.0F, 1.2F); 2135 break; 2136 case 1002: 2137 this.theWorld.playSound((double)par3, (double)par4, (double)par5, "random.bow", 1.0F, 1.2F); 2138 break; 2139 case 1003: 2140 if (Math.random() < 0.5D) 2141 { 2142 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.door_open", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2143 } 2144 else 2145 { 2146 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.door_close", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2147 } 2148 2149 break; 2150 case 1004: 2151 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.fizz", 0.5F, 2.6F + (var7.nextFloat() - var7.nextFloat()) * 0.8F); 2152 break; 2153 case 1005: 2154 if (Item.itemsList[par6] instanceof ItemRecord) 2155 { 2156 this.theWorld.playRecord(((ItemRecord)Item.itemsList[par6]).recordName, par3, par4, par5); 2157 } 2158 else 2159 { 2160 this.theWorld.playRecord((String)null, par3, par4, par5); 2161 } 2162 2163 break; 2164 case 1007: 2165 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.charge", 10.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2166 break; 2167 case 1008: 2168 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.fireball", 10.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2169 break; 2170 case 1009: 2171 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.ghast.fireball", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2172 break; 2173 case 1010: 2174 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.wood", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2175 break; 2176 case 1011: 2177 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.metal", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2178 break; 2179 case 1012: 2180 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.woodbreak", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2181 break; 2182 case 1014: 2183 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.wither.shoot", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2184 break; 2185 case 1015: 2186 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.bat.takeoff", 0.05F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2187 break; 2188 case 1016: 2189 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.infect", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2190 break; 2191 case 1017: 2192 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "mob.zombie.unfect", 2.0F, (var7.nextFloat() - var7.nextFloat()) * 0.2F + 1.0F); 2193 break; 2194 case 1020: 2195 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_break", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2196 break; 2197 case 1021: 2198 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_use", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2199 break; 2200 case 1022: 2201 this.theWorld.playSound((double)((float)par3 + 0.5F), (double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), "random.anvil_land", 0.3F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2202 break; 2203 case 2000: 2204 int var33 = par6 % 3 - 1; 2205 int var9 = par6 / 3 % 3 - 1; 2206 var10 = (double)par3 + (double)var33 * 0.6D + 0.5D; 2207 var12 = (double)par4 + 0.5D; 2208 double var34 = (double)par5 + (double)var9 * 0.6D + 0.5D; 2209 2210 for (int var35 = 0; var35 < 10; ++var35) 2211 { 2212 double var37 = var7.nextDouble() * 0.2D + 0.01D; 2213 double var38 = var10 + (double)var33 * 0.01D + (var7.nextDouble() - 0.5D) * (double)var9 * 0.5D; 2214 var39 = var12 + (var7.nextDouble() - 0.5D) * 0.5D; 2215 var23 = var34 + (double)var9 * 0.01D + (var7.nextDouble() - 0.5D) * (double)var33 * 0.5D; 2216 var25 = (double)var33 * var37 + var7.nextGaussian() * 0.01D; 2217 var27 = -0.03D + var7.nextGaussian() * 0.01D; 2218 var29 = (double)var9 * var37 + var7.nextGaussian() * 0.01D; 2219 this.spawnParticle("smoke", var38, var39, var23, var25, var27, var29); 2220 } 2221 2222 return; 2223 case 2001: 2224 var20 = par6 & 4095; 2225 2226 if (var20 > 0) 2227 { 2228 Block var40 = Block.blocksList[var20]; 2229 this.mc.sndManager.playSound(var40.stepSound.getBreakSound(), (float)par3 + 0.5F, (float)par4 + 0.5F, (float)par5 + 0.5F, (var40.stepSound.getVolume() + 1.0F) / 2.0F, var40.stepSound.getPitch() * 0.8F); 2230 } 2231 2232 this.mc.effectRenderer.addBlockDestroyEffects(par3, par4, par5, par6 & 4095, par6 >> 12 & 255); 2233 break; 2234 case 2002: 2235 var8 = (double)par3; 2236 var10 = (double)par4; 2237 var12 = (double)par5; 2238 var14 = "iconcrack_" + Item.potion.shiftedIndex; 2239 2240 for (var15 = 0; var15 < 8; ++var15) 2241 { 2242 this.spawnParticle(var14, var8, var10, var12, var7.nextGaussian() * 0.15D, var7.nextDouble() * 0.2D, var7.nextGaussian() * 0.15D); 2243 } 2244 2245 var15 = Item.potion.getColorFromDamage(par6); 2246 float var16 = (float)(var15 >> 16 & 255) / 255.0F; 2247 float var17 = (float)(var15 >> 8 & 255) / 255.0F; 2248 float var18 = (float)(var15 >> 0 & 255) / 255.0F; 2249 String var19 = "spell"; 2250 2251 if (Item.potion.isEffectInstant(par6)) 2252 { 2253 var19 = "instantSpell"; 2254 } 2255 2256 for (var20 = 0; var20 < 100; ++var20) 2257 { 2258 var39 = var7.nextDouble() * 4.0D; 2259 var23 = var7.nextDouble() * Math.PI * 2.0D; 2260 var25 = Math.cos(var23) * var39; 2261 var27 = 0.01D + var7.nextDouble() * 0.5D; 2262 var29 = Math.sin(var23) * var39; 2263 EntityFX var31 = this.func_72726_b(var19, var8 + var25 * 0.1D, var10 + 0.3D, var12 + var29 * 0.1D, var25, var27, var29); 2264 2265 if (var31 != null) 2266 { 2267 float var32 = 0.75F + var7.nextFloat() * 0.25F; 2268 var31.setRBGColorF(var16 * var32, var17 * var32, var18 * var32); 2269 var31.multiplyVelocity((float)var39); 2270 } 2271 } 2272 2273 this.theWorld.playSound((double)par3 + 0.5D, (double)par4 + 0.5D, (double)par5 + 0.5D, "random.glass", 1.0F, this.theWorld.rand.nextFloat() * 0.1F + 0.9F); 2274 break; 2275 case 2003: 2276 var8 = (double)par3 + 0.5D; 2277 var10 = (double)par4; 2278 var12 = (double)par5 + 0.5D; 2279 var14 = "iconcrack_" + Item.eyeOfEnder.shiftedIndex; 2280 2281 for (var15 = 0; var15 < 8; ++var15) 2282 { 2283 this.spawnParticle(var14, var8, var10, var12, var7.nextGaussian() * 0.15D, var7.nextDouble() * 0.2D, var7.nextGaussian() * 0.15D); 2284 } 2285 2286 for (double var36 = 0.0D; var36 < (Math.PI * 2D); var36 += 0.15707963267948966D) 2287 { 2288 this.spawnParticle("portal", var8 + Math.cos(var36) * 5.0D, var10 - 0.4D, var12 + Math.sin(var36) * 5.0D, Math.cos(var36) * -5.0D, 0.0D, Math.sin(var36) * -5.0D); 2289 this.spawnParticle("portal", var8 + Math.cos(var36) * 5.0D, var10 - 0.4D, var12 + Math.sin(var36) * 5.0D, Math.cos(var36) * -7.0D, 0.0D, Math.sin(var36) * -7.0D); 2290 } 2291 2292 return; 2293 case 2004: 2294 for (int var21 = 0; var21 < 20; ++var21) 2295 { 2296 double var22 = (double)par3 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D; 2297 double var24 = (double)par4 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D; 2298 double var26 = (double)par5 + 0.5D + ((double)this.theWorld.rand.nextFloat() - 0.5D) * 2.0D; 2299 this.theWorld.spawnParticle("smoke", var22, var24, var26, 0.0D, 0.0D, 0.0D); 2300 this.theWorld.spawnParticle("flame", var22, var24, var26, 0.0D, 0.0D, 0.0D); 2301 } 2302 } 2303 } 2304 2305 /** 2306 * Starts (or continues) destroying a block with given ID at the given coordinates for the given partially destroyed 2307 * value 2308 */ 2309 public void destroyBlockPartially(int par1, int par2, int par3, int par4, int par5) 2310 { 2311 if (par5 >= 0 && par5 < 10) 2312 { 2313 DestroyBlockProgress var6 = (DestroyBlockProgress)this.damagedBlocks.get(Integer.valueOf(par1)); 2314 2315 if (var6 == null || var6.getPartialBlockX() != par2 || var6.getPartialBlockY() != par3 || var6.getPartialBlockZ() != par4) 2316 { 2317 var6 = new DestroyBlockProgress(par1, par2, par3, par4); 2318 this.damagedBlocks.put(Integer.valueOf(par1), var6); 2319 } 2320 2321 var6.setPartialBlockDamage(par5); 2322 var6.setCloudUpdateTick(this.cloudTickCounter); 2323 } 2324 else 2325 { 2326 this.damagedBlocks.remove(Integer.valueOf(par1)); 2327 } 2328 } 2329 }