TextTemplates
Les TextTemplates sont une façon facile et pratique de stocker les messages avec des éléments variables. Par exemple, vous pouvez vous trouver vous-même désireux de créer un message configurable pour les joueurs qui rejoignent le serveur pour la première fois. Cela est facilement réalisable avec les TextTemplate
s en utilisant la stratégie suivante :
Disons que nous voulons créer un message de connexion où le texte est tout jaune et en italique sauf le nom du joueur, qui sera en gras et en couleur aqua, et le nom du serveur qui sera en gras et rouge. Nous pouvons créer un template de cette description en utilisant le code suivant :
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), "!"
);
Vous pouvez obtenir le résultat de ce text template avec la méthoe TextTemplate#apply(). La méthode apply()
accepte une Map<String, TextElement>
de paramètres, où les clés sont les noms des arguments et les valeurs sont les TextElement par lesquels vous souhaitez remplacer les arguments.
Note
Sauf si un argument est spécifié comme « optionnel » via Arg.optional()
, quand il est créé, les paramètres manquants fournis à la méthode apply()
vont lever une TextTemplateArgumentException. Les arguments peuvent également spécifier une valeur par défaut lors de leur création avec Arg.defaultValue()
Note
Bien que les arguments peuvent avoir du formatage de texte qui leur sont associés, il peut être remplacé en fournissant un objet Text avec un formatage personnalisé à la map de paramètres via la méthode apply()
.
Les TextTemplate
s, comme les objets Text eux-mêmes, sont sérialisables à Configurate. Pour sauvegarder un TextTemplate
dans un fichier de configuration, utilisez le code suivant. Nous allons également ajouter un paramètre ici pour que l’utilisateur puisse définir le nom de son serveur.
Astuce
Pour en savoir plus sur comment utiliser Configurate pour créer des fichiers de configuration pour vos plugins, veuillez vous reporter à Configuration des plugins.
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);
Cela va produire l’affichage suivant :
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="{"
}
}
Vous pouvez récupérer des TextTemplate
s depuis les configurations à l’aide du code suivant :
TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));
Une fois que vous êtes satisfait de la mise en page de votre nouveau TextTemplate
, allons de l’avant et envoyons-le au serveur quand un joueur rejoint le serveur pour la première fois. Nous pouvons y parvenir en utilisant le code suivant :
Astuce
Pour en savoir plus sur la façon de gérer des événements, veuillez vous reporter à Événements.
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);
}
}