diff --git a/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/BiomePerIslandGenerator.java b/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/BiomePerIslandGenerator.java index 06fb588..65cfcfe 100644 --- a/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/BiomePerIslandGenerator.java +++ b/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/BiomePerIslandGenerator.java @@ -1,58 +1,112 @@ package ca.recrown.islandsurvivalcraft.worldgen; -import java.util.Random; - +import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.generator.ChunkGenerator.BiomeGrid; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandMetadataType; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandOwnerMetadata; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandShoreBiomeMetadata; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandTUIDMetadata; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandTemperatureMetadata; +import ca.recrown.islandsurvivalcraft.IslandSurvivalCraft; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandBedrockMetadataHelper; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandMainBiomeMetadata; +import ca.recrown.islandsurvivalcraft.islandbedrockmetadata.IslandMetadataPack; + public class BiomePerIslandGenerator implements IslandBiomeGenerator { - private boolean begun; private IslandMapGenerator mapGenerator; private Biome currentIslandBiome; private float currentIslandTemperature; private Biome currentIslandShoreBiome; private BiomeSelector biomeSelector; - private Random random; private int worldHeight; + private World world; + private IslandBedrockMetadataHelper metadataHelper; + private TemperatureMapGenerator temperatureMapGenerator; + private String currentTUID; + private IslandSurvivalCraft plugin; - public BiomePerIslandGenerator(int buildHeight, IslandMapGenerator mapGenerator, Random random, BiomeSelector biomeSelector) { - this.worldHeight = buildHeight; + public BiomePerIslandGenerator(IslandSurvivalCraft plugin, World world, IslandMapGenerator mapGenerator, BiomeSelector biomeSelector, TemperatureMapGenerator temperatureMapGenerator) { + this.plugin = plugin; + this.temperatureMapGenerator = temperatureMapGenerator; + this.worldHeight = world.getMaxHeight(); this.mapGenerator = mapGenerator; - this.random = random; - } - - public void beginIslandBiome() { - if (begun) throw new IllegalStateException("Already generating biome for one island! Remember to call endIslandBiome() when done with one island."); - begun = true; - currentIslandTemperature = random.nextFloat() * 2f - 1f; - currentIslandBiome = biomeSelector.getLandBiome(currentIslandTemperature); - currentIslandShoreBiome = biomeSelector.getShoreBiome(currentIslandBiome, currentIslandTemperature); - } - - public void endIslandBiome() { - if (!begun) throw new IllegalStateException("Can't end island biome as there wasn't one that was started."); - begun = false; - currentIslandBiome = null; - } - - public void setBiome(Biome biome) { - - } - - public void setTemperature(float temperature) { - + this.biomeSelector = biomeSelector; + this.world = world; + this.metadataHelper = new IslandBedrockMetadataHelper(plugin, world); } public void GenerateBiome(int chunkX, int chunkZ, int localX, int localZ, BiomeGrid biome) { - if (!begun) throw new IllegalStateException("Please enclose this function call between beginning and ending a biome cycle."); int worldX = chunkX * 16 + localX; int worldZ = chunkZ * 16 + localZ; - if (mapGenerator.isShore(worldX, worldZ)) { - setBiome(localX, localZ, biome, currentIslandShoreBiome); - } else { - setBiome(localX, localZ, biome, currentIslandBiome); + if (mapGenerator.isIsland(worldX, worldZ)) { + IslandMetadataPack sameIslandPack = getSurroundingIslandData(world, worldX, worldZ); + if (sameIslandPack != null) { + //Old island + currentIslandBiome = sameIslandPack.mainBiomeMetadata.getMainBiome(); + currentIslandShoreBiome = sameIslandPack.shoreBiomeMetadata.getShoreBiome(); + currentIslandTemperature = sameIslandPack.temperatureMetadata.getTemperature(); + currentTUID = sameIslandPack.islandTIUDMetadata.getIUID(); + } else { + //New island + currentIslandTemperature = temperatureMapGenerator.getTemperature(worldX, worldZ); + currentIslandBiome = biomeSelector.getLandBiome(currentIslandTemperature); + currentIslandShoreBiome = biomeSelector.getShoreBiome(currentIslandBiome, currentIslandTemperature); + if (currentIslandShoreBiome == null) { + currentIslandShoreBiome = currentIslandBiome; + } + currentTUID = String.valueOf(worldX) + String.valueOf(worldZ); + } + //saving information + IslandMetadataPack current = new IslandMetadataPack(); + current.setMainBiome(currentIslandBiome, plugin); + current.setTemperature(currentIslandTemperature, plugin); + current.setShoreBiome(currentIslandShoreBiome, plugin); + current.setTUID(currentTUID, plugin); + metadataHelper.setIslandBedrockMetadataPack(worldX, worldZ, current); + + if (mapGenerator.isShore(worldX, worldZ)) { + setBiome(localX, localZ, biome, currentIslandShoreBiome); + } else { + setBiome(localX, localZ, biome, currentIslandBiome); + } } + + } + + private IslandMetadataPack getSurroundingIslandData(World world, int worldX, int worldZ) { + IslandMetadataPack data = null; + if (mapGenerator.isSameIsland(worldX, worldZ, worldX + 1, worldZ)) { + data = getMetadataPackAt(worldX + 1, worldZ, world); + + } else if (mapGenerator.isSameIsland(worldX, worldZ, worldX - 1, worldZ)) { + data = getMetadataPackAt(worldX - 1, worldZ, world); + + } else if (mapGenerator.isSameIsland(worldX, worldZ, worldX, worldZ + 1)) { + data = getMetadataPackAt(worldX, worldZ + 1, world); + + } else if (mapGenerator.isSameIsland(worldX, worldZ, worldX, worldZ - 1)) { + data = getMetadataPackAt(worldX, worldZ - 1, world); + + } + return data; + } + + private IslandMetadataPack getMetadataPackAt(int worldX, int worldZ, World world) { + IslandMetadataPack data = new IslandMetadataPack(); + data.mainBiomeMetadata = (IslandMainBiomeMetadata) metadataHelper.getIslandBedrockMetadata(worldX, worldZ, + IslandMetadataType.mainBiome); + data.shoreBiomeMetadata = (IslandShoreBiomeMetadata) metadataHelper.getIslandBedrockMetadata(worldX, worldZ, + IslandMetadataType.shoreBiome); + data.temperatureMetadata = (IslandTemperatureMetadata) metadataHelper.getIslandBedrockMetadata(worldX, worldZ, + IslandMetadataType.temperature); + data.ownerMetadata = (IslandOwnerMetadata) metadataHelper.getIslandBedrockMetadata(worldX, worldZ, + IslandMetadataType.ownerUUID); + data.islandTIUDMetadata = (IslandTUIDMetadata) metadataHelper.getIslandBedrockMetadata(worldX, worldZ, + IslandMetadataType.TIUD); + return data; } private void setBiome(int localX, int localZ, BiomeGrid biomeGrid, Biome biome) { diff --git a/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/IslandBiomeGenerator.java b/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/IslandBiomeGenerator.java index bbd9ebe..49cc769 100644 --- a/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/IslandBiomeGenerator.java +++ b/src/main/java/ca/recrown/islandsurvivalcraft/worldgen/IslandBiomeGenerator.java @@ -1,16 +1,8 @@ package ca.recrown.islandsurvivalcraft.worldgen; -import org.bukkit.block.Biome; import org.bukkit.generator.ChunkGenerator.BiomeGrid; public interface IslandBiomeGenerator { - public void beginIslandBiome(); - - public void endIslandBiome(); - - public void setBiome(Biome biome); - - public void setTemperature(float temperature); public void GenerateBiome(int chunkX, int chunkZ, int localX, int localZ, BiomeGrid biome); }