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

Die öffentlichen Methoden innerhalb des PluginManagers werden dazu genutzt, um Informationen der geladenen Plugins zu sammeln. Die Plugins werden in einem PluginContainer gespeichert (werden im nächsten Abschnitt angesprochen), damit man einfacher an Informationen über ein spezielles Plugin kommt. Du kannst den PluginManager z. B. dafür verwenden, um mit anderen Plugins zu kommunizieren, indem du die Instanz des anderen Plugin erhälst, um dessen Funktionen zu nutzen, um z. B. dein Plugin kompatibel zu machen oder deinem Plugin neue Features hinzuzufügen.

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 Service Manager

Tipp

Schau dir Services 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.provide(PluginManager.class);

3. 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.getPluginManager();

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

4. 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.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.List;

private List<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").orNull();

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").orNull();
private MyOtherPlugin pluginInstance = (MyOtherPlugin) myOtherPlugin.getInstance();

Bemerkung

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