blob: f36fc439db19cbdee046d46b511868748be1ca6a [file] [log] [blame] [raw]
package net.glowstone.constants;
import net.glowstone.util.noise.SimplexOctaveGenerator;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import static org.bukkit.block.Biome.*;
public class GlowBiomeClimate {
private static final Map<Biome, BiomeClimate> CLIMATE_MAP = new HashMap<>();
private static final SimplexOctaveGenerator noiseGen;
public static double getBiomeTemperature(Biome biome) {
return CLIMATE_MAP.get(biome).getTemperature();
}
public static double getBiomeHumidity(Biome biome) {
return CLIMATE_MAP.get(biome).getHumidity();
}
public static double getTemperature(Block block) {
return getBiomeTemperature(block.getBiome());
}
public static double getHumidity(Block block) {
return getBiomeHumidity(block.getBiome());
}
public static boolean isWet(Block block) {
return getBiomeHumidity(block.getBiome()) > 0.85D;
}
public static boolean isCold(Biome biome, int x, int y, int z) {
return getVariatedTemperature(biome, x, y , z) < 0.15D;
}
public static boolean isCold(Block block) {
return isCold(block.getBiome(), block.getX(), block.getY(), block.getZ());
}
public static boolean isRainy(Biome biome, int x, int y, int z) {
boolean rainy = CLIMATE_MAP.get(biome).isRainy();
return rainy && !isCold(biome, x, y, z);
}
public static boolean isRainy(Block block) {
return isRainy(block.getBiome(), block.getX(), block.getY(), block.getZ());
}
public static boolean isSnowy(Biome biome, int x, int y, int z) {
return isRainy(biome, x, y, z) && isCold(biome, x, y, z);
}
public static boolean isSnowy(Block block) {
return isSnowy(block.getBiome(), block.getX(), block.getY(), block.getZ());
}
private static double getVariatedTemperature(Biome biome, int x, int y, int z) {
double temp = CLIMATE_MAP.get(biome).getTemperature();
if (y > 64) {
double variation = noiseGen.noise(x, z, 0.5D, 2.0D) * 4.0D;
return temp - (variation + (double) (y - 64)) * 0.05D / 30.0D;
} else {
return temp;
}
}
private static void setBiomeClimate(BiomeClimate temp, Biome... biomes) {
for (Biome biome : biomes) {
CLIMATE_MAP.put(biome, temp);
}
}
private static class BiomeClimate {
public static final BiomeClimate DEFAULT = new BiomeClimate(0.5D, 0.5D, true);
public static final BiomeClimate PLAINS = new BiomeClimate(0.8D, 0.4D, true);
public static final BiomeClimate DESERT = new BiomeClimate(2.0D, 0.0D, false);
public static final BiomeClimate EXTREME_HILLS = new BiomeClimate(0.2D, 0.3D, true);
public static final BiomeClimate FOREST = new BiomeClimate(0.7D, 0.8D, true);
public static final BiomeClimate BIRCH_FOREST = new BiomeClimate(0.6D, 0.6D, true);
public static final BiomeClimate TAIGA = new BiomeClimate(0.25D, 0.8D, true);
public static final BiomeClimate SWAMPLAND = new BiomeClimate(0.8D, 0.9D, true);
public static final BiomeClimate ICE_PLAINS = new BiomeClimate(0.0D, 0.5D, true);
public static final BiomeClimate MUSHROOM = new BiomeClimate(0.9D, 1.0D, true);
public static final BiomeClimate COLD_BEACH = new BiomeClimate(0.05D, 0.3D, true);
public static final BiomeClimate JUNGLE = new BiomeClimate(0.95D, 0.9D, true);
public static final BiomeClimate JUNGLE_EDGE = new BiomeClimate(0.95D, 0.8D, true);
public static final BiomeClimate COLD_TAIGA = new BiomeClimate(-0.5D, 0.4D, true);
public static final BiomeClimate MEGA_TAIGA = new BiomeClimate(0.3D, 0.8D, true);
public static final BiomeClimate SAVANNA = new BiomeClimate(1.2D, 0.0D, false);
public static final BiomeClimate SAVANNA_MOUNTAINS = new BiomeClimate(1.1D, 0.0D, false);
public static final BiomeClimate SAVANNA_PLATEAU = new BiomeClimate(1.0D, 0.0D, false);
public static final BiomeClimate SAVANNA_PLATEAU_MOUNTAINS = new BiomeClimate(0.5D, 0.0D, false);
public static final BiomeClimate SKY = new BiomeClimate(0.5D, 0.5D, false);
private final double temperature;
private final double humidity;
private final boolean rainy;
public BiomeClimate(double temperature, double humidity, boolean rainy) {
this.temperature = temperature;
this.humidity = humidity;
this.rainy = rainy;
}
public double getTemperature() {
return temperature;
}
public double getHumidity() {
return humidity;
}
public boolean isRainy() {
return rainy;
}
}
static {
setBiomeClimate(BiomeClimate.DEFAULT, Biome.values());
setBiomeClimate(BiomeClimate.PLAINS, PLAINS, SUNFLOWER_PLAINS, BEACH);
setBiomeClimate(BiomeClimate.DESERT, DESERT, DESERT_HILLS, DESERT_MOUNTAINS, MESA, MESA_BRYCE, MESA_PLATEAU, MESA_PLATEAU_FOREST, MESA_PLATEAU_MOUNTAINS, MESA_PLATEAU_FOREST_MOUNTAINS, HELL);
setBiomeClimate(BiomeClimate.EXTREME_HILLS, EXTREME_HILLS, EXTREME_HILLS_PLUS, EXTREME_HILLS_MOUNTAINS, EXTREME_HILLS_PLUS_MOUNTAINS, STONE_BEACH, SMALL_MOUNTAINS);
setBiomeClimate(BiomeClimate.FOREST, FOREST, FOREST_HILLS, FLOWER_FOREST, ROOFED_FOREST, ROOFED_FOREST_MOUNTAINS);
setBiomeClimate(BiomeClimate.BIRCH_FOREST, BIRCH_FOREST, BIRCH_FOREST_HILLS, BIRCH_FOREST_MOUNTAINS, BIRCH_FOREST_HILLS_MOUNTAINS);
setBiomeClimate(BiomeClimate.TAIGA, TAIGA, TAIGA_HILLS, TAIGA_MOUNTAINS, MEGA_SPRUCE_TAIGA, MEGA_SPRUCE_TAIGA_HILLS);
setBiomeClimate(BiomeClimate.SWAMPLAND, SWAMPLAND, SWAMPLAND_MOUNTAINS);
setBiomeClimate(BiomeClimate.ICE_PLAINS, ICE_PLAINS, ICE_MOUNTAINS, ICE_PLAINS_SPIKES, FROZEN_RIVER, FROZEN_OCEAN);
setBiomeClimate(BiomeClimate.MUSHROOM, MUSHROOM_ISLAND, MUSHROOM_SHORE);
setBiomeClimate(BiomeClimate.COLD_BEACH, COLD_BEACH);
setBiomeClimate(BiomeClimate.JUNGLE, JUNGLE, JUNGLE_HILLS, JUNGLE_MOUNTAINS);
setBiomeClimate(BiomeClimate.JUNGLE_EDGE, JUNGLE_EDGE, JUNGLE_EDGE_MOUNTAINS);
setBiomeClimate(BiomeClimate.COLD_TAIGA, COLD_TAIGA, COLD_TAIGA_HILLS, COLD_TAIGA_MOUNTAINS);
setBiomeClimate(BiomeClimate.MEGA_TAIGA, MEGA_TAIGA, MEGA_TAIGA_HILLS);
setBiomeClimate(BiomeClimate.SAVANNA, SAVANNA);
setBiomeClimate(BiomeClimate.SAVANNA_MOUNTAINS, SAVANNA_MOUNTAINS);
setBiomeClimate(BiomeClimate.SAVANNA_PLATEAU, SAVANNA_PLATEAU);
setBiomeClimate(BiomeClimate.SAVANNA_PLATEAU_MOUNTAINS, SAVANNA_PLATEAU_MOUNTAINS);
setBiomeClimate(BiomeClimate.SKY, SKY);
noiseGen = new SimplexOctaveGenerator(new Random(1234), 1);
noiseGen.setScale(1 / 8.0D);
}
}