Package org.bukkit.generator

# 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:

- `shouldGenerateNoise()`
- `shouldGenerateSurface()`
- `shouldGenerateBedrock()`
- `shouldGenerateCaves()`
- `shouldGenerateDecorations()`
- `shouldGenerateMobs()`
- `shouldGenerateStructures()`

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static interface`
`ChunkGenerator.BiomeGrid`
Deprecated.
Biomes are now set with `BiomeProvider`
`static interface`
`ChunkGenerator.ChunkData`
Data for a Chunk.

## Constructor Summary

Constructors
Constructor
Description
`ChunkGenerator()`

## Method Summary

Modifier and Type
Method
Description
`boolean`
`canSpawn(@NotNull World world, int x, int z)`
Tests if the specified location is valid for a natural spawn position
`protected final @NotNull ChunkGenerator.ChunkData`
`createChunkData(@NotNull World world)`
Deprecated.
`ChunkGenerator.ChunkData` are now directly provided
`@NotNull ChunkGenerator.ChunkData`
`createVanillaChunkData(@NotNull World world, int x, int z)`
Create a ChunkData for use in a generator, that is populated by the vanilla generator for that world
`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.
`void`
`generateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)`
Shapes the Chunk caves for the given coordinates.
`@NotNull 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`
`void`
`generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)`
Shapes the Chunk noise for the given coordinates.
`void`
`generateSurface(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData)`
Shapes the Chunk surface for the given coordinates.
`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)`.
`@Nullable BiomeProvider`
`getDefaultBiomeProvider(@NotNull WorldInfo worldInfo)`
Gets called when no `BiomeProvider` is set in `WorldCreator` or via the server configuration files.
`@NotNull List<BlockPopulator>`
`getDefaultPopulators(@NotNull World world)`
Gets a list of default `BlockPopulator`s to apply to a given world
`@Nullable Location`
`getFixedSpawnLocation(@NotNull World world, @NotNull Random random)`
Gets a fixed spawn location to use for a given world.
`boolean`
`isParallelCapable()`
Deprecated.
the chunk generation code should be thread safe
`boolean`
`shouldGenerateBedrock()`
Gets if the server should generate Vanilla bedrock.
`boolean`
`shouldGenerateCaves()`
Gets if the server should generate Vanilla caves.
`boolean`
`shouldGenerateDecorations()`
Gets if the server should generate Vanilla decorations after this ChunkGenerator.
`boolean`
`shouldGenerateMobs()`
Gets if the server should generate Vanilla mobs after this ChunkGenerator.
`boolean`
`shouldGenerateNoise()`
Gets if the server should generate Vanilla noise.
`boolean`
`shouldGenerateStructures()`
Gets if the server should generate Vanilla structures after this ChunkGenerator.
`boolean`
`shouldGenerateSurface()`
Gets if the server should generate Vanilla surface.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Constructor Details

### ChunkGenerator

public ChunkGenerator()

## Method Details

### generateNoise

public void generateNoise(@NotNull @NotNull WorldInfo worldInfo, @NotNull @NotNull Random random, int chunkX, int chunkZ, @NotNull @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 @NotNull WorldInfo worldInfo, @NotNull @NotNull Random random, int chunkX, int chunkZ, @NotNull @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 @NotNull WorldInfo worldInfo, @NotNull @NotNull Random random, int chunkX, int chunkZ, @NotNull @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()`.

If `shouldGenerateBedrock()` is set to true, the given `ChunkGenerator.ChunkData` contains already the Vanilla bedrock 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

### generateCaves

public void generateCaves(@NotNull @NotNull WorldInfo worldInfo, @NotNull @NotNull Random random, int chunkX, int chunkZ, @NotNull @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 @Nullable BiomeProvider getDefaultBiomeProvider(@NotNull @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 @NotNull WorldInfo worldInfo, @NotNull @NotNull Random random, int x, int z, @NotNull @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 @NotNull ChunkGenerator.ChunkData generateChunkData(@NotNull @NotNull World world, @NotNull @NotNull Random random, int x, int z, @NotNull @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 @NotNull ChunkGenerator.ChunkData createChunkData(@NotNull @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 @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 @NotNull List<BlockPopulator> getDefaultPopulators(@NotNull @NotNull World world)
Gets a list of default `BlockPopulator`s to apply to a given world

Parameters:
  `world` - World to apply to
Returns:
  List containing any amount of BlockPopulators

### getFixedSpawnLocation

@Nullable public @Nullable Location getFixedSpawnLocation(@NotNull @NotNull World world, @NotNull @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.

Returns:
  true if the server should generate Vanilla noise

### 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.

Returns:
  true if the server should generate Vanilla surface

### shouldGenerateBedrock

public boolean shouldGenerateBedrock()
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.

Returns:
  true if the server should generate Vanilla caves

### 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.

Returns:
  true if the server should generate Vanilla decorations

### shouldGenerateMobs

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

Returns:
  true if the server should generate Vanilla mobs

### shouldGenerateStructures

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

Returns:
  true if the server should generate Vanilla structures

### createVanillaChunkData

@NotNull public @NotNull ChunkGenerator.ChunkData createVanillaChunkData(@NotNull @NotNull World world, int x, int z)
Create a ChunkData for use in a generator, that is populated by the vanilla generator for that world

Parameters:
  `world` - the world to create the ChunkData for
  `x` - the x coordinate of the chunk
  `z` - the z coordinate of the chunk
Returns:
  a new ChunkData for the world