package com.gmail.nossr50.config;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.config.hocon.*;
import com.gmail.nossr50.config.hocon.admin.ConfigAdmin;
import com.gmail.nossr50.config.hocon.antiexploit.ConfigExploitPrevention;
import com.gmail.nossr50.config.hocon.backup.ConfigAutomatedBackups;
import com.gmail.nossr50.config.hocon.commands.ConfigCommands;
import com.gmail.nossr50.config.hocon.database.ConfigDatabase;
import com.gmail.nossr50.config.hocon.donation.ConfigAuthorAdvertisements;
import com.gmail.nossr50.config.hocon.experience.ConfigExperience;
import com.gmail.nossr50.config.hocon.hardcore.ConfigHardcore;
import com.gmail.nossr50.config.hocon.items.ConfigItems;
import com.gmail.nossr50.config.hocon.language.ConfigLanguage;
import com.gmail.nossr50.config.hocon.metrics.ConfigMetrics;
import com.gmail.nossr50.config.hocon.mobs.ConfigMobs;
import com.gmail.nossr50.config.hocon.motd.ConfigMOTD;
import com.gmail.nossr50.config.hocon.notifications.ConfigNotifications;
import com.gmail.nossr50.config.hocon.particles.ConfigParticles;
import com.gmail.nossr50.config.hocon.party.ConfigParty;
import com.gmail.nossr50.config.hocon.party.data.ConfigPartyData;
import com.gmail.nossr50.config.hocon.playerleveling.ConfigLeveling;
import com.gmail.nossr50.config.hocon.scoreboard.ConfigScoreboard;
import com.gmail.nossr50.config.hocon.skills.acrobatics.ConfigAcrobatics;
import com.gmail.nossr50.config.hocon.skills.alchemy.ConfigAlchemy;
import com.gmail.nossr50.config.hocon.skills.archery.ConfigArchery;
import com.gmail.nossr50.config.hocon.skills.axes.ConfigAxes;
import com.gmail.nossr50.config.hocon.skills.exampleconfigs.ConfigNameRegisterDefaults;
import com.gmail.nossr50.config.hocon.skills.exampleconfigs.MinecraftMaterialWrapper;
import com.gmail.nossr50.config.hocon.skills.excavation.ConfigExcavation;
import com.gmail.nossr50.config.hocon.skills.fishing.ConfigFishing;
import com.gmail.nossr50.config.hocon.skills.herbalism.ConfigHerbalism;
import com.gmail.nossr50.config.hocon.skills.mining.ConfigMining;
import com.gmail.nossr50.config.hocon.skills.repair.ConfigRepair;
import com.gmail.nossr50.config.hocon.skills.salvage.ConfigSalvage;
import com.gmail.nossr50.config.hocon.skills.smelting.ConfigSmelting;
import com.gmail.nossr50.config.hocon.skills.swords.ConfigSwords;
import com.gmail.nossr50.config.hocon.skills.taming.ConfigTaming;
import com.gmail.nossr50.config.hocon.skills.unarmed.ConfigUnarmed;
import com.gmail.nossr50.config.hocon.skills.woodcutting.ConfigWoodcutting;
import com.gmail.nossr50.config.hocon.superabilities.ConfigSuperAbilities;
import com.gmail.nossr50.config.hocon.worldblacklist.ConfigWorldBlacklist;
import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
import com.gmail.nossr50.config.treasure.ExcavationTreasureConfig;
import com.gmail.nossr50.config.treasure.FishingTreasureConfig;
import com.gmail.nossr50.config.treasure.HerbalismTreasureConfig;
import com.gmail.nossr50.datatypes.experience.CustomXPPerk;
import com.gmail.nossr50.datatypes.experience.FormulaType;
import com.gmail.nossr50.datatypes.party.PartyFeature;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.repair.repairables.Repairable;
import com.gmail.nossr50.skills.repair.repairables.RepairableManager;
import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager;
import com.gmail.nossr50.util.experience.ExperienceMapManager;
import com.google.common.collect.Maps;
import com.google.common.reflect.TypeToken;
import ninja.leaping.configurate.objectmapping.serialize.TypeSerializerCollection;
import ninja.leaping.configurate.objectmapping.serialize.TypeSerializers;
import org.bukkit.Material;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
/**
* The Config Manager handles initializing, loading, and unloading registers for all configs that mcMMO uses
* This makes sure that mcMMO properly loads and unloads its values on reload
*
* Config Manager also holds all of our MultiConfigContainers
*/
public final class ConfigManager {
/* UNLOAD REGISTER */
private SkillPropertiesManager skillPropertiesManager;
private ArrayList unloadables;
/* COLLECTION MANAGERS */
private ArrayList userFiles;
private RepairableManager repairableManager;
private SalvageableManager salvageableManager;
/* CUSTOM SERIALIZERS */
private BonusDropManager bonusDropManager;
/* MOD MANAGERS */
//TODO: Add these back when modded servers become a thing again
/* MISC MANAGERS */
private TypeSerializerCollection customSerializers;
private ExperienceMapManager experienceMapManager;
/* CONFIG INSTANCES */
private SerializedConfigLoader configDatabase;
private SerializedConfigLoader configScoreboard;
private SerializedConfigLoader configLeveling;
private SerializedConfigLoader configWorldBlacklist;
private SerializedConfigLoader configExploitPrevention;
private SerializedConfigLoader configHardcore;
private SerializedConfigLoader configMetrics;
private SerializedConfigLoader configMOTD;
private SerializedConfigLoader configAuthorAdvertisements;
private SerializedConfigLoader configAutomatedBackups;
private SerializedConfigLoader configCommands;
private SerializedConfigLoader configItems;
private SerializedConfigLoader configLanguage;
private SerializedConfigLoader configParticles;
private SerializedConfigLoader configParty;
private SerializedConfigLoader configNotifications;
private SerializedConfigLoader configSuperAbilities;
private SerializedConfigLoader configAdmin;
private SerializedConfigLoader configMobs;
private SerializedConfigLoader configExperience;
private SerializedConfigLoader configAcrobatics;
private SerializedConfigLoader configAlchemy;
private SerializedConfigLoader configArchery;
private SerializedConfigLoader configAxes;
private SerializedConfigLoader configExcavation;
private SerializedConfigLoader configFishing;
private SerializedConfigLoader configHerbalism;
private SerializedConfigLoader configMining;
private SerializedConfigLoader configRepair;
private SerializedConfigLoader configSwords;
private SerializedConfigLoader configTaming;
private SerializedConfigLoader configUnarmed;
private SerializedConfigLoader configWoodcutting;
private SerializedConfigLoader configSmelting;
private SerializedConfigLoader configSalvage;
private SerializedConfigLoader configDefaultExamples;
private HashMap skillConfigLoaders;
//Data
private SerializedConfigLoader partyData;
//YAML CONFIGS
private PotionConfig potionConfig;
private MainConfig mainConfig;
private FishingTreasureConfig fishingTreasureConfig;
private ExcavationTreasureConfig excavationTreasureConfig;
private HerbalismTreasureConfig herbalismTreasureConfig;
private ExperienceConfig experienceConfig;
private AdvancedConfig advancedConfig;
private CoreSkillsConfig coreSkillsConfig;
private SoundConfig soundConfig;
private RankConfig rankConfig;
private HashMap partyItemWeights;
private HashMap partyFeatureUnlocks;
/* CONFIG ERRORS */
private ArrayList configErrors; //Collect errors to whine about to server admins
public ConfigManager() {
unloadables = new ArrayList<>();
userFiles = new ArrayList<>();
}
public void loadConfigs() {
//Register Custom Serializers
registerCustomTypeSerializers();
//Serialized Configs
initSerializedConfigs();
//Serialized Data
initSerializedDataFiles();
//Skill Property Registers
skillPropertiesManager = new SkillPropertiesManager();
skillPropertiesManager.fillRegisters();
//Assign Maps
partyItemWeights = Maps.newHashMap(configParty.getConfig().getPartyItemShare().getItemShareMap()); //Item Share Weights
partyFeatureUnlocks = Maps.newHashMap(configParty.getConfig().getPartyXP().getPartyLevel().getPartyFeatureUnlockMap()); //Party Progression
//Register Bonus Drops
registerBonusDrops();
//YAML Configs
initYAMLConfigs();
/*
* Managers
*/
// Register Managers
initMiscManagers();
initCollectionManagers();
}
private void initYAMLConfigs() {
potionConfig = new PotionConfig();
}
private void initSerializedDataFiles() {
partyData = new SerializedConfigLoader<>(ConfigPartyData.class, "partydata.conf", "PartyData", null);
}
private void initSerializedConfigs() {
//There's some race conditions here because mcMMO is goddamn spaghetti mess, language has to load first
configLanguage = new SerializedConfigLoader<>(ConfigLanguage.class, "language.conf", "Language", null);
/*
* No more race conditions
*/
configDatabase = new SerializedConfigLoader<>(ConfigDatabase.class, "database_settings.conf", "Database", null);
configScoreboard = new SerializedConfigLoader<>(ConfigScoreboard.class, "scoreboard.conf", "Scoreboard", null);
configLeveling = new SerializedConfigLoader<>(ConfigLeveling.class, "player_leveling.conf", "Player-Leveling", null);
configWorldBlacklist = new SerializedConfigLoader<>(ConfigWorldBlacklist.class, "world_blacklist.conf", "World-Blacklist", null);
configExploitPrevention = new SerializedConfigLoader<>(ConfigExploitPrevention.class, "anti_exploit.conf", "Anti-Exploit", null);
configMOTD = new SerializedConfigLoader<>(ConfigMOTD.class, "message_of_the_day.conf", "MOTD", null);
configHardcore = new SerializedConfigLoader<>(ConfigHardcore.class, "hardcore_mode.conf", "Hardcore-Mode", null);
configMetrics = new SerializedConfigLoader<>(ConfigMetrics.class, "analytics_reporting.conf", "Analytic-Reporting", null);
configAuthorAdvertisements = new SerializedConfigLoader<>(ConfigAuthorAdvertisements.class, "author_support_advertisements.conf", "mcMMO", null);
configAutomatedBackups = new SerializedConfigLoader<>(ConfigAutomatedBackups.class, "automated_backups.conf", "Automated-Backups", null);
configCommands = new SerializedConfigLoader<>(ConfigCommands.class, "commands.conf", "Commands", null);
configItems = new SerializedConfigLoader<>(ConfigItems.class, "custom_items.conf", "Items", null);
configParticles = new SerializedConfigLoader<>(ConfigParticles.class, "particle_spawning.conf", "Particles", null);
configParty = new SerializedConfigLoader<>(ConfigParty.class, "party.conf", "Party", null);
configNotifications = new SerializedConfigLoader<>(ConfigNotifications.class, "alerts_and_notifications.conf", "Notifications", null);
configSuperAbilities = new SerializedConfigLoader<>(ConfigSuperAbilities.class, "skill_super_abilities.conf", "Super-Abilities", null);
configAdmin = new SerializedConfigLoader<>(ConfigAdmin.class, "admin.conf", "Admin", null);
configMobs = new SerializedConfigLoader<>(ConfigMobs.class, "creatures.conf", "Creatures", null);
configExperience = new SerializedConfigLoader<>(ConfigExperience.class, "experience.conf", "Experience", null);
configDefaultExamples = new SerializedConfigLoader<>(ConfigNameRegisterDefaults.class, "minecraft_item_block_name_examples.conf", "Minecraft", null);
initSerializedSkillConfigs();
}
@SuppressWarnings(value = "unchecked")
private void initSerializedSkillConfigs() {
//Init HashMap
skillConfigLoaders = new HashMap<>();
//Init and register serialized skill configs
registerSkillConfig(PrimarySkillType.ACROBATICS, ConfigAcrobatics.class);
registerSkillConfig(PrimarySkillType.ALCHEMY, ConfigAlchemy.class);
registerSkillConfig(PrimarySkillType.SALVAGE, ConfigSalvage.class);
registerSkillConfig(PrimarySkillType.ARCHERY, ConfigArchery.class);
registerSkillConfig(PrimarySkillType.AXES, ConfigAxes.class);
registerSkillConfig(PrimarySkillType.EXCAVATION, ConfigExcavation.class);
registerSkillConfig(PrimarySkillType.FISHING, ConfigFishing.class);
registerSkillConfig(PrimarySkillType.HERBALISM, ConfigHerbalism.class);
registerSkillConfig(PrimarySkillType.MINING, ConfigMining.class);
registerSkillConfig(PrimarySkillType.REPAIR, ConfigRepair.class);
registerSkillConfig(PrimarySkillType.SWORDS, ConfigSwords.class);
registerSkillConfig(PrimarySkillType.TAMING, ConfigTaming.class);
registerSkillConfig(PrimarySkillType.UNARMED, ConfigUnarmed.class);
registerSkillConfig(PrimarySkillType.WOODCUTTING, ConfigWoodcutting.class);
registerSkillConfig(PrimarySkillType.SMELTING, ConfigSmelting.class);
//Setup Typed refs
configAcrobatics = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.ACROBATICS).getConfig();
configAlchemy = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.ALCHEMY).getConfig();
configSalvage = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.SALVAGE).getConfig();
configArchery = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.ARCHERY).getConfig();
configAxes = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.AXES).getConfig();
configExcavation = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.EXCAVATION).getConfig();
configFishing = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.FISHING).getConfig();
configHerbalism = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.HERBALISM).getConfig();
configMining = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.MINING).getConfig();
configRepair = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.REPAIR).getConfig();
configSwords = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.SWORDS).getConfig();
configTaming = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.TAMING).getConfig();
configUnarmed = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.UNARMED).getConfig();
configWoodcutting = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.WOODCUTTING).getConfig();
configSmelting = (SerializedConfigLoader) skillConfigLoaders.get(PrimarySkillType.SMELTING).getConfig();
}
private void registerCustomTypeSerializers() {
/*
TypeTokens are obtained in two ways
For Raw basic classes:
TypeToken stringTok = TypeToken.of(String.class);
TypeToken intTok = TypeToken.of(Integer.class);
For Generics:
TypeToken> stringListTok = new TypeToken>() {};
Wildcard example:
TypeToken