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