Administrador de Complementos
El Administrador de Complementos es a donde se envía el complemento después de ser cargado por el servidor al inicio. El servidor carga su complemento encontrando su clase principal, anotada por la anotación Plugin que contiene su información general, y le envía una nueva instancia al administrador. Luego, el administrador conserva esa instancia en su propia colección para que pueda examinarla y utilizar métodos proporcionados por ella misma, lo que le permite interactuar fácilmente con otro complemento cargado si lo desea.
La Clase de Administrador de Complementos
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.
Obteniendo el Administrador de Complementos
Usted puede obtener una instancia del PluginManager del servidor utilizando algunas maneras diferentes.
1. Inyección de Dependencia
Truco
Consulte la guía Inyección de Dependencia para obtener ayuda sobre cómo usar la inyección de dependencia.
El PluginManager es una de las pocas instancias de API que se inyectan en la clase principal luego de ser cargadas. Para solicitar una referencia, crea una nueva variable para contener la instancia de PluginManager y simplemente anotarla con @Inject.
import com.google.inject.Inject;
import org.spongepowered.api.plugin.PluginManager;
@Inject
private PluginManager pluginManager;
2. The Game Instance
Truco
Consulte los JavaDocs para Game para obtener información completa sobre la clase, así como sus métodos y su uso.
Una instancia del juego puede proporcionar una referencia al PluginManager del servidor también por conveniencia.
private PluginManager pluginManager = game.pluginManager();
Ahora que tiene una instancia para el administrador de complementos, vamos a usarlo.
3. Using the Sponge Class
La clase Sponge funciona de forma similar a Game, con la excepción de que Sponge contiene métodos estáticos. Se puede acceder desde cualquier lugar de su complemento. Tampoco necesita almacenar una instancia de la misma, como sucede con Game.
import org.spongepowered.api.Sponge;
private PluginManager pluginManager = Sponge.pluginManager();
Usando el Administrador de Complementos
El administrador de complementos proporciona varios métodos para trabajar con complementos.
Muchos métodos devuelven contenedores de complementos, que se analizarán en la siguiente sección. Los contenedores de complementos son prácticamente «contenedores» que se explican por sí mismos de la instancia del complemento real.
Con el administrador de complementos, es posible obtener todos los complementos actualmente cargados a través del administrador de complementos:
import org.spongepowered.plugin.PluginContainer;
import java.util.Collection;
private Collection<PluginContainer> plugins = pluginManager.plugins();
O bien, es posible obtener una instancia de un contenedor de complemento directamente, mediante el ejemplo que se muestra a continuación:
private PluginContainer myOtherPlugin = pluginManager.plugin("myOtherPluginId").orElse(null);
La Clase del Contenedor de Complementos
Cuando tomes un complemento del PluginManager, notarás muy rápidamente que no te dan una instancia inmediata del complemento solicitado. En su lugar, será recibido por un PluginContainer que contiene información sobre el complemento obtenido de su anotación @Plugin en su clase principal, así como también la instancia cargada.
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);
Nota
PluginContainer#instance() will return as an Object. You need to cast it as the target plugin
after obtaining it from the container.