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
Your plugin can provide the implementation for a core interface like PermissionService, or for a custom interface that is not part of SpongeAPI (e.g. economy, web server):
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.
PluginContainer plugin = ...;
Sponge.getServiceManager().setProvider(plugin, 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).