Browse Source

new config pt 10 - All configs are now managed by ConfigManager (WIP)

nossr50 6 years ago
parent
commit
f4ba472403
30 changed files with 515 additions and 324 deletions
  1. 2 2
      pom.xml
  2. 6 4
      src/main/java/com/gmail/nossr50/config/AdvancedConfig.java
  3. 2 2
      src/main/java/com/gmail/nossr50/config/ChildConfig.java
  4. 44 2
      src/main/java/com/gmail/nossr50/config/ConfigCollection.java
  5. 0 19
      src/main/java/com/gmail/nossr50/config/ConfigCollections.java
  6. 3 3
      src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java
  7. 15 0
      src/main/java/com/gmail/nossr50/config/GenericCollectionContainer.java
  8. 4 4
      src/main/java/com/gmail/nossr50/config/RankConfig.java
  9. 11 0
      src/main/java/com/gmail/nossr50/config/Registers.java
  10. 0 11
      src/main/java/com/gmail/nossr50/config/RegistersKeys.java
  11. 3 3
      src/main/java/com/gmail/nossr50/config/SoundConfig.java
  12. 166 0
      src/main/java/com/gmail/nossr50/config/collectionconfigs/ConfigManager.java
  13. 155 0
      src/main/java/com/gmail/nossr50/config/collectionconfigs/MultiConfigContainer.java
  14. 0 119
      src/main/java/com/gmail/nossr50/config/collectionconfigs/MultiConfigManager.java
  15. 7 20
      src/main/java/com/gmail/nossr50/config/collectionconfigs/RepairConfig.java
  16. 7 19
      src/main/java/com/gmail/nossr50/config/collectionconfigs/SalvageConfig.java
  17. 13 10
      src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java
  18. 4 4
      src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java
  19. 4 4
      src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java
  20. 14 13
      src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java
  21. 8 8
      src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java
  22. 1 1
      src/main/java/com/gmail/nossr50/datatypes/skills/subskills/AbstractSubSkill.java
  23. 13 66
      src/main/java/com/gmail/nossr50/mcMMO.java
  24. 0 1
      src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java
  25. 2 0
      src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java
  26. 2 1
      src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java
  27. 8 4
      src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java
  28. 2 1
      src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java
  29. 9 3
      src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java
  30. 10 0
      src/main/java/com/gmail/nossr50/util/StringUtils.java

+ 2 - 2
pom.xml

@@ -125,10 +125,10 @@
                             <pattern>com.flowpowered</pattern>
                             <shadedPattern>com.gmail.nossr50.flow</shadedPattern>
                         </relocation>-->
-                        <relocation>
+                        <!--<relocation>
                             <pattern>ninja.leaping</pattern>
                             <shadedPattern>com.gmail.nossr50.configurable</shadedPattern>
-                        </relocation>
+                        </relocation>-->
                     </relocations>
                 </configuration>
                 <executions>

+ 6 - 4
src/main/java/com/gmail/nossr50/config/AdvancedConfig.java

@@ -122,20 +122,22 @@ public class AdvancedConfig extends ConfigValidated {
     public static final String SEND_COPY_OF_MESSAGE_TO_CHAT = "SendCopyOfMessageToChat";
     public static final String EVENTS = "Events";
     public static final String SEND_TITLES = "SendTitles";
-    private static AdvancedConfig instance;
+    //private static AdvancedConfig instance;
 
-    private AdvancedConfig() {
+    public AdvancedConfig() {
         //super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "advanced.yml", true);
         super(mcMMO.p.getDataFolder().getAbsoluteFile(), "advanced.yml", true);
     }
 
-    public static AdvancedConfig getInstance() {
+
+
+    /*public static AdvancedConfig getInstance() {
         if (instance == null) {
             instance = new AdvancedConfig();
         }
 
         return instance;
-    }
+    }*/
 
     /**
      * The version of this config

+ 2 - 2
src/main/java/com/gmail/nossr50/config/ChildConfig.java

@@ -7,13 +7,13 @@ import org.bukkit.configuration.file.YamlConfiguration;
 
 import java.util.EnumSet;
 
-public class ChildConfig extends ConfigCollections {
+public class ChildConfig extends ConfigCollection {
     public ChildConfig() {
         super("child.yml");
     }
 
     @Override
-    protected void loadKeys() {
+    protected void register() {
         config.setDefaults(YamlConfiguration.loadConfiguration(plugin.getResourceAsReader("child.yml")));
 
         FamilyTree.clearRegistrations(); // when reloading, need to clear statics

+ 44 - 2
src/main/java/com/gmail/nossr50/config/ConfigCollection.java

@@ -1,7 +1,49 @@
 package com.gmail.nossr50.config;
 
+import java.io.File;
+import java.util.ArrayList;
 import java.util.Collection;
 
-public interface ConfigCollection<T> {
-    Collection<T> getLoadedCollection();
+/**
+ * Represents a config file that registers keys after its initialized
+ */
+public abstract class ConfigCollection<T> extends Config implements Registers, GenericCollectionContainer {
+
+    //The collection held by this class
+    protected Collection<T> genericCollection;
+
+    public ConfigCollection(String pathToParentFolder, String relativePath, boolean mergeNewKeys) {
+        super(pathToParentFolder, relativePath, mergeNewKeys);
+
+        //init
+        initCollection();
+
+        //load
+        register();
+    }
+
+    private void initCollection() {
+        if (genericCollection == null)
+            genericCollection = new ArrayList<>();
+    }
+
+    public ConfigCollection(File pathToParentFolder, String relativePath, boolean mergeNewKeys) {
+        super(pathToParentFolder, relativePath, mergeNewKeys);
+
+        //init
+        initCollection();
+
+        //load
+        register();
+    }
+
+    @Override
+    public Collection<T> getLoadedCollection() {
+        return this.genericCollection;
+    }
+
+    @Override
+    public void unload() {
+        genericCollection.clear();
+    }
 }

+ 0 - 19
src/main/java/com/gmail/nossr50/config/ConfigCollections.java

@@ -1,19 +0,0 @@
-package com.gmail.nossr50.config;
-
-import java.io.File;
-
-/**
- * Represents a config file that registers keys after its initialized
- */
-public abstract class ConfigCollections extends Config implements RegistersKeys, ConfigCollection {
-
-    public ConfigCollections(String pathToParentFolder, String relativePath, boolean mergeNewKeys) {
-        super(pathToParentFolder, relativePath, mergeNewKeys);
-        loadKeys();
-    }
-
-    public ConfigCollections(File pathToParentFolder, String relativePath, boolean mergeNewKeys) {
-        super(pathToParentFolder, relativePath, mergeNewKeys);
-        loadKeys();
-    }
-}

+ 3 - 3
src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java

@@ -6,19 +6,19 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.StringUtils;
 
 public class CoreSkillsConfig extends Config {
-    private static CoreSkillsConfig instance;
+    //private static CoreSkillsConfig instance;
 
     public CoreSkillsConfig() {
         //super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"coreskills.yml", true);
         super(mcMMO.p.getDataFolder().getAbsoluteFile(),"coreskills.yml", true);
     }
 
-    public static CoreSkillsConfig getInstance() {
+    /*public static CoreSkillsConfig getInstance() {
         if (instance == null)
             return new CoreSkillsConfig();
 
         return instance;
-    }
+    }*/
 
     /**
      * The version of this config

+ 15 - 0
src/main/java/com/gmail/nossr50/config/GenericCollectionContainer.java

@@ -0,0 +1,15 @@
+package com.gmail.nossr50.config;
+
+import java.util.Collection;
+
+/**
+ * Represents a class that contains a generic collection
+ * @param <T>
+ */
+public interface GenericCollectionContainer<T> {
+    /**
+     * Grab the collection held by this class
+     * @return the collection held by this class
+     */
+    Collection<T> getLoadedCollection();
+}

+ 4 - 4
src/main/java/com/gmail/nossr50/config/RankConfig.java

@@ -8,20 +8,20 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class RankConfig extends ConfigValidated {
-    private static RankConfig instance;
+    //private static RankConfig instance;
 
     public RankConfig() {
         //super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"skillranks.yml", true);
         super(mcMMO.p.getDataFolder().getAbsoluteFile(),"skillranks.yml", true);
-        this.instance = this;
+        //this.instance = this;
     }
 
-    public static RankConfig getInstance() {
+    /*public static RankConfig getInstance() {
         if (instance == null)
             return new RankConfig();
 
         return instance;
-    }
+    }*/
 
     @Override
     public void unload() {

+ 11 - 0
src/main/java/com/gmail/nossr50/config/Registers.java

@@ -0,0 +1,11 @@
+package com.gmail.nossr50.config;
+
+/**
+ * A class that is expected to register one thing into another thing
+ */
+public interface Registers {
+    /**
+     * Register stuff
+     */
+    void register();
+}

+ 0 - 11
src/main/java/com/gmail/nossr50/config/RegistersKeys.java

@@ -1,11 +0,0 @@
-package com.gmail.nossr50.config;
-
-/**
- * A class that registers keys
- */
-public interface RegistersKeys {
-    /**
-     * Loads up keys
-     */
-    void loadKeys();
-}

+ 3 - 3
src/main/java/com/gmail/nossr50/config/SoundConfig.java

@@ -7,7 +7,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class SoundConfig extends ConfigValidated {
-    private static SoundConfig instance;
+    //private static SoundConfig instance;
 
     public SoundConfig() {
         //super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "sounds.yml", true);
@@ -15,12 +15,12 @@ public class SoundConfig extends ConfigValidated {
         this.instance = this;
     }
 
-    public static SoundConfig getInstance() {
+    /*public static SoundConfig getInstance() {
         if (instance == null)
             return new SoundConfig();
 
         return instance;
-    }
+    }*/
 
     @Override
     public void unload() {

+ 166 - 0
src/main/java/com/gmail/nossr50/config/collectionconfigs/ConfigManager.java

@@ -0,0 +1,166 @@
+package com.gmail.nossr50.config.collectionconfigs;
+
+import com.gmail.nossr50.config.*;
+import com.gmail.nossr50.config.mods.ArmorConfigManager;
+import com.gmail.nossr50.config.mods.BlockConfigManager;
+import com.gmail.nossr50.config.mods.EntityConfigManager;
+import com.gmail.nossr50.config.mods.ToolConfigManager;
+import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
+import com.gmail.nossr50.config.treasure.TreasureConfig;
+import com.gmail.nossr50.skills.child.ChildConfig;
+import com.gmail.nossr50.skills.repair.repairables.Repairable;
+import com.gmail.nossr50.skills.repair.repairables.SimpleRepairableManager;
+import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
+import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager;
+
+import java.util.ArrayList;
+
+/**
+ *
+ * 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
+ *
+ * MultiConfigContainers
+ *      Represents a collection of config files that serve a similar purpose
+ *      As an example, with Repair you can have an unlimited number of files named repair.*.yml and each one will be treated the same and have its collections registered
+ *      The master file is always named x.vanilla.yml, for example "repair.vanilla.yml"
+ *          To be honest I'm not sure how many people make use of this system, but I'm keeping it since its been in mcMMO for like 6+ years
+ */
+public final class ConfigManager {
+
+    /* UNLOAD REGISTER */
+
+    private ArrayList<Unload> unloadables;
+
+    /* MULTI CONFIG INSTANCES */
+
+    private MultiConfigContainer<Repairable> repairableMultiConfigContainer;
+    private MultiConfigContainer<Salvageable> salvageableMultiConfigContainer;
+
+    /* COLLECTION MANAGERS */
+
+    private SimpleRepairableManager simpleRepairableManager;
+    private SimpleSalvageableManager simpleSalvageableManager;
+
+    /* CONFIG INSTANCES */
+
+    private TreasureConfig treasureConfig;
+    private AdvancedConfig advancedConfig;
+    private PotionConfig potionConfig;
+    private CoreSkillsConfig coreSkillsConfig;
+    private SoundConfig soundConfig;
+    private RankConfig rankConfig;
+
+    public ConfigManager()
+    {
+        unloadables = new ArrayList<>();
+
+        // Load Config Files
+        // I'm pretty these are supposed to be done in a specific order, so don't rearrange them willy nilly
+        treasureConfig = new TreasureConfig();
+        unloadables.add(treasureConfig);
+
+        advancedConfig = new AdvancedConfig();
+        unloadables.add(advancedConfig);
+
+        potionConfig = new PotionConfig();
+        unloadables.add(potionConfig);
+
+        coreSkillsConfig = new CoreSkillsConfig();
+        unloadables.add(coreSkillsConfig);
+
+        soundConfig = new SoundConfig();
+        unloadables.add(soundConfig);
+
+        rankConfig = new RankConfig();
+        unloadables.add(rankConfig);
+
+        //TODO: This config serves no purpose so its getting removed
+        new ChildConfig();
+
+        if (MainConfig.getInstance().getToolModsEnabled()) {
+            new ToolConfigManager();
+        }
+
+        if (MainConfig.getInstance().getArmorModsEnabled()) {
+            new ArmorConfigManager();
+        }
+
+        if (MainConfig.getInstance().getBlockModsEnabled()) {
+            new BlockConfigManager();
+        }
+
+        if (MainConfig.getInstance().getEntityModsEnabled()) {
+            new EntityConfigManager();
+        }
+
+        // Multi Config Containers
+        initMultiConfigContainers();
+
+        // Register Managers
+        initCollectionManagers();
+    }
+
+    /**
+     * Initializes all of our Multi Config Containers
+     */
+    private void initMultiConfigContainers()
+    {
+        //Repair
+        repairableMultiConfigContainer = new MultiConfigContainer<>("repair", CollectionClassType.REPAIR);
+        unloadables.add(repairableMultiConfigContainer);
+
+        //Salvage
+        salvageableMultiConfigContainer = new MultiConfigContainer<>("salvage", CollectionClassType.SALVAGE);
+        unloadables.add(salvageableMultiConfigContainer);
+    }
+
+    /**
+     * Initializes any managers related to config collections
+     */
+    private void initCollectionManagers()
+    {
+        // Handles registration of repairables
+        simpleRepairableManager = new SimpleRepairableManager(getRepairables());
+        unloadables.add(simpleRepairableManager);
+
+        // Handles registration of salvageables
+        simpleSalvageableManager = new SimpleSalvageableManager(getSalvageables());
+        unloadables.add(simpleSalvageableManager);
+    }
+
+    /**
+     * Get all loaded repairables (loaded from all repairable configs)
+     * @return the currently loaded repairables
+     */
+    public ArrayList<Repairable> getRepairables()
+    {
+        return (ArrayList<Repairable>) repairableMultiConfigContainer.getCollection();
+    }
+
+    /**
+     * Get all loaded salvageables (loaded from all salvageable configs)
+     * @return the currently loaded salvageables
+     */
+    public ArrayList<Salvageable> getSalvageables()
+    {
+        return (ArrayList<Salvageable>) salvageableMultiConfigContainer.getCollection();
+    }
+
+    /**
+     * Unloads all config options (prepares for reload)
+     */
+    public void unloadAllConfigsAndRegisters()
+    {
+        //Unload
+        for(Unload unloadable : unloadables)
+        {
+            unloadable.unload();
+        }
+
+        //Clear
+        unloadables.clear();
+    }
+}

+ 155 - 0
src/main/java/com/gmail/nossr50/config/collectionconfigs/MultiConfigContainer.java

@@ -0,0 +1,155 @@
+package com.gmail.nossr50.config.collectionconfigs;
+
+import com.gmail.nossr50.config.ConfigCollection;
+import com.gmail.nossr50.config.Unload;
+import com.gmail.nossr50.mcMMO;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.regex.Pattern;
+
+/**
+ * Represents a type of config collection, these config collections are spread across multiple config files potentially
+ * @param <T>
+ */
+public class MultiConfigContainer<T> implements Unload {
+
+    /* CONSTANTS */
+    public static final String DEFAULT_MULTICONFIG_FILENAME_SUFFIX = ".vanilla.yml";
+
+    /* VARS */
+    private final String configPrefix;
+    private Collection<T> collection;
+    public final CollectionClassType collectionClassType;
+    private ConfigCollection vanillaConfig;
+
+    @Override
+    public void unload() {
+        collection.clear();
+        vanillaConfig.unload();
+    }
+
+    public MultiConfigContainer(String configPrefix, CollectionClassType collectionClassType)
+    {
+        //Define Config Class
+        this.collectionClassType = collectionClassType;
+
+        //Define Config Filename Prefix
+        this.configPrefix = configPrefix;
+
+        //Init Collection
+        collection = new ArrayList<T>();
+
+        //Load Configs
+
+        //Vanilla Config
+        initConfigAndAddCollection(getVanillaConfigName(configPrefix));
+
+        //Custom Configs
+        loadCustomCollections(configPrefix);
+    }
+
+    /**
+     * Add another collection to this collection
+     * @param otherCollection
+     */
+    private void addCollection(Collection<T> otherCollection)
+    {
+        collection.addAll(otherCollection);
+    }
+
+    /**
+     * Grabs the Class to instance for this config collection
+     * @param collectionClassType the type of class
+     * @return the class to instance for this config collection
+     */
+    private Class getConfigClass(CollectionClassType collectionClassType)
+    {
+        switch(collectionClassType) {
+            case REPAIR:
+                return RepairConfig.class;
+            case SALVAGE:
+                return SalvageConfig.class;
+            default:
+                mcMMO.p.getLogger().severe("[DEBUG] Config Class type is undefined!");
+                return null;
+        }
+    }
+
+    /**
+     * Gets the name of the vanilla config which is always present
+     * @param configPrefix the prefix to the filename, for example "repair" or "salvage"
+     * @return the name of the vanilla config file for this collection
+     */
+    private String getVanillaConfigName(String configPrefix)
+    {
+        return configPrefix+DEFAULT_MULTICONFIG_FILENAME_SUFFIX;
+    }
+
+    /**
+     * Initializes a config and attempts to load add its collection
+     * @param configFileName the filename of the config to load
+     */
+    private void initConfigAndAddCollection(String configFileName)
+    {
+        mcMMO.p.getLogger().info("Reading from collection config - "+configFileName);
+        ConfigCollection configCollection = null;
+
+        try {
+            configCollection = (ConfigCollection) getConfigClass(collectionClassType).getConstructor(String.class).newInstance(configFileName);
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        }
+
+        //Add the collection loaded from this config
+        addCollection(configCollection.getLoadedCollection());
+    }
+
+    /**
+     * mcMMO allows collection config files to be named things like repair.whatevernameyouwanthere.yml and so on,
+     *  these files are treated in the same way as the vanilla file. They serve the purpose of organization
+     * @param configPrefix the prefix of the file name, for example "repair", "salvage", etc
+     */
+    public void loadCustomCollections(String configPrefix)
+    {
+        String vanillaConfigFileName = getVanillaConfigName(configPrefix);
+
+        //Find other files
+        Pattern pattern = Pattern.compile(configPrefix+"\\.(?:.+)\\.yml");
+        //File dataFolder = McmmoCore.getDataFolderPath();
+        File dataFolder = mcMMO.p.getDataFolder();
+
+        for (String fileName : dataFolder.list()) {
+            //Vanilla Config is already loaded
+            if(fileName.equalsIgnoreCase(vanillaConfigFileName))
+                continue;
+
+            //Find files that match the pattern
+            if (!pattern.matcher(fileName).matches()) {
+                continue;
+            }
+
+            //Init file
+            File currentFile = new File(dataFolder, fileName);
+
+            //Make sure its not a directory (needed?)
+            if(currentFile.isDirectory())
+                continue;
+
+            //Load and add the collections
+            initConfigAndAddCollection(fileName);
+        }
+    }
+
+    public Collection<T> getCollection() {
+        return collection;
+    }
+}

+ 0 - 119
src/main/java/com/gmail/nossr50/config/collectionconfigs/MultiConfigManager.java

@@ -1,119 +0,0 @@
-package com.gmail.nossr50.config.collectionconfigs;
-
-import com.gmail.nossr50.config.ConfigCollection;
-import com.gmail.nossr50.config.ConfigCollections;
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.skills.repair.repairables.Repairable;
-import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Represents a collection of config files that serve a similar purpose
- * For example, files named repair.*.yml are all loaded into memory, this lets admins keep their config files clean
- *
- * To be honest I'm not sure how many people make use of this system, but I'm keeping it since its been in mcMMO for like 6+ years
- */
-public final class MultiConfigManager {
-
-    public static final String DEFAULT_MULTICONFIG_FILENAME_SUFFIX = ".vanilla.yml";
-
-    //Configs
-    public com.gmail.nossr50.config.collectionconfigs.RepairConfig vanillaRepairConfig; //This is the main config file that mcMMO will copy out
-    public com.gmail.nossr50.config.collectionconfigs.SalvageConfig vanillaSalvageConfig;
-
-    private static List<Repairable> repairables;
-    private static List<Salvageable> salvageables;
-
-    public MultiConfigManager(String fileNamePrefix)
-    {
-        //init Collections
-        repairables = new ArrayList<>();
-        salvageables = new ArrayList<>();
-
-        //init vanilla configs
-        vanillaRepairConfig = new com.gmail.nossr50.config.collectionconfigs.RepairConfig(getVanillaConfigName("repair"));
-        vanillaSalvageConfig = new com.gmail.nossr50.config.collectionconfigs.SalvageConfig(getVanillaConfigName("salvage"));
-
-        //add valid vanilla collections to main collection
-        repairables.addAll(vanillaRepairConfig.getLoadedCollection());
-        salvageables.addAll(vanillaSalvageConfig.getLoadedCollection());
-
-        //add valid custom collections to main collection
-        loadCustomCollections("repair", repairables, com.gmail.nossr50.config.collectionconfigs.RepairConfig.class);
-        loadCustomCollections("salvage", salvageables, com.gmail.nossr50.config.collectionconfigs.SalvageConfig.class);
-    }
-
-    /**
-     * mcMMO allows collection config files to be named things like repair.whatevernameyouwanthere.yml and so on,
-     *  these files are treated in the same way as the vanilla file. They serve the purpose of organization
-     * @param configPrefix the prefix of the file name, for example "repair", "salvage", etc
-     * @param collection the collection that will be added to
-     */
-    public void loadCustomCollections(String configPrefix, Collection<?> collection, Class<? extends ConfigCollection> configClass)
-    {
-        String vanillaConfigFileName = getVanillaConfigName(configPrefix);
-
-        //Find other files
-        Pattern pattern = Pattern.compile(configPrefix+"\\.(?:.+)\\.yml");
-        //File dataFolder = McmmoCore.getDataFolderPath();
-        File dataFolder = mcMMO.p.getDataFolder();
-
-        for (String fileName : dataFolder.list()) {
-            //Vanilla Config is already loaded
-            if(fileName.equalsIgnoreCase(vanillaConfigFileName))
-                continue;
-
-            //Find files that match the pattern
-            if (!pattern.matcher(fileName).matches()) {
-                continue;
-            }
-
-            //Init file
-            File currentFile = new File(dataFolder, fileName);
-
-            //Make sure its not a directory (needed?)
-            if(currentFile.isDirectory())
-                continue;
-
-            try {
-                //TODO: Valid?
-                ConfigCollections customConfig = (ConfigCollections) getConfigClass(configPrefix).getConstructor(String.class).newInstance(configPrefix);
-                collection.addAll(customConfig.getLoadedCollection());
-
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (InvocationTargetException e) {
-                e.printStackTrace();
-            } catch (NoSuchMethodException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private String getVanillaConfigName(String configPrefix)
-    {
-        return configPrefix+DEFAULT_MULTICONFIG_FILENAME_SUFFIX;
-    }
-
-    private Class getConfigClass(String configPrefix)
-    {
-        switch(configPrefix) {
-            case "repair":
-                return RepairConfig.class;
-            case "salvage":
-                return SalvageConfig.class;
-            default:
-                mcMMO.p.getLogger().severe("[DEBUG] Config Class is null!");
-                return null;
-        }
-    }
-
-}

+ 7 - 20
src/main/java/com/gmail/nossr50/config/collectionconfigs/RepairConfig.java

@@ -1,7 +1,8 @@
 package com.gmail.nossr50.config.collectionconfigs;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.skills.MaterialType;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.repair.repairables.Repairable;
 import com.gmail.nossr50.skills.repair.repairables.RepairableFactory;
 import com.gmail.nossr50.util.ItemUtils;
@@ -12,28 +13,16 @@ import org.bukkit.Material;
 import org.bukkit.inventory.ItemStack;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
 /**
  * This config
  */
-public class RepairConfig extends ConfigCollections {
-    private List<Repairable> repairables;
-
+public class RepairConfig extends ConfigCollection {
     public RepairConfig(String fileName) {
-        super(McmmoCore.getDataFolderPath().getAbsoluteFile(), fileName, false);
-    }
-
-    @Override
-    public void unload() {
-        repairables = null;
-    }
-
-    @Override
-    public Collection getLoadedCollection() {
-        return repairables == null ? new ArrayList<Repairable>() : repairables;
+        //super(McmmoCore.getDataFolderPath().getAbsoluteFile(), fileName, false);
+        super(mcMMO.p.getDataFolder().getAbsoluteFile(), fileName, false);
     }
 
     /**
@@ -47,9 +36,7 @@ public class RepairConfig extends ConfigCollections {
     }
 
     @Override
-    public void loadKeys() {
-        repairables = new ArrayList<Repairable>();
-
+    public void register() {
         ConfigurationNode repairablesNode = getUserRootNode().getNode("Repairables");
         List<? extends ConfigurationNode> repairablesNodeChildrenList = repairablesNode.getChildrenList();
         Iterator<? extends ConfigurationNode> configIter = repairablesNodeChildrenList.iterator();
@@ -164,7 +151,7 @@ public class RepairConfig extends ConfigCollections {
 
             if (noErrorsInRepairable(reason)) {
                 Repairable repairable = RepairableFactory.getRepairable(itemType, repairMaterial, repairMetadata, minimumLevel, minimumQuantity, maximumDurability, repairConfigItemCategory, repairMaterialType, xpMultiplier);
-                repairables.add(repairable);
+                genericCollection.add(repairable);
             }
         }
     }

+ 7 - 19
src/main/java/com/gmail/nossr50/config/collectionconfigs/SalvageConfig.java

@@ -1,8 +1,9 @@
 package com.gmail.nossr50.config.collectionconfigs;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.skills.ItemType;
 import com.gmail.nossr50.datatypes.skills.MaterialType;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
 import com.gmail.nossr50.skills.salvage.salvageables.SalvageableFactory;
 import com.gmail.nossr50.util.ItemUtils;
@@ -12,25 +13,14 @@ import org.bukkit.configuration.ConfigurationSection;
 import org.bukkit.inventory.ItemStack;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
-public class SalvageConfig extends ConfigCollections {
-    private List<Salvageable> salvageables;
+public class SalvageConfig extends ConfigCollection {
 
     public SalvageConfig(String fileName) {
-        super(McmmoCore.getDataFolderPath().getAbsoluteFile(), fileName, false);
-    }
-
-    @Override
-    public Collection getLoadedCollection() {
-        return salvageables == null ? new ArrayList<Salvageable>() : salvageables;
-    }
-
-    @Override
-    public void unload() {
-        salvageables = null;
+        //super(McmmoCore.getDataFolderPath().getAbsoluteFile(), fileName, false);
+        super(mcMMO.p.getDataFolder().getAbsoluteFile(), fileName, false);
     }
 
     /**
@@ -44,9 +34,7 @@ public class SalvageConfig extends ConfigCollections {
     }
 
     @Override
-    protected void loadKeys() {
-        salvageables = new ArrayList<Salvageable>();
-
+    public void register() {
         ConfigurationSection section = config.getConfigurationSection("Salvageables");
         Set<String> keys = section.getKeys(false);
 
@@ -149,7 +137,7 @@ public class SalvageConfig extends ConfigCollections {
 
             if (noErrorsInSalvageable(reason)) {
                 Salvageable salvageable = SalvageableFactory.getSalvageable(itemMaterial, salvageMaterial, salvageMetadata, minimumLevel, maximumQuantity, maximumDurability, salvageItemType, salvageMaterialType, xpMultiplier);
-                salvageables.add(salvageable);
+                genericCollection.add(salvageable);
             }
         }
     }

+ 13 - 10
src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java

@@ -5,8 +5,9 @@ import com.gmail.nossr50.datatypes.experience.FormulaType;
 import com.gmail.nossr50.datatypes.skills.MaterialType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.StringUtils;
-import com.sk89q.worldedit.world.block.BlockType;
+import org.bukkit.Material;
 import org.bukkit.boss.BarColor;
 import org.bukkit.boss.BarStyle;
 import org.bukkit.entity.EntityType;
@@ -77,7 +78,8 @@ public class ExperienceConfig extends ConfigValidated {
 
     //TODO: Should merge be false? Seems okay to leave it as true..
     private ExperienceConfig() {
-        super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "experience.yml", true);
+        //super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "experience.yml", true);
+        super(mcMMO.p.getDataFolder().getAbsoluteFile(), "experience.yml", true);
     }
 
     public static ExperienceConfig getInstance() {
@@ -305,11 +307,11 @@ public class ExperienceConfig extends ConfigValidated {
 
     /* Combat XP Multipliers */
     public double getCombatXP(EntityType entity) {
-        return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
+        return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, StringUtils.getEntityConfigName(entity));
     }
 
     public double getAnimalsXP(EntityType entity) {
-        return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
+        return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, StringUtils.getEntityConfigName(entity));
     }
 
     public double getAnimalsXP() {
@@ -317,7 +319,7 @@ public class ExperienceConfig extends ConfigValidated {
     }
 
     public boolean hasCombatXP(EntityType entity) {
-        return hasNode(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
+        return hasNode(EXPERIENCE, COMBAT, MULTIPLIER1, StringUtils.getEntityConfigName(entity));
     }
 
     /* Materials  */
@@ -328,9 +330,10 @@ public class ExperienceConfig extends ConfigValidated {
      * @param blockType the type of block
      * @return the raw amount of XP for this block before modifiers
      */
-    public int getXp(PrimarySkillType skill, BlockType blockType) {
+    //public int getXp(PrimarySkillType skill, BlockType blockType) {
+    public int getXp(PrimarySkillType skill, Material blockType) {
         //TODO: This is going to need to be changed, this code here is only placeholder
-        String[] path = new String[]{ EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.getConfigName() };
+        String[] path = new String[]{ EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.toString()};
         return getIntValue(path);
     }
 
@@ -342,10 +345,10 @@ public class ExperienceConfig extends ConfigValidated {
      * @param blockType the type of block
      * @return true if the block does give XP
      */
-    public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockType blockType) {
+    public boolean doesBlockGiveSkillXP(PrimarySkillType skill, Material blockType) {
         //TODO: This used to support wildcard characters, seems a bit unnecessary to do so.
         //TODO: This is going to need to be changed, this code here is only placeholder
-        String[] path = new String[] {EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.getConfigName()};
+        String[] path = new String[] {EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.toString()};
         return hasNode(path);
     }
 
@@ -443,6 +446,6 @@ public class ExperienceConfig extends ConfigValidated {
 
     /* Taming */
     public int getTamingXP(EntityType type) {
-        return getIntValue(EXPERIENCE, TAMING, ANIMAL_TAMING, type.getConfigName());
+        return getIntValue(EXPERIENCE, TAMING, ANIMAL_TAMING, StringUtils.getEntityConfigName(type));
     }
 }

+ 4 - 4
src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.config.mods;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.skills.MaterialType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.repair.repairables.Repairable;
@@ -14,7 +14,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
-public class CustomArmorConfig extends ConfigCollections {
+public class CustomArmorConfig extends ConfigCollection {
     public List<Material> customBoots = new ArrayList<Material>();
     public List<Material> customChestplates = new ArrayList<Material>();
     public List<Material> customHelmets = new ArrayList<Material>();
@@ -24,7 +24,7 @@ public class CustomArmorConfig extends ConfigCollections {
 
     protected CustomArmorConfig(String fileName) {
         //super(McmmoCore.getDataFolderPath().getPath() + "mods", fileName, false);
-        super(mcMMO.p.getDataFolder().getPath() + "mods", fileName, false);        loadKeys();
+        super(mcMMO.p.getDataFolder().getPath() + "mods", fileName, false);        register();
     }
 
     /**
@@ -38,7 +38,7 @@ public class CustomArmorConfig extends ConfigCollections {
     }
 
     @Override
-    public void loadKeys() {
+    public void register() {
         loadArmor("Boots", customBoots);
         loadArmor("Chestplates", customChestplates);
         loadArmor("Helmets", customHelmets);

+ 4 - 4
src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.config.mods;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.mcMMO;
 import org.bukkit.Material;
@@ -11,7 +11,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
-public class CustomBlockConfig extends ConfigCollections {
+public class CustomBlockConfig extends ConfigCollection {
     public List<Material> customExcavationBlocks = new ArrayList<>();
     public List<Material> customHerbalismBlocks = new ArrayList<>();
     public List<Material> customMiningBlocks = new ArrayList<>();
@@ -25,11 +25,11 @@ public class CustomBlockConfig extends ConfigCollections {
     protected CustomBlockConfig(String fileName) {
         //super(McmmoCore.getDataFolderPath().getPath() + "mods", fileName, false);
         super(mcMMO.p.getDataFolder().getPath() + "mods", fileName, false);
-        loadKeys();
+        register();
     }
 
     @Override
-    protected void loadKeys() {
+    protected void register() {
         loadBlocks("Excavation", customExcavationBlocks);
         loadBlocks("Herbalism", customHerbalismBlocks);
         loadBlocks("Mining", customMiningBlocks);

+ 14 - 13
src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.config.skills.alchemy;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion;
 import com.gmail.nossr50.mcMMO;
 import org.bukkit.Color;
@@ -14,8 +14,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class PotionConfig extends ConfigCollections {
-    private static PotionConfig instance;
+public class PotionConfig extends ConfigCollection {
 
     private List<ItemStack> concoctionsIngredientsTierOne = new ArrayList<ItemStack>();
     private List<ItemStack> concoctionsIngredientsTierTwo = new ArrayList<ItemStack>();
@@ -28,21 +27,23 @@ public class PotionConfig extends ConfigCollections {
 
     private Map<String, AlchemyPotion> potionMap = new HashMap<String, AlchemyPotion>();
 
-    private PotionConfig() {
-        super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"potions.yml");
-        loadKeys();
+    public PotionConfig() {
+        super(mcMMO.p.getDataFolder().getAbsoluteFile(), "potions.yml", true);
+        register();
     }
 
-    public static PotionConfig getInstance() {
-        if (instance == null) {
-            instance = new PotionConfig();
-        }
-
-        return instance;
+    /**
+     * The version of this config
+     *
+     * @return
+     */
+    @Override
+    public double getConfigVersion() {
+        return 1;
     }
 
     @Override
-    protected void loadKeys() {
+    public void register() {
         loadConcoctions();
         loadPotionMap();
     }

+ 8 - 8
src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.config.treasure;
 
-import com.gmail.nossr50.config.ConfigCollections;
+import com.gmail.nossr50.config.ConfigCollection;
 import com.gmail.nossr50.datatypes.treasure.*;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.EnchantmentUtils;
@@ -20,9 +20,9 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
-public class TreasureConfig extends ConfigCollections {
+public class TreasureConfig extends ConfigCollection {
 
-    private static TreasureConfig instance;
+    //private static TreasureConfig instance;
 
     public HashMap<String, List<ExcavationTreasure>> excavationMap = new HashMap<String, List<ExcavationTreasure>>();
 
@@ -32,18 +32,18 @@ public class TreasureConfig extends ConfigCollections {
     public HashMap<Rarity, List<FishingTreasure>> fishingRewards = new HashMap<Rarity, List<FishingTreasure>>();
     public HashMap<Rarity, List<EnchantmentTreasure>> fishingEnchantments = new HashMap<Rarity, List<EnchantmentTreasure>>();
 
-    private TreasureConfig() {
+    public TreasureConfig() {
         //super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"treasures.yml");
-        super(mcMMO.p.getDataFolder().getAbsoluteFile(), "treasures.yml");
+        super(mcMMO.p.getDataFolder().getAbsoluteFile(), "treasures.yml", true);
     }
 
-    public static TreasureConfig getInstance() {
+    /*public static TreasureConfig getInstance() {
         if (instance == null) {
             instance = new TreasureConfig();
         }
 
         return instance;
-    }
+    }*/
 
     @Override
     protected boolean validateKeys() {
@@ -82,7 +82,7 @@ public class TreasureConfig extends ConfigCollections {
     }
 
     @Override
-    protected void loadKeys() {
+    protected void register() {
         if (config.getConfigurationSection("Treasures") != null) {
             backup();
             return;

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/skills/subskills/AbstractSubSkill.java

@@ -41,7 +41,7 @@ public abstract class AbstractSubSkill implements SubSkill, Interaction, Rank, S
     @Override @Deprecated
     public boolean isEnabled() {
         //TODO: This might be troublesome...
-        return CoreSkillsMainConfig.getInstance().isSkillEnabled(this);
+        return CoreSkillConfig.getInstance().isSkillEnabled(this);
     }
 
     /**

+ 13 - 66
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -1,13 +1,8 @@
 package com.gmail.nossr50;
 
-import com.gmail.nossr50.config.MainConfig;
-import com.gmail.nossr50.config.WorldBlacklist;
-import com.gmail.nossr50.config.mods.ArmorConfigManager;
-import com.gmail.nossr50.config.mods.BlockConfigManager;
-import com.gmail.nossr50.config.mods.EntityConfigManager;
-import com.gmail.nossr50.config.mods.ToolConfigManager;
-import com.gmail.nossr50.config.skills.repair.RepairConfigManager;
-import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager;
+import com.gmail.nossr50.config.*;
+import com.gmail.nossr50.config.collectionconfigs.ConfigManager;
+import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.database.DatabaseManager;
 import com.gmail.nossr50.database.DatabaseManagerFactory;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
@@ -24,13 +19,8 @@ import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.runnables.player.PowerLevelUpdatingTask;
 import com.gmail.nossr50.runnables.skills.BleedTimerTask;
 import com.gmail.nossr50.skills.alchemy.Alchemy;
-import com.gmail.nossr50.skills.child.ChildConfig;
-import com.gmail.nossr50.skills.repair.repairables.Repairable;
 import com.gmail.nossr50.skills.repair.repairables.RepairableManager;
-import com.gmail.nossr50.skills.repair.repairables.SimpleRepairableManager;
-import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
 import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager;
-import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager;
 import com.gmail.nossr50.util.*;
 import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager;
 import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory;
@@ -54,14 +44,11 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
 
 public class mcMMO extends JavaPlugin {
     /* Managers */
     private static ChunkManager       placeStore;
-    private static RepairableManager  repairableManager;
-    private static SalvageableManager salvageableManager;
+    private static ConfigManager      configManager;
     private static ModManager         modManager;
     private static DatabaseManager    databaseManager;
     private static FormulaManager     formulaManager;
@@ -217,7 +204,7 @@ public class mcMMO extends JavaPlugin {
         }
 
         //Init the blacklist
-        worldBlacklist = new WorldBlacklist(this);
+        worldBlacklist = new WorldBlacklist();
     }
 
     @Override
@@ -274,6 +261,11 @@ public class mcMMO extends JavaPlugin {
         }
 
         databaseManager.onDisable();
+
+        //Unload configs last
+        configManager.unloadAllConfigsAndRegisters();
+
+
         debug("Was disabled."); // How informative!
     }
 
@@ -412,54 +404,9 @@ public class mcMMO extends JavaPlugin {
     }
 
     private void loadConfigFiles() {
-        // New Config System
-
-        ConfigurableTest.getInstance(); //Init
-
-        // End New Config System
-
-
-        // Force the loading of config files
-        TreasureConfig.getInstance();
-        HiddenConfig.getInstance();
-        AdvancedConfig.getInstance();
-        PotionConfig.getInstance();
-        CoreSkillsMainConfig.getInstance();
-        SoundConfig.getInstance();
-        RankConfig.getInstance();
-
-        new ChildConfig();
-
-        List<Repairable> repairables = new ArrayList<Repairable>();
-        List<Salvageable> salvageables = new ArrayList<Salvageable>();
-
-        if (MainConfig.getInstance().getToolModsEnabled()) {
-            new ToolConfigManager(this);
-        }
-
-        if (MainConfig.getInstance().getArmorModsEnabled()) {
-            new ArmorConfigManager(this);
-        }
-
-        if (MainConfig.getInstance().getBlockModsEnabled()) {
-            new BlockConfigManager(this);
-        }
-
-        if (MainConfig.getInstance().getEntityModsEnabled()) {
-            new EntityConfigManager(this);
-        }
+        configManager = new ConfigManager();
 
-        // Load repair configs, make manager, and register them at this time
-        repairables.addAll(new RepairConfigManager(this).getLoadedRepairables());
-        repairables.addAll(modManager.getLoadedRepairables());
-        repairableManager = new SimpleRepairableManager(repairables.size());
-        repairableManager.registerRepairables(repairables);
 
-        // Load salvage configs, make manager and register them at this time
-        SalvageConfigManager sManager = new SalvageConfigManager(this);
-        salvageables.addAll(sManager.getLoadedSalvageables());
-        salvageableManager = new SimpleSalvageableManager(salvageables.size());
-        salvageableManager.registerSalvageables(salvageables);
     }
 
     private void registerEvents() {
@@ -483,13 +430,13 @@ public class mcMMO extends JavaPlugin {
          * Acrobatics skills
          */
 
-        if(CoreSkillsMainConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS))
+        if(CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS))
         {
             System.out.println("[mcMMO]" + " enabling Acrobatics Skills");
 
             //TODO: Should do this differently
             Roll roll = new Roll();
-            CoreSkillsMainConfig.getInstance().isSkillEnabled(roll);
+            CoreSkillsConfig.getInstance().isSkillEnabled(roll);
             InteractionManager.registerSubSkill(new Roll());
         }
     }

+ 0 - 1
src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.skills.child;
 
-import com.gmail.nossr50.config.AutoUpdateConfigLoader;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.util.StringUtils;
 import org.bukkit.configuration.file.YamlConfiguration;

+ 2 - 0
src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java

@@ -1,6 +1,8 @@
 package com.gmail.nossr50.skills.repair;
 
+import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.MainConfig;
+import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.datatypes.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;

+ 2 - 1
src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java

@@ -1,11 +1,12 @@
 package com.gmail.nossr50.skills.repair.repairables;
 
+import com.gmail.nossr50.config.Unload;
 import org.bukkit.Material;
 import org.bukkit.inventory.ItemStack;
 
 import java.util.List;
 
-public interface RepairableManager {
+public interface RepairableManager extends Unload {
     /**
      * Register a repairable with the RepairManager
      *

+ 8 - 4
src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java

@@ -1,20 +1,24 @@
 package com.gmail.nossr50.skills.repair.repairables;
 
+import com.gmail.nossr50.config.Unload;
 import org.bukkit.Material;
 import org.bukkit.inventory.ItemStack;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 
 public class SimpleRepairableManager implements RepairableManager {
     private HashMap<Material, Repairable> repairables;
 
-    public SimpleRepairableManager() {
-        this(55);
+    @Override
+    public void unload() {
+        repairables.clear();
     }
 
-    public SimpleRepairableManager(int repairablesSize) {
-        this.repairables = new HashMap<Material, Repairable>(repairablesSize);
+    public SimpleRepairableManager(List<Repairable> repairablesCollection) {
+        this.repairables = new HashMap<Material, Repairable>(repairablesCollection.size());
+        registerRepairables(repairablesCollection);
     }
 
     @Override

+ 2 - 1
src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java

@@ -1,11 +1,12 @@
 package com.gmail.nossr50.skills.salvage.salvageables;
 
+import com.gmail.nossr50.config.Unload;
 import org.bukkit.Material;
 import org.bukkit.inventory.ItemStack;
 
 import java.util.List;
 
-public interface SalvageableManager {
+public interface SalvageableManager extends Unload {
     /**
      * Register a salvageable with the SalvageManager
      *

+ 9 - 3
src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java

@@ -10,12 +10,18 @@ import java.util.List;
 public class SimpleSalvageableManager implements SalvageableManager {
     private HashMap<Material, Salvageable> salvageables;
 
-    public SimpleSalvageableManager() {
+    /*public SimpleSalvageableManager() {
         this(55);
+    }*/
+
+    @Override
+    public void unload() {
+        salvageables.clear();
     }
 
-    public SimpleSalvageableManager(int salvageablesSize) {
-        this.salvageables = new HashMap<Material, Salvageable>(salvageablesSize);
+    public SimpleSalvageableManager(List<Salvageable> salvageablesCollection) {
+        this.salvageables = new HashMap<Material, Salvageable>(salvageablesCollection.size());
+        registerSalvageables(salvageablesCollection);
     }
 
     @Override

+ 10 - 0
src/main/java/com/gmail/nossr50/util/StringUtils.java

@@ -20,6 +20,16 @@ public class StringUtils {
         return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase();
     }
 
+    /**
+     * Gets the name of the entity that the config file is expecting
+     * @param entityType target entity type
+     * @return the config friendly entity type string
+     */
+    public static String getEntityConfigName(EntityType entityType)
+    {
+        return entityType.toString();
+    }
+
     public static String getPrettyItemString(Material material) {
         return createPrettyString(material.toString());
     }