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. The Game Instance
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.pluginManager();
Jetzt wo du eine Instanz des Plugin-Managers hast, lass sie uns benutzen.
3. Using the Sponge Class
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.pluginManager();
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.plugin.PluginContainer;
import java.util.Collection;
private Collection<PluginContainer> plugins = pluginManager.plugins();
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.plugin("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.
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#metadata() to get
its metadata which contains the name of the plugin.
private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);
private MyOtherPlugin pluginInstance = (MyOtherPlugin) myOtherPlugin.instance().orElse(null);
Bemerkung
PluginContainer#instance() will return as an Object. You need to cast it as the target plugin
after obtaining it from the container.