Servicios

Casi todo (eventos, permisos, etc.) se maneja a través de servicios. Todos los servicios se acceden a través del administrador de servicios:

import org.spongepowered.api.Sponge;

Sponge.getServiceManager().provide(EventManager.class);

Si necesitas obtener una referencia de objeto a algo, puedes obtenerla del administrador de servicios.

Lineamientos de Servicio

  • Los servicios deben ser registrados como tarde, durante el estado “POST_INICIALIZATION” del juego.

  • Los servicios deberían estar operando totalmente cuando surja el estado de juego SERVER_ABOUT_TO_START.

Puede leer más sobre los estados de juego en la página Ciclo de vida del Plugin.

Nota

Es una buena práctica registrar los servicios tan pronto como sea posible, a fin de que otros plugins puedan notar que el servicio será ofrecido.

Proveyendo su propio servicio

Su plug-in puede proporcionar la implementación para una interfaz base como PermissionService, o para una interfaz personalizada que no es parte del API de Sponge (economy, servidor web):

Sponge.getServiceManager().setProvider(Object plugin, Class<T> service, T provider);

El objeto provider debe implementar la interfaz o clase service.

Diseñando el API de esta manera hace de Sponge extremadamente modular.

Nota

Los plug-ins deberían proporcionar opciones para no instalar sus proveedores si el plug-in no se dedica a una sola función.

Ejemplo: Proporcionando un simple servicio warp

El primer paso es opcional, pero es recomendado. Especifica los métodos públicos de la clase de servicio en una interfaz:

import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import java.util.Optional;

public interface WarpService {
    void setWarp(String name, Location<World> location);
    Optional<Location<World>> getWarp(String name);
}

Ahora puede escribir la clase que implementa tu interfaz:

import java.util.HashMap;

public class SimpleWarpService implements WarpService {
    HashMap<String, Location<World>> warpMap = new HashMap<String, Location<World>>();

    @Override
    public Optional<Location<World>> getWarp(String name) {
        if(!warpMap.containsKey(name)) {
            return Optional.empty();
        } else {
            return Optional.of(warpMap.get(name));
        }
    }

    @Override
    public void setWarp(String name, Location<World> location) {
        warpMap.put(name, location);
    }
}

Ahora podemos registrar una nueva instancia de la clase en el administrador de servicios. Estamos utilizando la interfaz WarpService.class como la clave de service.

Esto hace posible para otro desarrollador de plug-in escribir su propia implementación de su servicio (que implementa la interfaz) y reemplazar su versión.

Sponge.getServiceManager().setProvider(yourPluginInstance, WarpService.class, new SimpleWarpService());

Otros Plugins pueden acceder ahora a su servicio a través del administrador de servicios:

Sponge.getServiceManager().provide(WarpService.class);

Truco

Si no quiere usar interfaces, sólo reemplace la clave service con su clase (SimpleWarpService.class en el ejemplo).