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.