Advertisement
Jetp250

BukkitIslandChunkGenerator.java

May 12th, 2017
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.63 KB | None | 0 0
  1. package me.jetp250.skylands;
  2.  
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Random;
  6.  
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.Material;
  9. import org.bukkit.World;
  10. import org.bukkit.generator.BlockPopulator;
  11. import org.bukkit.generator.ChunkGenerator;
  12. import org.bukkit.material.MaterialData;
  13.  
  14. import me.jetp250.skylands.utility.FastRandom;
  15. import me.jetp250.skylands.utility.MathHelper;
  16. import me.jetp250.skylands.utility.OctaveNoiseGenerator;
  17.  
  18. @SuppressWarnings("deprecation")
  19. public class BukkitIslandChunkGenerator extends ChunkGenerator {
  20.  
  21.     private static final MaterialData[] MATERIALS;
  22.     private static final MaterialData[] MISC;
  23.  
  24.     protected final FastRandom random;
  25.     protected final OctaveNoiseGenerator noise;
  26.  
  27.     public BukkitIslandChunkGenerator(final FastRandom random, final int octaves) {
  28.         this.noise = new OctaveNoiseGenerator(random, octaves, 1 / 64.0F);
  29.         this.random = random;
  30.     }
  31.  
  32.     @Override
  33.     public List<BlockPopulator> getDefaultPopulators(final World world) {
  34.         return Collections.emptyList();
  35.     }
  36.  
  37.     @Override
  38.     public boolean canSpawn(final World world, final int x, final int z) {
  39.         return world.getHighestBlockYAt(x, z) > 0;
  40.     }
  41.  
  42.     @Override
  43.     public ChunkData generateChunkData(final World world, Random NOT_IN_USE, final int chunkX, final int chunkZ,
  44.             final BiomeGrid biome) {
  45.         final ChunkData data = Bukkit.createChunkData(world);
  46.         final int rX = chunkX * 16;
  47.         final int rZ = chunkZ * 16;
  48.         for (int x = 0; x < 16; ++x) {
  49.             final int realX = rX + x;
  50.             for (int z = 0; z < 16; ++z) {
  51.                 final int realZ = rZ + z;
  52.                 final float bottom = noise.noise(realX, realZ, 1.4F, 0.81F) * 40 + 90;
  53.                 float top = noise.noise(realX, realZ, 0.2F, 0.1F) * 14 + 90;
  54.                 final float sub = top - bottom;
  55.                 if (sub < 50F) {
  56.                     top -= (50F - sub) * 0.02;
  57.                 }
  58.                 if (top - bottom >= 3) {
  59.                     int y = top > 255 ? 255 : MathHelper.ceil(top);
  60.                     final int decorationHeight = y - 3;
  61.                     data.setBlock(x, y--, z, MISC[1]);
  62.                     final MaterialData decoration = MISC[2];
  63.                     for (; y > decorationHeight; --y)
  64.                         data.setBlock(x, y, z, decoration);
  65.                     for (; y > bottom; --y) {
  66.                         final MaterialData type = MATERIALS[random.nextInt(MATERIALS.length)];
  67.                         data.setBlock(x, y, z, type.getItemTypeId(), type.getData());
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.         return data;
  73.     }
  74.  
  75.     static {
  76.         MATERIALS = new MaterialData[] { new MaterialData(Material.COBBLESTONE), new MaterialData(Material.STONE),
  77.                 new MaterialData(Material.STONE, (byte) 5) };
  78.         MISC = new MaterialData[] { new MaterialData(Material.STONE), new MaterialData(Material.GRASS),
  79.                 new MaterialData(Material.DIRT) };
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement