ようこそ、ぷっこ村へ。ししゃもです。
(・∀・)ノ
やってきました、第4回コマンド講習会!!何となく慣れてきたんじゃないかと思うので、ここいらで派手にデータパックを作ってみようぜ!
データパックの構造を知ろう
今回は、教材用に用意したデータパック(以下デタパ)の中を覗きながら、構造や利点などを勉強してみませう。特にコマブロだけではできないことが、デタパでは可能です。ちょっと準備するのに別の知識がいりますが、とても便利で軽くできます。
その辺を見ていきましょう。今回は概念の解説多めで、コマンド自体はあんまりないです。サーセン!!
時間が許しそうなら、簡単なデタパも作ってみましょう。
教材はコチラをダウンロードしてもらって使います。まずは展開してみてください。
ちなみに、教材用のデタパは完成品なので遊ぶことができます。解説はこちらのページです。
データパックの構造について
デタパの構造をざっくり見ていきましょう。まずは全体をざっくり眺めてみてね。
なんか複雑そう?ダイジョブダイジョブ、実は見掛け倒しだよー。一個ずつ解説していくよー。ダイジョブよー。まず、Blooming フォルダを開くと以下のようになってますね。
- data … データパック本体、当たり前だけど必須
- pack.mcmeta … データパックであることをマイクラに教えるファイル。必須
- pack.png … デタパのサムネ画像、無くていい
- readme.txt … 注意書きとか書くいとくやつ。名前は任意だし、別になくていいです。と言うかデタパの構造的に必要なのではなく、質問をかわすための物です。日本語名にするとデタパ自体を読み込みません。
data と pack.mcmeta があればデタパとして成立します。
data 内について
data フォルダを開くと以下のようになっていますね。
全部デタパの部品です。ここでのフォルダ名や分け方は全部任意で、magicalpot の中身を blooming に一緒くたに入れるとかでもオッケーです。minecraft以外は自由に命名できます(小文字)
バニラを書き換えたい時は minecraft フォルダに入れますが、何か追加する時は新しく作りましょう。
minecraft フォルダは常時実行する系の場合必須です。
blooming 内について
じゃあ、blooming フォルダを開いてみましょう。以下のようになってますね。
- advancements … 実績追加用。実績は解除時に mcfunction を実行できるので、上手く使えれば軽いし便利だし、最強の部類だよ。
- functions … mcfunction っていうファイルを追加するためのフォルダです。mcfunction はコマブロタワーを一つのファイルにまとめた感じのものです。
- loot_tables … アイテムを出現させるルールを定めた、loot table(ルートテーブル) を追加するためのフォルダ。敵を倒した時、ランダムチェスト、釣り等で使う他、独自のルールでのアイテム出現、あまり数が大きくならない場合の乱数などに利用したりもできます。要するにめっちゃ便利!!今回は解説用に置いてるだけで、blooming の loot_tables は空っぽです。
- predicates … セレクタで使える predicate 追加用フォルダ。predicate は柔軟に条件判定ができ、特に nbt を扱うときにめっちゃ軽いです。便利なので良く使います。
- tags … ざっくり言うと、カテゴリーを作って任意のまとまりを追加するためのフォルダです。
結局全部良く使います。この階層のフォルダ名は固定です。他にもありますが、代表的なこれらを知っておくといいでしょう。もっと知りたい時は、ゾンブレラの中身をのぞいてみて下さいな。
データパックの利点を考える
コマンドを連続して実行する場合、コマブロタワーを作るか、デタパを作るかの選択肢があるわけで、どっちがええんじゃろかい?となると思います。もちろん折衷もありです。
複雑になるほど、手間の面でも、管理の面でもデタパの方がいいと思います。判断の材料になる、デタパの利点を見ていきましょう。
- デタパのコードは簡単に書き換え可能、修正が楽
- 実績を上手く使うことで、軽いのに常時プレイヤーの特定行動の監視ができる。例えば、特定の額縁に何かを入れた時に発動とか。
- 遅延、ループ(再帰)がやりやすい。
- プレディケートで確率を簡単に扱える
- ルートテーブルで、追加アイテムをドロップ品にしたり、チェストに仕込んだりできる
等々。あまり複雑な物を作らないなら、管理面が一番のメリットですかねー。
実際にデータパックを作ってみようか
同じものを作るとなると、多分メチャクチャ冗長になるので、簡略化した感じのデタパを実際に作ってみましょうか。まずは仕様を考えてみましょう。
- タンポポが頭にあるとをバフかける
- 右手に持ってスニークで、頭に(何もかぶってなければ)タンポポを装備させる。
これだけにしときましょう。これだけの場合最少の構成で納めると
こんな感じになります。フォルダ自体は作って名前を変えればいいので同じように階層を作ってください。
mcfunction 以外は、全てJSONを使います。わかんね、って場合は、JSONが何なのかをググっといてもらって、後は写したらええで。
pack.mcmeta
前述したとおり、マイクラに「私はデータパックですよー」って知らせるファイルです。内容は以下
{
"pack": {
"pack_format": 8,
"description": "A little more convenient for survival life!! By Sisyamo."
}
}
pack_format は対応するマイクラのバージョンごとに変えます。1.18現在は 8 です。
description はデタパの解説です。ワールド作成時、入れるデタパを選ぶ画面で表示されます。
load.json tick.json
load.json はワールド起動時毎に一回だけ読み込まれ、ファイル内で指定した mcfunction を実行できます。
tick.json もワールド起動時毎に読み込まれますが、こちらは指定した mcfunction を毎ティック(1秒間に20回)実行し続けます。常時実行とか聞いたら、ここで指定してるんだなって思ってもらえばいいです。
minecraft フォルダ以下のフォルダ名、ファイル名などの構成は今回の場合固定です。
{"values":["practice:init"]}
{"values":["practice:main"]}
load.json では init.mcfunction を tick.json では main.mcfunction を指定しています。
mcfunction
mcfunction はコマンドをひとまとめにしたファイルです。コマブロだと1個につき1行でしたが、mcfunction なら1つのファイルに100行でも200行でも入れられます。要は、コマブロタワーをわざわざ作らなくても、外部エディタで書いちゃえばいいわけですね。楽ちん。
ファイル名は任意ですが、小文字と一部記号しか使えませんので注意!!
時間がおしそうなので、今回は簡単な解説だけで丸写ししてもらって、わかりにくければ次回以降細かく解説していくことにさせて下さいな。
execute as @a[predicate=practice:is_sneaking,predicate=practice:flowerlib/has_dandelion] at @s unless data entity @s Inventory.[{Slot:103b}] run function practice:flowerlib/equip_dandelion
毎ティック実行されるメインの関数。自分ルールですが、mainとしてます。セレクタに predicate がありますねー。後述するプレディケートを自分で作って、その条件に合うか判定してます。is_sneaking でスニーク中か、flowerlib/has_dandelion でタンポポを持っているかを監視してます。
unless data entity @s Inventory.[{Slot:103b}] の部分は、頭のスロットに何かデータがあるかどうか(装備してるか)をチェックしてます。unless は、~ではないかを判定するのに使います。
初登場の function コマンドは、mcfunction を実行するためのコマンドです。
これを日本語訳すると、「スニーク中で右手にタンポポを持っており、且つ頭に何も装備していないプレイヤーがいた場合、そいつを実行者にして practice:flowerlib/equip_dandelion を実行する」って意味になります。
#set scoreboard and misc
schedule function practice:flowerlib/give_dandelion_effect 60t
load.json で指定したやつです。こちらも自分ルールですが init で固定してます。
#を付けるとコメント扱いになって、その行はメモ書きにできます。
schedule コマンドも初登場ですねー。このコマンドは指定したティック後、もしくは秒後に指定した mcfunction を実行させます。
60ティック後(3秒後。秒数指定したい場合は3sで同じ意味)にpractice:flowerlib/give_dandelion_effect を実行してねってお願いしてます。
#main, execute as @a[predicate=practice:is_sneaking,predicate=practice:flowerlib/has_dandelion] at @s unless data entity @s Inventory.[{Slot:103b}]
#detect flowers
item replace entity @s armor.head with minecraft:dandelion
clear @s minecraft:dandelion 1
#postprocess
stopsound @s block
particle minecraft:effect ~ ~1.8 ~ 0 0 0 10 15
playsound minecraft:block.anvil.place block @p ~ ~ ~ 1 2
playsound minecraft:entity.player.levelup block @p ~ ~ ~ 1 2
main で条件に合ったプレイヤーで実行されるやつです。1行目で長いコメントがありますが、複雑なデタパの場合、どこから処理が流れてきたかわからなくなりがちなので、書いとくと無駄な元ファイル探しジャーニーを減らせます。元ファイルで as や at を使って指定した実行者や実行位置は引き継ぐので、それもコメントで書いてます。
こちらも初登場な item コマンドは、スロットを操作するのに使えるコマンドです。頭のスロットにタンポポを置いてます。
clear コマンドも初かー、意外と多いなぁ。これは指定したアイテムを消すコマンドですね。タンポポを頭に置いたので、1個消して辻褄を合わそうってことです。
stopsound も初出でした……、多い、多くない?見たまんま音を止めます。
effect give @a[predicate=practice:flowerlib/equip_dandelion] minecraft:invisibility 6 3
schedule function practice:flowerlib/give_dandelion_effect 5s
こちらは、init で指定したやつです。もし頭にタンポポ割いてたら、透明化のエフェクトを付与します。で、5秒後に自身を再度実行します。こうすることで、常時実行に比べてずっと負荷を減らしつつ、プレイヤーの状態を監視できます。あまり急がなくていい処理は、こうやって何秒かおきに1回実行にしておくと吉です。
predicate
前述した、条件判定に使える便利機能です。ちょっと分かりにくいけど、めちゃめちゃ便利やで!!こちらもJSONで記述します。
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"type": "minecraft:player",
"flags": {
"is_sneaking": true
}
}
}
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"type": "minecraft:player",
"equipment": {
"head": {
"items": [
"minecraft:dandelion"
]
}
}
}
}
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"mainhand": {
"items": [
"minecraft:dandelion"
]
}
}
}
上から、スニークしているか、タンポポを頭に装備しているか、タンポポを右手に持っているかをそれぞれ判定します。他にもエンティティの状態を細かく指定して、書ききれない条件判定ができます。できれば覚えていけるといいな。
完成したデータパックをチェック
完成した可愛くてしょうがない第1号デタパちゃんをzip圧縮しておきましょう。別にせんでもいいですが、配布とか考えてるなら圧縮します。お好みで。そしたらデタパ入りのワールドを作ります。
チートをオンに、花探しがめんどいのでクリエイティブにしときましょう。さらに、データパックの所をクリック。
こんな画面になるので、さっきの zip をドラッグ&ドロップすることで利用可能に反映されます。そしたら、反映されたやつをクリック!!選択中に移りますので、完了で準備できます。もし、デタパとして何か問題がある時は、ここで読み込みエラーが出ます。直しましょう。
戻ってワールド作成で遂にデタパ入りの世界を作ることができました!!天才じゃん!!
動作テスト
タンポポを右手に持ってスニークで、頭にタンポポが咲くっていうデタパでしたね。
じゃあ、早速右手に持って、スニ――――――ク!!
ぽわんとエフェクトが出て頭にタンポポが咲きました。やったね!!
さらにちょっと待つと、姿が消えたではありませんか!!魔法かな!?待つ時間は5秒ごとに判定が入るように作ったので、咲くタイミングで待ち時間がズレます。実際、5秒のズレでそうそう困ることは無いだろうという判断で決めてます。これが1秒じゃなきゃヤダ!!とか、コンマのズレも許したくない!!とかの場合は、適宜 schedule コマンドの待ち時間を変えるとか、もういっそ main に入れて常時判定するとかしましょう。
全ての判断は、自分次第だし、配布するにしても重くなくてウィルスとか仕掛けてなけりゃ、どんな方法でもいいです。すぐ正解を決めつけようとするのは日本人の悪い癖です。好きなように生きろや!みんな違って、みんないい!!
まとめ
と、いうわけで、たぶん今回の講習会はグダるだろうなー、と思いつつまとめに移ります。先に謝っときます、上手くまとまってなくて申し訳ありませんでした。100年後腹を切ります!!
データパックの利点、多少は伝わったでしょうか?色々予備知識はいりますが、修正したり、細かく作りこんだりする時にでる差は歴然です。無理ない程度に使いこなしましょうー。
一応、お試しで作ったデタパ貼っときますねー。
もしかしたら、2回に分けてるかもですが、とりあえず今回はこの辺で、お帰りの際はお気を付けて~(・∀・)ノシ
コメント