package mcjty.rftools.items.dimlets; import mcjty.rftools.dimension.world.types.ControllerType; import net.minecraft.world.biome.BiomeGenBase; import java.util.HashMap; import java.util.Map; public class BiomeControllerMapping { public static final Map<Integer, Integer> coldBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> warmBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> mediumBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> wetBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> dryBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> fieldsBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> mountainsBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> magicalBiomeReplacements = new HashMap<Integer, Integer>(); public static final Map<Integer, Integer> forestBiomeReplacements = new HashMap<Integer, Integer>(); public static void setupControllerBiomes() { BiomeGenBase[] biomeGenArray = BiomeGenBase.getBiomeGenArray(); makeFilteredBiomeMap(biomeGenArray, coldBiomeReplacements, ControllerType.CONTROLLER_COLD); makeFilteredBiomeMap(biomeGenArray, warmBiomeReplacements, ControllerType.CONTROLLER_WARM); makeFilteredBiomeMap(biomeGenArray, mediumBiomeReplacements, ControllerType.CONTROLLER_MEDIUM); makeFilteredBiomeMap(biomeGenArray, wetBiomeReplacements, ControllerType.CONTROLLER_WET); makeFilteredBiomeMap(biomeGenArray, dryBiomeReplacements, ControllerType.CONTROLLER_DRY); makeFilteredBiomeMap(biomeGenArray, fieldsBiomeReplacements, ControllerType.CONTROLLER_FIELDS); makeFilteredBiomeMap(biomeGenArray, mountainsBiomeReplacements, ControllerType.CONTROLLER_MOUNTAINS); makeFilteredBiomeMap(biomeGenArray, magicalBiomeReplacements, ControllerType.CONTROLLER_MAGICAL); makeFilteredBiomeMap(biomeGenArray, forestBiomeReplacements, ControllerType.CONTROLLER_FOREST); } private static void makeFilteredBiomeMap(BiomeGenBase[] biomeGenArray, Map<Integer, Integer> map, ControllerType type) { makeFilteredBiomeMap(biomeGenArray, map, type.getFilter()); } public static void makeFilteredBiomeMap(BiomeGenBase[] biomeGenArray, Map<Integer, Integer> map, ControllerType.BiomeFilter filter) { // First check if there exist biomes for a certain filter. boolean ok = false; for (BiomeGenBase biome : biomeGenArray) { if (biome != null) { if (filter.match(biome)) { ok = true; break; } } } if (!ok) { // No biomes found! We just map every biome to itself as a fallback. for (BiomeGenBase biome : biomeGenArray) { if (biome != null) { map.put(biome.biomeID, biome.biomeID); } } } else { for (BiomeGenBase biome : biomeGenArray) { if (biome != null) { if (filter.match(biome)) { map.put(biome.biomeID, biome.biomeID); } else { map.put(biome.biomeID, findSuitableBiomes(biomeGenArray, biome, filter)); } } } } } private static int findSuitableBiomes(BiomeGenBase[] biomeGenArray, BiomeGenBase biome, ControllerType.BiomeFilter filter) { double bestdist = 1000000000.0f; int bestidx = 0; // Make sure we always have some matching biome. for (BiomeGenBase base : biomeGenArray) { if (base != null && filter.match(base)) { // This 'base' could be a replacement. Check if it is close enough. if (biome.getBiomeClass() == base.getBiomeClass()) { // Same class, that's good enough for me. return base.biomeID; } double dist = filter.calculateBiomeDistance(biome, base); if (dist < bestdist) { bestdist = dist; bestidx = base.biomeID; } } } return bestidx; } }