
前回はカスタムコマンドの作り方を紹介したから今回はその引数について紹介していくよ。

引数ですか…よろしくお願いします。

何でもできるっていうのが答えかな…前回のイベントの講座でも言ったように条件と処理をどうするかで無限大だからね。

なるほど…よろしくお願いします。
引数とは
Minecraftのコマンドを例にしますが,/tp @p 60 20 15
と実行するときに/tp
以降の@p 60 20 15
を引数と言います。
@p
を第一引数,60
を第二引数…という形で呼びます。
引数を使ってみる
command /test <text>:
trigger:
broadcast "%arg-1%"
引数を使った自作コマンドです。
Skriptを読み込んだら/test 好きな文字列
を実行してみましょう。
実行すると入力した文字列がチャットに表示されます。
[21:02:39 WARN]: Line 14: (main.sk) the 1st argument is already a text, so you should not put it in one (e.g. the 1st argument instead of "%the 1st argument%") Line: broadcast "%arg-1%"

あれ?エラーが出てしまいました…

ん?ああ,これはエラーじゃないよ。エラーだったらWARNって書いてあるところがERRORになるからね。
余談: エラーじゃなくて警告
入門編で紹介すると混乱する人が多いと思うので細かくは説明しませんが,今回引数の型にtextを選びました。(Javaとかをやってる人ならStringと言った方が伝わるでしょう。)
textは文字列のことなのですが,今回broadcast "%arg-1%"
というコードを書きました。
“(ダブルクォーテーション)で囲んだ中はもちろん文字列なので文字列の中に文字列を単体で入れるのは間違えではないけど推奨しないよ…と言われているんですね。
じゃあ,どうすればよいのかと言えば,broadcast arg-1
とすればいいのです。
と,言ってもbroadcast "指定した引数は「%arg-1%」でした。"
というような文章の中に引数を埋め込むことが多いと思うのであまり気にしなくてもかまいません。

エラーじゃなかったんですね。
話は戻るのですが,/gamemode @p creative
といったように引数が増える場合は<text>
を単純に増やせばいいんですか?

そうだよ。でも気を付けてほしいのは@p
と言ったようなセレクターはminecraftが用意したものなので使えません。
引数を増やす
command /test <text> <text>:
trigger:
broadcast "%arg-1% %arg-2%"
これで二つの引数ができました。あとはどんどん増やせばいくらでも増やせます。
引数の増減
gamemodeコマンドの使い方は/gamemode @p creative
だったり/gamemode creative
というように引数を減らしても動作しますよね?
Skriptでもこれは可能です。その方法は引数部分に[]を付けてあげるだけです。
つけてあげないとCorrect usage: /test <text> <text>
と表示されます。これはコマンドの使い方が間違っているよという意味です。
command /test [<text>] [<text>]:
trigger:
broadcast "%arg-1% %arg-2%"
こんなかんじに!
ですがこの時に気を付けなければいけないのは/test
と実行すると<none> <none>
と表示されます。
なので条件文を使って引数の存在をチェックしましょう。
command /test [<text>] [<text>]: trigger: if arg-1 is set: # 第一引数有 if arg-2 is set: # 第二引数有 broadcast "%arg-1% %arg-2%" else: # 第二引数無 broadcast arg-1 else: # 全引数無 broadcast "引数がありません。"
こうすることで引数を入力しなくともコマンドを実行することができます。
今回少しミスったなぁ…と思ったのが引数の型をどちらもtextにしてしまったため条件文が第一引数はないけど第二引数はあるよっていうのが作れないんですよね…
型について
text部分をplayerにしたり,numberにしたりすることで数字にすることができます。数字にするとなにができるのか?ということですがこんなことができます。
command /plus <number> <number>:
trigger:
set {_temp} to arg-1 + arg-2
broadcast "%{_temp}%"
コマンド実行してみましょう。/plus 4.5 3.2
と実行すると7.7
が返ってきました。
もちろんnumberをtextとすればエラーが発生します。
第一引数に複数の型を使いたい…
何度もゲームモードコマンドを参考にしますが/gamemode creative
と/gamemode player creative
の二つでは第一引数は文字列(またはゲームモード)型とプレイヤー型が使われています。
第二引数は[]
で囲ってあげればいいけど第一引数はどうすればいいのか…
そんなときはtextを使いましょう。
command /plus <text> <text>:
trigger:
set {_temp1} to arg-1 parsed as number
set {_temp2} to arg-2 parsed as number
if {_temp1} is not set:
if {_temp2} is not set:
parse error is set
send "全引数が数字ではありません"
else:
send "第一引数が数字ではありません"
else:
if {_temp2} is not set:
parse error is set
send "第二引数が数字ではありません"
else:
add {_temp1} to {_temp2}
send "%{_temp2}%"
条件文が多くてややこしくなっていますが重要なのはset {_temp1} to arg-1 parsed as number
とset {_temp2} to arg-2 parsed as number
とparse error is set:
です。
最初の二つは第一引数と第二引数の型をnumber型に変更するというコードです。
最後のparse error is set
は型の変更に失敗した時にparse error
というものが発生するためparse error
が存在したら…という条件になっています。

型はいっぱいありそうで難しそうですね…

そうだね。私もこの記事を書くためにSkriptの型を調べるんだけどいっぱいあって書ききれないんだよ…今回はnumberを使ったけど整数を意味するintもあったり似ているようで違う型があって…
ということで今回は自作コマンドの引数について紹介しました。
また次の講座で会いましょう。
講座について
当講座で紹介したソースコードはGitHubにて公開されています。
GitHubページはコチラです。
コメント