Metin şablonları
TextTemplate’leri, mesajları değişken öğelerle depolamanın kolay ve rahat bir yoludur. Örneğin, sunucuya ilk kez katılan oyuncular için yapılandırılabilir bir mesaj oluşturmak isteyebilirsiniz. Bu, aşağıdaki stratejiyi kullanarak TextTemplate
ile kolayca elde edilebilir:
Diyelim ki metnin tamamı sarı ve italikleştirilmiş bir katılma mesajı oluşturmak istiyoruz, bu kodun kalın ve aqua olacağı ve sunucunun adının kalın ve kırmızı olacağı söyleniyor. Aşağıdaki kodu kullanarak bu açıklamanın bir şablonu oluşturabiliriz:
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), "!"
);
Bu metin şablonunun sonucunu TextTemplate#apply() yöntemiyle edinebilirsiniz. Apply ()
yöntemi, anahtarların argümanlara ait olduğu ve değerlerin argümanları değiştirmek istediğiniz TextElement değerleri olduğu bir Map <String, TextElement>
parametresini kabul eder.
Not
Bir argüman “isteğe bağlı” olarak Arg.optional()` yoluyla oluşturulmadığı sürece, ``apply()
yöntemine verilen eksik parametreler bir TextTemplateArgumentException atar. Bağımsız değişkenler için ayrıca, Arg.defaultValue()
Not
Bağımsız değişkenler onlarla ilişkili metin biçimlendirmesine sahip olabilmesine rağmen, parametre eşlemesine apply()
yöntemiyle özel biçimlendirilmiş bir Metin nesnesi sağlayarak geçersiz kılınabilir.
TextTemplate
, gibi Text nesneleri kendileri Configurate için seri hale getirilebilir. Bir yapılandırma dosyasına bir TextTemplate
kaydetmek için aşağıdaki kodu kullanın. Ayrıca, kullanıcı sunucu adını tanımlayabilmesi için bir ayar ekleyeceğiz.
Tüyo
Eklentinize yapılandırma dosyaları oluşturmak için Configurate’i nasıl kullanacağınız hakkında daha fazla bilgi edinmek için lütfen Eklentileri yapılandırma sayfasına bakın.
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);
Bu, aşağıdaki çıktıyı üretecektir:
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="{"
}
}
Aşağıdaki kodları kullanarak yapılandırmalardan TextTemplate
’i alabilirsiniz:
TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));
Yeni TextTemplate
’in düzeninden memnun olduğunuzda, bir oyuncu sunucuya ilk kez katıldığında gönderelim. Aşağıdaki kodu kullanarak bunu başarabiliriz:
Tüyo
Etkinliklerin nasıl ele alınacağı hakkında daha fazla bilgi edinmek için lütfen Etkinlikler’e bakın.
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);
}
}