diff --git a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml
similarity index 55%
rename from .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml
rename to .idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml
index 8991a67..0d3e00e 100644
--- a/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_v1_0_g8d3b6b6_296.xml
+++ b/.idea/libraries/Maven__com_github_TBMCPlugins_ButtonCore_Towny_master_248b0d8d0a_1.xml
@@ -1,13 +1,13 @@
-
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml
similarity index 55%
rename from .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml
rename to .idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml
index b5aaa43..19b24a3 100644
--- a/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_c8cb88f27a_1.xml
+++ b/.idea/libraries/Maven__com_github_milkbowl_VaultAPI_master_431c5273c2_1.xml
@@ -1,13 +1,13 @@
-
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml
index 4f2c5e4..63108e8 100644
--- a/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml
+++ b/.idea/libraries/Maven__org_bukkit_bukkit_1_13_1_R0_1_SNAPSHOT.xml
@@ -1,13 +1,13 @@
-
+
-
+
-
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml
index 42f0d6f..b6f88ae 100644
--- a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml
+++ b/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml
@@ -1,13 +1,13 @@
-
+
-
+
-
+
\ No newline at end of file
diff --git a/BuildConfigUpdater/BuildConfigUpdater.iml b/BuildConfigUpdater/BuildConfigUpdater.iml
index 73696cd..4902d56 100644
--- a/BuildConfigUpdater/BuildConfigUpdater.iml
+++ b/BuildConfigUpdater/BuildConfigUpdater.iml
@@ -12,6 +12,7 @@
+
diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java
new file mode 100644
index 0000000..a83037b
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentCommand.java
@@ -0,0 +1,30 @@
+package buttondevteam.core;
+
+import buttondevteam.lib.chat.CommandClass;
+import buttondevteam.lib.chat.TBMCCommandBase;
+import org.bukkit.command.CommandSender;
+
+@CommandClass(modOnly = true)
+public class ComponentCommand extends TBMCCommandBase {
+ @Override
+ public boolean OnCommand(CommandSender sender, String alias, String[] args) {
+ if (args.length < 2)
+ return false;
+ switch (args[0]) {
+ case "enable":
+ break;
+ case "disable":
+ break;
+ case "list":
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String[] GetHelpText(String alias) {
+ return new String[0];
+ }
+}
diff --git a/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java
new file mode 100644
index 0000000..023dee4
--- /dev/null
+++ b/ButtonCore/src/main/java/buttondevteam/core/ComponentManager.java
@@ -0,0 +1,33 @@
+package buttondevteam.core;
+
+import buttondevteam.lib.architecture.Component;
+import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException;
+
+public final class ComponentManager {
+ private ComponentManager() {}
+
+ /**
+ * Enables components based on a configuration
+ */
+ public static void enableComponents() {
+ //Component.getComponents().values().stream().filter(c->cs.getConfigurationSection(c.getClass().getSimpleName()).getBoolean("enabled")).forEach(c-> {
+ Component.getComponents().values().stream().filter(c -> c.shouldBeEnabled().get()).forEach(c -> {
+ try {
+ Component.setComponentEnabled(c, true);
+ } catch (UnregisteredComponentException ignored) { //This *should* never happen
+ }
+ });
+ }
+
+ /**
+ * Disables all components that are enabled
+ */
+ public static void disableComponents() {
+ Component.getComponents().values().stream().filter(Component::isEnabled).forEach(c -> {
+ try {
+ Component.setComponentEnabled(c, false);
+ } catch (UnregisteredComponentException ignored) { //This *should* never happen
+ }
+ });
+ }
+}
diff --git a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java
index b25ed1f..ec130f1 100755
--- a/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java
+++ b/ButtonCore/src/main/java/buttondevteam/core/MainPlugin.java
@@ -40,6 +40,7 @@ public class MainPlugin extends JavaPlugin {
setupPermissions();
Test = getConfig().getBoolean("test", true);
saveConfig();
+ ComponentManager.enableComponents();
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class);
TBMCChatAPI.RegisterChatChannel(Channel.GlobalChat = new Channel("§fOOC§f", Color.White, "ooc", null));
@@ -67,6 +68,7 @@ public class MainPlugin extends JavaPlugin {
@Override
public void onDisable() {
+ ComponentManager.disableComponents();
logger.info("Saving player data...");
TBMCPlayerBase.savePlayers();
logger.info("Player data saved.");
diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java
index 33c6788..d59cbd9 100644
--- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java
+++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java
@@ -1,17 +1,75 @@
package buttondevteam.lib.architecture;
import buttondevteam.lib.TBMCCoreAPI;
+import buttondevteam.lib.architecture.exceptions.UnregisteredComponentException;
import buttondevteam.lib.chat.TBMCChatAPI;
import buttondevteam.lib.chat.TBMCCommandBase;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.experimental.var;
import lombok.val;
+import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+/**
+ * Configuration is based on class name
+ */
public abstract class Component {
- private static HashMap, Component> components;
+ private static HashMap, Component> components = new HashMap<>();
+
+ @Getter
+ private boolean enabled = false;
+ @Getter(value = AccessLevel.PROTECTED)
+ @NonNull
+ private JavaPlugin plugin;
+ @NonNull
+ private ConfigurationSection config;
+
+ public ConfigData shouldBeEnabled() {
+ return getData("enabled", true);
+ }
+
+ private HashMap> datamap = new HashMap<>();
+
+ /**
+ * This method overload should only be used with primitves or String.
+ *
+ * @param path The path in config to use
+ * @param def The value to use by default
+ * @param The type of this variable (only use primitives or String)
+ * @return The data object that can be used to get or set the value
+ */
+ @SuppressWarnings("unchecked")
+ protected ConfigData getData(String path, T def) {
+ ConfigData> data = datamap.get(path);
+ if (data == null) datamap.put(path, data = new ConfigData<>(config, path, def));
+ return (ConfigData) data;
+ }
+
+ /**
+ * This method overload may be used with any class.
+ *
+ * @param path The path in config to use
+ * @param def The value to use by default
+ * @param getter A function that converts a primitive representation to the correct value
+ * @param setter A function that converts a value to a primitive representation
+ * @param The type of this variable (can be any class)
+ * @return The data object that can be used to get or set the value
+ */
+ @SuppressWarnings("unchecked")
+ protected ConfigData getData(String path, T def, Function