diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java index 3319bd22..04039582 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -244,6 +245,9 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { private boolean manageListeners = true; protected final List permStateReceivers = new ArrayList(); + + /** All registered components. */ + protected Set allComponents = new LinkedHashSet(50); protected Metrics metrics = null; @@ -252,6 +256,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { */ @Override public void addComponent(final Object obj) { + allComponents.add(obj); if (obj instanceof Listener) { addListener((Listener) obj); } @@ -363,6 +368,22 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { if (verbose) LogUtil.logInfo("[NoCheatPlus] Stop all remaining tasks..."); getServer().getScheduler().cancelTasks(this); + // Exemptions cleanup. + NCPExemptionManager.clear(); + + // Data cleanup. + if (verbose) LogUtil.logInfo("[NoCheatPlus] Cleanup DataManager..."); + dataMan.onDisable(); + + // Hooks: + // (Expect external plugins to unregister their hooks on their own.) + // (No native hooks present, yet.) + + // Unregister all added components explicitly. + for (Object obj : allComponents){ + removeComponent(obj); + } + if (verbose) LogUtil.logInfo("[NoCheatPlus] Cleanup some mappings..."); // Remove listeners. listeners.clear(); @@ -371,17 +392,6 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { // World specific permissions. permStateReceivers.clear(); - // Data cleanup. - if (verbose) LogUtil.logInfo("[NoCheatPlus] Cleanup DataManager..."); - dataMan.onDisable(); - - // Exemptions cleanup. - NCPExemptionManager.clear(); - - // Hooks: - // (Expect external plugins to unregister their hooks on their own.) - // (No native hooks present, yet.) - // Clear command changes list (compatibility issues with NPCs, leads to recalculation of perms). if (changedCommands != null){ changedCommands.clear();