package com.dynious.biota.config;
import com.dynious.biota.Biota;
import com.dynious.biota.lib.Reference;
import com.dynious.biota.lib.Settings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class BiomeConfig
{
private static final float[] NORMAL_NUTRIENTS = { Settings.NORMAL_PHOSPHORUS , Settings.NORMAL_POTASSIUM , Settings.NORMAL_NITROGEN };
private static BiomeInfo[] biomeInfoArray = new BiomeInfo[BiomeGenBase.getBiomeGenArray().length];
public static void init()
{
Loader.load();
}
public static float[] getNutrientValuesForChunk(Chunk chunk)
{
int biomeID = getDominantBiomeInChunk(chunk);
return getBiomeNutrientValues(biomeID);
}
public static float[] getRandomizedNutrientValuesForChunk(Chunk chunk)
{
Random random = new Random();
float[] values = getNutrientValuesForChunk(chunk);
values[0] = values[0] + (1F-(random.nextFloat()*2)) * Settings.DELTA_PHOSPHORUS * values[0];
values[1] = values[1] + (1F-(random.nextFloat()*2)) * Settings.DELTA_POTASSIUM * values[1];
values[2] = values[2] + (1F-(random.nextFloat()*2)) * Settings.DELTA_NITROGEN * values[2];
return values;
}
public static float[] getBiomeNutrientValues(int biomeID)
{
if (biomeID < 0 || biomeID >= biomeInfoArray.length || biomeInfoArray[biomeID] == null)
return NORMAL_NUTRIENTS.clone();
return biomeInfoArray[biomeID].normalNutrients.clone();
}
public static void registerBiomeValue(int biomeID, float normalPhosphorus, float normalPotassium, float normalNitrogen)
{
if (biomeID >= 0 && biomeInfoArray.length > biomeID)
{
if (biomeInfoArray[biomeID] == null)
{
biomeInfoArray[biomeID] = new BiomeInfo(new float[] { normalPhosphorus, normalPotassium, normalNitrogen });
}
else
{
Biota.logger.warn("Biome with ID " + biomeID + " already registered! Skipping.");
}
}
else
{
Biota.logger.warn("Invalid biome id: " + biomeID + "! Skipping.");
}
}
private static int getDominantBiomeInChunk(Chunk chunk)
{
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : chunk.getBiomeArray()) {
Integer count = map.get(i);
map.put(i, count != null ? count+1 : 0);
}
return Collections.max(map.entrySet(),
new Comparator<Map.Entry<Integer, Integer>>()
{
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2)
{
return o1.getValue().compareTo(o2.getValue());
}
}).getKey();
}
private static class BiomeInfo
{
public float[] normalNutrients;
public BiomeInfo(float[] normalNutrients)
{
this.normalNutrients = normalNutrients;
}
}
private static class Loader
{
private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
public LoaderPart[] biomes;
private Loader(LoaderPart[] biomes)
{
this.biomes = biomes;
}
public static void load()
{
List<Loader> loaders = new ArrayList<Loader>();
File file = new File(cpw.mods.fml.common.Loader.instance().getConfigDir(), Reference.MOD_ID.toLowerCase());
if (!file.exists())
{
file.mkdirs();
}
boolean foundVanilla = false;
for (File foundFile : file.listFiles())
{
if (foundFile.getName().endsWith(".cfg") && foundFile.getName().startsWith("biomes"))
{
if (foundFile.getName().equals("biomesVanilla.cfg"))
foundVanilla = true;
Loader loader = readFile(foundFile);
if (loader != null)
loaders.add(loader);
}
}
if (!foundVanilla)
{
Loader loader = makeDefaultConfig();
String jsonString = gson.toJson(loader);
try
{
FileUtils.writeStringToFile(new File(file, "biomesVanilla.cfg"), jsonString);
} catch (IOException e)
{
e.printStackTrace();
}
}
for (Loader loader : loaders)
{
LoaderPart[] biomes1 = loader.biomes;
for (LoaderPart biome : biomes1)
{
if (biome.biomeID >= 0 && biomeInfoArray.length > biome.biomeID)
{
if (biomeInfoArray[biome.biomeID] == null)
{
biomeInfoArray[biome.biomeID] = new BiomeInfo(new float[]{biome.normalPhosphorus, biome.normalPotassium, biome.normalNitrogen});
}
else
{
Biota.logger.warn("Biome with ID " + biome.biomeID + " already registered! Skipping.");
}
}
else
{
Biota.logger.warn("Invalid biome id: " + biome.biomeID + "! Skipping.");
}
}
}
}
private static Loader readFile(File file)
{
try
{
String jsonString = FileUtils.readFileToString(file);
return gson.fromJson(jsonString, Loader.class);
} catch (IOException e)
{
e.printStackTrace();
}
return null;
}
private static Loader makeDefaultConfig()
{
List<LoaderPart> list = new ArrayList<LoaderPart>();
list.add(new LoaderPart(0, 15F, 200F, 7.5F));
list.add(new LoaderPart(1, 15F, 200F, 7.5F));
list.add(new LoaderPart(2, 7.5F, 100F, 3.75F));
list.add(new LoaderPart(3, 13F, 180F, 7F));
list.add(new LoaderPart(4, 15F, 200F, 7.5F));
list.add(new LoaderPart(5, 14F, 190F, 7.25F));
list.add(new LoaderPart(6, 16F, 220F, 8F));
list.add(new LoaderPart(7, 14F, 180F, 7.25F));
list.add(new LoaderPart(8, 4F, 70F, 2F));
list.add(new LoaderPart(9, 0F, 0F, 0F));
list.add(new LoaderPart(10, 13F, 180F, 7F));
list.add(new LoaderPart(11, 12F, 160F, 6F));
list.add(new LoaderPart(12, 13F, 170F, 6.5F));
list.add(new LoaderPart(13, 13F, 180F, 7F));
list.add(new LoaderPart(14, 13F, 180F, 7F));
list.add(new LoaderPart(15, 13F, 180F, 7F));
list.add(new LoaderPart(16, 13F, 180F, 7F));
list.add(new LoaderPart(17, 7.5F, 100F, 3.75F));
list.add(new LoaderPart(18, 15F, 200, 7.5F));
list.add(new LoaderPart(19, 13F, 180F, 7F));
list.add(new LoaderPart(20, 14F, 190F, 7.25F));
list.add(new LoaderPart(21, 17F, 280F, 9F));
list.add(new LoaderPart(22, 17F, 280F, 9F));
list.add(new LoaderPart(23, 17F, 280F, 9F));
list.add(new LoaderPart(24, 15F, 200F, 7.5F));
list.add(new LoaderPart(25, 8F, 120F, 4F));
list.add(new LoaderPart(26, 13F, 180F, 7F));
list.add(new LoaderPart(27, 15F, 200F, 7.5F));
list.add(new LoaderPart(28, 15F, 200F, 7.5F));
list.add(new LoaderPart(29, 15F, 200F, 7.5F));
list.add(new LoaderPart(30, 13F, 180F, 7F));
list.add(new LoaderPart(31, 13F, 180F, 7F));
list.add(new LoaderPart(32, 14F, 190F, 7.25F));
list.add(new LoaderPart(33, 13F, 180F, 7F));
list.add(new LoaderPart(34, 14F, 190F, 7.25F));
list.add(new LoaderPart(35, 11.5F, 155F, 5.75F));
list.add(new LoaderPart(36, 11.5F, 155F, 5.75F));
list.add(new LoaderPart(37, 7.5F, 100F, 3.75F));
list.add(new LoaderPart(38, 7.5F, 100F, 3.75F));
list.add(new LoaderPart(39, 7.5F, 100F, 3.75F));
return new Loader(list.toArray(new LoaderPart[list.size()]));
}
private static class LoaderPart
{
public int biomeID;
public float normalPhosphorus;
public float normalPotassium;
public float normalNitrogen;
public LoaderPart(int biomeID, float normalPhosphorus, float normalPotassium, float normalNitrogen)
{
this.biomeID = biomeID;
this.normalPhosphorus = normalPhosphorus;
this.normalPotassium = normalPotassium;
this.normalNitrogen = normalNitrogen;
}
}
}
}