Class ChunkGenerator

java.lang.Object
org.bukkit.generator.ChunkGenerator

public abstract class ChunkGenerator extends Object
A chunk generator is responsible for the initial shaping of an entire chunk. For example, the nether chunk generator should shape netherrack and soulsand. A chunk is generated in multiple steps, those steps are always in the same order. Between those steps however an unlimited time may pass. This means, a chunk may generated until the surface step and continue with the bedrock step after one or multiple server restarts or even after multiple Minecraft versions. The order of generation is as follows
  1. generateNoise(WorldInfo, Random, int, int, ChunkData)
  2. generateSurface(WorldInfo, Random, int, int, ChunkData)
  3. generateBedrock(WorldInfo, Random, int, int, ChunkData)
  4. generateCaves(WorldInfo, Random, int, int, ChunkData)
Every method listed above as well as getBaseHeight(WorldInfo, Random, int, int, HeightMap) must be completely thread safe and able to handle multiple concurrent callers. Some aspects of world generation can be delegated to the Vanilla generator. The following methods can be overridden to enable this:
  • Constructor Details

    • ChunkGenerator

      public ChunkGenerator()
  • Method Details

    • generateNoise

      public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)
      Shapes the Chunk noise for the given coordinates.

      Notes:

      This method should never attempt to get the Chunk at the passed coordinates, as doing so may cause an infinite loop.

      This method should never modify the ChunkGenerator.ChunkData at a later point of time.

      The Y-coordinate range should never be hardcoded, to get the Y-coordinate range use the methods ChunkGenerator.ChunkData.getMinHeight() and ChunkGenerator.ChunkData.getMaxHeight().

      If shouldGenerateNoise() is set to true, the given ChunkGenerator.ChunkData contains already the Vanilla noise generation.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      chunkData - To modify
    • generateSurface

      public void generateSurface(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)
      Shapes the Chunk surface for the given coordinates.

      Notes:

      This method should never attempt to get the Chunk at the passed coordinates, as doing so may cause an infinite loop.

      This method should never modify the ChunkGenerator.ChunkData at a later point of time.

      The Y-coordinate range should never be hardcoded, to get the Y-coordinate range use the methods ChunkGenerator.ChunkData.getMinHeight() and ChunkGenerator.ChunkData.getMaxHeight().

      If shouldGenerateSurface() is set to true, the given ChunkGenerator.ChunkData contains already the Vanilla surface generation.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      chunkData - To modify
    • generateBedrock

      public void generateBedrock(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)
      Shapes the Chunk bedrock layer for the given coordinates.

      Notes:

      This method should never attempt to get the Chunk at the passed coordinates, as doing so may cause an infinite loop.

      This method should never modify the ChunkGenerator.ChunkData at a later point of time.

      The Y-coordinate range should never be hardcoded, to get the Y-coordinate range use the methods ChunkGenerator.ChunkData.getMinHeight() and ChunkGenerator.ChunkData.getMaxHeight().

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      chunkData - To modify
    • generateCaves

      public void generateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)
      Shapes the Chunk caves for the given coordinates.

      Notes:

      This method should never attempt to get the Chunk at the passed coordinates, as doing so may cause an infinite loop.

      This method should never modify the ChunkGenerator.ChunkData at a later point of time.

      The Y-coordinate range should never be hardcoded, to get the Y-coordinate range use the methods ChunkGenerator.ChunkData.getMinHeight() and ChunkGenerator.ChunkData.getMaxHeight().

      If shouldGenerateCaves() is set to true, the given ChunkGenerator.ChunkData contains already the Vanilla cave generation.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      chunkData - To modify
    • getDefaultBiomeProvider

      @Nullable public BiomeProvider getDefaultBiomeProvider(@NotNull WorldInfo worldInfo)
      Gets called when no BiomeProvider is set in WorldCreator or via the server configuration files. It is therefore possible that one plugin can provide the Biomes and another one the generation.

      Notes:

      If null is returned, than Vanilla biomes are used.

      This method only gets called once when the world is loaded. Returning another BiomeProvider later one is not respected.

      Parameters:
      worldInfo - The world info of the world the biome provider will be used for
      Returns:
      BiomeProvider to use to fill the biomes of a chunk
    • getBaseHeight

      public int getBaseHeight(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull HeightMap heightMap)
      This method is similar to World.getHighestBlockAt(int, int, HeightMap). With the difference being, that the highest y coordinate should be the block before any surface, bedrock, caves or decoration is applied. Or in other words the highest block when only the noise is present at the chunk.

      Notes:

      When this method is not overridden, the Vanilla base height is used.

      This method should never attempt to get the Chunk at the passed coordinates, or use the method World.getHighestBlockAt(int, int, HeightMap), as doing so may cause an infinite loop.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      x - The X-coordinate from world origin
      z - The Z-coordinate from world origin
      heightMap - From the highest block should be get
      Returns:
      The y coordinate of the highest block at the given location
    • generateChunkData

      @NotNull @Deprecated public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull ChunkGenerator.BiomeGrid biome)
      Deprecated.
      The generation is now split up and the new methods should be used, see ChunkGenerator
      Shapes the chunk for the given coordinates. This method must return a ChunkData.

      Notes:

      This method should never attempt to get the Chunk at the passed coordinates, as doing so may cause an infinite loop

      This method should never modify a ChunkData after it has been returned.

      This method must return a ChunkData returned by createChunkData(org.bukkit.World)

      Parameters:
      world - The world this chunk will be used for
      random - The random generator to use
      x - The X-coordinate of the chunk
      z - The Z-coordinate of the chunk
      biome - Proposed biome values for chunk - can be updated by generator
      Returns:
      ChunkData containing the types for each block created by this generator
    • createChunkData

      @NotNull @Deprecated protected final ChunkGenerator.ChunkData createChunkData(@NotNull World world)
      Deprecated.
      ChunkGenerator.ChunkData are now directly provided
      Create a ChunkData for a world.
      Parameters:
      world - the world the ChunkData is for
      Returns:
      a new ChunkData for world
    • canSpawn

      public boolean canSpawn(@NotNull World world, int x, int z)
      Tests if the specified location is valid for a natural spawn position
      Parameters:
      world - The world we're testing on
      x - X-coordinate of the block to test
      z - Z-coordinate of the block to test
      Returns:
      true if the location is valid, otherwise false
    • getDefaultPopulators

      @NotNull public List<BlockPopulator> getDefaultPopulators(@NotNull World world)
      Gets a list of default BlockPopulators to apply to a given world
      Parameters:
      world - World to apply to
      Returns:
      List containing any amount of BlockPopulators
    • getFixedSpawnLocation

      @Nullable public Location getFixedSpawnLocation(@NotNull World world, @NotNull Random random)
      Gets a fixed spawn location to use for a given world.

      A null value is returned if a world should not use a fixed spawn point, and will instead attempt to find one randomly.

      Parameters:
      world - The world to locate a spawn point for
      random - Random generator to use in the calculation
      Returns:
      Location containing a new spawn point, otherwise null
    • isParallelCapable

      @Deprecated public boolean isParallelCapable()
      Deprecated.
      the chunk generation code should be thread safe
      Gets if this ChunkGenerator is parallel capable. See ChunkGenerator for more information.
      Returns:
      parallel capable status
    • shouldGenerateNoise

      public boolean shouldGenerateNoise()
      Gets if the server should generate Vanilla noise.

      The Vanilla noise is generated before generateNoise(WorldInfo, Random, int, int, ChunkData) is called.

      This is method is not called (and has therefore no effect), if shouldGenerateNoise(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla noise
      See Also:
    • shouldGenerateNoise

      public boolean shouldGenerateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla noise.

      The Vanilla noise is generated before generateNoise(WorldInfo, Random, int, int, ChunkData) is called.

      Only this method is called if both this and shouldGenerateNoise() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla noise
      See Also:
    • shouldGenerateSurface

      public boolean shouldGenerateSurface()
      Gets if the server should generate Vanilla surface.

      The Vanilla surface is generated before generateSurface(WorldInfo, Random, int, int, ChunkData) is called.

      This is method is not called (and has therefore no effect), if shouldGenerateSurface(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla surface
      See Also:
    • shouldGenerateSurface

      public boolean shouldGenerateSurface(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla surface.

      The Vanilla surface is generated before generateSurface(WorldInfo, Random, int, int, ChunkData) is called.

      Only this method is called if both this and shouldGenerateSurface() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla surface
      See Also:
    • shouldGenerateBedrock

      @Deprecated public boolean shouldGenerateBedrock()
      Deprecated.
      has no effect, bedrock generation is part of the surface step, see shouldGenerateSurface()
      Gets if the server should generate Vanilla bedrock.

      The Vanilla bedrock is generated before generateBedrock(WorldInfo, Random, int, int, ChunkData) is called.

      Returns:
      true if the server should generate Vanilla bedrock
    • shouldGenerateCaves

      public boolean shouldGenerateCaves()
      Gets if the server should generate Vanilla caves.

      The Vanilla caves are generated before generateCaves(WorldInfo, Random, int, int, ChunkData) is called.

      This is method is not called (and has therefore no effect), if shouldGenerateCaves(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla caves
      See Also:
    • shouldGenerateCaves

      public boolean shouldGenerateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla caves.

      The Vanilla caves are generated before generateCaves(WorldInfo, Random, int, int, ChunkData) is called.

      Only this method is called if both this and shouldGenerateCaves() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla caves
      See Also:
    • shouldGenerateDecorations

      public boolean shouldGenerateDecorations()
      Gets if the server should generate Vanilla decorations after this ChunkGenerator.

      The Vanilla decoration are generated before any BlockPopulator are called.

      This is method is not called (and has therefore no effect), if shouldGenerateDecorations(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla decorations
      See Also:
    • shouldGenerateDecorations

      public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla decorations after this ChunkGenerator.

      The Vanilla decoration are generated before any BlockPopulator are called.

      Only this method is called if both this and shouldGenerateDecorations() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla decorations
      See Also:
    • shouldGenerateMobs

      public boolean shouldGenerateMobs()
      Gets if the server should generate Vanilla mobs after this ChunkGenerator.

      This is method is not called (and has therefore no effect), if shouldGenerateMobs(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla mobs
      See Also:
    • shouldGenerateMobs

      public boolean shouldGenerateMobs(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla mobs after this ChunkGenerator.

      Only this method is called if both this and shouldGenerateMobs() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla mobs
      See Also:
    • shouldGenerateStructures

      public boolean shouldGenerateStructures()
      Gets if the server should generate Vanilla structures after this ChunkGenerator.

      This is method is not called (and has therefore no effect), if shouldGenerateStructures(WorldInfo, Random, int, int) is overridden.

      Returns:
      true if the server should generate Vanilla structures
      See Also:
    • shouldGenerateStructures

      public boolean shouldGenerateStructures(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ)
      Gets if the server should generate Vanilla structures after this ChunkGenerator.

      Only this method is called if both this and shouldGenerateStructures() are overridden.

      Parameters:
      worldInfo - The world info of the world this chunk will be used for
      random - The random generator to use
      chunkX - The X-coordinate of the chunk
      chunkZ - The Z-coordinate of the chunk
      Returns:
      true if the server should generate Vanilla structures
      See Also: