Updated to APIv3.2
Commands can now be unregistered. Requires CommandManager as of 2017/05/05 09:44
This commit is contained in:
parent
1ee4a123d2
commit
71906eb107
@ -1,13 +1,19 @@
|
|||||||
command modules {
|
command modules {
|
||||||
list {
|
list {
|
||||||
help Lists all modules. Color indicates status: §aENABLED §cDISABLED;
|
help Lists all modules. Color indicates status: §aENABLED §cDISABLED;
|
||||||
perm jutils.admin;
|
perm jutils.modules.list;
|
||||||
run list;
|
run list;
|
||||||
}
|
}
|
||||||
load [string:name...] {
|
load [string:name...] {
|
||||||
help (Re)-Loads a module. WARNING: Handle with care! This has direct affect on code being executed. This command will temporarily halt the main thread until the class loading operation was completed.;
|
help (Re)-Loads a module. WARNING: Handle with care! This has direct affect on code being executed. This command will temporarily halt the main thread until the class loading operation was completed.;
|
||||||
perm jtuils.admin;
|
perm jtuils.modules.admin;
|
||||||
run load name;
|
run load name;
|
||||||
type console;
|
type console;
|
||||||
}
|
}
|
||||||
|
unload [string:name...] {
|
||||||
|
help Unloads a module. WARNING: Handle with care! This has direct affect on code being executed. This command will temporarily halt the main thread until the class loading operation was completed.;
|
||||||
|
perm jutils.modules.admin;
|
||||||
|
run unload name;
|
||||||
|
type console;
|
||||||
|
}
|
||||||
}
|
}
|
@ -3,9 +3,11 @@ package com.redstoner.coremods.moduleLoader;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -35,7 +37,7 @@ import net.minecraft.server.v1_11_R1.MinecraftServer;
|
|||||||
/** The module loader, mother of all modules. Responsible for loading and taking care of all modules.
|
/** The module loader, mother of all modules. Responsible for loading and taking care of all modules.
|
||||||
*
|
*
|
||||||
* @author Pepich */
|
* @author Pepich */
|
||||||
@Version(major = 3, minor = 1, revision = 6, compatible = 2)
|
@Version(major = 3, minor = 2, revision = 0, compatible = 2)
|
||||||
public final class ModuleLoader implements CoreModule
|
public final class ModuleLoader implements CoreModule
|
||||||
{
|
{
|
||||||
private static ModuleLoader instance;
|
private static ModuleLoader instance;
|
||||||
@ -99,10 +101,10 @@ public final class ModuleLoader implements CoreModule
|
|||||||
}
|
}
|
||||||
Utils.error("Invalid config file! Creating new, blank file!");
|
Utils.error("Invalid config file! Creating new, blank file!");
|
||||||
}
|
}
|
||||||
List<String> autoload = config.getStringList("autoLoad");
|
List<String> coremods = config.getStringList("coremods");
|
||||||
if (autoload == null || autoload.isEmpty())
|
if (coremods == null || coremods.isEmpty())
|
||||||
{
|
{
|
||||||
config.set("autoLoad", new String[] {"# Add the modules here!"});
|
config.set("coremods", new String[] {"# Add the coremodules here!"});
|
||||||
Main.plugin.saveConfig();
|
Main.plugin.saveConfig();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -113,6 +115,23 @@ public final class ModuleLoader implements CoreModule
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
List<String> autoload = config.getStringList("autoload");
|
||||||
|
if (autoload == null || autoload.isEmpty())
|
||||||
|
{
|
||||||
|
config.set("autoload", new String[] {"# Add the modules here!"});
|
||||||
|
Main.plugin.saveConfig();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
config.save(configFile);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String s : coremods)
|
||||||
|
if (!s.startsWith("#"))
|
||||||
|
ModuleLoader.addDynamicModule(s);
|
||||||
for (String s : autoload)
|
for (String s : autoload)
|
||||||
if (!s.startsWith("#"))
|
if (!s.startsWith("#"))
|
||||||
ModuleLoader.addDynamicModule(s);
|
ModuleLoader.addDynamicModule(s);
|
||||||
@ -300,9 +319,24 @@ public final class ModuleLoader implements CoreModule
|
|||||||
{
|
{
|
||||||
HandlerList.unregisterAll((Listener) module);
|
HandlerList.unregisterAll((Listener) module);
|
||||||
}
|
}
|
||||||
|
String[] commands = getAllHooks(module).toArray(new String[] {});
|
||||||
|
CommandManager.unregisterAll(commands);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ArrayList<String> getAllHooks(Module module)
|
||||||
|
{
|
||||||
|
ArrayList<String> commands = new ArrayList<String>();
|
||||||
|
for (Method m : module.getClass().getMethods())
|
||||||
|
{
|
||||||
|
Command cmd = m.getDeclaredAnnotation(Command.class);
|
||||||
|
if (cmd == null)
|
||||||
|
continue;
|
||||||
|
commands.add(cmd.hook());
|
||||||
|
}
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
@Command(hook = "load")
|
@Command(hook = "load")
|
||||||
public boolean loadModule(CommandSender sender, String name)
|
public boolean loadModule(CommandSender sender, String name)
|
||||||
{
|
{
|
||||||
@ -310,6 +344,13 @@ public final class ModuleLoader implements CoreModule
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Command(hook = "unload")
|
||||||
|
public boolean unloadModule(CommandSender sender, String name)
|
||||||
|
{
|
||||||
|
removeDynamicModule(name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static final void addDynamicModule(String name)
|
public static final void addDynamicModule(String name)
|
||||||
{
|
{
|
||||||
Object[] status = getServerStatus();
|
Object[] status = getServerStatus();
|
||||||
@ -451,6 +492,44 @@ public final class ModuleLoader implements CoreModule
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final void removeDynamicModule(String name)
|
||||||
|
{
|
||||||
|
Object[] status = getServerStatus();
|
||||||
|
for (Module m : modules.keySet())
|
||||||
|
{
|
||||||
|
if (m.getClass().getName().equals(name))
|
||||||
|
{
|
||||||
|
Utils.info(
|
||||||
|
"Found existing module, attempting unload. WARNING! This operation will halt the main thread until it is completed.");
|
||||||
|
Utils.info("Current server status:");
|
||||||
|
Utils.info("Current system time: " + status[0]);
|
||||||
|
Utils.info("Current tick: " + status[1]);
|
||||||
|
Utils.info("Last TPS: " + status[2]);
|
||||||
|
Utils.info("Entity count: " + status[3]);
|
||||||
|
Utils.info("Player count: " + status[4]);
|
||||||
|
Utils.info("Attempting to disable module properly:");
|
||||||
|
disableModule(m);
|
||||||
|
Utils.info("Disabled module, overriding the implementation:");
|
||||||
|
Object[] newStatus = getServerStatus();
|
||||||
|
Utils.info("Task complete! Took " + ((long) newStatus[0] - (long) status[0]) + "ms to finish!");
|
||||||
|
Utils.info("Current server status:");
|
||||||
|
Utils.info("Current system time: " + newStatus[0]);
|
||||||
|
Utils.info("Current tick: " + newStatus[1]);
|
||||||
|
Utils.info("Last TPS: " + newStatus[2]);
|
||||||
|
Utils.info("Entity count: " + newStatus[3]);
|
||||||
|
Utils.info("Player count: " + newStatus[4]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!name.startsWith("com.redstoner.modules."))
|
||||||
|
{
|
||||||
|
Utils.warn("Couldn't find class definition, suspecting missing path. Autocompleting path, trying again.");
|
||||||
|
removeDynamicModule("com.redstoner.modules." + name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Utils.error("Couldn't find module! Couldn't ");
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
private static final Object[] getServerStatus()
|
private static final Object[] getServerStatus()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user