TextTemplates
TextTemplates adalah cara yang mudah dan nyaman untuk menyimpan pesan dengan variabel elemen. Misalnya, anda mungkin menemukan diri anda ingin membuat pesan dikonfigurasi untuk pemain yang telah bergabung dengan server untuk pertama kalinya. Hal ini mudah dicapai dengan TextTemplate
s menggunakan strategi berikut:
Misalnya kita ingin membuat pesan bergabung dimana teks semuanya kuning dan miring kecuali nama pemain, yang mana akan cetak tebal dan aqua dan nama server yang mana akan dicetak tebal dan merah. kita bisa membuat template tentang deskripsi tersebut menggunakan kode berikut ini:
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), "!"
);
Anda dapat memperoleh hasil teks template dengan TextTemplate#berlaku() metode. Berlaku()
metode menerima Peta<String, TextElement>
dari parameter di mana kuncinya adalah nama-nama argumen dan nilai-nilai adalah TextElement nilai-nilai yang anda inginkan untuk mengganti argumen dengan.
Catatan
Kecuali sebuah argumen ditentukan sebagai "opsional" melalui Arg.opsional()
ketika itu dibuat, hilang parameter yang dipasok ke terapkan()
metode akan membuang TextTemplateArgumentException. Argumen juga dapat menentukan nilai default selama penciptaan mereka dengan Arg.defaultValue()
Catatan
Meskipun argumen dapat memiliki format teks yang terkait dengan mereka, ini dapat diganti dengan menyediakan obyek Teks dengan format kustom untuk parameter peta melalui apply()
metode.
TextTemplate
s, seperti Text objek sendiri adalah serializable untuk Configurate. Untuk menyimpan TextTemplate
untuk file konfigurasi menggunakan kode berikut. Kami juga akan menambahkan pengaturan di sini sehingga pengguna dapat menentukan nama server mereka.
Tip
Untuk mempelajari lebih lanjut tentang cara menggunakan Configurate untuk membuat file konfigurasi untuk plugin anda silahkan merujuk ke /plugin/konfigurasi/index.
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);
Ini akan memproduksi hasil berikut:
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="{"
}
}
Anda dapat mengambil TextTemplate
s dari konfigurasi menggunakan kode berikut:
TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));
Setelah anda puas dengan tata letak baru anda TextTemplate
, mari kita pergi ke depan dan mengirimkannya ke server ketika seorang pemain bergabung dengan server untuk pertama kalinya. Kita bisa mencapai itu menggunakan kode berikut:
Tip
Untuk mempelajari lebih lanjut tentang bagaimana untuk menangani peristiwa, silahkan merujuk ke /plugin/peristiwa/index.
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);
}
}