Текстовые шаблоны
TextTemplate - простой и удобный способ хранения сообщений с переменными элементами. Например, вы можете захотеть создать настраиваемое сообщение для игроков, которые присоединились к серверу в первый раз. Это легко достижимо с помощью TextTemplate
, если использовать следующую стратегию:
Предположим, мы хотим создать сообщение при подключении к серверу, в котором текст будет желтым и выделенным курсивом, кроме имени игрока, который будет выделен жирным шрифтом и светло-бирюзовым цветом, а также имя сервера, которое будет жирным и красным. Мы можем создать шаблон, используя следующий код:
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), "!"
);
Вы можете получить результат этого текстового шаблона с помощью метода TextTemplate#apply(). Метод apply()
принимает параметр Map<String, TextElement>
, где ключи являются именами аргументов, а значения являются теми значениями TextElement, которыми вы хотите заменить.
Примечание
Если аргумент не указан как «необязательный» через Arg.optional()
при создании, отсутствующие параметры, переданные в метод apply()
, будут вызывать TextTemplateArgumentException. Аргументы также могут указывать значение по умолчанию во время их создания с помощью Arg.defaultValue()
Примечание
Хотя аргументы могут иметь связанное с ними форматирование текста, это можно переопределить, предоставив объект Text с настраиваемым форматированием в Map с помощью метода apply()
.
TextTemplate
, как и сами объекты Text, могут быть сериализованы для Configurate. Чтобы сохранить TextTemplate
в файле конфигурации, используйте следующий код. Мы также добавим здесь параметр, чтобы пользователь мог определить имя своего сервера.
Совет
Чтобы узнать больше о том, как использовать Configurate для создания файлов конфигурации вашего плагина, можно найти в статье Настройка плагинов.
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);
Это приведет к следующему результату:
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="{"
}
}
Вы можете получить TextTemplate
из конфигураций, используя следующий код:
TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));
Когда вы довольны шаблоном вашего нового TextTemplate
, давайте перейдем к нему и отправим его на сервер, когда игрок впервые присоединяется к серверу. Мы можем добиться этого, используя следующий код:
Совет
Чтобы узнать больше о том, как обрабатывать события, можно найти в статье События.
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);
}
}