/**
   * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the
   * blocks for the specified chunk from the map seed and chunk seed
   */
  public Chunk provideChunk(int par1, int par2) {
    Chunk var3 = new Chunk(this.worldObj, par1, par2);

    for (int var4 = 0; var4 < this.field_82700_c.length; ++var4) {
      int var5 = var4 >> 4;
      ExtendedBlockStorage var6 = var3.getBlockStorageArray()[var5];

      if (var6 == null) {
        var6 = new ExtendedBlockStorage(var4, !this.worldObj.provider.hasNoSky);
        var3.getBlockStorageArray()[var5] = var6;
      }

      for (int var7 = 0; var7 < 16; ++var7) {
        for (int var8 = 0; var8 < 16; ++var8) {
          var6.setExtBlockID(var7, var4 & 15, var8, this.field_82700_c[var4] & 255);
          var6.setExtBlockMetadata(var7, var4 & 15, var8, this.field_82698_d[var4]);
        }
      }
    }

    var3.generateSkylightMap();
    BiomeGenBase[] var9 =
        this.worldObj
            .getWorldChunkManager()
            .loadBlockGeneratorData((BiomeGenBase[]) null, par1 * 16, par2 * 16, 16, 16);
    byte[] var10 = var3.getBiomeArray();

    for (int var11 = 0; var11 < var10.length; ++var11) {
      var10[var11] = (byte) var9[var11].biomeID;
    }

    Iterator var12 = this.structureGenerators.iterator();

    while (var12.hasNext()) {
      MapGenStructure var13 = (MapGenStructure) var12.next();
      var13.generate(this, this.worldObj, par1, par2, (byte[]) null);
    }

    var3.generateSkylightMap();
    return var3;
  }
  /** Sets a blockID of a position within a chunk with metadata. Args: x, y, z, blockID, metadata */
  public boolean setBlockIDWithMetadata(int par1, int par2, int par3, int par4, int par5) {
    int var6 = par3 << 4 | par1;

    if (par2 >= this.precipitationHeightMap[var6] - 1) {
      this.precipitationHeightMap[var6] = -999;
    }

    int var7 = this.heightMap[var6];
    int var8 = this.getBlockID(par1, par2, par3);
    int var9 = this.getBlockMetadata(par1, par2, par3);

    if (var8 == par4 && var9 == par5) {
      return false;
    } else {
      ExtendedBlockStorage var10 = this.storageArrays[par2 >> 4];
      boolean var11 = false;

      if (var10 == null) {
        if (par4 == 0) {
          return false;
        }

        var10 =
            this.storageArrays[par2 >> 4] =
                new ExtendedBlockStorage(par2 >> 4 << 4, !this.worldObj.provider.hasNoSky);
        var11 = par2 >= var7;
      }

      int var12 = this.xPosition * 16 + par1;
      int var13 = this.zPosition * 16 + par3;

      if (var8 != 0 && !this.worldObj.isRemote) {
        Block.blocksList[var8].onSetBlockIDWithMetaData(this.worldObj, var12, par2, var13, var9);
      }

      var10.setExtBlockID(par1, par2 & 15, par3, par4);

      if (var8 != 0) {
        if (!this.worldObj.isRemote) {
          Block.blocksList[var8].breakBlock(this.worldObj, var12, par2, var13, var8, var9);
        } else if (Block.blocksList[var8] instanceof ITileEntityProvider && var8 != par4) {
          this.worldObj.removeBlockTileEntity(var12, par2, var13);
        }
      }

      if (var10.getExtBlockID(par1, par2 & 15, par3) != par4) {
        return false;
      } else {
        var10.setExtBlockMetadata(par1, par2 & 15, par3, par5);

        if (var11) {
          this.generateSkylightMap();
        } else {
          if (Block.lightOpacity[par4 & 4095] > 0) {
            if (par2 >= var7) {
              this.relightBlock(par1, par2 + 1, par3);
            }
          } else if (par2 == var7 - 1) {
            this.relightBlock(par1, par2, par3);
          }

          this.propagateSkylightOcclusion(par1, par3);
        }

        TileEntity var14;

        if (par4 != 0) {
          if (!this.worldObj.isRemote) {
            Block.blocksList[par4].onBlockAdded(this.worldObj, var12, par2, var13);
          }

          if (Block.blocksList[par4] instanceof ITileEntityProvider) {
            var14 = this.getChunkBlockTileEntity(par1, par2, par3);

            if (var14 == null) {
              var14 =
                  ((ITileEntityProvider) Block.blocksList[par4]).createNewTileEntity(this.worldObj);
              this.worldObj.setBlockTileEntity(var12, par2, var13, var14);
            }

            if (var14 != null) {
              var14.updateContainingBlockInfo();
            }
          }
        } else if (var8 > 0 && Block.blocksList[var8] instanceof ITileEntityProvider) {
          var14 = this.getChunkBlockTileEntity(par1, par2, par3);

          if (var14 != null) {
            var14.updateContainingBlockInfo();
          }
        }

        this.isModified = true;
        return true;
      }
    }
  }