From 34c358669b5cc25038fddd4ea2a7c012dd3da9a6 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 21:24:09 -0400 Subject: [PATCH] Added getting resources from the JAR --- .../java/emu/grasscutter/plugin/Plugin.java | 30 +++++++++++++++++-- .../emu/grasscutter/plugin/PluginManager.java | 8 ++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/emu/grasscutter/plugin/Plugin.java b/src/main/java/emu/grasscutter/plugin/Plugin.java index a3160d7c7..42858c247 100644 --- a/src/main/java/emu/grasscutter/plugin/Plugin.java +++ b/src/main/java/emu/grasscutter/plugin/Plugin.java @@ -1,13 +1,20 @@ package emu.grasscutter.plugin; import emu.grasscutter.Grasscutter; +import emu.grasscutter.plugin.api.ServerHook; import emu.grasscutter.server.game.GameServer; +import java.io.InputStream; +import java.net.URLClassLoader; + /** * The base class for all plugins to extend. */ public abstract class Plugin { + private final ServerHook server = ServerHook.getInstance(); + private PluginIdentifier identifier; + private URLClassLoader classLoader; /** * This method is reflected into. @@ -15,9 +22,11 @@ public abstract class Plugin { * Set plugin variables. * @param identifier The plugin's identifier. */ - private void initializePlugin(PluginIdentifier identifier) { + private void initializePlugin(PluginIdentifier identifier, URLClassLoader classLoader) { if(this.identifier == null) this.identifier = identifier; + if(this.classLoader == null) + this.classLoader = classLoader; else Grasscutter.getLogger().warn(this.identifier.name + " had a reinitialization attempt."); } @@ -55,7 +64,24 @@ public abstract class Plugin { * @return A server instance. */ public final GameServer getServer() { - return Grasscutter.getGameServer(); + return this.server.getGameServer(); + } + + /** + * Returns an input stream for a resource in the JAR file. + * @param resourceName The name of the resource. + * @return An input stream. + */ + public final InputStream getResource(String resourceName) { + return this.classLoader.getResourceAsStream(resourceName); + } + + /** + * Returns the server hook. + * @return A server hook singleton. + */ + public final ServerHook getHandle() { + return this.server; } /* Called when the plugin is first loaded. */ diff --git a/src/main/java/emu/grasscutter/plugin/PluginManager.java b/src/main/java/emu/grasscutter/plugin/PluginManager.java index d436b54d7..0c11aadf0 100644 --- a/src/main/java/emu/grasscutter/plugin/PluginManager.java +++ b/src/main/java/emu/grasscutter/plugin/PluginManager.java @@ -73,7 +73,7 @@ public final class PluginManager { Class pluginClass = loader.loadClass(pluginConfig.mainClass); Plugin pluginInstance = (Plugin) pluginClass.getDeclaredConstructor().newInstance(); - this.loadPlugin(pluginInstance, PluginIdentifier.fromPluginConfig(pluginConfig)); + this.loadPlugin(pluginInstance, PluginIdentifier.fromPluginConfig(pluginConfig), loader); fileReader.close(); // Close the file reader. } catch (ClassNotFoundException ignored) { @@ -89,14 +89,14 @@ public final class PluginManager { * Load the specified plugin. * @param plugin The plugin instance. */ - private void loadPlugin(Plugin plugin, PluginIdentifier identifier) { + private void loadPlugin(Plugin plugin, PluginIdentifier identifier, URLClassLoader classLoader) { Grasscutter.getLogger().info("Loading plugin: " + identifier.name); // Add the plugin's identifier. try { Class pluginClass = Plugin.class; - Method method = pluginClass.getDeclaredMethod("initializePlugin", PluginIdentifier.class); - method.setAccessible(true); method.invoke(plugin, identifier); method.setAccessible(false); + Method method = pluginClass.getDeclaredMethod("initializePlugin", PluginIdentifier.class, URLClassLoader.class); + method.setAccessible(true); method.invoke(plugin, identifier, classLoader); method.setAccessible(false); } catch (Exception ignored) { Grasscutter.getLogger().warn("Failed to add plugin identifier: " + identifier.name); }