|
| 1 | +package worldgeneratorextension.vanillagenerator.biome; |
| 2 | + |
| 3 | +import cn.nukkit.level.biome.Biome; |
| 4 | +import cn.nukkit.level.biome.EnumBiome; |
| 5 | +import cn.nukkit.math.NukkitRandom; |
| 6 | +import worldgeneratorextension.vanillagenerator.noise.bukkit.SimplexOctaveGenerator; |
| 7 | +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; |
| 8 | +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; |
| 9 | + |
| 10 | +public class BiomeClimate { |
| 11 | + |
| 12 | + private static final Int2ObjectMap<Climate> CLIMATE_MAP = new Int2ObjectOpenHashMap<>(); |
| 13 | + private static final SimplexOctaveGenerator noiseGen; |
| 14 | + |
| 15 | + static { |
| 16 | + int[] biomes = new int[Biome.unorderedBiomes.size()]; |
| 17 | + for (int i = 0; i < biomes.length; i++) { |
| 18 | + biomes[i] = Biome.unorderedBiomes.get(i).getId(); |
| 19 | + } |
| 20 | + setBiomeClimate(Climate.DEFAULT, biomes); |
| 21 | + setBiomeClimate(Climate.PLAINS, EnumBiome.PLAINS.id, EnumBiome.SUNFLOWER_PLAINS.id, EnumBiome.BEACH.id); |
| 22 | + setBiomeClimate(Climate.DESERT, EnumBiome.DESERT.id, EnumBiome.DESERT_HILLS.id, EnumBiome.DESERT_M.id, EnumBiome.MESA.id, EnumBiome.MESA_BRYCE.id, EnumBiome.MESA_PLATEAU.id, EnumBiome.MESA_PLATEAU_F.id, EnumBiome.MESA_PLATEAU_M.id, EnumBiome.MESA_PLATEAU_F_M.id, EnumBiome.HELL.id); |
| 23 | + setBiomeClimate(Climate.EXTREME_HILLS, EnumBiome.EXTREME_HILLS.id, EnumBiome.EXTREME_HILLS_PLUS.id, EnumBiome.EXTREME_HILLS_M.id, EnumBiome.EXTREME_HILLS_PLUS_M.id, EnumBiome.STONE_BEACH.id, EnumBiome.EXTREME_HILLS_EDGE.id); |
| 24 | + setBiomeClimate(Climate.FOREST, EnumBiome.FOREST.id, EnumBiome.FOREST_HILLS.id, EnumBiome.FLOWER_FOREST.id, EnumBiome.ROOFED_FOREST.id, EnumBiome.ROOFED_FOREST_M.id); |
| 25 | + setBiomeClimate(Climate.BIRCH_FOREST, EnumBiome.BIRCH_FOREST.id, EnumBiome.BIRCH_FOREST_HILLS.id, EnumBiome.BIRCH_FOREST_M.id, EnumBiome.BIRCH_FOREST_HILLS_M.id); |
| 26 | + setBiomeClimate(Climate.TAIGA, EnumBiome.TAIGA.id, EnumBiome.TAIGA_HILLS.id, EnumBiome.TAIGA_M.id, EnumBiome.MEGA_SPRUCE_TAIGA.id, EnumBiome.MEGA_SPRUCE_TAIGA_HILLS.id); |
| 27 | + setBiomeClimate(Climate.SWAMPLAND, EnumBiome.SWAMP.id, EnumBiome.SWAMPLAND_M.id); |
| 28 | + setBiomeClimate(Climate.ICE_PLAINS, EnumBiome.ICE_PLAINS.id, EnumBiome.ICE_PLAINS_SPIKES.id, EnumBiome.FROZEN_RIVER.id, EnumBiome.FROZEN_OCEAN.id, EnumBiome.ICE_MOUNTAINS.id); |
| 29 | + setBiomeClimate(Climate.MUSHROOM, EnumBiome.MUSHROOM_ISLAND.id, EnumBiome.MUSHROOM_ISLAND_SHORE.id); |
| 30 | + setBiomeClimate(Climate.COLD_BEACH, EnumBiome.COLD_BEACH.id); |
| 31 | + setBiomeClimate(Climate.JUNGLE, EnumBiome.JUNGLE.id, EnumBiome.JUNGLE_HILLS.id, EnumBiome.JUNGLE_M.id, EnumBiome.BAMBOO_JUNGLE.id, EnumBiome.BAMBOO_JUNGLE_HILLS.id); |
| 32 | + setBiomeClimate(Climate.JUNGLE_EDGE, EnumBiome.JUNGLE_EDGE.id, EnumBiome.JUNGLE_EDGE_M.id); |
| 33 | + setBiomeClimate(Climate.COLD_TAIGA, EnumBiome.COLD_TAIGA.id, EnumBiome.COLD_TAIGA_HILLS.id, EnumBiome.COLD_TAIGA_M.id); |
| 34 | + setBiomeClimate(Climate.MEGA_TAIGA, EnumBiome.MEGA_TAIGA.id, EnumBiome.MEGA_TAIGA_HILLS.id); |
| 35 | + setBiomeClimate(Climate.SAVANNA, EnumBiome.SAVANNA.id); |
| 36 | + setBiomeClimate(Climate.SAVANNA_MOUNTAINS, EnumBiome.SAVANNA_M.id); |
| 37 | + setBiomeClimate(Climate.SAVANNA_PLATEAU, EnumBiome.SAVANNA_PLATEAU.id); |
| 38 | + setBiomeClimate(Climate.SAVANNA_PLATEAU_MOUNTAINS, EnumBiome.SAVANNA_PLATEAU_M.id); |
| 39 | + setBiomeClimate(Climate.SKY);//, EnumBiome.THE_END.id, EnumBiome.SMALL_END_ISLANDS.id, EnumBiome.END_MIDLANDS.id, EnumBiome.END_HIGHLANDS.id, EnumBiome.END_BARRENS.id |
| 40 | + |
| 41 | + noiseGen = new SimplexOctaveGenerator(new NukkitRandom(1234), 1); |
| 42 | + noiseGen.setScale(1 / 8.0D); |
| 43 | + } |
| 44 | + |
| 45 | + public static double getTemperature(int biome) { |
| 46 | + return CLIMATE_MAP.get(biome).getTemperature(); |
| 47 | + } |
| 48 | + |
| 49 | + public static double getHumidity(int biome) { |
| 50 | + return CLIMATE_MAP.get(biome).getHumidity(); |
| 51 | + } |
| 52 | + |
| 53 | + public static boolean isWet(int biome) { |
| 54 | + return getHumidity(biome) > 0.85D; |
| 55 | + } |
| 56 | + |
| 57 | + public static boolean isCold(int biome, int x, int y, int z) { |
| 58 | + return getVariatedTemperature(biome, x, y, z) < 0.15D; |
| 59 | + } |
| 60 | + |
| 61 | + public static boolean isRainy(int biome, int x, int y, int z) { |
| 62 | + boolean rainy = CLIMATE_MAP.get(biome).isRainy(); |
| 63 | + return rainy && !isCold(biome, x, y, z); |
| 64 | + } |
| 65 | + |
| 66 | + public static boolean isSnowy(int biome, int x, int y, int z) { |
| 67 | + boolean rainy = CLIMATE_MAP.get(biome).isRainy(); |
| 68 | + return rainy && isCold(biome, x, y, z); |
| 69 | + } |
| 70 | + |
| 71 | + private static double getVariatedTemperature(int biome, int x, int y, int z) { |
| 72 | + double temp = CLIMATE_MAP.get(biome).getTemperature(); |
| 73 | + if (y > 64) { |
| 74 | + double variation = noiseGen.noise(x, z, 0.5D, 2.0D) * 4.0D; |
| 75 | + return temp - (variation + (y - 64)) * 0.05D / 30.0D; |
| 76 | + } else { |
| 77 | + return temp; |
| 78 | + } |
| 79 | + } |
| 80 | + |
| 81 | + private static void setBiomeClimate(Climate temp, int... biomes) { |
| 82 | + for (int biome : biomes) { |
| 83 | + CLIMATE_MAP.put(biome, temp); |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + private static class Climate { |
| 88 | + |
| 89 | + public static final Climate DEFAULT = new Climate(0.5D, 0.5D, true); |
| 90 | + public static final Climate PLAINS = new Climate(0.8D, 0.4D, true); |
| 91 | + public static final Climate DESERT = new Climate(2.0D, 0.0D, false); |
| 92 | + public static final Climate EXTREME_HILLS = new Climate(0.2D, 0.3D, true); |
| 93 | + public static final Climate FOREST = new Climate(0.7D, 0.8D, true); |
| 94 | + public static final Climate BIRCH_FOREST = new Climate(0.6D, 0.6D, true); |
| 95 | + public static final Climate TAIGA = new Climate(0.25D, 0.8D, true); |
| 96 | + public static final Climate SWAMPLAND = new Climate(0.8D, 0.9D, true); |
| 97 | + public static final Climate ICE_PLAINS = new Climate(0.0D, 0.5D, true); |
| 98 | + public static final Climate MUSHROOM = new Climate(0.9D, 1.0D, true); |
| 99 | + public static final Climate COLD_BEACH = new Climate(0.05D, 0.3D, true); |
| 100 | + public static final Climate JUNGLE = new Climate(0.95D, 0.9D, true); |
| 101 | + public static final Climate JUNGLE_EDGE = new Climate(0.95D, 0.8D, true); |
| 102 | + public static final Climate COLD_TAIGA = new Climate(-0.5D, 0.4D, true); |
| 103 | + public static final Climate MEGA_TAIGA = new Climate(0.3D, 0.8D, true); |
| 104 | + public static final Climate SAVANNA = new Climate(1.2D, 0.0D, false); |
| 105 | + public static final Climate SAVANNA_MOUNTAINS = new Climate(1.1D, 0.0D, false); |
| 106 | + public static final Climate SAVANNA_PLATEAU = new Climate(1.0D, 0.0D, false); |
| 107 | + public static final Climate SAVANNA_PLATEAU_MOUNTAINS = new Climate(0.5D, 0.0D, false); |
| 108 | + public static final Climate SKY = new Climate(0.5D, 0.5D, false); |
| 109 | + |
| 110 | + private final double temperature; |
| 111 | + private final double humidity; |
| 112 | + private final boolean rainy; |
| 113 | + |
| 114 | + Climate(double temperature, double humidity, boolean rainy) { |
| 115 | + this.temperature = temperature; |
| 116 | + this.humidity = humidity; |
| 117 | + this.rainy = rainy; |
| 118 | + } |
| 119 | + |
| 120 | + public double getTemperature() { |
| 121 | + return this.temperature; |
| 122 | + } |
| 123 | + |
| 124 | + public double getHumidity() { |
| 125 | + return this.humidity; |
| 126 | + } |
| 127 | + |
| 128 | + public boolean isRainy() { |
| 129 | + return this.rainy; |
| 130 | + } |
| 131 | + } |
| 132 | +} |
0 commit comments