TextTemplates

TextTemplates son una manera fácil y conveniente de almacenar mensajes con elementos variables. Por ejemplo, puede que quiera crear un mensaje configurable para los jugadores que se han unido al servidor por primera vez. Esto es fácilmente alcanzable con TextTemplates utilizando la siguiente estrategia:

Supongamos que queremos crear un mensaje de unión donde el texto sea todo amarillo y en cursiva excepto el nombre del jugador, que será en negrita y aguamarina y el nombre del servidor que será en negrita y rojo. Podemos crear una plantilla para esa descripción utilizando el siguiente código:

import static org.spongepowered.api.text.TextTemplate.*;
import org.spongepowered.api.text.TextTemplate;
import org.spongepowered.api.text.format.TextColor;
import org.spongepowered.api.text.format.TextStyle;

TextTemplate template = of(
    TextColors.YELLOW, TextStyles.ITALIC, "Welcome to ",
    arg("server").color(TextColors.RED).style(TextStyles.BOLD), " ",
    arg("player").color(TextColors.AQUA).style(TextStyles.BOLD), "!"
);

Puede obtener el resultado de esta plantilla de texto con el método TextTemplate#apply(). El método apply() acepta un Map<String, TextElement> para parámetros donde las claves son los nombres de los argumentos y los valores son los valores TextElement que desea remplazar con los argumentos.

Nota

A menos que un argumento sea especificado como «opcional» a través de Arg.optional() cuando es creado, los parámetros faltantes suministrados para el método apply() producirá un TextTemplateArgumentException. Los argumentos también pueden especificar un valor por defecto durante su creación con Arg.defaultValue()

Nota

Aunque los argumentos pueden tener un formato de texto asociado a ellos, esto puede ser ignorado proporcionando un objeto de Texto con formato personalizado al mapa de parámetros a través del método apply().

TextTemplates, como objetos de Text son serializables al Configurar. Para guardar un TextTemplate en un archivo de configuración utilice el siguiente código. También vamos a agregar una configuración aquí para que el usuario pueda definir el nombre de su servidor.

Truco

Para aprender más sobre como utilizar la Configuración para crear archivos de configuración para su complemento por favor consulte Configurando Extensiones.

import ninja.leaping.configurate.ConfigurationNode;
import com.google.common.reflect.TypeToken;

ConfigurationNode node = loader.load();
node.getNode("serverName").setValue("My Sponge Server");
node.getNode("mytemplate").setValue(TypeToken.of(TextTemplate.class), template);
loader.save(node);

Esto producirá la siguiente salida:

serverName="My Sponge Server"
mytemplate {
    arguments {
        player {
            optional=false
        }
        server {
            optional=false
        }
    }
    content {
        color=yellow
        extra=[
            "Welcome to ",
            {
                bold=true
                color=red
                text="{server}"
            },
            " ",
            {
                bold=true
                color=aqua
                text="{player}"
            },
            "!"
        ]
        italic=true
        text=""
    }
    options {
        closeArg="}"
        openArg="{"
    }
}

Puede recuperar TextTemplates de las configuraciones utilizando el siguiente código:

TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));

Una vez que esté satisfecho con el diseño de su nuevo TextTemplate, vamos a seguir adelante y enviar esto al servidor donde un jugador se une al servidor por primera vez. Podemos conseguir eso utilizando el siguiente código:

Truco

Para aprender más sobre como manejar eventos, por favor consulte Eventos.

import com.google.common.collect.ImmutableMap;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.network.ClientConnectionEvent;
import org.spongepowered.api.text.Text;
import java.time.Instant;
import java.util.Optional;

@Listener
public void onJoin(ClientConnectionEvent.Join event) {
    Player player = event.getTargetEntity();
    Instant firstPlayed = player.firstPlayed().get();
    Instant lastPlayed = player.lastPlayed().get();
    if (firstPlayed.equals(lastPlayed)) {
        // Player has not been to this server before
        // First we will get the server name from our configuration file
        String serverName = node.getNode("serverName").getString();
        // Next we will send the template to the server,
        // using the "server" and "player" template parameters
        Text message = this.template.apply(ImmutableMap.of(
                "server", Text.of(serverName), "player", Text.of(player.getName())
        )).build();
        event.setMessage(message);
    }
}