diff --git a/paper-server/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java b/paper-server/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java index 70413fddd23c..3200aef1ba5d 100644 --- a/paper-server/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java +++ b/paper-server/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java @@ -117,6 +117,10 @@ public static void load(OptionSet optionSet) throws Exception { java.util.List files = ((java.util.List) optionSet.valuesOf("add-plugin")).stream().map(File::toPath).toList(); io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.PluginFlagProviderSource.INSTANCE, files); + @SuppressWarnings("unchecked") + java.util.List dirs = ((java.util.List) optionSet.valuesOf("add-plugin-dir")).stream().map(File::toPath).toList(); + dirs.forEach(pluginDir -> io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.DirectoryProviderSource.INSTANCE_NO_CREATE, pluginDir)); + final Set paperPluginNames = new TreeSet<>(); final Set legacyPluginNames = new TreeSet<>(); LaunchEntryPointHandler.INSTANCE.getStorage().forEach((entrypoint, providerStorage) -> { diff --git a/paper-server/src/main/java/io/papermc/paper/plugin/provider/source/DirectoryProviderSource.java b/paper-server/src/main/java/io/papermc/paper/plugin/provider/source/DirectoryProviderSource.java index 0846d3a904e4..00dbd17a2378 100644 --- a/paper-server/src/main/java/io/papermc/paper/plugin/provider/source/DirectoryProviderSource.java +++ b/paper-server/src/main/java/io/papermc/paper/plugin/provider/source/DirectoryProviderSource.java @@ -16,14 +16,25 @@ */ public class DirectoryProviderSource implements ProviderSource> { - public static final DirectoryProviderSource INSTANCE = new DirectoryProviderSource(); + public static final DirectoryProviderSource INSTANCE = new DirectoryProviderSource(true); + public static final DirectoryProviderSource INSTANCE_NO_CREATE = new DirectoryProviderSource(false); private static final FileProviderSource FILE_PROVIDER_SOURCE = new FileProviderSource("Directory '%s'"::formatted, false); // Paper - Remap plugins private static final Logger LOGGER = LogUtils.getClassLogger(); + private final boolean createDirectory; + + public DirectoryProviderSource(final boolean createDirectory) { + this.createDirectory = createDirectory; + } + @Override public List prepareContext(Path context) throws IOException { // Symlink happy, create file if missing. if (!Files.isDirectory(context)) { + if (!this.createDirectory) { + return List.of(); + } + Files.createDirectories(context); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java b/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java index 4cfb502c2ca7..9d4d97fcb0f3 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java @@ -146,10 +146,11 @@ public static void main(String[] args) { .describedAs("Yml file"); this.acceptsAll(asList("paper-dir", "paper-settings-directory"), "Directory for Paper settings") - .withRequiredArg() - .ofType(File.class) - .defaultsTo(new File(io.papermc.paper.configuration.PaperConfigurations.CONFIG_DIR)) - .describedAs("Config directory"); + .withRequiredArg() + .ofType(File.class) + .defaultsTo(new File(io.papermc.paper.configuration.PaperConfigurations.CONFIG_DIR)) + .describedAs("Config directory"); + this.acceptsAll(asList("paper", "paper-settings"), "File for Paper settings") .withRequiredArg() .ofType(File.class) @@ -162,6 +163,12 @@ public static void main(String[] args) { .defaultsTo(new File[] {}) .describedAs("Jar file"); + this.acceptsAll(asList("add-plugin-dir", "add-extra-plugin-dir"), "Specify paths to extra plugin directories to be loaded in addition to the plugins folder. This argument can be specified multiple times, once for each extra plugin dir path.") + .withRequiredArg() + .ofType(File.class) + .defaultsTo(new File[] {}) + .describedAs("Plugin directory"); + this.accepts("server-name", "Name of the server") .withRequiredArg() .ofType(String.class)