diff --git a/src/main/java/world/bentobox/boxed/generators/AbstractBoxedBiomeGenerator.java b/src/main/java/world/bentobox/boxed/generators/AbstractBoxedBiomeGenerator.java new file mode 100644 index 0000000..2539b13 --- /dev/null +++ b/src/main/java/world/bentobox/boxed/generators/AbstractBoxedBiomeGenerator.java @@ -0,0 +1,140 @@ +package world.bentobox.boxed.generators; + +import java.io.File; +import java.util.Collections; +import java.util.EnumMap; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.World.Environment; +import org.bukkit.block.Biome; +import org.bukkit.block.BlockFace; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.util.Vector; + +import com.google.common.base.Enums; + +import nl.rutgerkok.worldgeneratorapi.BiomeGenerator; +import world.bentobox.boxed.Boxed; + +/** + * @author tastybento + * + */ +public abstract class AbstractBoxedBiomeGenerator implements BiomeGenerator { + + private static final Map ENV_MAP; + static { + Map e = new EnumMap<>(Environment.class); + e.put(Environment.NORMAL, "distribution.overworld"); + e.put(Environment.NETHER, "distribution.nether"); + e.put(Environment.THE_END, "distribution.the_end"); + ENV_MAP = Collections.unmodifiableMap(e); + } + + private final SortedMap northEast; + private final SortedMap southEast; + private final SortedMap northWest; + private final SortedMap southWest; + + protected final Map> quadrants; + + private final Boxed addon; + protected final int dist; + private final int offsetX; + private final int offsetZ; + private final Biome defaultBiome; + + + public AbstractBoxedBiomeGenerator(Boxed boxed, Environment env, Biome defaultBiome) { + this.addon = boxed; + this.defaultBiome = defaultBiome; + dist = addon.getSettings().getIslandDistance(); + offsetX = addon.getSettings().getIslandXOffset(); + offsetZ = addon.getSettings().getIslandZOffset(); + // Load the config + File biomeFile = new File(addon.getDataFolder(), "biomes.yml"); + if (!biomeFile.exists()) { + addon.saveResource("biomes.yml", true); + } + YamlConfiguration config = YamlConfiguration.loadConfiguration(biomeFile); + northEast = loadQuad(config, ENV_MAP.get(env) + ".north-east"); + southEast = loadQuad(config, ENV_MAP.get(env) + ".south-east"); + northWest = loadQuad(config, ENV_MAP.get(env) + ".north-west"); + southWest = loadQuad(config, ENV_MAP.get(env) + ".south-west"); + + quadrants = new EnumMap<>(BlockFace.class); + quadrants.put(BlockFace.NORTH_EAST, northEast); + quadrants.put(BlockFace.NORTH_WEST, northWest); + quadrants.put(BlockFace.SOUTH_EAST, southEast); + quadrants.put(BlockFace.SOUTH_WEST, southWest); + } + + + private SortedMap loadQuad(YamlConfiguration config, String string) { + SortedMap result = new TreeMap<>(); + if (config.contains(string)) { + for (String ring : config.getStringList(string)) { + String[] split = ring.split(":"); + if (split.length == 2 && NumberUtils.isNumber(split[0])) { + try { + double d = Double.parseDouble(split[0]); + Biome biome = Enums.getIfPresent(Biome.class, split[1].toUpperCase(Locale.ENGLISH)).orNull(); + if (biome == null) { + addon.logError(split[1].toUpperCase(Locale.ENGLISH) + " is an unknown biome on this server."); + } else { + result.put(d, biome); + } + } catch(Exception e) { + addon.logError(string + ": " + split[0] + " does not seem to be a double. For integers add a .0 to the end"); + } + } else { + addon.logError(ring + " must be in the format ratio:biome where ratio is a double."); + } + } + } + return result; + } + + @Override + public Biome getZoomedOutBiome(int x, int y, int z) { + /* + * The given x, y and z coordinates are scaled down by a factor of 4. So when Minecraft + * wants to know the biome at x=112, it will ask the biome generator for a biome at x=112/4=28. + */ + /* + * Biomes go around the island centers + * + */ + Vector s = new Vector(x * 4, 0, z * 4); + Vector l = getClosestIsland(s); + double dis = l.distanceSquared(s); + double d = dis / (dist * dist); + Vector direction = s.subtract(l); + if (direction.getBlockX() <= 0 && direction.getBlockZ() <= 0) { + return getBiome(BlockFace.NORTH_WEST, d); + } else if (direction.getBlockX() > 0 && direction.getBlockZ() <= 0) { + return getBiome(BlockFace.NORTH_EAST, d); + } else if (direction.getBlockX() <= 0 && direction.getBlockZ() > 0) { + return getBiome(BlockFace.SOUTH_WEST, d); + } + return getBiome(BlockFace.SOUTH_EAST, d); + } + + private Biome getBiome(BlockFace dir, double d) { + Entry en = ((TreeMap) quadrants.get(dir)).ceilingEntry(d); + return en == null ? defaultBiome : en.getValue(); + } + + private Vector getClosestIsland(Vector v) { + int d = dist * 2; + long x = Math.round((double) v.getBlockX() / d) * d + offsetX; + long z = Math.round((double) v.getBlockZ() / d) * d + offsetZ; + return new Vector(x, 0, z); + } + +} diff --git a/src/main/java/world/bentobox/boxed/generators/BoxedBiomeGenerator.java b/src/main/java/world/bentobox/boxed/generators/BoxedBiomeGenerator.java index 55fd1b5..fe6c045 100644 --- a/src/main/java/world/bentobox/boxed/generators/BoxedBiomeGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/BoxedBiomeGenerator.java @@ -1,131 +1,18 @@ package world.bentobox.boxed.generators; -import java.io.File; -import java.util.Collections; -import java.util.EnumMap; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.World.Environment; import org.bukkit.block.Biome; -import org.bukkit.block.BlockFace; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.util.Vector; -import com.google.common.base.Enums; - -import nl.rutgerkok.worldgeneratorapi.BiomeGenerator; import world.bentobox.boxed.Boxed; /** * @author tastybento * */ -public class BoxedBiomeGenerator implements BiomeGenerator { - - private final SortedMap northEast; - private final SortedMap southEast; - private final SortedMap northWest; - private final SortedMap southWest; - - private final Map> quadrants; - - private final Boxed addon; - private final int dist; - private final int offsetX; - private final int offsetZ; - +public class BoxedBiomeGenerator extends AbstractBoxedBiomeGenerator { public BoxedBiomeGenerator(Boxed boxed) { - this.addon = boxed; - dist = addon.getSettings().getIslandDistance(); - offsetX = addon.getSettings().getIslandXOffset(); - offsetZ = addon.getSettings().getIslandZOffset(); - // Load the config - File biomeFile = new File(addon.getDataFolder(), "biomes.yml"); - if (!biomeFile.exists()) { - addon.saveResource("biomes.yml", true); - } - YamlConfiguration config = YamlConfiguration.loadConfiguration(biomeFile); - northEast = loadQuad(config, "distribution.overworld.north-east"); - southEast = loadQuad(config, "distribution.overworld.south-east"); - northWest = loadQuad(config, "distribution.overworld.north-west"); - southWest = loadQuad(config, "distribution.overworld.south-west"); - - quadrants = new EnumMap<>(BlockFace.class); - quadrants.put(BlockFace.NORTH_EAST, northEast); - quadrants.put(BlockFace.NORTH_WEST, northWest); - quadrants.put(BlockFace.SOUTH_EAST, southEast); - quadrants.put(BlockFace.SOUTH_WEST, southWest); - } - - - private SortedMap loadQuad(YamlConfiguration config, String string) { - SortedMap result = new TreeMap<>(); - if (config.contains(string)) { - for (String ring : config.getStringList(string)) { - String[] split = ring.split(":"); - if (split.length == 2 && NumberUtils.isNumber(split[0])) { - try { - double d = Double.parseDouble(split[0]); - Biome biome = Enums.getIfPresent(Biome.class, split[1].toUpperCase(Locale.ENGLISH)).orNull(); - if (biome == null) { - addon.logError(split[1].toUpperCase(Locale.ENGLISH) + " is an unknown biome on this server."); - } else { - - addon.log(string + " " + biome + " " + d); - result.put(d, biome); - } - } catch(Exception e) { - addon.logError(string + ": " + split[0] + " does not seem to be a double. For integers add a .0 to the end"); - } - } else { - addon.logError(ring + " must be in the format ratio:biome where ratio is a double."); - } - } - } - return result; - } - - @Override - public Biome getZoomedOutBiome(int x, int y, int z) { - /* - * The given x, y and z coordinates are scaled down by a factor of 4. So when Minecraft - * wants to know the biome at x=112, it will ask the biome generator for a biome at x=112/4=28. - */ - /* - * Biomes go around the island centers - * - */ - Vector s = new Vector(x * 4, 0, z * 4); - Vector l = getClosestIsland(s); - double dis = l.distanceSquared(s); - double d = dis / (dist * dist); - Vector direction = s.subtract(l); - if (direction.getBlockX() <= 0 && direction.getBlockZ() <= 0) { - return getBiome(BlockFace.NORTH_WEST, d); - } else if (direction.getBlockX() > 0 && direction.getBlockZ() <= 0) { - return getBiome(BlockFace.NORTH_EAST, d); - } else if (direction.getBlockX() <= 0 && direction.getBlockZ() > 0) { - return getBiome(BlockFace.SOUTH_WEST, d); - } - return getBiome(BlockFace.SOUTH_EAST, d); - } - - private Biome getBiome(BlockFace dir, double d) { - Entry en = ((TreeMap) quadrants.get(dir)).ceilingEntry(d); - return en == null ? Biome.OCEAN : en.getValue(); - } - - Vector getClosestIsland(Vector v) { - int d = dist * 2; - long x = Math.round((double) v.getBlockX() / d) * d + offsetX; - long z = Math.round((double) v.getBlockZ() / d) * d + offsetZ; - return new Vector(x, 0, z); + super(boxed, Environment.NORMAL, Biome.OCEAN); } } diff --git a/src/main/java/world/bentobox/boxed/generators/BoxedChunkGenerator.java b/src/main/java/world/bentobox/boxed/generators/BoxedChunkGenerator.java index 6376d61..c80a136 100644 --- a/src/main/java/world/bentobox/boxed/generators/BoxedChunkGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/BoxedChunkGenerator.java @@ -16,13 +16,11 @@ public class BoxedChunkGenerator { private final WorldRef wordRef; private final Boxed addon; private WorldRef wordRefNether; - private WorldRef wordRefEnd; public BoxedChunkGenerator(Boxed addon) { this.addon = addon; wordRef = WorldRef.ofName(addon.getSettings().getWorldName()); wordRefNether = WorldRef.ofName(addon.getSettings().getWorldName() + "_nether"); - wordRefEnd = WorldRef.ofName(addon.getSettings().getWorldName() + "_end"); } public ChunkGenerator getGenerator() { diff --git a/src/main/java/world/bentobox/boxed/generators/NetherBiomeGenerator.java b/src/main/java/world/bentobox/boxed/generators/NetherBiomeGenerator.java index bee4c99..53f038a 100644 --- a/src/main/java/world/bentobox/boxed/generators/NetherBiomeGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/NetherBiomeGenerator.java @@ -1,149 +1,18 @@ package world.bentobox.boxed.generators; -import java.util.Collections; -import java.util.EnumMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.SortedMap; -import java.util.TreeMap; - +import org.bukkit.World.Environment; import org.bukkit.block.Biome; -import org.bukkit.block.BlockFace; -import org.bukkit.util.Vector; -import nl.rutgerkok.worldgeneratorapi.BiomeGenerator; import world.bentobox.boxed.Boxed; /** * @author tastybento * */ -public class NetherBiomeGenerator implements BiomeGenerator { - - private static final double ONE = 0.03; - private static final double TWO = 0.13; - private static final double THREE = 0.25; - private static final double FOUR = 0.5; - private static final double FIVE = 0.75; - private static final double SIX = 1.0; - private static final double SEVEN = 1.25; - private static final double EIGHT = 1.75; - private static final double LAST = 2.0; - - - private static final TreeMap NORTH_EAST = new TreeMap<>(); - static { - double f = 0.01; - NORTH_EAST.put(ONE + f, Biome.NETHER_WASTES); - NORTH_EAST.put(TWO + f, Biome.CRIMSON_FOREST); - NORTH_EAST.put(THREE + f, Biome.NETHER_WASTES); - NORTH_EAST.put(FOUR + f, Biome.WARPED_FOREST); - NORTH_EAST.put(FIVE + f, Biome.NETHER_WASTES); - NORTH_EAST.put(SIX + f, Biome.CRIMSON_FOREST); - NORTH_EAST.put(SEVEN + f, Biome.SOUL_SAND_VALLEY); - NORTH_EAST.put(EIGHT + f, Biome.BASALT_DELTAS); - NORTH_EAST.put(LAST + f, Biome.NETHER_WASTES); - } - private static final TreeMap SOUTH_EAST = new TreeMap<>(); - static { - double f = -0.01; - SOUTH_EAST.put(ONE + f, Biome.NETHER_WASTES); - SOUTH_EAST.put(TWO + f, Biome.BASALT_DELTAS); - SOUTH_EAST.put(THREE + f, Biome.SOUL_SAND_VALLEY); - SOUTH_EAST.put(FOUR + f, Biome.WARPED_FOREST); - SOUTH_EAST.put(FIVE + f, Biome.NETHER_WASTES); - SOUTH_EAST.put(SIX + f, Biome.BASALT_DELTAS); - SOUTH_EAST.put(SEVEN + f, Biome.SOUL_SAND_VALLEY); - SOUTH_EAST.put(EIGHT + f, Biome.WARPED_FOREST); - SOUTH_EAST.put(LAST + f, Biome.CRIMSON_FOREST); - } - - private static final TreeMap NORTH_WEST = new TreeMap<>(); - static { - double f = 0.02; - NORTH_WEST.put(ONE + f, Biome.NETHER_WASTES); - NORTH_WEST.put(TWO + f, Biome.SOUL_SAND_VALLEY); - NORTH_WEST.put(THREE + f, Biome.SOUL_SAND_VALLEY); - NORTH_WEST.put(FOUR + f, Biome.BASALT_DELTAS); - NORTH_WEST.put(FIVE + f, Biome.NETHER_WASTES); - NORTH_WEST.put(SIX + f, Biome.CRIMSON_FOREST); - NORTH_WEST.put(SEVEN + f, Biome.SOUL_SAND_VALLEY); - NORTH_WEST.put(EIGHT + f, Biome.WARPED_FOREST); - NORTH_WEST.put(LAST + f, Biome.NETHER_WASTES); - } - - private static final TreeMap SOUTH_WEST = new TreeMap<>(); - static { - double f = -0.01; - SOUTH_WEST.put(ONE + f, Biome.NETHER_WASTES); - SOUTH_WEST.put(TWO + f, Biome.SOUL_SAND_VALLEY); - SOUTH_WEST.put(THREE + f, Biome.NETHER_WASTES); - SOUTH_WEST.put(FOUR + f, Biome.SOUL_SAND_VALLEY); - SOUTH_WEST.put(FIVE + f, Biome.NETHER_WASTES); - SOUTH_WEST.put(SIX + f, Biome.CRIMSON_FOREST); - SOUTH_WEST.put(SEVEN + f, Biome.WARPED_FOREST); - SOUTH_WEST.put(EIGHT + f, Biome.BASALT_DELTAS); - SOUTH_WEST.put(LAST + f, Biome.NETHER_WASTES); - } - private static final Map> QUADRANTS; - static { - Map> q = new EnumMap<>(BlockFace.class); - q.put(BlockFace.NORTH_EAST, NORTH_EAST); - q.put(BlockFace.NORTH_WEST, NORTH_WEST); - q.put(BlockFace.SOUTH_EAST, SOUTH_EAST); - q.put(BlockFace.SOUTH_WEST, SOUTH_WEST); - QUADRANTS = Collections.unmodifiableMap(q); - } - - - private final Boxed addon; - private final int dist; - private final int offsetX; - private final int offsetZ; - +public class NetherBiomeGenerator extends AbstractBoxedBiomeGenerator { public NetherBiomeGenerator(Boxed boxed) { - this.addon = boxed; - dist = addon.getSettings().getIslandDistance(); - offsetX = addon.getSettings().getIslandXOffset(); - offsetZ = addon.getSettings().getIslandZOffset(); - } - - @Override - public Biome getZoomedOutBiome(int x, int y, int z) { - /* - * The given x, y and z coordinates are scaled down by a factor of 4. So when Minecraft - * wants to know the biome at x=112, it will ask the biome generator for a biome at x=112/4=28. - */ - /* - * Biomes go around the island centers - * - */ - Vector s = new Vector(x * 4, 0, z * 4); - Vector l = getClosestIsland(s); - double dis = l.distanceSquared(s); - double d = dis / (dist * dist); - Vector direction = s.subtract(l); - if (direction.getBlockX() <= 0 && direction.getBlockZ() <= 0) { - return getBiome(BlockFace.NORTH_WEST, d); - } else if (direction.getBlockX() > 0 && direction.getBlockZ() <= 0) { - return getBiome(BlockFace.NORTH_EAST, d); - } else if (direction.getBlockX() <= 0 && direction.getBlockZ() > 0) { - return getBiome(BlockFace.SOUTH_WEST, d); - } - return getBiome(BlockFace.SOUTH_EAST, d); - } - - private Biome getBiome(BlockFace dir, double d) { - Entry en = ((TreeMap) QUADRANTS.get(dir)).ceilingEntry(d); - return en == null ? Biome.NETHER_WASTES : en.getValue(); - } - - Vector getClosestIsland(Vector v) { - int d = dist * 2; - long x = Math.round((double) v.getBlockX() / d) * d + offsetX; - long z = Math.round((double) v.getBlockZ() / d) * d + offsetZ; - return new Vector(x, 0, z); + super(boxed, Environment.NETHER, Biome.NETHER_WASTES); } } diff --git a/src/main/java/world/bentobox/boxed/generators/NetherGenerator.java b/src/main/java/world/bentobox/boxed/generators/NetherGenerator.java index 8d4b5d3..b0f8b85 100644 --- a/src/main/java/world/bentobox/boxed/generators/NetherGenerator.java +++ b/src/main/java/world/bentobox/boxed/generators/NetherGenerator.java @@ -100,23 +100,6 @@ public class NetherGenerator implements BaseNoiseGenerator { double heightOffset = y < 12 && bm.height != 0 ? bm.height - y : 0; buffer[y] = noise + heightOffset; } - - - /* - for (int y = 0; y < buffer.length; y++) { - double noise = this.mainNoiseGenerator.noise(x, y, z); - double heightOffset = height - y; - buffer[y] = noise + heightOffset; - } - // Ceiling - - x = ((((double)scaledX*4) % dist) / 4); - z = ((((double)scaledZ*4) % dist) / 4); - for (int y = 15; y > height + 2; y--) { - double noise = this.mainNoiseGenerator.noise(x, y, z) * 2; - double heightOffset = y - height; - buffer[y] = noise + heightOffset; - }*/ } } \ No newline at end of file diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index de2331f..eca7278 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -49,6 +49,47 @@ distribution: - 0.9:MOUNTAIN_EDGE - 1.1:ICE_SPIKES - 20.0:COLD_OCEAN + nether: + north-east: + - 0.03:NETHER_WASTES + - 0.14:CRIMSON_FOREST + - 0.26:NETHER_WASTES + - 0.51:WARPED_FOREST + - 0.76:NETHER_WASTES + - 1.1:CRIMSON_FOREST + - 1.36:SOUL_SAND_VALLEY + - 1.6:BASALT_DELTAS + - 2.1:NETHER_WASTES + south-east: + - 0.03:NETHER_WASTES + - 0.05:CRIMSON_FOREST + - 0.23:NETHER_WASTES + - 0.48:WARPED_FOREST + - 0.70:NETHER_WASTES + - 1.0:CRIMSON_FOREST + - 1.2:SOUL_SAND_VALLEY + - 1.9:BASALT_DELTAS + - 2.0:NETHER_WASTES + north-west: + - 0.03:NETHER_WASTES + - 0.15:CRIMSON_FOREST + - 0.20:NETHER_WASTES + - 0.3:WARPED_FOREST + - 0.5:NETHER_WASTES + - 1.0:CRIMSON_FOREST + - 1.25:SOUL_SAND_VALLEY + - 1.5:BASALT_DELTAS + - 2.0:NETHER_WASTES + south-west: + - 0.03:NETHER_WASTES + - 0.11:CRIMSON_FOREST + - 0.22:NETHER_WASTES + - 0.51:WARPED_FOREST + - 0.73:NETHER_WASTES + - 1.1:CRIMSON_FOREST + - 1.26:SOUL_SAND_VALLEY + - 1.54:BASALT_DELTAS + - 2.1:NETHER_WASTES nether: biomes: NETHER_WASTES: