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. Dependency Injection

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

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

Ahora que tiene una instancia para el administrador de complementos, vamos a usarlo.

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