Tworzenie Placeholderów

Ostrzeżenie

Ta dokumentacja została napisana dla SpongeAPI 7 i możliwe, że jest już przestarzała. Jeśli masz ochotę wspomóc w jej aktualizacji, prosimy, utwórz PR!

Główną umiejętnością Placeholder API Sponge-a jest tworzenie własnych tokenów i udostępnianie ich innym pluginom. Aby stworzyć swój własnych placeholder, musisz utworzyć obiekt, który implementuje PlaceholderParser oraz zarejestrować go w odpowiednim rejestrze.

Tworzenie PlaceholderParserów

Istnieją dwa sposoby na utworzenie PlaceholderParser'a:

Obiekty PlaceholderParser przyjmują obiekt PlaceholderContext, który zawiera kontekst żądania oraz zwracają Component bazując na tym kontekście. Informacje jakie PlaceholderContext może zawierać to:

  • Powiązany obiekt, taki jak Player

  • Argument string, który na zazwyczaj będzie dostarczony przez silnik szablonów.

Jest to minimum określone przez Sponge.

Jeśli Twój placeholder nie potrafi dostarczyć tekstu z powodu niepełnego kontekstu lub braku jakichś argumentów, powinien zwrócić pusty Component i nie rzucać wyjątkiem.

Wskazówka

Jeśli chcesz dodać możliwość przekazywania wielu argumentów do swojego placeholder’a, zastanów się nad dzieleniem argumentu string.

Pamiętaj aby poinformować użytkowników Twojego pluginu jak argument string powinien wyglądać.

Przykład: PlaceholderParser dla nazwy domyślnego świata

Ten PlaceholderParser próbuje uzyskać domyślną nazwę świata, zwracając pusty Component jeśli nie uda mu się jej wydobyć. Używa builder-a, aby utworzyć parser o ID spongedocs:defaultworld, przyjmując, że ID pluginu to spongedocs.

import net.kyori.adventure.text.Component;

PluginContainer thisPlugin = ...;

PlaceholderParser parser = PlaceholderParser.builder()
    .plugin(this.thisPlugin)
    .id("defaultworld")
    .name("Default World Placeholder")
    .parser(placeholderContext -> {
        return Sponge.getServer()
            .getDefaultWorld()
            .map(x -> x.getWorldName())
            .orElse(Component.empty());
    })
    .build();

Example: Player Location PlaceholderParser

Ten PlaceholderParser próbuje wydobyć pozycję gracza na świecie. Jeśli zostanie użyty bez obiektu Player, zwróci pusty Component. To implementuje interfejs PlaceholderParser bezpośrednio.

import net.kyori.adventure.text.TextComponent;

public class PlayerLocationPlaceholder implements PlaceholderParser {

    @Override
    public String getId() {
        return "spongedocs:location"
    }

    @Override
    public String getName() {
        return "Location Placeholder"
    }

    @Override
    public Component parse(PlaceholderContext placeholderContext) {
        placeholderContext.associatedObject()
            .filter(x -> x instanceof Player)
            .map(player -> ((Player) player).getLocation())
            .map(location -> TextComponent.ofChildren(
                Component.text("World: "),
                Component.text(location.getExtent().getName()),
                Component.text(" - "),
                Component.text(location.getPosition())))
            .orElse(Component.empty());
    }
}

Example: Current Time PlaceholderParser

This PlaceholderParser returns the current time in the server’s local timezone. If the string „UTC” is provided as the argument string, it returns the current time in the UTC time zone. This implements the PlaceholderParser interface directly.

public class CurrentTimePlaceholder implements PlaceholderParser {

    @Override
    public String getId() {
        return "spongedocs:currenttime";
    }

    @Override
    public String getName() {
        return "Current Time parser";
    }

    @Override
    public Component parse(PlaceholderContext placeholderContext) {
        if (placeholderContext.argumentString().filter(x -> x.equalsIgnoreCase("UTC")).isPresent()) {
            return Component.text(OffsetDateTime.now(ZoneOffset.UTC).format(FORMATTER));
        }
        return Component.text(OffsetDateTime.now().format(FORMATTER));
    }

}

Registering Your PlaceholderParser

For your parser to be easily accessible to other plugins, it must be registered in the registry. This should be done by listening to the GameRegistryEvent.Register<PlaceholderParser> event and registering your parsers using the register method.

Example: Registering a PlaceholderParser

PlaceholderParser parser = ...;

@Listener
public void registerTokensEvent(GameRegistryEvent.Register<PlaceholderParser> event) {
    event.register(this.parser);
}