blob: 5eb045df4ce868f8b135f8cd342a0cc4a4b2dbf6 [file] [log] [blame] [raw]
package net.glowstone.constants;
import static com.google.common.base.Preconditions.checkNotNull;
import static net.glowstone.GlowServer.getWorldConfig;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_BIG_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_BIG_HILLS2;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_DEEP_OCEAN;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_DEFAULT;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_DEFAULT_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_EXTREME_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_FLATLANDS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_FLATLANDS_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_FLAT_SHORE;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_HIGH_PLATEAU;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_HIGH_SPIKES;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_LOW_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_LOW_SPIKES;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_MID_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_MID_HILLS2;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_MID_PLAINS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_OCEAN;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_RIVER;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_ROCKY_SHORE;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_SWAMPLAND;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_HEIGHT_SWAMPLAND_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_BIG_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_BIG_HILLS2;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_DEEP_OCEAN;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_DEFAULT;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_DEFAULT_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_EXTREME_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_FLATLANDS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_FLATLANDS_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_FLAT_SHORE;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_HIGH_PLATEAU;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_HIGH_SPIKES;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_LOW_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_LOW_SPIKES;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_MID_HILLS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_MID_HILLS2;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_MID_PLAINS;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_OCEAN;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_RIVER;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_ROCKY_SHORE;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_SWAMPLAND;
import static net.glowstone.util.config.WorldConfig.Key.BIOME_SCALE_SWAMPLAND_HILLS;
import static org.bukkit.block.Biome.ICE_SPIKES;
import static org.bukkit.block.Biome.SNOWY_TAIGA;
import static org.bukkit.block.Biome.SNOWY_TAIGA_MOUNTAINS;
import static org.bukkit.block.Biome.SNOWY_TUNDRA;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.collect.MutableClassToInstanceMap;
import java.lang.reflect.Constructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.glowstone.generator.ground.GroundGenerator;
import net.glowstone.generator.ground.SnowyGroundGenerator;
import net.glowstone.generator.populators.overworld.BiomePopulator;
import net.glowstone.generator.populators.overworld.IceSpikesPopulator;
import net.glowstone.generator.populators.overworld.SnowyTundraPopulator;
import net.glowstone.generator.populators.overworld.TaigaPopulator;
import net.glowstone.i18n.ConsoleMessages;
import org.bukkit.block.Biome;
/**
* Mappings for Biome id values.
*/
@Builder
@Data
public final class GlowBiome {
private static final int[] ids = new int[Biome.values().length];
private static final GlowBiome[] biomes = new GlowBiome[256];
private static ClassToInstanceMap<BiomePopulator> populators = MutableClassToInstanceMap.create();
private static ClassToInstanceMap<GroundGenerator> groundGenerators = MutableClassToInstanceMap.create();
// TODO: use Biome builder with 1.13 biomes
static {
register(
builder()
.type(SNOWY_TUNDRA)
.id(12)
.temperature(0.0)
.populator(SnowyTundraPopulator.class)
.ground(GroundGenerator.class)
.scale(BiomeScale.FLATLANDS)
.build(),
builder()
.type(ICE_SPIKES)
.id(140)
.temperature(0.0)
.populator(IceSpikesPopulator.class)
.ground(SnowyGroundGenerator.class)
.scale(BiomeScale.MID_HILLS)
.build(),
builder()
.type(SNOWY_TAIGA)
.id(30)
.temperature(-0.5)
.populator(TaigaPopulator.class)
.ground(GroundGenerator.class)
.scale(BiomeScale.MID_PLAINS)
.build(),
builder()
.type(SNOWY_TAIGA_MOUNTAINS)
.id(158)
.temperature(-0.5)
.populator(TaigaPopulator.class)
.ground(GroundGenerator.class)
.scale(BiomeScale.MID_HILLS)
.build()
);
// Make caches immutable
populators = ImmutableClassToInstanceMap.copyOf(populators);
groundGenerators = ImmutableClassToInstanceMap.copyOf(groundGenerators);
}
private final int id;
private final Biome type;
private final double temperature;
private final BiomePopulator populator;
private final GroundGenerator ground;
private final BiomeScale scale;
/**
* Get the biome ID for a specified Biome.
*
* @param biome the Biome.
* @return the biome id, or -1
*/
public static int getId(Biome biome) {
checkNotNull(biome, "Biome cannot be null");
return ids[biome.ordinal()];
}
/**
* Get the GlowBiome for a specified id.
*
* @param id the id.
* @return the Biome, or null
*/
public static GlowBiome getBiome(int id) {
if (id < biomes.length) {
return biomes[id];
} else {
ConsoleMessages.Error.Biome.UNKNOWN.log(id);
return null;
}
}
/**
* Get the GlowBiome for a specified biome type.
*
* @param biome the biome type.
* @return the Biome, or null
*/
public static GlowBiome getBiome(Biome biome) {
return getBiome(getId(biome));
}
private static void register(GlowBiome... biomes) {
for (GlowBiome biome : biomes) {
GlowBiome.ids[biome.type.ordinal()] = biome.id;
GlowBiome.biomes[biome.id] = biome;
}
}
public static class GlowBiomeBuilder {
public GlowBiomeBuilder populator(Class<? extends BiomePopulator> populatorClass, Object... args) {
this.populator = cachedInstanceClass(
populators,
populatorClass,
args
);
return this;
}
public GlowBiomeBuilder ground(Class<? extends GroundGenerator> groundClass, Object... args) {
this.ground = cachedInstanceClass(
groundGenerators,
groundClass,
args
);
return this;
}
}
private static <T> T cachedInstanceClass(ClassToInstanceMap<T> cacheMap,
Class<? extends T> clazz, Object... args) {
if (args.length == 0) {
// Cache
if (cacheMap.containsKey(clazz)) {
return cacheMap.getInstance(clazz);
} else {
try {
return cacheMap.put(clazz, clazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
// Don't cache if args are required
T instance = null;
for (Constructor<?> constructor : clazz.getConstructors()) {
// Try to call constructor, silently ignore exceptions
try {
instance = (T) constructor.newInstance(args);
break;
} catch (Exception ignored) {
// Ignored exception, go to next constructor
}
}
if (instance == null) {
throw new IllegalArgumentException("Could not find a constructor for given parameters.");
}
return instance;
}
return null;
}
@RequiredArgsConstructor
private static class BiomeScale {
public static final BiomeScale DEFAULT = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_DEFAULT),
getWorldConfig().getDouble(BIOME_SCALE_DEFAULT));
public static final BiomeScale FLAT_SHORE = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_FLAT_SHORE),
getWorldConfig().getDouble(BIOME_SCALE_FLAT_SHORE));
public static final BiomeScale HIGH_PLATEAU = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_HIGH_PLATEAU),
getWorldConfig().getDouble(BIOME_SCALE_HIGH_PLATEAU));
public static final BiomeScale FLATLANDS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_FLATLANDS),
getWorldConfig().getDouble(BIOME_SCALE_FLATLANDS));
public static final BiomeScale SWAMPLAND = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_SWAMPLAND),
getWorldConfig().getDouble(BIOME_SCALE_SWAMPLAND));
public static final BiomeScale MID_PLAINS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_MID_PLAINS),
getWorldConfig().getDouble(BIOME_SCALE_MID_PLAINS));
public static final BiomeScale FLATLANDS_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_FLATLANDS_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_FLATLANDS_HILLS));
public static final BiomeScale SWAMPLAND_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_SWAMPLAND_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_SWAMPLAND_HILLS));
public static final BiomeScale LOW_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_LOW_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_LOW_HILLS));
public static final BiomeScale HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_HILLS));
public static final BiomeScale MID_HILLS2 = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_MID_HILLS2),
getWorldConfig().getDouble(BIOME_SCALE_MID_HILLS2));
public static final BiomeScale DEFAULT_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_DEFAULT_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_DEFAULT_HILLS));
public static final BiomeScale MID_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_MID_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_MID_HILLS));
public static final BiomeScale BIG_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_BIG_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_BIG_HILLS));
public static final BiomeScale BIG_HILLS2 = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_BIG_HILLS2),
getWorldConfig().getDouble(BIOME_SCALE_BIG_HILLS2));
public static final BiomeScale EXTREME_HILLS = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_EXTREME_HILLS),
getWorldConfig().getDouble(BIOME_SCALE_EXTREME_HILLS));
public static final BiomeScale ROCKY_SHORE = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_ROCKY_SHORE),
getWorldConfig().getDouble(BIOME_SCALE_ROCKY_SHORE));
public static final BiomeScale LOW_SPIKES = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_LOW_SPIKES),
getWorldConfig().getDouble(BIOME_SCALE_LOW_SPIKES));
public static final BiomeScale HIGH_SPIKES = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_HIGH_SPIKES),
getWorldConfig().getDouble(BIOME_SCALE_HIGH_SPIKES));
public static final BiomeScale RIVER = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_RIVER),
getWorldConfig().getDouble(BIOME_SCALE_RIVER));
public static final BiomeScale OCEAN = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_OCEAN),
getWorldConfig().getDouble(BIOME_SCALE_OCEAN));
public static final BiomeScale DEEP_OCEAN = new BiomeScale(
getWorldConfig().getDouble(BIOME_HEIGHT_DEEP_OCEAN),
getWorldConfig().getDouble(BIOME_SCALE_DEEP_OCEAN));
@Getter
private final double height;
@Getter
private final double scale;
}
}