mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 13:07:06 +01:00
26734e83b0
* Updated Upstream (Bukkit/CraftBukkit/Spigot) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 8085edde SPIGOT-6918: Add SpawnCategory API and configurations for Axolotls 04c7e13c PR-719: Add Player Profile API 71564210 SPIGOT-6910: Add BlockDamageAbortEvent CraftBukkit Changes: febaa1c6 SPIGOT-6918: Add SpawnCategory API and configurations for Axolotls 9dafd109 Don't send updates over large distances bdac46b0 SPIGOT-6782: EntityPortalEvent should not destroy entity when setTo() uses same world as getFrom() 8f361ece PR-1002: Add Player Profile API 911875d4 Increase outdated build delay e5f8a767 SPIGOT-6917: Use main scoreboard for /trigger a672a531 Clean up callBlockDamageEvent 8e1bdeef SPIGOT-6910: Add BlockDamageAbortEvent Spigot Changes: 6edb62f3 Rebuild patches 7fbc6a1e Rebuild patches * Updated Upstream (CraftBukkit) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: de951355 SPIGOT-6927: Fix default value of spawn-limits in Worlds
181 lines
11 KiB
Diff
181 lines
11 KiB
Diff
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 f8001cafc3494675dfa31c0c5feb975c0f066c5d..4b5486bec19d330404562814a0c4cf63f2f7ef1d 100644
|
|
--- a/src/main/java/org/bukkit/Bukkit.java
|
|
+++ b/src/main/java/org/bukkit/Bukkit.java
|
|
@@ -75,6 +75,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}.
|
|
+ *
|
|
+ * <p>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.</p>
|
|
+ *
|
|
+ * @return plugins directory
|
|
+ */
|
|
+ @NotNull
|
|
+ public static File getPluginsFolder() {
|
|
+ return server.getPluginsFolder();
|
|
+ }
|
|
+
|
|
/**
|
|
* Attempts to set the {@link Server} singleton.
|
|
* <p>
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index 7cc8f68205f7c0ec2ebada5030f944675b776c76..e38a0d7d48a57364bec0c8d1dc16e256622298a0 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -60,6 +60,18 @@ import org.jetbrains.annotations.Nullable;
|
|
*/
|
|
public interface Server extends PluginMessageRecipient {
|
|
|
|
+ /**
|
|
+ * 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}.
|
|
+ *
|
|
+ * <p>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.</p>
|
|
+ *
|
|
+ * @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 7548e40af8043c1b5716f2d7d0122833466854c4..83d3ee09cc6f91b095f6b8519a431ef70f2b67ec 100644
|
|
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
|
|
@@ -111,6 +111,12 @@ 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<File> extraPluginJars) {
|
|
+ // Paper end
|
|
Validate.notNull(directory, "Directory cannot be null");
|
|
Validate.isTrue(directory.isDirectory(), "Directory must be a directory");
|
|
|
|
@@ -128,7 +134,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
Map<String, Collection<String>> softDependencies = new HashMap<String, Collection<String>>();
|
|
|
|
// This is where it figures out all possible plugins
|
|
- for (File file : directory.listFiles()) {
|
|
+ // Paper start - extra jars
|
|
+ final List<File> pluginJars = new ArrayList<>(java.util.Arrays.asList(directory.listFiles()));
|
|
+ pluginJars.addAll(extraPluginJars);
|
|
+ for (File file : pluginJars) {
|
|
+ // Paper end
|
|
PluginLoader loader = null;
|
|
for (Pattern filter : filters) {
|
|
Matcher match = filter.matcher(file.getName());
|
|
@@ -144,14 +154,14 @@ public final class SimplePluginManager implements PluginManager {
|
|
description = loader.getPluginDescription(file);
|
|
String name = description.getName();
|
|
if (name.equalsIgnoreCase("bukkit") || name.equalsIgnoreCase("minecraft") || name.equalsIgnoreCase("mojang")) {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': Restricted Name");
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': Restricted Name"); // Paper
|
|
continue;
|
|
} else if (description.rawName.indexOf(' ') != -1) {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': uses the space-character (0x20) in its name");
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': uses the space-character (0x20) in its name"); // Paper
|
|
continue;
|
|
}
|
|
} catch (InvalidDescriptionException ex) {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex);
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper
|
|
continue;
|
|
}
|
|
|
|
@@ -162,7 +172,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
description.getName(),
|
|
file.getPath(),
|
|
replacedFile.getPath(),
|
|
- directory.getPath()
|
|
+ file.getParentFile().getPath() // Paper
|
|
));
|
|
}
|
|
|
|
@@ -183,7 +193,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
file.getPath(),
|
|
provided,
|
|
pluginFile.getPath(),
|
|
- directory.getPath()
|
|
+ file.getParentFile().getPath() // Paper
|
|
));
|
|
} else {
|
|
String replacedPlugin = pluginsProvided.put(provided, description.getName());
|
|
@@ -265,7 +275,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
|
|
server.getLogger().log(
|
|
Level.SEVERE,
|
|
- "Could not load '" + entry.getValue().getPath() + "' in folder '" + directory.getPath() + "'",
|
|
+ "Could not load '" + entry.getValue().getPath() + "' in folder '" + entry.getValue().getParentFile().getPath() + "'", // Paper
|
|
new UnknownDependencyException("Unknown dependency " + dependency + ". Please download and install " + dependency + " to run this plugin."));
|
|
break;
|
|
}
|
|
@@ -304,11 +314,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
loadedPlugins.add(loadedPlugin.getName());
|
|
loadedPlugins.addAll(loadedPlugin.getDescription().getProvides());
|
|
} else {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'");
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'"); // Paper
|
|
}
|
|
continue;
|
|
} catch (InvalidPluginException ex) {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex);
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper
|
|
}
|
|
}
|
|
}
|
|
@@ -335,11 +345,11 @@ public final class SimplePluginManager implements PluginManager {
|
|
loadedPlugins.add(loadedPlugin.getName());
|
|
loadedPlugins.addAll(loadedPlugin.getDescription().getProvides());
|
|
} else {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'");
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'"); // Paper
|
|
}
|
|
break;
|
|
} catch (InvalidPluginException ex) {
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "'", ex);
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "'", ex); // Paper
|
|
}
|
|
}
|
|
}
|
|
@@ -352,7 +362,7 @@ public final class SimplePluginManager implements PluginManager {
|
|
while (failedPluginIterator.hasNext()) {
|
|
File file = failedPluginIterator.next();
|
|
failedPluginIterator.remove();
|
|
- server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': circular dependency detected");
|
|
+ server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + file.getParentFile().getPath() + "': circular dependency detected"); // Paper
|
|
}
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
index cf2f517765d8f2a23cc4a17d9ee2dcd81f841b1b..9700ed558e65260264279b92dc661f39a0d0209c 100644
|
|
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
@@ -91,7 +91,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());
|