From f4456f46a7045d81b8d80be8b1c7704e94d4263a Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 11:42:17 -0700 Subject: [PATCH] API stuff --- .../terra/api/bukkit/BukkitBiomeGrid.java | 39 ++++++++++ .../terra/api/bukkit/BukkitBlockData.java | 17 +++++ .../dfsek/terra/api/bukkit/BukkitWorld.java | 5 ++ .../generator/BukkitChunkGenerator.java | 60 +++++++++++++++ .../dfsek/terra/api/generic/BlockData.java | 5 ++ .../api/generic/generator/BlockPopulator.java | 4 +- .../api/generic/generator/ChunkGenerator.java | 75 ++++++++++++++----- .../terra/api/generic/world/BiomeGrid.java | 50 +++++++++++++ .../dfsek/terra/api/generic/world/World.java | 2 + 9 files changed, 236 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/BlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java new file mode 100644 index 000000000..599243fd0 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.world.BiomeGrid; +import org.bukkit.block.Biome; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +public class BukkitBiomeGrid implements BiomeGrid { + private final ChunkGenerator.BiomeGrid delegate; + + public BukkitBiomeGrid(ChunkGenerator.BiomeGrid biomeGrid) { + this.delegate = biomeGrid; + } + + @Override + public ChunkGenerator.BiomeGrid getHandle() { + return delegate; + } + + @Override + public @NotNull Biome getBiome(int x, int z) { + return delegate.getBiome(x, z); + } + + @Override + public @NotNull Biome getBiome(int x, int y, int z) { + return delegate.getBiome(x, y, z); + } + + @Override + public void setBiome(int x, int z, @NotNull Biome bio) { + delegate.setBiome(x, z, bio); + } + + @Override + public void setBiome(int x, int y, int z, @NotNull Biome bio) { + delegate.setBiome(x, y, z, bio); + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java new file mode 100644 index 000000000..73701d1ea --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.BlockData; + +public class BukkitBlockData implements BlockData { + private final org.bukkit.block.data.BlockData delegate; + + public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { + this.delegate = delegate; + } + + + @Override + public org.bukkit.block.data.BlockData getHandle() { + return delegate; + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java index 94e3ae4c3..91b16ae6d 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -13,4 +13,9 @@ public class BukkitWorld implements World { public long getSeed() { return delegate.getSeed(); } + + @Override + public org.bukkit.World getHandle() { + return delegate; + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java new file mode 100644 index 000000000..1c4530278 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -0,0 +1,60 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.bukkit.BukkitBlockData; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Random; + +public abstract class BukkitChunkGenerator extends ChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { + + + @Override + public ChunkGenerator.@NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + BukkitChunkData data = new BukkitChunkData(createChunkData(((BukkitWorld) world).getHandle())); + generateChunkData(new BukkitWorld(world), random, x, z, new BukkitBiomeGrid(biome), data); + return data.getHandle(); + } + + @Override + public List getDefaultPopulators(com.dfsek.terra.api.generic.world.World world) { + return null; + } + + public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { + + private final ChunkGenerator.ChunkData delegate; + + public BukkitChunkData(ChunkGenerator.ChunkData delegate) { + this.delegate = delegate; + } + + @Override + public ChunkGenerator.ChunkData getHandle() { + return delegate; + } + + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); + } + + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new BukkitBlockData(delegate.getBlockData(x, y, z)); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/BlockData.java new file mode 100644 index 000000000..dfca0b585 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/BlockData.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.generic; + +public interface BlockData { + Object getHandle(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java index a205ff579..196a9153a 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java @@ -5,6 +5,6 @@ import com.dfsek.terra.api.generic.world.World; import java.util.Random; -public abstract class BlockPopulator { - public abstract void populate(World world, Random random, Chunk chunk); +public interface BlockPopulator { + void populate(World world, Random random, Chunk chunk); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index 563c7e018..8eda98c94 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -1,27 +1,64 @@ package com.dfsek.terra.api.generic.generator; -import java.util.Collections; +import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import org.jetbrains.annotations.NotNull; + import java.util.List; +import java.util.Random; -public abstract class ChunkGenerator { - public boolean isParallelCapable() { - return false; - } - public boolean shouldGenerateCaves() { - return false; - } - public boolean shouldGenerateDecorations() { - return false; - } - public boolean shouldGenerateMobs() { - return false; - } +public interface ChunkGenerator { + boolean isParallelCapable(); - public boolean shouldGenerateStructures() { - return false; - } + boolean shouldGenerateCaves(); - public List getDefaultPopulators() { - return Collections.emptyList(); + boolean shouldGenerateDecorations(); + + boolean shouldGenerateMobs(); + + boolean shouldGenerateStructures(); + + void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); + + List getDefaultPopulators(World world); + + interface ChunkData { + Object getHandle(); + + /** + * Get the maximum height for the chunk. + *

+ * Setting blocks at or above this height will do nothing. + * + * @return the maximum height + */ + int getMaxHeight(); + + + /** + * Set the block at x,y,z in the chunk data to material. + *

+ * Setting blocks outside the chunk's bounds does nothing. + * + * @param x the x location in the chunk from 0-15 inclusive + * @param y the y location in the chunk from 0 (inclusive) - maxHeight (exclusive) + * @param z the z location in the chunk from 0-15 inclusive + * @param blockData the type to set the block to + */ + void setBlock(int x, int y, int z, @NotNull BlockData blockData); + + + /** + * Get the type and data of the block at x, y, z. + *

+ * Getting blocks outside the chunk's bounds returns air. + * + * @param x the x location in the chunk from 0-15 inclusive + * @param y the y location in the chunk from 0 (inclusive) - maxHeight (exclusive) + * @param z the z location in the chunk from 0-15 inclusive + * @return the data of the block or the BlockData for air if x, y or z are outside the chunk's bounds + */ + @NotNull BlockData getBlockData(int x, int y, int z); } } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java new file mode 100644 index 000000000..2cc030c17 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.api.generic.world; + +import org.bukkit.block.Biome; +import org.jetbrains.annotations.NotNull; + +public interface BiomeGrid { + Object getHandle(); + + /** + * Get biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param z - 0-15 + * @return Biome value + * @deprecated biomes are now 3-dimensional + */ + @NotNull + Biome getBiome(int x, int z); + + /** + * Get biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param y - 0-255 + * @param z - 0-15 + * @return Biome value + */ + @NotNull + Biome getBiome(int x, int y, int z); + + /** + * Set biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param z - 0-15 + * @param bio - Biome value + * @deprecated biomes are now 3-dimensional + */ + void setBiome(int x, int z, @NotNull Biome bio); + + /** + * Set biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param y - 0-255 + * @param z - 0-15 + * @param bio - Biome value + */ + void setBiome(int x, int y, int z, @NotNull Biome bio); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index 2b834ce54..2a2078259 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -2,4 +2,6 @@ package com.dfsek.terra.api.generic.world; public interface World { long getSeed(); + + Object getHandle(); }