diff --git a/src/main/java/world/bentobox/boxed/Boxed.java b/src/main/java/world/bentobox/boxed/Boxed.java index 430c219..5ff604d 100644 --- a/src/main/java/world/bentobox/boxed/Boxed.java +++ b/src/main/java/world/bentobox/boxed/Boxed.java @@ -23,6 +23,7 @@ import world.bentobox.bentobox.api.flags.Flag.Mode; import world.bentobox.bentobox.api.flags.Flag.Type; import world.bentobox.bentobox.managers.RanksManager; import world.bentobox.boxed.generators.biomes.BoxedBiomeGenerator; +import world.bentobox.boxed.generators.biomes.NetherSeedBiomeGenerator; import world.bentobox.boxed.generators.biomes.SeedBiomeGenerator; import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator; import world.bentobox.boxed.generators.chunks.BoxedBlockPopulator; @@ -59,6 +60,7 @@ public class Boxed extends GameModeAddon { private AdvancementsManager advManager; private AbstractBoxedChunkGenerator netherChunkGenerator; private World baseWorld; + private World baseWorldNether; private World seedWorld; private World seedWorldNether; //private World seedWorldEnd; @@ -166,16 +168,34 @@ public class Boxed extends GameModeAddon { } private void createNether(String worldName) { + // Create vanilla seed nether world log("Creating Boxed Seed Nether world ..."); - seedWorldNether = WorldCreator - .name(SEED + NETHER) - .generator(new BoxedSeedChunkGenerator(this, Environment.NETHER)) + // This creates a vanilla base world with biomes + AbstractBoxedChunkGenerator seedBaseGen = new BoxedSeedChunkGenerator(this, Environment.NETHER); + baseWorldNether = WorldCreator + .name(SEED+NETHER+BASE) + .generator(seedBaseGen) .environment(Environment.NETHER) .seed(getSettings().getSeed()) .createWorld(); - seedWorldNether.setDifficulty(Difficulty.EASY); // No damage wanted in this world. + baseWorldNether.setDifficulty(Difficulty.PEACEFUL); + baseWorldNether.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ()); + copyChunks(baseWorldNether, seedBaseGen); + // Create seed world + // This copies a base world with custom biomes + log("Creating Boxed Biomed Nether world ..."); - copyChunks(seedWorldNether, this.netherChunkGenerator); + seedWorldNether = WorldCreator + .name(SEED+NETHER) + .generator(new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen))) + .environment(Environment.NETHER) + .seed(getSettings().getSeed()) + .createWorld(); + seedWorldNether.setDifficulty(Difficulty.EASY); + + seedWorldNether.setSpawnLocation(settings.getNetherSeedX(), 64, settings.getNetherSeedZ()); + + copyChunks(seedWorldNether, netherChunkGenerator); if (getServer().getWorld(worldName + NETHER) == null) { log("Creating Boxed's Nether..."); diff --git a/src/main/java/world/bentobox/boxed/generators/biomes/AbstractSeedBiomeProvider.java b/src/main/java/world/bentobox/boxed/generators/biomes/AbstractSeedBiomeProvider.java index c23159f..3a56b0a 100644 --- a/src/main/java/world/bentobox/boxed/generators/biomes/AbstractSeedBiomeProvider.java +++ b/src/main/java/world/bentobox/boxed/generators/biomes/AbstractSeedBiomeProvider.java @@ -120,8 +120,6 @@ public abstract class AbstractSeedBiomeProvider extends BiomeProvider { int yy = Math.max(Math.min(y * 4, worldInfo.getMaxHeight()), worldInfo.getMinHeight()); // To handle bug in Spigot Biome b = snapshot.getBiome(xx, yy, zz); - if (y > DEPTH ) - BentoBox.getInstance().logDebug("Returning vanilla biome " + b + " for " + worldInfo.getName() + " " + x + " " + y + " " + z); return Objects.requireNonNull(b); } @@ -143,7 +141,7 @@ public abstract class AbstractSeedBiomeProvider extends BiomeProvider { } Vector s = new Vector(x, 0, z); Vector l = getClosestIsland(s); - BentoBox.getInstance().logDebug("Closest island is " + Util.xyz(l)); + //BentoBox.getInstance().logDebug("Closest island is " + Util.xyz(l)); double dis = l.distance(s); double d = dis / dist; // Normalize Vector direction = s.subtract(l); diff --git a/src/main/java/world/bentobox/boxed/generators/chunks/AbstractBoxedChunkGenerator.java b/src/main/java/world/bentobox/boxed/generators/chunks/AbstractBoxedChunkGenerator.java index 4a742aa..ee8c8b1 100644 --- a/src/main/java/world/bentobox/boxed/generators/chunks/AbstractBoxedChunkGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/chunks/AbstractBoxedChunkGenerator.java @@ -1,45 +1,17 @@ package world.bentobox.boxed.generators.chunks; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.Random; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; -import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.block.Banner; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.Sign; -import org.bukkit.entity.AbstractHorse; -import org.bukkit.entity.Ageable; -import org.bukkit.entity.ChestedHorse; -import org.bukkit.entity.Horse; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Tameable; -import org.bukkit.entity.Villager; -import org.bukkit.generator.BiomeProvider; -import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; -import org.bukkit.generator.WorldInfo; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Attachable; -import org.bukkit.material.Colorable; import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBlock; -import world.bentobox.bentobox.blueprints.dataobjects.BlueprintCreatureSpawner; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity; import world.bentobox.bentobox.util.Pair; import world.bentobox.boxed.Boxed; @@ -80,10 +52,12 @@ public abstract class AbstractBoxedChunkGenerator extends ChunkGenerator { protected abstract List getChests(Chunk chunk); /** + * Get the chunk snapshot for these chunk coords or null if there is none. * @param x chunk x * @param z chunk z * @return chunk snapshot or null if there is none */ + @Nullable public ChunkSnapshot getChunk(int x, int z) { return chunks.get(new Pair<>(x, z)).snapshot; } @@ -94,34 +68,6 @@ public abstract class AbstractBoxedChunkGenerator extends ChunkGenerator { return true; } - @Override - public void generateNoise(WorldInfo worldInfo, Random r, int chunkX, int chunkZ, ChunkData cd) { - - int height = worldInfo.getMaxHeight(); - int minY = worldInfo.getMinHeight(); - int xx = repeatCalc(chunkX); - int zz = repeatCalc(chunkZ); - Pair coords = new Pair<>(xx, zz); - if (!chunks.containsKey(coords)) { - // This should never be needed because islands should abut each other - cd.setRegion(0, minY, 0, 16, 0, 16, Material.WATER); - return; - } - // Copy the chunk - ChunkSnapshot chunk = chunks.get(coords).snapshot; - copyChunkVerbatim(cd, chunk, minY, height); - - } - - private void copyChunkVerbatim(ChunkData cd, ChunkSnapshot chunk, int minY, int height) { - for (int x = 0; x < 16; x ++) { - for (int z = 0; z < 16; z++) { - for (int y = minY; y < height; y++) { - cd.setBlock(x, y, z, chunk.getBlockData(x, y, z)); - } - } - } - } /** * Calculates the repeating value for a given size diff --git a/src/main/java/world/bentobox/boxed/generators/chunks/BoxedChunkGenerator.java b/src/main/java/world/bentobox/boxed/generators/chunks/BoxedChunkGenerator.java index 5bdc1c5..4577b72 100644 --- a/src/main/java/world/bentobox/boxed/generators/chunks/BoxedChunkGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/chunks/BoxedChunkGenerator.java @@ -3,17 +3,14 @@ package world.bentobox.boxed.generators.chunks; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Random; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Banner; import org.bukkit.block.Block; @@ -30,22 +27,18 @@ import org.bukkit.entity.Tameable; import org.bukkit.entity.Villager; import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.WorldInfo; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Attachable; import org.bukkit.material.Colorable; import org.bukkit.util.Vector; +import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBlock; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintCreatureSpawner; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity; import world.bentobox.bentobox.util.Pair; import world.bentobox.boxed.Boxed; -import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator.ChestData; -import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator.ChunkStore; -import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator.EntityData; /** * Chunk generator for all environments @@ -196,4 +189,32 @@ public class BoxedChunkGenerator extends AbstractBoxedChunkGenerator { return cs; } + @Override + public void generateNoise(WorldInfo worldInfo, Random r, int chunkX, int chunkZ, ChunkData cd) { + int height = worldInfo.getMaxHeight(); + int minY = worldInfo.getMinHeight(); + int xx = repeatCalc(chunkX); + int zz = repeatCalc(chunkZ); + ChunkSnapshot chunk = this.getChunk(xx,zz); + if (chunk == null) { + // This should never be needed because islands should abut each other + //cd.setRegion(0, minY, 0, 16, 0, 16, Material.WATER); + BentoBox.getInstance().logDebug("No chunks found for " + xx + " " + zz); + return; + } + // Copy the chunk + copyChunkVerbatim(cd, chunk, minY, height); + + } + + private void copyChunkVerbatim(ChunkData cd, ChunkSnapshot chunk, int minY, int height) { + for (int x = 0; x < 16; x ++) { + for (int z = 0; z < 16; z++) { + for (int y = minY; y < height; y++) { + cd.setBlock(x, y, z, chunk.getBlockData(x, y, z)); + } + } + } + } + }