package me.vudu.Conflict.Handlers;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import me.vudu.Conflict.ConflictPlugin;
import me.vudu.Conflict.Blocks.ArtifactBlock;
import me.vudu.Conflict.util.BlockLocation;
import me.vudu.Conflict.util.PluginSerializer;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
/**
* verwaltet die Config Files
* ist f�r speichern und laden zust�ndig
* @author vwendel
*
*/
public class ConfigHandler {
private ConflictPlugin plugin;
private FileConfiguration customConfig;
private File customConfigFile;
private FileConfiguration fileConfig;
Class<ConflictPlugin> conflict;
public ConfigHandler(ConflictPlugin plugin){
this.plugin=plugin;
fileConfig = plugin.getConfig();
conflict = ConflictPlugin.class;
}
/**
* l�dt eine Variable aus der Config oder erstellt diese und schreibt sie mit einem Default-Wert in die Config
* @param name Name der Variablen
* @param defaultValue Default-Wert
* @param fg ConfigFile in das gespeichert wird
*/
private void loadConfigElement(String name, Object defaultValue, FileConfiguration fg){
if(null == fg.get(name)){
fg.set(name, defaultValue);
}else{
try {
if(defaultValue instanceof Boolean){
conflict.getField(name).setBoolean(null, fg.getBoolean(name));
}
if(defaultValue instanceof Integer){
conflict.getField(name).setInt(null, fg.getInt(name));
}
if(defaultValue instanceof Double){
conflict.getField(name).setDouble(null, fg.getDouble(name));
}
if(defaultValue instanceof Long){
conflict.getField(name).setLong(null, fg.getLong(name));
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
/**
* l�dt einen Wert aus der DefaultConfig
* @param name Name der Variable
* @param defaultValue Wert, der gespeichert wird, falls die Variable nicht existiert
*/
private void loadDefaultConfigElement(String name, Object defaultValue){
loadConfigElement(name, defaultValue, this.fileConfig);
}
/**
* l�dt einen Wert aus der CustomConfig im Welt-Ordner
* @param name Name der Variable
* @param defaultValue Wert, der gespeichert wird, falls die Variable nicht existiert
*/
private void loadCustomConfigElement(String name, Object defaultValue){
loadConfigElement(name, defaultValue, getCustomConfig());
}
/**
* l�dt alle Config-Daten
*/
public void loadConfig(){
loadDefaultConfigElement("isCoop", false);
loadDefaultConfigElement("hungerPerTime", 1);
loadDefaultConfigElement("hungerIncreaseMultiplicator", 1);
loadDefaultConfigElement("hungerDecreaseMultiplicator", 1);
loadDefaultConfigElement("hungerDelayTicks", 6000);
loadDefaultConfigElement("hungerIntervallTicks", 1200);
loadDefaultConfigElement("blockUpdateTicks", 40);
loadDefaultConfigElement("blockGrowTime", 60);
loadDefaultConfigElement("artBlockHardness", 20.0f);
loadDefaultConfigElement("vuduBrickHardness", 50.0f);
loadDefaultConfigElement("deffBlockHardness", 1.0f);
loadDefaultConfigElement("minBBHeight", 50);
loadDefaultConfigElement("maxBBHeight", 70);
loadDefaultConfigElement("explosionRange", 5);
loadDefaultConfigElement("isInBaseBuild", 50);
loadDefaultConfigElement("isInBaseDamage", 100);
loadDefaultConfigElement("isInBaseHighDamage", 25);
loadDefaultConfigElement("damageTreshold", 1000);
loadDefaultConfigElement("campingBaseDamage", 1);
loadDefaultConfigElement("campingDamageIntervall", 50);
loadDefaultConfigElement("defenseHealIntervall", 100);
loadDefaultConfigElement("skillRegenerationIntervall", 30);
loadDefaultConfigElement("skillRun1", 1.2);
loadDefaultConfigElement("skillRun2", 1.4);
loadDefaultConfigElement("skillSwim1", 1.2);
loadDefaultConfigElement("skillSwim2", 1.4);
loadDefaultConfigElement("skillJump", 1.5);
loadDefaultConfigElement("artSpeedupMax", 6);
loadDefaultConfigElement("virusDistance", 25);
loadDefaultConfigElement("spawnX", 0);
loadDefaultConfigElement("spawnZ", 0);
//************************* CustomConfig***********************
loadCustomConfigElement("allowDestroyBaseBlock", false);
loadCustomConfigElement("serverCloseTimestamp", ConflictPlugin.serverCloseTimestamp);
loadCustomConfigElement("allowBBB", true);
loadCustomConfigElement("allowBBR", false);
loadCustomConfigElement("artRed", 0);
loadCustomConfigElement("artBlue", 0);
loadCustomConfigElement("damageTowerRed", 0);
loadCustomConfigElement("damageTowerBlue", 0);
loadCustomConfigElement("defenseTowerRed", 0);
loadCustomConfigElement("defenseTowerBlue", 0);
loadCustomConfigElement("radarTowerRed", 0);
loadCustomConfigElement("radarTowerBlue", 0);
//Basen
if (null != getCustomConfig().get("redBase") && getCustomConfig().getString("redBase").length()>0){
ConflictPlugin.redBase = new BlockLocation(getCustomConfig().getString("redBase"));
}
if (null != getCustomConfig().get("blueBase") && getCustomConfig().getString("blueBase").length()>0){
ConflictPlugin.blueBase = new BlockLocation(getCustomConfig().getString("blueBase"));
}
//speichern
plugin.saveConfig();
saveCustomConfig();
}
/**
* liefert das CustomConfigFile oder l�dt dieses neu
* @return das File
*/
private FileConfiguration getCustomConfig() {
if (customConfig == null) {
reloadCustomConfig();
}
return customConfig;
}
/**
* erzeugt ein CustomConfigFile
*/
private void reloadCustomConfig() {
if (customConfigFile == null) {
customConfigFile = new File(plugin.getServer().getWorlds().get(0).getWorldFolder(), "customConfig.yml");
}
customConfig = YamlConfiguration.loadConfiguration(customConfigFile);
// Schaut nach den Standardwerten in der jar
InputStream defConfigStream = plugin.getResource("customConfig.yml");
if (defConfigStream != null) {
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
customConfig.setDefaults(defConfig);
}
}
/**
* speichert das ConfigFile mit den sensiblen Daten
*/
private void saveCustomConfig() {
if (customConfig == null || customConfigFile == null) {
return;
}
try {
customConfig.save(customConfigFile);
} catch (IOException ex) {
Bukkit.getLogger().log(Level.SEVERE, "Konfiguration konnte nicht nach " + customConfigFile + " geschrieben werden.", ex);
}
}
/**
* schreibt persistente Daten
*/
public void save(){
//***** Bin�rdaten *****
PluginSerializer.save(ConflictPlugin.baseBlocksRed, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/baseblockRed.bin");
PluginSerializer.save(ConflictPlugin.baseBlocksBlue, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/baseblockBlue.bin");
PluginSerializer.save(ConflictPlugin.doorsRed, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/doorsRed.bin");
PluginSerializer.save(ConflictPlugin.doorsBlue, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/doorsBlue.bin");
PluginSerializer.save(ConflictPlugin.is5Locations, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/is5Locations.bin");
//Timestamps speichern
for(ArtifactBlock b : ConflictPlugin.allArtifacts){
PluginSerializer.save(b.timestamps, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/timestamps"+b.getName() +".bin");
}
PluginSerializer.save(ConflictPlugin.totalXP, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalXP.bin");
PluginSerializer.save(ConflictPlugin.totalSkills, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalSkills.bin");
PluginSerializer.save(ConflictPlugin.totalAnimal, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalAnimal.bin");
PluginSerializer.save(ConflictPlugin.totalCoal, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalCoal.bin");
PluginSerializer.save(ConflictPlugin.totalCrafted, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalCrafted.bin");
PluginSerializer.save(ConflictPlugin.totalDiamond, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalDiamond.bin");
PluginSerializer.save(ConflictPlugin.totalGiantMushroom, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalGiantMushroom.bin");
PluginSerializer.save(ConflictPlugin.totalGold, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalGold.bin");
PluginSerializer.save(ConflictPlugin.totalIron, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalIron.bin");
PluginSerializer.save(ConflictPlugin.totalLapis, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalLapis.bin");
PluginSerializer.save(ConflictPlugin.totalMobs, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalMobs.bin");
PluginSerializer.save(ConflictPlugin.totalMushroom, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalMushroom.bin");
PluginSerializer.save(ConflictPlugin.totalRedstone, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalRedstone.bin");
PluginSerializer.save(ConflictPlugin.totalWheat, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalWheat.bin");
PluginSerializer.save(ConflictPlugin.totalFish, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalFish.bin");
PluginSerializer.save(ConflictPlugin.totalArt1, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalArt1.bin");
PluginSerializer.save(ConflictPlugin.totalArt2, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/totalArt2.bin");
//damageTreshold
PluginSerializer.save(ConflictPlugin.damageTresholdForPlayer, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/damageTresholdForPlayer.bin");
//Skills speichern
PluginSerializer.save(ConflictPlugin.skillCraftQual, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillCraftQual.bin");
PluginSerializer.save(ConflictPlugin.skillCraftArmor, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillCraftArmor.bin");
PluginSerializer.save(ConflictPlugin.skillCraftBow, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillCraftBow.bin");
PluginSerializer.save(ConflictPlugin.skillCraftSword, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillCraftSword.bin");
PluginSerializer.save(ConflictPlugin.skillCraftTool, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillCraftTool.bin");
PluginSerializer.save(ConflictPlugin.skillMineClay, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineClay.bin");
PluginSerializer.save(ConflictPlugin.skillMineDiamond, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineDiamond.bin");
PluginSerializer.save(ConflictPlugin.skillMineDurab, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineDurab.bin");
PluginSerializer.save(ConflictPlugin.skillMineGold, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineGold.bin");
PluginSerializer.save(ConflictPlugin.skillMineIron, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineIron.bin");
PluginSerializer.save(ConflictPlugin.skillMineRedstone, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineRedstone.bin");
PluginSerializer.save(ConflictPlugin.skillMineLapis, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillMineLapis.bin");
PluginSerializer.save(ConflictPlugin.skillFightMonsters, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightMonsters.bin");
PluginSerializer.save(ConflictPlugin.skillFightCamp, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightCamp.bin");
PluginSerializer.save(ConflictPlugin.skillFightArmor, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightArmor.bin");
PluginSerializer.save(ConflictPlugin.skillFightDrop, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightDrop.bin");
PluginSerializer.save(ConflictPlugin.skillFightDamage, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightDamage.bin");
PluginSerializer.save(ConflictPlugin.skillFightJump, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightJump.bin");
PluginSerializer.save(ConflictPlugin.skillFightRegeneration, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightRegeneration.bin");
PluginSerializer.save(ConflictPlugin.skillFightSpeedLand, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightSpeedLand.bin");
PluginSerializer.save(ConflictPlugin.skillFightSpeedWater, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFightSpeedWater.bin");
PluginSerializer.save(ConflictPlugin.skillFoodBone, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodBone.bin");
PluginSerializer.save(ConflictPlugin.skillFoodChicken, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodChicken.bin");
PluginSerializer.save(ConflictPlugin.skillFoodCow, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodCow.bin");
PluginSerializer.save(ConflictPlugin.skillFoodFish, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodFish.bin");
PluginSerializer.save(ConflictPlugin.skillFoodHarvest, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodHarvest.bin");
PluginSerializer.save(ConflictPlugin.skillFoodPork, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodPork.bin");
PluginSerializer.save(ConflictPlugin.skillFoodSeed, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/skillFoodSeed.bin");
PluginSerializer.save(ConflictPlugin.armorPlate, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/armorPlate.bin");
PluginSerializer.save(ConflictPlugin.armorLeggins, plugin.getServer().getWorlds().get(0).getWorldFolder()+"/armorLeggins.bin");
//***** CustomConfig *****
//Timestamp des shutdown speichern
getCustomConfig().set("serverCloseTimestamp", System.currentTimeMillis());
//Basen speichern
if(null!=ConflictPlugin.redBase){
getCustomConfig().set("redBase", ConflictPlugin.redBase.toString());
}else{
getCustomConfig().set("redBase", "");
}
if(null!=ConflictPlugin.blueBase){
getCustomConfig().set("blueBase", ConflictPlugin.blueBase.toString());
}else{
getCustomConfig().set("blueBase", "");
}
//weitere Variablen
getCustomConfig().set("allowBBB", ConflictPlugin.allowBBB);
getCustomConfig().set("allowBBR", ConflictPlugin.allowBBR);
getCustomConfig().set("artBlue", ConflictPlugin.artBlue);
getCustomConfig().set("artRed", ConflictPlugin.artRed);
getCustomConfig().set("damageTowerBlue", ConflictPlugin.damageTowerBlue);
getCustomConfig().set("damageTowerRed", ConflictPlugin.damageTowerRed);
getCustomConfig().set("defenseTowerBlue", ConflictPlugin.defenseTowerBlue);
getCustomConfig().set("defenseTowerRed", ConflictPlugin.defenseTowerRed);
getCustomConfig().set("radarTowerBlue", ConflictPlugin.radarTowerBlue);
getCustomConfig().set("radarTowerRed", ConflictPlugin.radarTowerRed);
//speichern
saveCustomConfig();
}
}