Ayrıştırma Argümanı
Komut Oluşturma API’sı güçlü bir argüman ayrıştırıcısı ile birlikte gelir. Dize girdisini java taban türlerine (tamsayılar, boole’lar, dizeler) veya oyun nesnelerine (oyuncular, dünya, blok türleri, …) dönüştürür. Ayrıştırıcı, isteğe bağlı bağımsız değişkenleri ve bayrakları destekler. Ayrıca, TAB’ların tamamlanmasını da yönetir.
Ayrıştırılan bağımsız değişkenler CommandContext nesnesi. Ayrıştırıcı tek bir nesneyi döndürürse, onu :javadoc: CommandContext#getOne(String) ile alır. İsteğe bağlı ve zayıf argümanlar `` Optional.empty() `` dönebilir.
Ayrıştırıcıların birçoğu birden fazla nesne döndürebilir (örn. Kullanıcı adıyla eşleşen birden çok oyuncu). Bu durumda, CommandContext#getAll(String) yöntemi Collection
olası eşleşmelerden almak için kullanılmalıdır. Aksi takdirde, bağlam nesnesi bir istisna atar!
Tüyo
GenericArguments#onlyOne(CommandElement) döndürülen değerlerin miktarını tek bir değerle sınırlamak için bunlardan birini güvenle kullanabilirsin.``args.<T>getOne(String)``.
Yeni bir tane oluşturmak için CommandElement (argument) ve GenericArguments fabrika sınıflarını kullanın. Çoğu komut öğesi, hata ve yardım iletileri görüntülenen kısa bir metin anahtarı gerektirir.
CommandElement
dosyasını komut üreticisine CommandSpec.Builder#arguments(CommandElement…) yöntemi ile uygulayın. Metoda birden fazla argümanın zincirlenmesi için birden fazla `` CommandElement`` geçirmek mümkündür (örn. /msg <player> <msg>
). Bu, CommandElement
nesnelerini bir GenericArguments#seq(CommandElement…) elemanında sarmalamayla aynı etkiye sahiptir.
Örnek: Çoklu Argümanlarla Komut Oluşturma
import org.spongepowered.api.Sponge;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.command.CommandException;
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.command.args.CommandContext;
import org.spongepowered.api.command.args.GenericArguments;
import org.spongepowered.api.command.spec.CommandExecutor;
import org.spongepowered.api.command.spec.CommandSpec;
CommandSpec myCommandSpec = CommandSpec.builder()
.description(Text.of("Send a message to a player"))
.permission("myplugin.command.message")
.arguments(
GenericArguments.onlyOne(GenericArguments.player(Text.of("player"))),
GenericArguments.remainingJoinedStrings(Text.of("message")))
.executor(new CommandExecutor() {
@Override
public CommandResult execute(CommandSource src, CommandContext args) throws CommandException {
Player player = args.<Player>getOne("player").get();
String message = args.<String>getOne("message").get();
player.sendMessage(Text.of(message));
return CommandResult.success();
}
})
.build();
Sponge.getCommandManager().register(plugin, myCommandSpec, "message", "msg", "m");
`` GenericArguments`` komut öğelerine genel bakış
Komut Öğesi |
Açıklama |
Değer türü & miktar |
---|---|---|
|
Hiçbir argüman beklemiyor. Bu, bir dosyanın varsayılan davranıştır |
|
Java Temel Türleri |
||
|
Bir bağımsız değişkenin bir dize olmasını gerektirir. |
bir |
|
Geriye kalan tüm bağımsız değişkenleri boşluklarla birbirine bağlar (ileti komutları için kullanışlıdır). |
bir |
|
Argümanın bir boolean olmasını gerektirir. |
bir |
|
Bir bağımsız değişkenin bir tam sayı olmasını gerektirir. |
bir |
|
Bir argümanın bir çift olması gerekir. |
bir |
Oyun Nesneleri |
||
|
Bir çevrimiçi oyuncu temsil etmek için bir argüman bekleyin. Birden fazla oyuncu geri dönebilir! |
çoklu |
|
`` Player`` gibi, ancak eşleşen bir oyuncu bulunamazsa, komutun göndereni geri getirir. |
çoklu |
|
`` PlayerOrSource`` gibi, ancak bir oyuncu yerine bir kullanıcı döndürür. |
çoklu |
|
Bir dünyayı temsil etmek için bir argümanın olmasını bekleyin (ayrıca boşaltılmış dünyaları da içerir). |
çoklu |
|
Bir argümanın bir boyutu temsil etmesini bekleyin ( |
çoklu |
|
Bir argümanın |
bir |
|
Bağımsız bir değişkenin |
bir |
|
Belirtilen üyenin bir argümanını bekleyin CatalogType. |
belirtilen katalog türünde birden çok eşleşen öğe |
Matchers |
||
|
Sınırlı bir değer kümesinden seçim yapmaya izin veren bir bağımsız değişkeni döndürür. |
Bir belirtilen değer |
|
Argümanların harf dizisini bekleyin (örn. |
Bir belirtilen değer |
|
Argümanın sağlanan enum altında bir anahtar olmasını gerektirir. |
belirtilen enumun birden çok eşleşen öğeleri |
Araçlar Komut öğeleri etrafında sarılabilir. Değer türü sarılmış öğeden devralınır. |
||
|
Bir dizi komut elemanı oluşturur (örn. |
miras |
|
Belirli bir komut öğesinin belirli sayıda sağlanmasını isteyin. |
çoklu miras |
|
Geriye kalan tüm bağımsız değişkenlerin sağlanan komut öğesine uymasını zorunlu kılın. |
çoklu miras |
|
Sağlanan komut öğesini isteğe bağlı yapın. Bağımsız değişken geçersiz biçimdeyse ve args yoksa bir hata atar. |
miras |
|
Sağlanan komut öğesini isteğe bağlı yapın. Bağımsız değişken geçersiz biçimdeyse ve args yoksa bir hata atmaz. |
miras |
|
Verilen öğelerin ilkiyle eşleşen bir komut öğesi döndürür. (komutu aşırı yüklemek için kullanışlıdır, örn. |
miras |
|
Verilen komut öğesi, sağlanan anahtardaki içeriğe yalnızca bir değer eklemek için kısıtlar. |
miras |
|
Komut bayrakları için bir oluşturucu döndürür (örn. Bakınız Komut Bayrakları |
Kısa Bayrak: bir Uzun Bayrak: bir Değer Bayrağı: Devralınan |
|
Belirtilen komut argümanını kullanmak için komut göndereninin belirtilen izni almasını gerektirir |
miras |
Tüyo
Daha fazla bilgi için Javadocs sitesini ziyaret edin GenericArguments.
Özel Komut Elementleri
Özel komut öğeleri oluşturmak mümkündür (örn. bir URL ayrıştırıcı veya bir Vector2i
elementi) Soyut CommandElement
sınıfını uzatarak.
CommandElement#parseValue(CommandSource, CommandArgs) yöntemi bir ham argüman dizesini CommandArgs#next() alıp bir nesneye dönüştürmelidir. Eğer ayrıştırma başarısız olursa bir :javadoc: ArgumentParseException atmalıdır.
CommandElement#complete(CommandSource, CommandArgs, CommandContext) yönteminde bir sonraki ham argümanı okumak için CommandArgs#peek() kullanılmalıdır. TAB tamamlama önerileri listesini döndürür.
Örnek: ``Vector2i``komut elementi tanımı
Bu örnekteki ayrıştırıcı iki girdi bağımsız değişkenini okur ve bir vektöre dönüştürür.
import com.flowpowered.math.vector.Vector2i;
import org.spongepowered.api.command.args.ArgumentParseException;
import org.spongepowered.api.command.args.CommandArgs;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.command.args.CommandElement;
import java.util.Collections;
import java.util.List;
public class Vector2iCommandElement extends CommandElement {
CommandArgs errorargs;
protected Vector2iCommandElement(Text key) {
super(key);
}
@Override
protected Object parseValue(CommandSource source, CommandArgs args) throws ArgumentParseException {
// <x> <y>
errorargs=args;
String xInput = args.next();
int x = parseInt(xInput);
String yInput = args.next();
int y = parseInt(yInput);
return new Vector2i(x, y);
}
private int parseInt(String input) throws ArgumentParseException {
try {
return Integer.parseInt(input);
} catch(NumberFormatException e) {
throw errorargs.createError(Text.of("'" + input + "' is not a valid number!"));
}
}
@Override
public List<String> complete(CommandSource src, CommandArgs args, CommandContext context) {
return Collections.emptyList();
}
@Override
public Text getUsage(CommandSource src) {
return Text.of("<x> <y>");
}
}
Örnek: Vector2i
komut elementi kullanımı
// /plottp <x> <y>
CommandSpec myCommandSpec = CommandSpec.builder()
.description(Text.of("Teleport to a plot"))
.permission("myplugin.command.plot.tp")
.arguments(new Vector2iCommandElement(Text.of("coordinates")))
.executor(new MyCommandExecutor())
.build();
Tüyo
Daha fazla örnek için “GenericArguments” sınıfının ‘Kaynak kodu <https://github.com/SpongePowered/SpongeAPI/blob/stable-5.1.0/src/main/java/org/spongepowered/api/command/args/GenericArguments.java>’_ ‘na bakın.