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 TextTemplate
s 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()
.
TextTemplate
s, 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 TextTemplate
s 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);
}
}