Сервисы

Почти всё (события, права и т.д.) обрабатывается с помощью сервисов. Доступ ко всем сервисам осуществляется через менеджер сервисов:

import org.spongepowered.api.Sponge;

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

Если нужно получить ссылку на что-либо, это можно сделать с помощью менеждера сервисов.

Руководства по Сервисам

  • Сервисы должны регистрироваться в состоянии игры POST_INITIALIZATION.
  • Сервисы должны полностью функционировать в состоянии игры SERVER_ABOUT_TO_START.

Подробнее о состояниях игры прочитайте на странице Жизненный цикл плагина.

Примечание

Рекомендуется регистрировать сервисы как можно скорее, чтобы другие плагины могли увидеть данный сервис.

Предоставление собственного сервиса

Ваш плагин может предоставить реализацию для интерфейса ядра, такого как PermissionService, или реализацию пользовательского интерфейса, который не является частью Sponge API (например, экономика, веб-сервер):

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

Объект provider должен реализовывать интерфейс или класс service.

Такая схема API делает Sponge очень модульным.

Примечание

Плагины должны предоставлять возможность отключать свою реализацию интерфейсов, кроме случая, когда это единственная функция плагина.

Пример: предоставление простого сервиса варпов

Первый шаг не обязателен, но рекомендуется. Нужно перечислить публичные функции класса сервиса в интерфейсе:

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);
}

Теперь можно написать класс, реализующий этот интерфейс:

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);
    }
}

Теперь мы можем зарегистрировать новый экземпляр класса в менеджере сервисов. Мы используем интерфейс WarpService.class в качестве параметра service.

Это даёт возможность другим разработчикам плагинов написать собственную реализацию сервиса (которая реализует интерфейс), заменив существующую.

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

Теперь другие плагины могут получить доступ к сервису через менеджер сервисов:

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

Совет

Если вы не хотите использовать интерфейсы, просто замените параметр service на ваш класс (в примере - SimpleWarpService.class).