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 PluginManager
s. 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.