diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java index e96289eee..e7d0e64d8 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.bukkit; import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; public class BukkitChunk implements Chunk { private final org.bukkit.Chunk delegate; @@ -19,6 +20,11 @@ public class BukkitChunk implements Chunk { return delegate.getZ(); } + @Override + public World getWorld() { + return new BukkitWorld(delegate.getWorld()); + } + @Override public org.bukkit.Chunk 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 91b16ae6d..0af1b0652 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -1,7 +1,13 @@ package com.dfsek.terra.api.bukkit; +import com.dfsek.terra.api.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import java.io.File; +import java.util.UUID; + public class BukkitWorld implements World { private final org.bukkit.World delegate; @@ -14,6 +20,41 @@ public class BukkitWorld implements World { return delegate.getSeed(); } + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return new BukkitChunkGenerator(delegate.getGenerator()); + } + + @Override + public String getName() { + return null; + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + @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 index a2cf7d3ab..a79d4a5a7 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -2,57 +2,60 @@ package com.dfsek.terra.api.bukkit.generator; import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; -import com.dfsek.terra.api.generic.world.block.BlockData; -import org.bukkit.World; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Random; +import java.util.stream.Collectors; -public class BukkitChunkGenerator extends ChunkGenerator { - private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; +public class BukkitChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { + private final ChunkGenerator delegate; - public BukkitChunkGenerator(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + public BukkitChunkGenerator(ChunkGenerator delegate) { this.delegate = delegate; } @Override - public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - BukkitWorld bukkitWorld = new BukkitWorld(world); - BukkitChunkData data = new BukkitChunkData(createChunkData(world)); - delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); - return data.getHandle(); + public ChunkGenerator getHandle() { + return delegate; } - public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { + @Override + public boolean isParallelCapable() { + return delegate.isParallelCapable(); + } - private final ChunkGenerator.ChunkData delegate; + @Override + public boolean shouldGenerateCaves() { + return delegate.shouldGenerateCaves(); + } - public BukkitChunkData(ChunkGenerator.ChunkData delegate) { - this.delegate = delegate; - } + @Override + public boolean shouldGenerateDecorations() { + return delegate.shouldGenerateDecorations(); + } - @Override - public ChunkGenerator.ChunkData getHandle() { - return delegate; - } + @Override + public boolean shouldGenerateMobs() { + return delegate.shouldGenerateMobs(); + } - @Override - public int getMaxHeight() { - return delegate.getMaxHeight(); - } + @Override + public boolean shouldGenerateStructures() { + return delegate.shouldGenerateStructures(); + } + @Override + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data) { + return new BukkitChunkGeneratorWrapper.BukkitChunkData(delegate.generateChunkData(((BukkitWorld) world).getHandle(), random, x, z, ((BukkitBiomeGrid) biome).getHandle())); + } - @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)); - } + @Override + public List getDefaultPopulators(World world) { + return delegate.getDefaultPopulators(((BukkitWorld) world).getHandle()).stream().map(BukkitPopulator::new).collect(Collectors.toList()); } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java new file mode 100644 index 000000000..c7a527347 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class BukkitChunkGeneratorWrapper extends ChunkGenerator { + private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; + + public BukkitChunkGeneratorWrapper(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + this.delegate = delegate; + } + + @Override + public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + BukkitWorld bukkitWorld = new BukkitWorld(world); + BukkitChunkData data = new BukkitChunkData(createChunkData(world)); + delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); + return data.getHandle(); + } + + 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/bukkit/generator/BukkitPopulator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java new file mode 100644 index 000000000..85a218c1e --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitChunk; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; + +import java.util.Random; + +public class BukkitPopulator implements BlockPopulator { + private final org.bukkit.generator.BlockPopulator handle; + + public BukkitPopulator(org.bukkit.generator.BlockPopulator handle) { + this.handle = handle; + } + + @Override + public void populate(World world, Random random, Chunk chunk) { + handle.populate(((BukkitWorld) world).getHandle(), random, ((BukkitChunk) chunk).getHandle()); + } + + @Override + public org.bukkit.generator.BlockPopulator getHandle() { + return handle; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java index 50623d482..a8c38b374 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java +++ b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.gaea; -import org.bukkit.World; + +import com.dfsek.terra.api.generic.world.World; import java.io.File; -public class Gaea { +public class Gaea { private static boolean debug; public static File getGaeaFolder(World w) { diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java index 35ad222c7..a5d2a34e7 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java +++ b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.population; -import org.bukkit.Chunk; + +import com.dfsek.terra.api.generic.world.Chunk; import java.io.Serializable; import java.util.UUID; diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java index d17f1a850..fbf3d78db 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java +++ b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java @@ -6,10 +6,10 @@ import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.util.SerializationUtil; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.plugin.java.JavaPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -18,18 +18,18 @@ import java.util.HashSet; import java.util.List; import java.util.Random; -public class PopulationManager extends BlockPopulator { - private final List attachedPopulators = new GlueList<>(); +public class PopulationManager implements BlockPopulator { + private final List attachedPopulators = new GlueList<>(); private final HashSet needsPop = new HashSet<>(); - private final JavaPlugin main; + private final TerraPlugin main; private final Object popLock = new Object(); private WorldProfiler profiler; - public PopulationManager(JavaPlugin main) { + public PopulationManager(TerraPlugin main) { this.main = main; } - public void attach(GaeaBlockPopulator populator) { + public void attach(BlockPopulator populator) { this.attachedPopulators.add(populator); } @@ -85,7 +85,7 @@ public class PopulationManager extends BlockPopulator { long zRand = (random.nextLong() / 2L << 1L) + 1L; random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); Chunk currentChunk = w.getChunkAt(x, z); - for(GaeaBlockPopulator r : attachedPopulators) { + for(BlockPopulator r : attachedPopulators) { r.populate(w, random, currentChunk); } needsPop.remove(c); diff --git a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index 8926d69ff..9cbcd02ef 100644 --- a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -4,4 +4,6 @@ import com.dfsek.terra.api.generic.world.WorldHandle; public interface TerraPlugin { WorldHandle getHandle(); + + boolean isEnabled(); } 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 196a9153a..15591155f 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 @@ -1,10 +1,11 @@ package com.dfsek.terra.api.generic.generator; +import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import java.util.Random; -public interface BlockPopulator { +public interface BlockPopulator extends Handle { 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 a7261ff68..f63ec12a3 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,5 +1,6 @@ package com.dfsek.terra.api.generic.generator; +import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; @@ -8,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Random; -public interface ChunkGenerator { +public interface ChunkGenerator extends Handle { boolean isParallelCapable(); boolean shouldGenerateCaves(); @@ -19,7 +20,7 @@ public interface ChunkGenerator { boolean shouldGenerateStructures(); - void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); + ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); List getDefaultPopulators(World world); diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java index e9ffcf814..1c9ed6b1e 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java @@ -6,4 +6,6 @@ public interface Chunk extends Handle { int getX(); int getZ(); + + World getWorld(); } 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 99b3f1242..e32bc7309 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 @@ -1,9 +1,25 @@ package com.dfsek.terra.api.generic.world; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; + +import java.io.File; +import java.util.UUID; public interface World extends Handle { long getSeed(); int getMaxHeight(); + + ChunkGenerator getGenerator(); + + String getName(); + + UUID getUID(); + + boolean isChunkGenerated(int x, int z); + + Chunk getChunkAt(int x, int z); + + File getWorldFolder(); } diff --git a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java index e3f23d7b7..a3cc4bee6 100644 --- a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java +++ b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java @@ -4,7 +4,6 @@ import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.gaea.generation.GenerationPopulator; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; @@ -13,6 +12,7 @@ import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Vector3; @@ -21,9 +21,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.population.FloraPopulator; -import com.dfsek.terra.population.OrePopulator; -import com.dfsek.terra.population.TreePopulator; import com.dfsek.terra.util.PaletteUtil; import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; @@ -38,7 +35,7 @@ import java.util.Random; import java.util.logging.Level; public class ChunkGeneratorImpl implements ChunkGenerator { - private static final Map popMap = new HashMap<>(); + private static final Map popMap = new HashMap<>(); private final PopulationManager popMan; private final ConfigPack configPack; private final Terra main; @@ -48,13 +45,13 @@ public class ChunkGeneratorImpl implements ChunkGenerator { popMan = new PopulationManager(main); this.configPack = c; this.main = main; - popMan.attach(new OrePopulator(main)); - popMan.attach(new TreePopulator(main)); - popMan.attach(new FloraPopulator(main)); + //popMan.attach(new OrePopulator(main)); + //popMan.attach(new TreePopulator(main)); + //popMan.attach(new FloraPopulator(main)); } public static synchronized void saveAll() { - for(Map.Entry e : popMap.entrySet()) { + for(Map.Entry e : popMap.entrySet()) { try { e.getValue().saveBlocks(e.getKey()); Debug.info("Saved data for world " + e.getKey().getName()); @@ -65,7 +62,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); + if(!(c.getWorld().getGenerator() instanceof ChunkGeneratorImpl)) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } @@ -95,22 +92,22 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } @Override - public void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData chunk) { + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkData chunk) { TerraWorld tw = main.getWorld(world); + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { - interp = new ChunkInterpolator3(world, x, z, tw.getGrid()); + interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); if(needsLoad) load(world); // Load population data for world. - if(!tw.isSafe()) return; - int xOrig = (x << 4); - int zOrig = (z << 4); - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); + if(!tw.isSafe()) return chunk; + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); ElevationInterpolator elevationInterpolator; try(ProfileFuture ignored1 = tw.getProfiler().measure("ElevationTime")) { - elevationInterpolator = new ElevationInterpolator(x, z, tw.getGrid()); + elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid()); } Sampler sampler = new Sampler(interp, elevationInterpolator); @@ -158,25 +155,17 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } } } - try(ProfileFuture ignored = measure("BiomeApplyTime")) { - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - for(byte x = 0; x < 4; x++) { - for(byte z = 0; z < 4; z++) { - int cx = xOrig + (x << 2); - int cz = zOrig + (z << 2); - Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); - biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); - } + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + for(int x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); } } - for(GenerationPopulator g : getGenerationPopulators(world)) { - g.populate(world, chunk, random, chunkX, chunkZ, interp); - } } - - return chunk; } @@ -189,7 +178,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { popMan.attachProfiler(p); } - private void load(org.bukkit.World w) { + private void load(World w) { try { popMan.loadBlocks(w); } catch(FileNotFoundException e) {