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. El Administrador de Servicio
Truco
Vea Servicios para obtener una guía completa sobre el Administrador de Servicio.
El administrador del servicio también tiene una instancia del PluginManager
del servidor. Simplemente use el método ServiceManager#provide(Class), pasando la clase PluginManager
“s (PluginManager.class
) como parámetro.
private PluginManager pluginManager = serviceManager.provideUnchecked(PluginManager.class);
3. La Instancia del Juego
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.getPluginManager();
Ahora que tiene una instancia para el administrador de complementos, vamos a usarlo.
4. Usando la Clase Sponge
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.getPluginManager();
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.api.plugin.PluginContainer;
import java.util.Collection;
private Collection<PluginContainer> plugins = pluginManager.getPlugins();
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.getPlugin("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.
El PluginContainer
contendrá cualquier información genérica sobre el complemento establecido por su desarrollador propietario. Puede usar información desde aquí en lugar de codificar lo que sabe sobre él en su complemento de soporte. Un escenario de ejemplo sería si el desarrollador propietario cambia el nombre del complemento, las referencias a este último en el complemento de soporte no se convertirían en incorrectas como resultado de este cambio, siempre y cuando haya utilizado el método PluginContainer#getName() para obtener su nombre.
private PluginContainer myOtherPlugin = pluginManager.getPlugin("myOtherPluginId").orElse(null);
private MyOtherPlugin pluginInstance = (MyOtherPlugin) myOtherPlugin.getInstance().orElse(null);
Nota
PluginContainer#getInstance() volverá como Object
. Debe convertirlo como el complemento de destino después de obtenerlo del contenedor.