Gestionnaire de Plugin
Le gestionnaire de Plugin (Plugin Manager) est ce vers quoi votre plugin est envoyé, après avoir été chargé par le serveur au démarrage. Le serveur charge votre plugin en trouvant sa classe principale, repérée par l’annotation Plugin, et envoie une nouvelle instance de celle-ci au gestionnaire. Le gestionnaire maintient ensuite cette instance dans sa propre collection à laquelle vous pouvez accéder en utilisant les méthodes fournies par celui-ci, vous permettant ainsi d’interagir facilement avec un autre plugin chargé si vous le désirez.
La Classe PluginManager
Les méthodes publiques à l’intérieur du PluginManager sont utilisées pour récupérer des informations à propos de la collection actuelle des plugins chargés, par l’intermédiaire de leur instance. Les plugins sont stockés dans un PluginContainer (détaillé dans la section suivante) pour permettre une centralisation facile des informations sur le plugin spécifique. Par exemple, vous pouvez utiliser le PluginManager
pour communiquer avec un autre plugin, récupérer son instance et utiliser les méthodes qu’il propose pour fournir une compatibilité ou des fonctionnalités étendues au moyen de votre plugin.
Obtenir le gestionnaire de plugin
Vous pouvez obtenir une instance du PluginManager
du serveur de plusieurs manières différentes.
1. Injection de dépendances
Astuce
Voir le guide Injection de Dépendances pour toute aide sur l’utilisation des injections de dépendances.
Le PluginManager
est l’une des rares instances de l’API qui est injectée dans la classe principale lorsqu’elle est chargée. Pour demander une référence, créez une nouvelle variable contenant l’instance du PluginManager
et annotez-la simplement avec @Inject
.
import com.google.inject.Inject;
import org.spongepowered.api.plugin.PluginManager;
@Inject
private PluginManager pluginManager;
2. Le gestionnaire de Services
Astuce
Voir Services pour un guide complet sur le Gestionnaire de Services.
Le gestionnaire de services possède également une instance du PluginManager
du serveur. Il suffit d’utiliser la méthode ServiceManager#provide(Class)`, en passant la classe (PluginManager.class
) du PluginManager
en paramètre.
private PluginManager pluginManager = serviceManager.provideUnchecked(PluginManager.class);
3. L’instance de jeu
Astuce
Voir les JavaDocs de Game pour une information plus complète sur la classe, ainsi que ses méthodes et leur utilisation.
Une instance de jeu peut, elle aussi, fournir une référence du PluginManager
du serveur pour plus de commodité.
private PluginManager pluginManager = game.getPluginManager();
Maintenant que vous avez une instance du gestionnaire de plugin, utilisons-la.
4. Utilisation de la Classe Sponge
La classe Sponge fonctionne à peu près comme Game
, à l’exception du fait que Sponge
contenant des méthodes statiques, on peut y accéder à n’importe quel endroit du plugin. Vous n’avez donc pas besoin d’instances la classe, comme vous le feriez pour Game
.
import org.spongepowered.api.Sponge;
private PluginManager pluginManager = Sponge.getPluginManager();
Utiliser le Gestionnaire de Plugins
Le gestionnaire de plugin fournit plusieurs méthodes pour travailler avec des plugins.
Un grand nombre de méthodes retournent des conteneurs de plugin, qui seront détaillés dans la section suivante. Les conteneurs de plugin sont comme ils le sous-entendent des « contenants » d’une instance actuelle de plugin.
Avec le gestionnaire de plugin, il est possible d’obtenir tous les plugins actuellement chargés via le gestionnaire de plugin:
import org.spongepowered.api.plugin.PluginContainer;
import java.util.Collection;
private Collection<PluginContainer> plugins = pluginManager.getPlugins();
Ou bien, il est possible d’obtenir directement une instance vers un conteneur de plugin, par l’exemple illustré ci-dessous:
private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);
La Classe PluginContainer
Lorsque vous récupérez un plugin depuis le PluginManager
, vous remarquerez très vite qu’il ne vous est pas donné une instance immédiate du plugin demandé. Au lieu de cela, vous recevrez un PluginContainer
contenant des informations sur le plugin obtenues par son annotation @Plugin
dans sa classe principale, ainsi que l’instance chargée.
Le PluginContainer
contiendra toutes les informations génériques sur le plugin définies par son développeur d’origine. Vous pouvez utiliser ses informations dans votre plugin secondaire, au lieu de coder en dur ce que vous savez à propos de lui. Un exemple de scénario serait que si le développeur d’origine change le nom du plugin, les références à ce dernier dans le plugin secondaire ne deviendraient pas fausses à la suite de ce changement, à condition que vous ayez utilisé la méthode PluginContainer#getName() pour obtenir son nom.
private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);
private MyOtherPlugin pluginInstance = (MyOtherPlugin) myOtherPlugin.getInstance().orElse(null);
Note
La méthode PluginContainer#getInstance() retourna un Object
. Vous devez le caster (convertir son type) du même type que le plugin cible après l’avoir obtenu du conteneur.