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