Commit d4f9820e authored by KingRainbow44's avatar KingRainbow44
Browse files

Added getting resources from the JAR

parent f3061a36
package emu.grasscutter.plugin; package emu.grasscutter.plugin;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.plugin.api.ServerHook;
import emu.grasscutter.server.game.GameServer; import emu.grasscutter.server.game.GameServer;
import java.io.InputStream;
import java.net.URLClassLoader;
/** /**
* The base class for all plugins to extend. * The base class for all plugins to extend.
*/ */
public abstract class Plugin { public abstract class Plugin {
private final ServerHook server = ServerHook.getInstance();
private PluginIdentifier identifier; private PluginIdentifier identifier;
private URLClassLoader classLoader;
/** /**
* This method is reflected into. * This method is reflected into.
...@@ -15,9 +22,11 @@ public abstract class Plugin { ...@@ -15,9 +22,11 @@ public abstract class Plugin {
* Set plugin variables. * Set plugin variables.
* @param identifier The plugin's identifier. * @param identifier The plugin's identifier.
*/ */
private void initializePlugin(PluginIdentifier identifier) { private void initializePlugin(PluginIdentifier identifier, URLClassLoader classLoader) {
if(this.identifier == null) if(this.identifier == null)
this.identifier = identifier; this.identifier = identifier;
if(this.classLoader == null)
this.classLoader = classLoader;
else Grasscutter.getLogger().warn(this.identifier.name + " had a reinitialization attempt."); else Grasscutter.getLogger().warn(this.identifier.name + " had a reinitialization attempt.");
} }
...@@ -55,7 +64,24 @@ public abstract class Plugin { ...@@ -55,7 +64,24 @@ public abstract class Plugin {
* @return A server instance. * @return A server instance.
*/ */
public final GameServer getServer() { 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. */ /* Called when the plugin is first loaded. */
......
...@@ -73,7 +73,7 @@ public final class PluginManager { ...@@ -73,7 +73,7 @@ public final class PluginManager {
Class<?> pluginClass = loader.loadClass(pluginConfig.mainClass); Class<?> pluginClass = loader.loadClass(pluginConfig.mainClass);
Plugin pluginInstance = (Plugin) pluginClass.getDeclaredConstructor().newInstance(); 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. fileReader.close(); // Close the file reader.
} catch (ClassNotFoundException ignored) { } catch (ClassNotFoundException ignored) {
...@@ -89,14 +89,14 @@ public final class PluginManager { ...@@ -89,14 +89,14 @@ public final class PluginManager {
* Load the specified plugin. * Load the specified plugin.
* @param plugin The plugin instance. * @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); Grasscutter.getLogger().info("Loading plugin: " + identifier.name);
// Add the plugin's identifier. // Add the plugin's identifier.
try { try {
Class<Plugin> pluginClass = Plugin.class; Class<Plugin> pluginClass = Plugin.class;
Method method = pluginClass.getDeclaredMethod("initializePlugin", PluginIdentifier.class); Method method = pluginClass.getDeclaredMethod("initializePlugin", PluginIdentifier.class, URLClassLoader.class);
method.setAccessible(true); method.invoke(plugin, identifier); method.setAccessible(false); method.setAccessible(true); method.invoke(plugin, identifier, classLoader); method.setAccessible(false);
} catch (Exception ignored) { } catch (Exception ignored) {
Grasscutter.getLogger().warn("Failed to add plugin identifier: " + identifier.name); Grasscutter.getLogger().warn("Failed to add plugin identifier: " + identifier.name);
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment