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 TextTemplates 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.

TextTemplates, 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 TextTemplates 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);
    }
}