統合版とJava版のコマンドでできる・できないこと
こんにちは。かけです。
マイクラサークルハマクラさん主催の2024年アドベントカレンダー6日目の記事です。他の記事もぜひご覧ください。
今回はMinecraftのJava版と統合版でコマンド(mcfunctionも含む)で機能の差を比較しました。もちろん執筆時の時のものですし誤っているものがあるかもしれません。ぜひご指摘・ご教授お願いいたします。
scoreboardにdummy以外ない
scoreboardとは整数のみを保存・操作できるもの(プログラミング言語でいう整数変数)です。そのため1tickごとに加算や減算することでタイマーが作れたり、比較することでランキングが作れたりします。(これは統合版でもできます)
このscoreboardですが、Minecraft内部からも加算されるようにできます。例えば、プレイヤーが死亡したときにスコアの値が増加するなどです。これによりどのプレイヤーが死亡したか検知してそれに応じた処理が行えます。
しかし、これは統合版で記述することはできません。dummy(イベントでの増減はしない)ものしか存在しないからです。
NBT/Componentを指定できない
EntityやItemなどはComponentやNBTというデータ構造によって特性が保存されています。例えば、NoGravityというComponentをtrueにすると重力を受けなくなります。
このComponentやNBTを組み合わせることにより特殊なEntityが作れるわけですが、統合版ではほとんど変更できません。似ているもの(ブロックの設置や破壊条件)などはあるもののJavaと比較すると本のごく一部でしかありません。
execute if functionがない
Java版、統合版どちらともmcfunctionというコマンドを外部に記述できる携帯を持ちます。この中で処理が成功したか否かで処理を分岐したいときがあります。そこでexecute if functionやexecute storeなどを用いますが、統合版にはありません。頑張ればコマンドブロックの条件付きで見えるのかもしれませんが外部に記述する意味が薄れてしまいます。
returnがない
mcfunction内で特定の条件の時に処理続けたくない/中断して呼び出し元に戻りたい時があります。例えば、スコアボードの値が1以上ならば処理を続けるが0なら処理を続けなくないときに0なら戻りたくなります。そういう時はreturn構文を用いますが、統合版にはありません。
execute as @e run functionできない
functionはexecuteの影響を受けません。例えば、雪玉の1ブロック上に雷を召喚したく、mcfunctionに@sの1ブロック上(execute at @s run…)と記載しても、統合版のmcfunctionでは@sが使うことができません。
そのため雪玉専用のmcfunctionや弓専用のmcfunctionを使うことになり再利用性が下がってしまいます。
hasitemが便利??
統合版限定でターゲットセレクタにhasitemがあります。指定したエンティティがあるアイテムを持っているかを区別できます。(JavaではNBTで記述できます)
しかし、このhasitemはアイテムID、アイテムのデータ、量、アイテムのスロットしか検索条件がありません。例えば名前はないのです。
そのため、メインハンドにネザースターを持った時に何かしていた時に、別の処理も名前が違うネザースタで処理を分岐できません。量で区別できますが、捨てれてしまうのは困ります。
item replace
統合版にはreplaceitemという指定したエンティティの指定したスロットに直接アイテムを生成するコマンドがあります。(NBTやComponentはブロック設置や破壊といった数少ないものしか指定できません)
Javaではitem replaceが対応するものかと思いますが、これは他のEntityやBlockのアイテムを別のEntityやBlockにコピーするコマンドとなっておりかなり仕様が違います。
そのためエンチャント付きの防具を統合版のコマンドだけで実現ができません。NBTやComponentはもちろん使用できず、replaceitemで防具を生成してenchantしてスロット変更したいですが、アイテムのスロット変更はできません。
まとめ
今回はJava版と統合版でコマンド(mcfunctionも含む)に着目して比較しましたが、統合版ではかなり機能制限がされているように感じました。
しかし、統合版のAddonsではJavaScript(TypeScript)を記述できるためこれらの問題はほとんど解決するはずです(未調査)。
教育版は統合版と類似していますので、Minecraftでの教育はAddonsに託されているのかなと思いますが、今後コマンドではなくJavaScript(TypeScript)の記述能力がMinecraftの開発界隈では求められていくのかなと思います。