From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Tue, 18 May 2021 14:42:26 -0700 Subject: [PATCH] Add command line option to load extra plugin jars not in the plugins folder ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java index 07d393152320270e38f495120dd19e35ece73149..026c1accb03bdd42981a2eaf9189d7b2fe6e7339 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -80,6 +80,20 @@ public final class Bukkit { return server; } + /** + * Returns the de facto plugins directory, generally used for storing plugin jars to be loaded, + * as well as their {@link org.bukkit.plugin.Plugin#getDataFolder() data folders}. + * + *

Plugins should use {@link org.bukkit.plugin.Plugin#getDataFolder()} rather than traversing this + * directory manually when determining the location in which to store their data and configuration files.

+ * + * @return plugins directory + */ + @NotNull + public static File getPluginsFolder() { + return server.getPluginsFolder(); + } + /** * Attempts to set the {@link Server} singleton. *

diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java index baa02b5223769755670c611ca4d6acc7bf202116..523f5ac54f7662c7c96182a352236732d2d3b122 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -65,6 +65,18 @@ import org.jetbrains.annotations.Nullable; */ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audience.ForwardingAudience { // Paper + /** + * Returns the de facto plugins directory, generally used for storing plugin jars to be loaded, + * as well as their {@link org.bukkit.plugin.Plugin#getDataFolder() data folders}. + * + *

Plugins should use {@link org.bukkit.plugin.Plugin#getDataFolder()} rather than traversing this + * directory manually when determining the location in which to store their data and configuration files.

+ * + * @return plugins directory + */ + @NotNull + File getPluginsFolder(); + /** * Used for all administrative messages, such as an operator using a * command. diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 63389474a2b3f0e283b42e7004aa6a94904a3d17..974ff7116b294473ec450757e8a9341540f43dcd 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -116,9 +116,22 @@ public final class SimplePluginManager implements PluginManager { @Override @NotNull public Plugin[] loadPlugins(@NotNull File directory) { + // Paper start - extra jars + return this.loadPlugins(directory, java.util.Collections.emptyList()); + } + @NotNull + public Plugin[] loadPlugins(final @NotNull File directory, final @NotNull List extraPluginJars) { + // Paper end if (true) { List pluginList = new ArrayList<>(); java.util.Collections.addAll(pluginList, this.paperPluginManager.loadPlugins(directory)); + for (File file : extraPluginJars) { + try { + pluginList.add(this.paperPluginManager.loadPlugin(file)); + } catch (Exception e) { + this.server.getLogger().log(Level.SEVERE, "Plugin loading error!", e); + } + } return pluginList.toArray(new Plugin[0]); } Preconditions.checkArgument(directory != null, "Directory cannot be null"); diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index de6b6188587fd254ab96cbc1f95fda2056d9cbe2..eaefbb00e9993d54906cc8cf35cf753c0d6c7707 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -93,7 +93,7 @@ public final class JavaPluginLoader implements PluginLoader { throw new InvalidPluginException(ex); } - final File parentFile = file.getParentFile(); + final File parentFile = this.server.getPluginsFolder(); // Paper final File dataFolder = new File(parentFile, description.getName()); @SuppressWarnings("deprecation") final File oldDataFolder = new File(parentFile, description.getRawName());