diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index fe15d49d88..ed927b1605 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -13,6 +13,7 @@ import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.Net; import static io.anuke.arc.Core.*; @@ -108,6 +109,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform listener.init(); } super.resize(graphics.getWidth(), graphics.getHeight()); + mods.each(Mod::init); finished = true; Events.fire(new ClientLoadEvent()); } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 563251aea8..4ef2fc9d09 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -245,6 +245,7 @@ public class Vars implements Loadable{ modDirectory.mkdirs(); + mods.load(); maps.load(); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index cc65655b88..5d7228479f 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -200,6 +200,11 @@ public class NetServer implements ApplicationListener{ registerCommands(); } + @Override + public void init(){ + mods.each(mod -> mod.registerClientCommands(clientCommands)); + } + private void registerCommands(){ clientCommands.register("help", "[page]", "Lists all commands.", (args, player) -> { if(args.length > 0 && !Strings.canParseInt(args[0])){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 363a29f3e5..9499bae006 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -6,8 +6,6 @@ import io.anuke.arc.files.*; import io.anuke.arc.function.*; import io.anuke.arc.util.*; import io.anuke.mindustry.io.*; -import io.anuke.mindustry.plugin.*; -import io.anuke.mindustry.plugin.Plugins.*; import java.net.*; diff --git a/core/src/io/anuke/mindustry/plugin/Plugins.java b/core/src/io/anuke/mindustry/plugin/Plugins.java deleted file mode 100644 index 946ec00f4f..0000000000 --- a/core/src/io/anuke/mindustry/plugin/Plugins.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.anuke.mindustry.plugin; - -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.function.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.io.*; - -import java.net.*; - -import static io.anuke.mindustry.Vars.pluginDirectory; - -public class Plugins{ - private Array loaded = new Array<>(); - private ObjectMap, PluginMeta> metas = new ObjectMap<>(); - - /** Returns a file named 'config.json' in a special folder for the specified plugin. - * Call this in init(). */ - public FileHandle getConfig(Plugin plugin){ - PluginMeta load = metas.get(plugin.getClass()); - if(load == null) throw new IllegalArgumentException("Plugin is not loaded yet (or missing)!"); - return pluginDirectory.child(load.name).child("config.json"); - } - - /** @return the loaded plugin found by class, or null if not found. */ - public @Nullable LoadedPlugin getPlugin(Class type){ - return loaded.find(l -> l.plugin.getClass() == type); - } - - /** Loads all plugins from the folder, but does call any methods on them.*/ - public void load(){ - for(FileHandle file : pluginDirectory.list()){ - if(!file.extension().equals("jar")) continue; - - try{ - loaded.add(loadPlugin(file)); - }catch(IllegalArgumentException ignored){ - }catch(Exception e){ - Log.err("Failed to load plugin file {0}. Skipping.", file); - e.printStackTrace(); - } - } - } - - /** @return all loaded plugins. */ - public Array all(){ - return loaded; - } - - /** Iterates through each plugin.*/ - public void each(Consumer cons){ - loaded.each(p -> cons.accept(p.plugin)); - } - - private LoadedPlugin loadPlugin(FileHandle jar) throws Exception{ - FileHandle zip = new ZipFileHandle(jar); - - FileHandle metaf = zip.child("plugin.json"); - if(!metaf.exists()){ - Log.warn("Plugin {0} doesn't have a 'plugin.json' file, skipping.", jar); - throw new IllegalArgumentException(); - } - - PluginMeta meta = JsonIO.read(PluginMeta.class, metaf.readString()); - - URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(meta.main); - metas.put(main, meta); - return new LoadedPlugin(jar, zip, (Plugin)main.getDeclaredConstructor().newInstance(), meta); - } - - /** Represents a plugin that has been loaded from a jar file.*/ - public static class LoadedPlugin{ - public final FileHandle jarFile; - public final FileHandle zipRoot; - public final Plugin plugin; - public final PluginMeta meta; - - public LoadedPlugin(FileHandle jarFile, FileHandle zipRoot, Plugin plugin, PluginMeta meta){ - this.zipRoot = zipRoot; - this.jarFile = jarFile; - this.plugin = plugin; - this.meta = meta; - } - } - - /** Plugin metadata information.*/ - public static class PluginMeta{ - public String name, author, main, description; - public String version; - } -} diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index 92c3303c52..c42e695c1d 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.server; import io.anuke.arc.*; -import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.mod.*; import static io.anuke.mindustry.Vars.*; @@ -28,5 +28,9 @@ public class MindustryServer implements ApplicationListener{ Core.app.addListener(logic = new Logic()); Core.app.addListener(netServer = new NetServer()); Core.app.addListener(new ServerControl(args)); + + mods.each(Mod::init); } + + } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index f414772b3d..38eaf7bc72 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -21,8 +21,6 @@ import io.anuke.mindustry.maps.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.plugin.*; -import io.anuke.mindustry.plugin.Plugins.*; import io.anuke.mindustry.type.*; import java.io.*; @@ -52,7 +50,6 @@ public class ServerControl implements ApplicationListener{ private PrintWriter socketOutput; public ServerControl(String[] args){ - Core.settings.defaults( "shufflemode", "normal", "bans", "", @@ -110,9 +107,6 @@ public class ServerControl implements ApplicationListener{ Effects.setScreenShakeProvider((a, b) -> {}); Effects.setEffectProvider((a, b, c, d, e, f) -> {}); - //load plugins - plugins.load(); - registerCommands(); Core.app.post(() -> { @@ -176,9 +170,6 @@ public class ServerControl implements ApplicationListener{ } }); - //initialize plugins - plugins.each(Plugin::init); - if(!mods.all().isEmpty()){ info("&lc{0} plugins loaded.", mods.all().size); }