フレームワークを利用したコマンドの実装(Cloud編)
前章では、BukkitのAPIを利用してコマンドを実装しました。 しかし、BukkitのAPIは非常に複雑で、初心者には理解が難しい部分もあります。 そこで、IncendoのCloudというコマンドフレームワークを利用することで、コマンドの実装を簡単に行う方法について説明します。
Cloudとは
Cloudは、コマンドフレームでマインクラフトサーバーのコマンドを簡単に実装するためのライブラリです。 また、マインクラフト以外のコマンドの実装においても利用することができます。
詳しくは、こちらを参照してください。
Cloudの導入
build.gradle.kts
repositories {
mavenCentral()
+ maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
dependencies {
+ implementation(libs.cloud.core)
+ implementation(libs.cloud.paper)
+ implementation(libs.cloud.annotations)
}
また、libs.versions.tomlに以下の設定を追加します。
gradle/libs.versions.toml
[versions]
cloud = "2.0.0"
cloudPaper = "2.0.0-beta.10"
[libraries]
cloud-core = { group = "org.incendo", name = "cloud-core", version.ref = "cloud" }
cloud-paper = { group = "org.incendo", name = "cloud-paper", version.ref = "cloudPaper" }
cloud-annotations = { group = "org.incendo", name = "cloud-annotations", version.ref = "cloud" }
コマンドの実装
public class DiceCommand {
@Command("dice")
public void dice(CommandSourceStack source) {
source.getSender().sendMessage("You rolled a " + (int) (Math.random() * 6 + 1));
}
}
public class TestCommand implements JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
plugin = this;
registerCommands();
}
void registerCommands() {
PaperCommandManager<CommandSourceStack> commandManager = PaperCommandManager.builder()
.executionCoordinator(ExecutionCoordinator.asyncCoordinator())
.buildOnEnable(plugin);
AnnotationParser annotationParser = new AnnotationParser(commandManager, CommandSourceStack.class);
annotationParser.parse(new DiceCommand());
}
}
これで、/diceというコマンドを実装することができました。
コマンドを実装する際には、@Commandアノテーションを付与することで、コマンドを実装することができます。
それを、AnnotationParserを利用して、コマンドを登録することができます。
引数をとる
引数とは、コマンドを実行する際に指定する値のことです。
例えば、/dice 6というコマンドを実装する場合、6が引数になります。
この場合、引数の数の面を持つサイコロを振るコマンドを実装することにします。
public class DiceCommand {
@Command("dice <size>")
public void dice(CommandSourceStack source, @Argument("size") int size) {
source.getSender().sendMessage("You rolled a " + (int) (Math.random() * size + 1) + " / " + size);
}
}
引数を取得するには、@Argumentアノテーションを利用します。
また、引数の型を指定することで、引数を取得することができます。
<>で表したものは、必須の引数を表します。
[]で表したものは、任意の引数を表します。
演習
/diceコマンドを実装してください。/dice <size>コマンドを実装してください。/dice <size> <times>コマンドを実装してください。
サブコマンドを実装する
サブコマンドとは、コマンドの中にさらにコマンドを実装することです。
例えば、/dice rollというコマンドを実装する場合、rollがサブコマンドに なります。
public class DiceCommand {
@Command("dice <size>")
public void dice(CommandSourceStack source, @Argument("size") int size) {
source.getSender().sendMessage("You rolled a " + (int) (Math.random() * size + 1) + " / " + size);
}
@Command("dice roll")
public void roll(CommandSourceStack source) {
source.getSender().sendMessage("You rolled a " + (int) (Math.random() * 6 + 1));
}
}
演習
/dice rollコマンドを実装してください。