diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java new file mode 100644 index 0000000..105df77 --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginLoader.java @@ -0,0 +1,88 @@ +package org.patchbukkit.loader; + +import java.io.File; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; +import org.bukkit.event.Event; +import org.bukkit.event.Listener; +import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.InvalidDescriptionException; +import org.bukkit.plugin.InvalidPluginException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginLoader; +import org.bukkit.plugin.RegisteredListener; +import org.bukkit.plugin.UnknownDependencyException; +import org.bukkit.plugin.java.JavaPlugin; + +@SuppressWarnings("deprecation") +public class PatchBukkitPluginLoader implements PluginLoader { + + public static JavaPlugin createPlugin(String jarPath, String mainClass) { + try { + File jarFile = new File(jarPath); + if (!jarFile.exists()) { + System.err.println( + "[PatchBukkit] Plugin file does not exist: " + jarPath + ); + return null; + } + + PatchBukkitPluginClassLoader classLoader = + new PatchBukkitPluginClassLoader( + PatchBukkitPluginLoader.class.getClassLoader(), + jarFile + ); + + Class jarClass = Class.forName(mainClass, true, classLoader); + return (JavaPlugin) jarClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public Plugin loadPlugin(File file) + throws InvalidPluginException, UnknownDependencyException { + throw new UnsupportedOperationException("Use createPlugin() instead"); + } + + @Override + public PluginDescriptionFile getPluginDescription(File file) + throws InvalidDescriptionException { + throw new UnsupportedOperationException( + "Use PatchBukkitPluginClassLoader.getDescription() instead" + ); + } + + @Override + public Pattern[] getPluginFileFilters() { + return new Pattern[] { Pattern.compile("\\.jar$") }; + } + + @Override + public void enablePlugin(Plugin plugin) { + if (plugin instanceof JavaPlugin javaPlugin) { + javaPlugin.setEnabled(true); + } + } + + @Override + public void disablePlugin(Plugin plugin) { + if (plugin instanceof JavaPlugin javaPlugin) { + javaPlugin.setEnabled(false); + } + } + + @Override + public Map< + Class, + Set + > createRegisteredListeners(Listener listener, Plugin plugin) { + // TODO: Implement event listener registration when event system is needed + // For now, return empty map - plugins won't be able to register events + return Map.of(); + } +} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PluginLoader.java b/java/patchbukkit/src/main/java/org/patchbukkit/PluginLoader.java deleted file mode 100644 index 478985d..0000000 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PluginLoader.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.patchbukkit.loader; - -import io.papermc.paper.plugin.provider.util.ProviderUtil; -import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.plugin.java.JavaPlugin; - -public class PluginLoader { - - private static final Logger LOGGER = Logger.getLogger("PatchBukkit"); - - public static JavaPlugin createPlugin(String jarPath, String mainClass) { - try { - File jarFile = new File(jarPath); - if (!jarFile.exists()) { - LOGGER.severe("Plugin file does not exist: " + jarPath); - return null; - } - - PatchBukkitPluginClassLoader classLoader = - new PatchBukkitPluginClassLoader( - PluginLoader.class.getClassLoader(), - jarFile - ); - - return ProviderUtil.loadClass( - mainClass, - JavaPlugin.class, - classLoader - ); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/java/patchbukkit/src/main/resources/META-INF/services/org.bukkit.plugin.PluginLoader b/java/patchbukkit/src/main/resources/META-INF/services/org.bukkit.plugin.PluginLoader new file mode 100644 index 0000000..0a061b3 --- /dev/null +++ b/java/patchbukkit/src/main/resources/META-INF/services/org.bukkit.plugin.PluginLoader @@ -0,0 +1 @@ +org.patchbukkit.loader.PatchBukkitPluginLoader diff --git a/rust/src/plugin/manager.rs b/rust/src/plugin/manager.rs index 2199447..3849799 100644 --- a/rust/src/plugin/manager.rs +++ b/rust/src/plugin/manager.rs @@ -150,13 +150,9 @@ impl PluginManager { } pub fn load_all_plugins(&mut self, jvm: &Jvm) -> Result<()> { - let loader = jvm.create_instance( - "org.patchbukkit.loader.PluginLoader", - InvocationArg::empty(), - )?; for plugin in &mut self.plugins { - let result = jvm.invoke( - &loader, + let result = jvm.invoke_static( + "org.patchbukkit.loader.PatchBukkitPluginLoader", "createPlugin", &[ InvocationArg::try_from(&plugin.path.to_string_lossy().to_string())?,