@Override
  public float generateNoise(
      OpenSimplexNoise simplex, CellNoise cell, int x, int y, float border, float river) {
    float h = simplex.noise2(x / 100f, y / 100f) * 8;
    h += simplex.noise2(x / 30f, y / 30f) * 4;
    h += simplex.noise2(x / 15f, y / 15f) * 2;
    h += simplex.noise2(x / 7f, y / 7f);

    return 70f + (20f * river) + h;
  }
  @Override
  public float generateNoise(
      OpenSimplexNoise simplex, CellNoise cell, int x, int y, float border, float river) {

    float st = (simplex.noise2(x / 160f, y / 160f) + 0.38f) * (ConfigRTG.duneHeight + 23f) * river;
    st = st < 0.2f ? 0.2f : st;

    float h = simplex.noise2(x / 60f, y / 60f) * st * 2f;
    h = h > 0f ? -h : h;
    h += st;
    h *= h / 50f;
    h += st;

    return 70f + h;
  }
  @Override
  public float generateNoise(
      OpenSimplexNoise simplex, CellNoise cell, int x, int y, float border, float river) {
    float h = simplex.noise2(x / 180f, y / 180f) * 40f * river;
    h *= h / 35f;

    if (h < 1f) {
      h = 1f;
    }

    if (h < 4f) {
      h += (simplex.noise2(x / 50f, y / 50f) + simplex.noise2(x / 15f, y / 15f)) * (4f - h);
    }

    return 68f + h;
  }
  @Override
  public float generateNoise(
      OpenSimplexNoise simplex,
      CellNoise cell,
      int x,
      int y,
      float ocean,
      float border,
      float river) {
    float h = simplex.noise2(x / vWidth, y / vWidth) * vHeight * river;
    h += simplex.noise2(x / 20f, y / 20f) * 2;

    float m = simplex.noise2(x / hWidth, y / hWidth) * hHeight * river;
    m *= m / 40f;

    float sm = simplex.noise2(x / 30f, y / 30f) * 8f;
    sm *= m / 20f > 3.75f ? 3.75f : m / 20f;
    m += sm;

    float cm = cell.noise(x / 25D, y / 25D, 1D) * 12f;
    cm *= m / 20f > 3.75f ? 3.75f : m / 20f;
    m += cm;

    float l = simplex.noise2(x / lWidth, y / lWidth) * lHeight;
    l *= l / 25f;
    l = l < 8f ? 8f : l;

    h += simplex.noise2(x / 12f, y / 12f) * 3f;
    h += simplex.noise2(x / 5f, y / 5f) * 1.5f;

    return bHeight + h + m - l;
  }
  @Override
  public float generateNoise(
      OpenSimplexNoise simplex, CellNoise cell, int x, int y, float border, float river) {

    float floNoise;
    float st = (simplex.noise2(x / 160f, y / 160f) + 0.38f) * 10f * river;
    st = st < 0.2f ? 0.2f : st;

    float h = simplex.noise2(x / 60f, y / 60f) * st * 2f;
    h = h > 0f ? -h : h;
    h += st;
    h *= h / 80f;
    h += st;

    floNoise = 62f + h;

    // FMLLog.log(Level.INFO, "floNoise = %f", floNoise);

    return floNoise;
  }
  @Override
  public float generateNoise(
      OpenSimplexNoise simplex, CellNoise cell, int x, int y, float border, float river) {

    float h = simplex.noise2(x / 200f, y / 200f) * 4;
    h += simplex.noise2(x / 100f, y / 100f) * 2;

    float m = simplex.noise2(x / 200f, y / 200f) * hillStrength * river;
    m *= m / ((hillStrength * 0.1f) + hillStrength);

    float sm = simplex.noise2(x / hillStrength, y / hillStrength) * 8f;
    sm *= m / 20f > 3.75f ? 3.75f : m / 20f;
    m += sm;

    float l = simplex.noise2(x / 260f, y / 260f) * 38f;
    l *= l / 25f;
    l = l < -8f ? -8f : l;

    return baseHeight + h + m - l;
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {
    RealisticBiomeBase.rDecorateSeedBiome(
        world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    float l = simplex.noise2(chunkX / 80f, chunkY / 80f) * 60f - 15f;

    if (rand.nextInt(24) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);

      if (y22 < 100) {
        if (rand.nextBoolean()) {
          (new WorldGenLog(logBlock, 1, Blocks.leaves, -1, 2 + rand.nextInt(2)))
              .generate(world, rand, x22, y22, z22);
        } else {
          (new WorldGenLog(Blocks.log, 0, Blocks.leaves, -1, 2 + rand.nextInt(2)))
              .generate(world, rand, x22, y22, z22);
        }
      }
    }

    //        for (int f23 = 0; f23 < 8f * strength; f23++)
    //        {
    //            int j15 = chunkX + rand.nextInt(16) + 8;
    //            int j17 = rand.nextInt(128);
    //            int j20 = chunkY + rand.nextInt(16) + 8;
    //            (new WorldGenFlowers(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
    // 11})).generate(world, rand, j15, j17, j20);
    //        }
    //
    //        for (int l14 = 0; l14 < 12f * strength; l14++)
    //        {
    //            int l19 = chunkX + rand.nextInt(16) + 8;
    //            int k22 = rand.nextInt(128);
    //            int j24 = chunkY + rand.nextInt(16) + 8;
    //            (new WorldGenGrass(Blocks.tallgrass, 1)).generate(world, rand, l19, k22, j24);
    //        }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    // rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    rDecorateSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    float l = simplex.noise2(chunkX / 100f, chunkY / 100f) * 6f + 0.8f;

    if (l > 0f && rand.nextInt(12) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);
      (new WorldGenLog(1, 3 + rand.nextInt(4), false)).generate(world, rand, x22, y22, z22);
    }

    for (int b = 0; b < 2f * strength; b++) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);

      if (rand.nextInt(8) == 0) {

        if (rand.nextInt(10) == 0) {
          (new WorldGenTreeShrub(rand.nextInt(5) + 4, rand.nextInt(2), rand.nextInt(2)))
              .generate(world, rand, i1, k1, j1);
        } else {
          (new WorldGenTreeShrub(rand.nextInt(4) + 1, rand.nextInt(2), rand.nextInt(2)))
              .generate(world, rand, i1, k1, j1);
        }
      }
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    // rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    float l = simplex.noise2(chunkX / 100f, chunkY / 100f) * 6f + 0.8f;

    if (l > 0f && rand.nextInt(6) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);

      Block log;
      byte logMeta;

      log = Blocks.log;
      logMeta = (byte) 0;

      (new WorldGenLog(log, logMeta, Blocks.leaves, -1, 3 + rand.nextInt(3)))
          .generate(world, rand, x22, y22, z22);
    }

    rDecorateSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);
  }
  @Override
  public void paintTerrain(
      Block[] blocks,
      byte[] metadata,
      int i,
      int j,
      int x,
      int y,
      int depth,
      World world,
      Random rand,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float[] noise,
      float river,
      BiomeGenBase[] base) {
    float c = CliffCalculator.calc(x, y, noise);
    int cliff = 0;
    boolean gravel = false;

    Block b;
    for (int k = 255; k > -1; k--) {
      b = blocks[(y * 16 + x) * 256 + k];
      if (b == Blocks.air) {
        depth = -1;
      } else if (b == Blocks.stone) {
        depth++;

        if (depth == 0) {
          if (k < 63) {
            if (beach) {
              gravel = true;
            }
          }

          float p = simplex.noise3(i / 8f, j / 8f, k / 8f) * 0.5f;
          if (c > min && c > sCliff - ((k - sHeight) / sStrength) + p) {
            cliff = 1;
          }
          if (c > cCliff) {
            cliff = 2;
          }

          if (cliff == 1) {
            blocks[(y * 16 + x) * 256 + k] =
                rand.nextInt(3) == 0 ? Blocks.cobblestone : Blocks.stone;
          } else if (cliff == 2) {
            blocks[(y * 16 + x) * 256 + k] = shadowDesertBlock;
            metadata[(y * 16 + x) * 256 + k] = shadowDesertByte;
          } else if (k < 63) {
            if (beach) {
              blocks[(y * 16 + x) * 256 + k] = beachBlock;
              gravel = true;
            } else if (k < 62) {
              blocks[(y * 16 + x) * 256 + k] = fillerBlock;
            } else {
              blocks[(y * 16 + x) * 256 + k] = topBlock;
            }
          } else {
            blocks[(y * 16 + x) * 256 + k] = topBlock;
          }
        } else if (depth < 6) {
          if (cliff == 1) {
            blocks[(y * 16 + x) * 256 + k] = Blocks.stone;
          } else if (cliff == 2) {
            blocks[(y * 16 + x) * 256 + k] = shadowDesertBlock;
            metadata[(y * 16 + x) * 256 + k] = shadowDesertByte;
          } else if (gravel) {
            blocks[(y * 16 + x) * 256 + k] = beachBlock;
          } else {
            blocks[(y * 16 + x) * 256 + k] = fillerBlock;
          }
        }
      }
    }
  }
  @Override
  public void paintTerrain(
      Block[] blocks,
      byte[] metadata,
      int i,
      int j,
      int x,
      int y,
      int depth,
      World world,
      Random rand,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float[] noise,
      float river,
      BiomeGenBase[] base) {

    float c = CliffCalculator.calc(x, y, noise);
    boolean cliff = c > 1.4f ? true : false;
    boolean mix = false;

    for (int k = 255; k > -1; k--) {
      Block b = blocks[(y * 16 + x) * 256 + k];
      if (b == Blocks.air) {
        depth = -1;
      } else if (b == Blocks.stone) {
        depth++;

        if (shouldReplaceStone()) {
          blocks[(y * 16 + x) * 256 + k] =
              EBAPI.ebStonify(EnhancedBiomesBlocks.stoneEB, hcStone(world, i, j, x, y, k));
          metadata[(y * 16 + x) * 256 + k] =
              EBAPI.ebStonify(EBAPI.SLATE, hcStoneMeta(world, i, j, x, y, k));
        }

        if (cliff) {
          if (depth > -1 && depth < 2) {
            if (rand.nextInt(3) == 0) {
              blocks[(y * 16 + x) * 256 + k] = blockCliff2;
              metadata[(y * 16 + x) * 256 + k] = byteCliff2;
            } else {
              blocks[(y * 16 + x) * 256 + k] = blockCliff1;
              metadata[(y * 16 + x) * 256 + k] = byteCliff1;
            }

          } else if (depth < 10) {
            blocks[(y * 16 + x) * 256 + k] = blockCliff1;
            metadata[(y * 16 + x) * 256 + k] = byteCliff1;
          }
        } else {
          if (depth == 0 && k > 61) {
            if (simplex.noise2(i / floMixWidth, j / floMixWidth)
                    + simplex.noise2(i / floSmallWidth, j / floSmallWidth) * floSmallStrength
                > floMixHeight) {
              blocks[(y * 16 + x) * 256 + k] = blockMixTop;
              metadata[(y * 16 + x) * 256 + k] = byteMixTop;

              mix = true;
            } else {
              blocks[(y * 16 + x) * 256 + k] = topBlock;
              metadata[(y * 16 + x) * 256 + k] = topBlockMeta;
            }
          } else if (depth < 4) {
            if (mix) {
              blocks[(y * 16 + x) * 256 + k] = blockMixFiller;
              metadata[(y * 16 + x) * 256 + k] = byteMixFiller;
            } else {
              blocks[(y * 16 + x) * 256 + k] = fillerBlock;
              metadata[(y * 16 + x) * 256 + k] = fillerBlockMeta;
            }
          }
        }
      }
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    for (int i23 = 0; i23 < 1; i23++) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);

      if (k1 < 80) {
        (new WorldGenBlockBlob(Blocks.cobblestone, 0)).generate(world, rand, i1, k1, j1);
      }
    }

    if (river > 0.7f) {
      if (river > 0.86f) {
        for (int b33 = 0; b33 < 10f * strength; b33++) {
          int j6 = chunkX + rand.nextInt(16) + 8;
          int k10 = chunkY + rand.nextInt(16) + 8;
          int z52 = world.getHeightValue(j6, k10);

          if (z52 < 100f || (z52 < 120f && rand.nextInt(10) == 0)) {
            WorldGenerator worldgenerator =
                rand.nextInt(4) != 0 ? new WorldGenShrub(0, 0) : new WorldGenTreeSavanna(1);
            worldgenerator.setScale(1.0D, 1.0D, 1.0D);
            worldgenerator.generate(world, rand, j6, z52, k10);
          }
        }
      }

      for (int k18 = 0; k18 < 12f * strength; k18++) {
        int k21 = chunkX + rand.nextInt(16) + 8;
        int j23 = rand.nextInt(160);
        int k24 = chunkY + rand.nextInt(16) + 8;
        if (j23 < 120f) {
          (new WorldGenCacti(false)).generate(world, rand, k21, j23, k24);
        }
      }

      for (int f25 = 0; f25 < 2f * strength; f25++) {
        int i18 = chunkX + rand.nextInt(16) + 8;
        int i23 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenReed()).generate(world, rand, i18, 60 + rand.nextInt(8), i23);
      }

      if (rand.nextInt(28) == 0) {
        int j16 = chunkX + rand.nextInt(16) + 8;
        int j18 = rand.nextInt(128);
        int j21 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenPumpkin()).generate(world, rand, j16, j18, j21);
      }

      for (int f23 = 0; f23 < 3; f23++) {
        int j15 = chunkX + rand.nextInt(16) + 8;
        int j17 = rand.nextInt(128);
        int j20 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenFlowers(new int[] {9, 9, 9, 9, 3, 3, 3, 3, 3, 2, 2, 2, 11, 11, 11}))
            .generate(world, rand, j15, j17, j20);
      }

      for (int l14 = 0; l14 < 15; l14++) {
        int l19 = chunkX + rand.nextInt(16) + 8;
        int k22 = rand.nextInt(128);
        int j24 = chunkY + rand.nextInt(16) + 8;

        if (rand.nextInt(3) == 0) {
          (new WorldGenGrass(Blocks.double_plant, 2)).generate(world, rand, l19, k22, j24);
        } else {
          (new WorldGenGrass(Blocks.tallgrass, 1)).generate(world, rand, l19, k22, j24);
        }
      }
    } else {
      int a = 6 - (int) (simplex.noise2(chunkX / 100f, chunkY / 100f) * 10);
      if (a < 1 || rand.nextInt(a) == 0) {
        int j6 = chunkX + rand.nextInt(16) + 8;
        int k10 = chunkY + rand.nextInt(16) + 8;
        int z52 = world.getHeightValue(j6, k10);

        if (z52 < 100f || (z52 < 120f && rand.nextInt(10) == 0)) {
          WorldGenerator worldgenerator =
              rand.nextInt(14) != 0 ? new WorldGenShrub(0, 0) : new WorldGenTreeSavanna(1);
          worldgenerator.setScale(1.0D, 1.0D, 1.0D);
          worldgenerator.generate(world, rand, j6, z52, k10);
        }
      }

      for (int k18 = 0; k18 < 70; k18++) {
        int k21 = chunkX + rand.nextInt(16) + 8;
        int j23 = 64 + rand.nextInt(64);
        int k24 = chunkY + rand.nextInt(16) + 8;
        if (j23 < 120f) {
          (new WorldGenCacti(false)).generate(world, rand, k21, j23, k24);
        }
      }

      if (rand.nextInt((int) (3f / strength)) == 0) {
        int i18 = chunkX + rand.nextInt(16) + 8;
        int i23 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenReed()).generate(world, rand, i18, 60 + rand.nextInt(8), i23);
      }

      if (rand.nextInt(28) == 0) {
        int j16 = chunkX + rand.nextInt(16) + 8;
        int j18 = rand.nextInt(128);
        int j21 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenPumpkin()).generate(world, rand, j16, j18, j21);
      }

      for (int f23 = 0; f23 < 3; f23++) {
        int j15 = chunkX + rand.nextInt(16) + 8;
        int j17 = rand.nextInt(128);
        int j20 = chunkY + rand.nextInt(16) + 8;
        (new WorldGenFlowers(new int[] {9, 9, 9, 9, 3, 3, 3, 3, 3, 2, 2, 2, 11, 11, 11}))
            .generate(world, rand, j15, j17, j20);
      }

      for (int l14 = 0; l14 < 15; l14++) {
        int l19 = chunkX + rand.nextInt(16) + 8;
        int k22 = rand.nextInt(128);
        int j24 = chunkY + rand.nextInt(16) + 8;

        if (rand.nextInt(3) == 0) {
          (new WorldGenGrass(Blocks.double_plant, 2)).generate(world, rand, l19, k22, j24);
        } else {
          (new WorldGenGrass(Blocks.tallgrass, 1)).generate(world, rand, l19, k22, j24);
        }
      }
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    // boulders
    for (int l = 0; l < 3f * strength; ++l) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);

      if (k1 < 95 && rand.nextInt(16) == 0) {
        (new WorldGenBlob(Blocks.mossy_cobblestone, 0, rand)).generate(world, rand, i1, k1, j1);
      }
    }

    // trees
    float l = simplex.noise2(chunkX / 100f, chunkY / 100f) * 6f + 0.8f;
    for (int b1 = 0; b1 < l * 4f * strength; b1++) {
      int j6 = chunkX + rand.nextInt(16) + 8;
      int k10 = chunkY + rand.nextInt(16) + 8;
      int z52 = world.getHeightValue(j6, k10);

      if (rand.nextInt(24) == 0) {
        // WorldGenerator worldgenerator = new WorldGenTreeSpruceSmall(1 + rand.nextInt(2));
        WorldGenerator worldgenerator = new WorldGenTreePineEuro();
        worldgenerator.setScale(1.0D, 1.0D, 1.0D);
        worldgenerator.generate(world, rand, j6, z52, k10);
      }
    }

    if (l > 0f && rand.nextInt(6) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);
      (new WorldGenLog(1, 3 + rand.nextInt(4), false)).generate(world, rand, x22, y22, z22);
    }

    for (int b = 0; b < 2f * strength; b++) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);
      if (rand.nextInt(10) == 0) {
        (new WorldGenTreeShrub(rand.nextInt(5) + 4, rand.nextInt(2), rand.nextInt(2)))
            .generate(world, rand, i1, k1, j1);
      } else {
        (new WorldGenTreeShrub(rand.nextInt(4) + 1, rand.nextInt(2), rand.nextInt(2)))
            .generate(world, rand, i1, k1, j1);
      }
    }

    if (rand.nextInt((int) (3f / strength)) == 0) {
      int k15 = chunkX + rand.nextInt(16) + 8;
      int k17 = rand.nextInt(64) + 64;
      int k20 = chunkY + rand.nextInt(16) + 8;

      if (rand.nextBoolean()) {
        (new WorldGenFlowers(Blocks.brown_mushroom)).generate(world, rand, k15, k17, k20);
      } else {
        (new WorldGenFlowers(Blocks.red_mushroom)).generate(world, rand, k15, k17, k20);
      }
    }

    if (rand.nextInt((int) (20f / strength)) == 0) {
      int j16 = chunkX + rand.nextInt(16) + 8;
      int j18 = rand.nextInt(128);
      int j21 = chunkY + rand.nextInt(16) + 8;
      (new WorldGenPumpkin()).generate(world, rand, j16, j18, j21);
    }

    for (int l14 = 0; l14 < 10f * strength; l14++) {
      int l19 = chunkX + rand.nextInt(16) + 8;
      int k22 = rand.nextInt(128);
      int j24 = chunkY + rand.nextInt(16) + 8;
      (new WorldGenGrass(Blocks.tallgrass, 1)).generate(world, rand, l19, k22, j24);
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    float l = simplex.noise2(chunkX / 80f, chunkY / 80f) * 60f - 15f;

    for (int b1 = 0; b1 < 2 * strength; b1++) {
      if (rand.nextInt(2) == 0) {
        int j6 = chunkX + rand.nextInt(16) + 8;
        int k10 = chunkY + rand.nextInt(16) + 8;
        int z52 = world.getHeightValue(j6, k10);

        if (z52 < 230) {
          if (rand.nextInt(32) == 0) {
            WorldGenerator worldgenerator = TreeGen.greatOak(rand);
            worldgenerator.setScale(1.0D, 1.0D, 1.0D);
            worldgenerator.generate(world, rand, j6, z52, k10);
          } else {
            WorldGenerator worldgenerator = TreeGen.birch();
            worldgenerator.setScale(1.0D, 1.0D, 1.0D);
            worldgenerator.generate(world, rand, j6, z52, k10);
          }
        }
      }
    }

    if (l > 5f) {
      for (int b2 = 0; b2 < 4f * strength; b2++) {
        int j6 = chunkX + rand.nextInt(16) + 8;
        int k10 = chunkY + rand.nextInt(16) + 8;
        int z52 = world.getHeightValue(j6, k10);

        if (z52 < 220) {
          WorldGenerator worldgenerator =
              rand.nextInt(2) == 0
                  ? TreeGen.birch()
                  : rand.nextInt(10) != 0
                      ? new WorldGenTrees(false)
                      : new WorldGenForest(false, false);
          worldgenerator.setScale(1.0D, 1.0D, 1.0D);
          worldgenerator.generate(world, rand, j6, z52, k10);
        }
      }
    }

    if (rand.nextInt((int) (32f / strength)) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);
      if (y22 < 100) {
        if (rand.nextBoolean()) {
          (new WorldGenLog(Blocks.log, 0, Blocks.leaves, -1, 3 + rand.nextInt(4)))
              .generate(world, rand, x22, y22, z22);
        } else {
          (new WorldGenLog(Blocks.log, 2, Blocks.leaves, -1, 3 + rand.nextInt(4)))
              .generate(world, rand, x22, y22, z22);
        }
      }
    }

    for (int f24 = 0; f24 < 3f * strength; f24++) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);
      if (k1 < 110) {
        (new WorldGenTreeShrub(rand.nextInt(4) + 1, 0, rand.nextInt(3)))
            .generate(world, rand, i1, k1, j1);
      }
    }

    for (int f23 = 0; f23 < 8f * strength; f23++) {
      int j15 = chunkX + rand.nextInt(16) + 8;
      int j17 = rand.nextInt(128);
      int j20 = chunkY + rand.nextInt(16) + 8;
      (new WorldGenFlowers(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}))
          .generate(world, rand, j15, j17, j20);
    }

    for (int l14 = 0; l14 < 12f * strength; l14++) {
      int l19 = chunkX + rand.nextInt(16) + 8;
      int k22 = rand.nextInt(128);
      int j24 = chunkY + rand.nextInt(16) + 8;
      (new WorldGenGrass(Blocks.tallgrass, 1)).generate(world, rand, l19, k22, j24);
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    for (int l = 0; l < 6f * strength; ++l) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);

      if (k1 < 95 && rand.nextInt(16) == 0) {
        (new WorldGenBlob(Blocks.cobblestone, 0, rand)).generate(world, rand, i1, k1, j1);
      }
    }

    float l = simplex.noise2(chunkX / 100f, chunkY / 100f) * 12f + 4f;
    for (int b1 = 0; b1 < l * strength; b1++) {
      int j6 = chunkX + rand.nextInt(16) + 8;
      int k10 = chunkY + rand.nextInt(16) + 8;
      int z52 = world.getHeightValue(j6, k10);

      if (z52 < 90) {
        WorldGenerator worldgenerator =
            rand.nextInt(8) != 0
                ? new WorldGenTreePine(4, rand.nextInt(4) == 0 ? 1 : 0)
                : rand.nextInt(3) != 0
                    ? new WorldGenTreePineSmall(3 + rand.nextInt(6), 6 + rand.nextInt(8), 0)
                    : new WorldGenIceSpike();
        worldgenerator.setScale(1.0D, 1.0D, 1.0D);
        worldgenerator.generate(world, rand, j6, z52, k10);
      } else if (z52 < 120) {
        WorldGenerator worldgenerator =
            rand.nextInt(4) != 0
                ? new WorldGenTreePineSmall(
                    1 + rand.nextInt(3), 3 + rand.nextInt(5), rand.nextInt(2))
                : new WorldGenIceSpike();
        worldgenerator.setScale(1.0D, 1.0D, 1.0D);
        worldgenerator.generate(world, rand, j6, z52, k10);
      }
    }

    if (rand.nextInt((int) (12f / strength)) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);
      if (y22 < 100) {
        (new WorldGenLog(1, 3 + rand.nextInt(4), false)).generate(world, rand, x22, y22, z22);
      }
    }
  }
  @Override
  public void rDecorate(
      World world,
      Random rand,
      int chunkX,
      int chunkY,
      OpenSimplexNoise simplex,
      CellNoise cell,
      float strength,
      float river) {

    /**
     * Using rDecorateSeedBiome() to partially decorate the biome? If so, then comment out this
     * method.
     */
    // rOreGenSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    float l = simplex.noise2(chunkX / 80f, chunkY / 80f) * 60f - 15f;
    // float l = simplex.noise3(chunkX / 80f, chunkY / 80f, simplex.noise2(chunkX / 60f, chunkY /
    // 60f)) * 60f - 15f;

    for (int l1 = 0; l1 < 2f * strength; ++l1) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);

      if (k1 < 80 && rand.nextInt(20) == 0) {
        if (rand.nextInt(8) != 0) {
          (new WorldGenBlob(Blocks.mossy_cobblestone, 0, rand)).generate(world, rand, i1, k1, j1);
        } else {
          (new WorldGenBlob(Blocks.web, 0, rand)).generate(world, rand, i1, k1, j1);
        }
      }
    }

    if (l > 0f) {
      for (int b2 = 0; b2 < 24f * strength; b2++) {
        int j6 = chunkX + rand.nextInt(16) + 8;
        int k10 = chunkY + rand.nextInt(16) + 8;
        int z52 = world.getHeightValue(j6, k10);

        if (z52 < 120) {
          WorldGenerator worldgenerator =
              new WorldGenTreeMangrove(
                  Blocks.log2,
                  1,
                  Blocks.leaves2,
                  1,
                  9 + rand.nextInt(5),
                  3 + rand.nextInt(2),
                  13f,
                  3,
                  0.32f,
                  0.1f);
          worldgenerator.setScale(1.0D, 1.0D, 1.0D);
          worldgenerator.generate(world, rand, j6, z52, k10);
        }
      }
    }

    if (rand.nextInt((int) (10f / strength)) == 0) {
      int x22 = chunkX + rand.nextInt(16) + 8;
      int z22 = chunkY + rand.nextInt(16) + 8;
      int y22 = world.getHeightValue(x22, z22);
      if (y22 < 100) {
        (new WorldGenLog(Blocks.log2, 1, Blocks.leaves2, -1, 9 + rand.nextInt(5)))
            .generate(world, rand, x22, y22, z22);
      }
    }

    for (int f24 = 0; f24 < strength; f24++) {
      int i1 = chunkX + rand.nextInt(16) + 8;
      int j1 = chunkY + rand.nextInt(16) + 8;
      int k1 = world.getHeightValue(i1, j1);
      if (k1 < 110) {
        (new WorldGenTreeShrub(rand.nextInt(4) + 1, 0, rand.nextInt(3)))
            .generate(world, rand, i1, k1, j1);
      }
    }

    if (TerrainGen.decorate(world, rand, chunkX, chunkY, GRASS)) {

      for (int l14 = 0; l14 < 10f * strength; l14++) {
        int l19 = chunkX + rand.nextInt(16) + 8;
        int k22 = rand.nextInt(128);
        int j24 = chunkY + rand.nextInt(16) + 8;
        int grassMeta;

        if (rand.nextInt(16) == 0) {
          grassMeta = 0;
        } else {
          grassMeta = 1;
        }

        (new WorldGenGrass(Blocks.tallgrass, grassMeta)).generate(world, rand, l19, k22, j24);
      }

      for (int l14 = 0; l14 < 8f * strength; l14++) {
        int l19 = chunkX + rand.nextInt(16) + 8;
        int k22 = rand.nextInt(128);
        int j24 = chunkY + rand.nextInt(16) + 8;

        if (rand.nextInt(6) == 0) {
          (new WorldGenGrass(Blocks.double_plant, RandomUtil.getRandomInt(rand, 2, 3)))
              .generate(world, rand, l19, k22, j24);
        }
      }

      for (int l14 = 0; l14 < 4f * strength; l14++) {
        int l19 = chunkX + rand.nextInt(16) + 8;
        int k22 = rand.nextInt(128);
        int j24 = chunkY + rand.nextInt(16) + 8;
        int grassMeta;

        if (rand.nextInt(16) == 0) {
          grassMeta = 0;
        } else {
          grassMeta = RandomUtil.getRandomInt(rand, 1, 2);
        }

        (new WorldGenGrass(Blocks.tallgrass, grassMeta)).generate(world, rand, l19, k22, j24);
      }
    }

    rDecorateSeedBiome(world, rand, chunkX, chunkY, simplex, cell, strength, river, baseBiome);

    int k15 = chunkX + rand.nextInt(16) + 8;
    int k20 = chunkY + rand.nextInt(16) + 8;
    int k17 = world.getHeightValue(k15, k20);

    if (rand.nextBoolean()) {
      (new WorldGenFlowers(Blocks.brown_mushroom)).generate(world, rand, k15, k17, k20);
    } else {
      (new WorldGenFlowers(Blocks.red_mushroom)).generate(world, rand, k15, k17, k20);
    }
  }