Plugin-Manager

Nachdem dein Plugin vom Server beim Startvorgang geladen wurde, wird es zum Plugin-Manager geschickt. Der Server lädt das Plugin, indem es dessen Hauptklasse, die durch die Plugin-Annotation markiert ist, welche die allgemeinen Informationen des Plugins enthält, und sendet eine neue Instanz des Plugins zum Manager. Der Manager hat seine eigene Sammlung von Plugins, in die deines auch eingefügt wird. So kannst du mithilfe dessen einfach auf jedes andere geladene Plugin zugreifen.

Die PluginManager-Klasse

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.

Wie kommt man an den Plugin-Manager

Du kannst an die Instanz des PluginManager\s über mehrere Wege kommen.

1. Dependency-Injection

Tipp

Schau dir den Dependency Injection Guide an, falls du Hilfe bei der Dependency Injection brauchst.

Der Plugin-Manager ist eine der wenigen API-Instanzen, die in die Main-Klasse eingefügt werden, während diese geladen wird. Um eine Referenz zu erhalten, erstelle eine neue Variable, die die Plugin-Manager-Instanz enthalte soll und schreibe @Inject darüber.

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

@Inject
private PluginManager pluginManager;

2. Der Service-Manager

Tipp

Schau dir Dienste für einen ausführlichen Guide über den Service-Manager an.

Der Service-Manager hält eine Instanz des PluginManagers. Du kannst einfach die Methode ServiceManager#provide(Class) benutzen und die PluginManager-Klasse (PluginManager.class) als Parameter übergeben.

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

3. Die Game-Instanz

Tipp

Schau dir die JavaDocs von Game an, um detaillierte Informationen über die Klasse, deren Methoden und Verwendung dieser zu bekommen.

Eine Game-Instanz kann auch eine Referenz zu dem PluginManager bieten, um den Zugriff zu erleichtern.

private PluginManager pluginManager = game.getPluginManager();

Jetzt wo du eine Instanz des Plugin-Managers hast, lass sie uns benutzen.

4. Verwendung der Sponge Klasse

Die Sponge-Klasse funktioniert ähnlich zu Game, mit der Ausnahme, dass Sponge statische Methoden enthält, die von überall in deinem Plugin aufgerufen werden können. Du musst deshalb also keine Instanz davon bereithalten, wie du es für Game tun musst.

import org.spongepowered.api.Sponge;

private PluginManager pluginManager = Sponge.getPluginManager();

Den Plugin-Manager benutzen

Der Plugin-Manager bietet viele Methoden, um mit Plugins zu arbeiten.

Viele Methoden geben einen sog. Plugin-Container zurück, auf dessen Methoden in dem nächsten Abschnitt eingegangen wird. Diese sog. Plugin-Container sind im Grunde selbsterklärend, denn diese beinhalten eine Plugin-Instanz.

Mit dem Plugin-Manager bekommst du Zugriff auf alle bereits geladene Plugins, die durch diesen Plugin-Manager geladen wurden:

import org.spongepowered.api.plugin.PluginContainer;

import java.util.Collection;

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

Oder man holt sich direkt die Instanz eines Plugins in einen PluginContainer. Ein Beispiel dazu findest du direkt unter diesem Text:

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

Die PluginContainer-Klasse

Wenn du ein Plugin von dem PluginManager holst, dann hast du bestimmt schnell gemerkt, dass du keine unmittelbare Instanz des Plugins bekommen hast, sondern einen PluginContainer der Informationen über das Plugin enthält. Diese Informationen kommen von der @Plugin Annotation in der Hauptklasse des Plugins und aus der geladenen Instanz.

Der PluginContainer enthält jede übergeordnete Information über das Plugin, die der Programmierer festgelegt hast. Du kannst diese Informationen dazu benutzten, um das „hard-coden“ (das direkte einprogrammieren von statischen Werten) zu umgehen. Ein mögliches Szenario könnte z.B. sein: das der Programmierer den Namen seines Plugins ändert, dies muss aber nicht direkt zu einer Inkompatibilität führen, wenn du die PluginContainer#getName() Methode benutzt, um den Namen des Plugins zu bekommen.

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

Bemerkung

Die PluginContainer#getInstance()-Methode gibt als Resultat ein Object zurück. Dieses Object musst du dann zu deinem gewünschten Plugin casten.