diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java index 069cfd66b..63904e4c0 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java +++ b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java @@ -2,6 +2,7 @@ package net.md_5.bungee.api; import net.md_5.bungee.api.plugin.PluginManager; import com.google.common.base.Preconditions; +import java.io.File; import java.net.InetSocketAddress; import java.util.Collection; import java.util.Map; @@ -221,4 +222,11 @@ public abstract class ProxyServer * @return the console command sender of this proxy */ public abstract CommandSender getConsole(); + + /** + * Return the folder used to load plugins from. + * + * @return the folder used to load plugin + */ + public abstract File getPluginsFolder(); } diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java b/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java index ce3158551..38fe3f6fe 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/Plugin.java @@ -1,6 +1,9 @@ package net.md_5.bungee.api.plugin; +import java.io.File; +import java.io.InputStream; import lombok.Getter; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ConfigurationAdapter; /** @@ -12,6 +15,8 @@ public class Plugin @Getter private PluginDescription description; + @Getter + private ProxyServer proxy; /** * Called when the plugin has just been loaded. Most of the proxy will not @@ -36,13 +41,38 @@ public class Plugin { } + /** + * Gets the data folder where this plugin may store arbitrary data. It will + * be a child of {@link ProxyServer#getPluginsFolder()}. + * + * @return the data folder of this plugin + */ + public final File getDataFolder() + { + return new File( getProxy().getPluginsFolder(), getDescription().getName() ); + } + + /** + * Get a resource from within this plugins jar or container. Care must be + * taken to close the returned stream. + * + * @param name the full path name of this resource + * @return the stream for getting this resource, or null if it does not + * exist + */ + public final InputStream getResourceAsStream(String name) + { + return getClass().getClassLoader().getResourceAsStream( name ); + } + /** * Called by the loader to initialize the fields in this plugin. * * @param description the description that describes this plugin */ - final void init(PluginDescription description) + final void init(ProxyServer proxy, PluginDescription description) { + this.proxy = proxy; this.description = description; } } diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java index 772c04904..967280108 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginManager.java @@ -15,6 +15,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; import java.util.regex.Pattern; +import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; @@ -24,11 +25,14 @@ import org.yaml.snakeyaml.Yaml; * Class to manage bridging between plugin duties and implementation duties, for * example event handling and plugin management. */ +@RequiredArgsConstructor public class PluginManager { private static final Pattern argsSplit = Pattern.compile( " " ); /*========================================================================*/ + private final ProxyServer proxy; + /*========================================================================*/ private final Yaml yaml = new Yaml(); private final EventBus eventBus = new EventBus(); private final Map plugins = new HashMap<>(); @@ -176,7 +180,7 @@ public class PluginManager Class main = loader.loadClass( desc.getMain() ); Plugin plugin = (Plugin) main.getDeclaredConstructor().newInstance(); - plugin.init( desc ); + plugin.init( proxy, desc ); plugins.put( desc.getName(), plugin ); plugin.onLoad(); ProxyServer.getInstance().getLogger().log( Level.INFO, "Loaded plugin {0} version {1} by {2}", new Object[] diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 7a417bfc1..f97d9f3d9 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -92,7 +92,7 @@ public class BungeeCord extends ProxyServer * Plugin manager. */ @Getter - public final PluginManager pluginManager = new PluginManager(); + public final PluginManager pluginManager = new PluginManager(this); @Getter @Setter private ReconnectHandler reconnectHandler; @@ -100,6 +100,8 @@ public class BungeeCord extends ProxyServer @Setter private ConfigurationAdapter configurationAdapter = new YamlConfig(); private final Collection pluginChannels = new HashSet<>(); + @Getter + private final File pluginsFolder = new File( "plugins" ); { @@ -168,9 +170,8 @@ public class BungeeCord extends ProxyServer @Override public void start() throws IOException { - File plugins = new File( "plugins" ); - plugins.mkdir(); - pluginManager.loadPlugins( plugins ); + pluginsFolder.mkdir(); + pluginManager.loadPlugins( pluginsFolder ); config.load(); if ( reconnectHandler == null ) {