Plugin Manager

The Plugin Manager is what your plugin gets sent to after being loaded by the server at startup. The server loads your plugin by finding its main class, annotated by the Plugin annotation that holds its general information, and sends a new instance of it to the manager. The manager then keeps that instance in its own collection that you can look into and pull from using methods provided by itself, thus allowing you to easily interact with another loaded plugin if you so desire.

The PluginManager Class

Public methods inside the PluginManager are used to grab information about the current collection of loaded plugins, alongside their instances. The plugins are stored inside a PluginContainer (discussed in next section) to allow for an easy center of information about the specific plugin. As an example, you can use the PluginManager to communicate with another plugin, grabbing its instance and using the methods it offers to provide compatibility or extended features by means of your calling plugin.

Obtaining the Plugin Manager

Je kan op verschillende manieren een instantie van de servers PluginManager verkrijgen.

1. Dependency Injection

Tip

Zie de Dependency Injection handleiding voor hulp bij het gebruik van dependency injection.

De PluginManager is een van de weinige API instanties die geïnjecteerd wordt in de main klasse wanneer het geladen wordt. Om een referentie naar de instantie te verkrijgen maak je simpelweg een nieuwe variabele aan waar de PluginManager instantie kan gestoken worden en annoteer je deze met @Inject.

import com.google.inject.Inject;
import org.spongepowered.api.plugin.PluginManager;

@Inject
private PluginManager pluginManager;

2. The Service Manager

Tip

Zie Services voor een volledige handleiding over de Service Manager.

The service manager also holds an instance of the server’s PluginManager. Simply use the method ServiceManager#provide(Class), passing the PluginManager’s class (PluginManager.class) as a parameter.

private PluginManager pluginManager = serviceManager.provideUnchecked(PluginManager.class);

3. The Game Instance

Tip

See the JavaDocs for Game for full information about the class, as well as its methods and their usage.

Een game instance kan eveneens een referentie naar de servers PluginManager voorzien.

private PluginManager pluginManager = game.getPluginManager();

Nu dat je een instantie hebt van de plugin manager, laten we het gebruiken.

4. Using the Sponge Class

The Sponge class works similarly to Game, with the exception that since Sponge contains static methods. It can be accessed anywhere throughout your plugin. You also do not need to store an instance of it, as you would need to do with Game.

import org.spongepowered.api.Sponge;

private PluginManager pluginManager = Sponge.getPluginManager();

Using the Plugin Manager

De plugin manager voorziet enkele methodes om te werken met plugins.

Een heleboel methodes geven plugin containers terug, die we bespreken in het volgende deel. Plugin containers zij vrij vanzelfsprekend “containers” die de eigenlijke plugin bevatten.

Met de plugin manager wordt het mogelijk om alle plugins te verkrijgen die momenteel zijn geladen via de plugin manager:

import org.spongepowered.api.plugin.PluginContainer;

import java.util.Collection;

private Collection<PluginContainer> plugins = pluginManager.getPlugins();

Of, het is mogelijk om een instantie van de plugin container te verkrijgen zoals wordt aangetoond in het onderstaande voorbeeld:

private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);

De PluginContainer Klasse

Wanneer je een plugin neemt van de PluginManager zal je al snel opmerken dat je niet meteen een instantie krijgt van de gevraagde plugin. In de plaats daarvan zal je een PluginContainer krijgen die informatie bevat over de plugin dat verkregen is via de @Plugin annotatie in de main klasse van de plugin en de ingelade instantie zelf.

The PluginContainer will hold any generic information about the plugin set by its owning developer. You can use information from here instead of hard-coding what you know about it in your supporting plugin. An example scenario would be if the owning developer changes the name of the plugin, references to the latter in the supporting plugin would not become wrong as a result of this change, provided you’ve used the method PluginContainer#getName() to get its name.

private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);
private MyOtherPlugin pluginInstance = (MyOtherPlugin) myOtherPlugin.getInstance().orElse(null);

Notitie

PluginContainer#getInstance() will return as an Object. You need to cast it as the target plugin after obtaining it from the container.