mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-24 00:11:31 +00:00
Merge pull request #628 from exzork/development
PluginManager: Use the same class loader and add getPlugin method
This commit is contained in:
commit
d70df776b1
@ -4,12 +4,12 @@ import emu.grasscutter.Grasscutter;
|
|||||||
import emu.grasscutter.server.event.Event;
|
import emu.grasscutter.server.event.Event;
|
||||||
import emu.grasscutter.server.event.EventHandler;
|
import emu.grasscutter.server.event.EventHandler;
|
||||||
import emu.grasscutter.server.event.HandlerPriority;
|
import emu.grasscutter.server.event.HandlerPriority;
|
||||||
import emu.grasscutter.utils.EventConsumer;
|
|
||||||
import emu.grasscutter.utils.Utils;
|
import emu.grasscutter.utils.Utils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -47,12 +47,23 @@ public final class PluginManager {
|
|||||||
List<File> plugins = Arrays.stream(files)
|
List<File> plugins = Arrays.stream(files)
|
||||||
.filter(file -> file.getName().endsWith(".jar"))
|
.filter(file -> file.getName().endsWith(".jar"))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
URL[] pluginNames = new URL[plugins.size()];
|
||||||
|
plugins.forEach(plugin -> {
|
||||||
|
try {
|
||||||
|
pluginNames[plugins.indexOf(plugin)] = plugin.toURI().toURL();
|
||||||
|
} catch (MalformedURLException exception) {
|
||||||
|
Grasscutter.getLogger().warn("Unable to load plugin.", exception);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
URLClassLoader classLoader = new URLClassLoader(pluginNames);
|
||||||
|
|
||||||
plugins.forEach(plugin -> {
|
plugins.forEach(plugin -> {
|
||||||
try {
|
try {
|
||||||
URL url = plugin.toURI().toURL();
|
URL url = plugin.toURI().toURL();
|
||||||
try (URLClassLoader loader = new URLClassLoader(new URL[]{url})) {
|
try (URLClassLoader loader = new URLClassLoader(new URL[]{url})) {
|
||||||
URL configFile = loader.findResource("plugin.json");
|
URL configFile = loader.findResource("plugin.json"); // Find the plugin.json file for each plugin.
|
||||||
InputStreamReader fileReader = new InputStreamReader(configFile.openStream());
|
InputStreamReader fileReader = new InputStreamReader(configFile.openStream());
|
||||||
|
|
||||||
PluginConfig pluginConfig = Grasscutter.getGsonFactory().fromJson(fileReader, PluginConfig.class);
|
PluginConfig pluginConfig = Grasscutter.getGsonFactory().fromJson(fileReader, PluginConfig.class);
|
||||||
@ -68,10 +79,10 @@ public final class PluginManager {
|
|||||||
JarEntry entry = entries.nextElement();
|
JarEntry entry = entries.nextElement();
|
||||||
if(entry.isDirectory() || !entry.getName().endsWith(".class") || entry.getName().contains("module-info")) continue;
|
if(entry.isDirectory() || !entry.getName().endsWith(".class") || entry.getName().contains("module-info")) continue;
|
||||||
String className = entry.getName().replace(".class", "").replace("/", ".");
|
String className = entry.getName().replace(".class", "").replace("/", ".");
|
||||||
loader.loadClass(className);
|
classLoader.loadClass(className); // Use the same class loader for ALL plugins.
|
||||||
}
|
}
|
||||||
|
|
||||||
Class<?> pluginClass = loader.loadClass(pluginConfig.mainClass);
|
Class<?> pluginClass = classLoader.loadClass(pluginConfig.mainClass);
|
||||||
Plugin pluginInstance = (Plugin) pluginClass.getDeclaredConstructor().newInstance();
|
Plugin pluginInstance = (Plugin) pluginClass.getDeclaredConstructor().newInstance();
|
||||||
this.loadPlugin(pluginInstance, PluginIdentifier.fromPluginConfig(pluginConfig), loader);
|
this.loadPlugin(pluginInstance, PluginIdentifier.fromPluginConfig(pluginConfig), loader);
|
||||||
|
|
||||||
@ -156,6 +167,10 @@ public final class PluginManager {
|
|||||||
.toList().forEach(handler -> this.invokeHandler(event, handler));
|
.toList().forEach(handler -> this.invokeHandler(event, handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Plugin getPlugin(String name) {
|
||||||
|
return this.plugins.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs logic checks then invokes the provided event handler.
|
* Performs logic checks then invokes the provided event handler.
|
||||||
* @param event The event passed through to the handler.
|
* @param event The event passed through to the handler.
|
||||||
@ -167,4 +182,4 @@ public final class PluginManager {
|
|||||||
(event.isCanceled() && handler.ignoresCanceled())
|
(event.isCanceled() && handler.ignoresCanceled())
|
||||||
) handler.getCallback().consume((T) event);
|
) handler.getCallback().consume((T) event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user