use of fr.neatmonster.nocheatplus.components.registry.feature.IDisableListener in project NoCheatPlus by NoCheatPlus.
the class NoCheatPlus method onDisable.
/**
* (Called on the plugin getting disabled.)
* <hr>
* Rough order of disabling:<br>
* <ul>
* <li>Prevent further registration. For now also disable listeners, though
* this might get shifted still.</li>
* <li><b>Call onDisable for IDisableListener instances, in reversed
* order of registration.</b> This includes clearing all data (Needs extensions for sorting
* by priority for IDisableListener instances.).</li>
* <li>Random sequence of cleanup calls for other registries and logging
* statistics.</li>
* <li>Call removeComponent for all registered components.</li>
* <li>Cleanup BlockProperties and clear most internal mappings for
* components (needs a more clean registry approach).</li>
* <li>(Command changes cleanup: currently disabled due to compatibility
* issues, could cause other issues with dynamic plugin managers.)</li>
* <li>Cleanup ConfigManager.</li>
* <li>Shutdown LogManager.</li>
* </ul>
*/
@Override
public void onDisable() {
final boolean verbose = ConfigManager.getConfigFile().getBoolean(ConfPaths.LOGGING_EXTENDED_STATUS);
// Remove listener references.
if (verbose) {
logManager.info(Streams.INIT, "Cleanup event registry (Bukkit)...");
}
// TODO: Prevent register feature ?
eventRegistry.clear();
BukkitScheduler sched = getServer().getScheduler();
// Stop data-man task.
if (dataManTaskId != -1) {
sched.cancelTask(dataManTaskId);
dataManTaskId = -1;
}
// Stop the tickTask.
if (verbose) {
logManager.info(Streams.INIT, "Stop TickTask...");
}
TickTask.setLocked(true);
TickTask.purge();
TickTask.cancel();
TickTask.removeAllTickListeners();
// Stop consistency checking task.
if (consistencyCheckerTaskId != -1) {
sched.cancelTask(consistencyCheckerTaskId);
consistencyCheckerTaskId = -1;
}
// Just to be sure nothing gets left out.
if (verbose) {
logManager.info(Streams.INIT, "Stop all remaining tasks...");
}
sched.cancelTasks(this);
// DisableListener.onDisable (includes DataManager cleanup.)
if (verbose) {
logManager.info(Streams.INIT, "onDisable calls (include DataManager cleanup)...");
}
// TODO: Reliable sorting order + sort now (checks and data cleanup late, data manager last, allow plugins to access stuff before data is reset).
final ArrayList<IDisableListener> disableListeners = new ArrayList<IDisableListener>(this.disableListeners);
Collections.reverse(disableListeners);
for (final IDisableListener dl : disableListeners) {
try {
dl.onDisable();
} catch (Throwable t) {
logManager.severe(Streams.INIT, "IDisableListener (" + dl.getClass().getName() + "): " + t.getClass().getSimpleName() + " / " + t.getMessage());
logManager.severe(Streams.INIT, t);
}
}
// ExemptionManager cleanup.
if (verbose) {
logManager.info(Streams.INIT, "Reset ExemptionManager...");
}
NCPExemptionManager.clear();
// Remove hooks.
allViolationsHook.unregister();
NCPHookManager.removeAllHooks();
// Write some debug/statistics.
final Counters counters = getGenericInstance(Counters.class);
if (counters != null) {
// Ensure we get this kind of information for the time being.
if (verbose) {
// Server logger needs info level.
logManager.info(Streams.INIT, counters.getMergedCountsString(true));
} else {
logManager.debug(Streams.TRACE_FILE, counters.getMergedCountsString(true));
}
}
// Unregister all added components explicitly (reverse order).
if (verbose) {
logManager.info(Streams.INIT, "Unregister all registered components...");
}
final ArrayList<Object> components = new ArrayList<Object>(this.allComponents);
for (int i = components.size() - 1; i >= 0; i--) {
removeComponent(components.get(i));
}
// Cleanup BlockProperties.
if (verbose) {
logManager.info(Streams.INIT, "Cleanup BlockProperties...");
}
BlockProperties.cleanup();
if (verbose) {
logManager.info(Streams.INIT, "Cleanup some mappings...");
}
// Remove IDisableListener instances.
// Just in case.
disableListeners.clear();
// Remove listeners.
listeners.clear();
// Remove config listeners.
notifyReload.clear();
// Sub registries.
subRegistries.clear();
// Just in case: clear the subComponentHolders.
subComponentholders.clear();
// Generic instances registry.
genericInstanceRegistry.clear();
// Feature tags.
featureTags.clear();
// BlockChangeTracker.
if (blockChangeListener != null) {
blockChangeListener.setEnabled(false);
// Only on disable.
blockChangeListener = null;
}
blockChangeTracker.clear();
// Restore changed commands.
// if (verbose) LogUtil.logInfo("Undo command changes...");
// undoCommandChanges();
// Clear command changes list (compatibility issues with NPCs, leads to recalculation of perms).
changedCommands.clear();
// Cleanup the configuration manager.
if (verbose) {
logManager.info(Streams.INIT, "Cleanup ConfigManager...");
}
ConfigManager.cleanup();
// Cleanup file logger.
if (verbose) {
logManager.info(Streams.INIT, "Shutdown LogManager...");
}
StaticLog.setUseLogManager(false);
StaticLog.setStreamID(Streams.INIT);
logManager.shutdown();
// Tell the server administrator that we finished unloading NoCheatPlus.
if (verbose) {
// Bukkit logger.
Bukkit.getLogger().info("[NoCheatPlus] All cleanup done.");
}
final PluginDescriptionFile pdfFile = getDescription();
// Bukkit logger.
Bukkit.getLogger().info("[NoCheatPlus] Version " + pdfFile.getVersion() + " is disabled.");
}
Aggregations