なんぞや
この記事では、「どのように発想するのか」という点から「完成した後、どうするのか」という点まで、多少の小技を含めご紹介させていただきます。
非常に低レベルな記事ですので、ミスも多いかと思いますが、どうか温かい目でご覧ください。
1.発想
桶が見えてきたあなたは、まずはお風呂に入りましょう。
お風呂は何かを発想するのに最適な場所です。
湯船に浸かり、「どのようなデータパックを作りたいか?」「どのようなアイテムを追加して、それはどのような効果で...」というのを思い付かなくなるまで考えます。
考えだすことができた暁には、できるだけ早くメモしましょう。
※本当はスマートフォンなどをお風呂に持ち込むのが理想なのですが、水没の恐れがあるためやめましょう。
2.フォルダを作る
データパック制作において、衝動的な勢いは非常に大切です。
勢いがあるうちにデータパックのフォルダを作り、制作を始めましょう。
ここで、軽くデータパックの構造をおさらいしておきましょう。
1.階層
データパックは、基本的にフォルダの中にフォルダを作り
↓
適切な名前のフォルダの中に.json形式などのファイルを置き
↓
それに構文を記入することで動作させます。
このフォルダの設定すべき正しい名称や、どのようにフォルダの階層を作るべきか、ということは、「Minecraft Wiki」に掲載されているので見ることをおすすめします。
衝動でデータパックを作り始めた際は、
データパック名/data/カスタム名/functions/main.mcfunction
と
データパック名/data/カスタム名/functions/install.mcfunction
、
データパック名/data/minecraft/advancements/tick.json
、
データパック名/data/minecraft/advancements/load.json
、
の4つを用意しておけば良いでしょう。
これで基本的なデータパックは作成可能です。
2.拡張子
「拡張子」というのは、ファイルの後ろについている「.mp4」「.json」といった、.を含む単語のことです。
Minecraftのデータパックを作る際に使うのは、
.mcfunction
が90%、.json
が10%と言ったところでしょう。
この.mcfunction
と.json
を感覚的に覚えることがデータパックを作る上で一番重要と言っても良いかもしれません。
.mcfunction
の中には、Minecraftの中で使うような、「コマンド」の形式で記入します。
しかし、.json
の中には「コマンド」とは別の「Jsonフォーマット」で記入します。
最初は、.json
で.mcfunction
を呼び出す、という認識でOKです。
あとは、ひたすらにファイルを追加し、中身を書き、フォルダにまとめて...という形でひたすらコマンドを記入していきます。
ここで、ふたつおすすめの小技をご紹介します。
-tips1-
一つ目です。
この小技は上級者の方々が知らず知らずのうちに使っていたりして、すごく便利なので覚えておくと良いでしょう。
また、この小技はVisualStudioCodeのものですので、VSCodeを使用している人のみご覧ください!
長々と構文を書いていると、非常に見づらくなってしまいます。
ひとつ例を挙げましょう。
#set
execute as @a[tag=lime_team] at @s run function spraft:weapons/set_g
execute as @a[tag=pink_team] at @s run function spraft:weapons/set_p
#start_house
execute as @e[tag=Start_house_lime] at @s run function spraft:weapons/start_house/main
execute as @e[tag=Start_house_pink] at @s run function spraft:weapons/start_house/main
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:17}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/start_house/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:18}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/start_house/place_p
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:19}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/start_house/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:20}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/start_house/start_p
#parasol_rocket
execute as @e[tag=Parasol_Rocket.g] at @s run function spraft:weapons/parasol_rocket/entities/rocket_g
execute as @e[tag=Parasol_Rocket.p] at @s run function spraft:weapons/parasol_rocket/entities/rocket_p
execute as @e[tag=Parasol.g] at @s run function spraft:weapons/parasol_rocket/entities/parasol_g
execute as @e[tag=Parasol.p] at @s run function spraft:weapons/parasol_rocket/entities/parasol_p
execute as @e[tag=Parasol_R_smoke.g] at @s run function spraft:weapons/parasol_rocket/entities/smoke_g
execute as @e[tag=Parasol_R_smoke.p] at @s run function spraft:weapons/parasol_rocket/entities/smoke_p
execute as @e[tag=Parasol_Rocket.particle] at @s run function spraft:weapons/parasol_rocket/particles/main
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:9}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/parasol_rocket/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:10}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/parasol_rocket/place_p
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:11}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/parasol_rocket/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:12}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/parasol_rocket/start_p
#azarashi_throw
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:13}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/azarashi_throw/place_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:14}}}] at @s[scores={Rocket_click=1..}] run function spraft:weapons/azarashi_throw/place_p
execute as @e[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:15}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/azarashi_throw/start_g
execute as @e[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:16}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/azarashi_throw/start_p
execute as @e[tag=Azarashi.g] at @s run function spraft:weapons/azarashi_throw/bullet_g
execute as @e[tag=Azarashi.p] at @s run function spraft:weapons/azarashi_throw/bullet_p
execute as @a[tag=Azarashi_now,tag=lime_team] at @s positioned ~ ~1 ~ run function spraft:ink/rotate/azarashi_g
execute as @a[tag=Azarashi_now,tag=pink_team] at @s positioned ~ ~1 ~ run function spraft:ink/rotate/azarashi_p
#ultra_hanko
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:7}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/ultra_hanko/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:8}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/ultra_hanko/start_p
scoreboard players add @a[tag=Hanko_now] Hanko_time 1
execute as @a[scores={Hanko_time=180..}] at @s run function spraft:weapons/ultra_hanko/break
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] at @s run function spraft:weapons/ultra_hanko/main_yasumi_p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] at @s run function spraft:weapons/ultra_hanko/main_yasumi_g
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:30,special:1}}}] at @s run tag @s add have_ultra_hanko.p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:31,special:1}}}] at @s run tag @s add have_ultra_hanko.g
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] at @s run tag @s add have_ultra_hanko.p
execute as @a[nbt={SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] at @s run tag @s add have_ultra_hanko.g
execute as @a[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:30,special:1}}}] at @s[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:32,special:1}}}] run tag @s remove have_ultra_hanko.p
execute as @a[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:31,special:1}}}] at @s[nbt=!{SelectedItem:{id:"minecraft:shield",tag:{CustomModelData:33,special:1}}}] run tag @s remove have_ultra_hanko.g
#Splash_down
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:5}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/splash_down/start_g
execute as @a[nbt={SelectedItem:{id:"minecraft:carrot_on_a_stick",tag:{CustomModelData:6}}}] at @s[scores={Special_click=1..}] run function spraft:weapons/splash_down/start_p
execute as @a[tag=splash_down_g] at @s run function spraft:weapons/splash_down/main
execute as @a[tag=splash_down_p] at @s run function spraft:weapons/splash_down/main
execute as @e[tag=down_ink_g] at @s run function spraft:ink/splash_down_g
execute as @e[tag=down_ink_p] at @s run function spraft:ink/splash_down_p
execute as @e[tag=Splash_down.particle] at @s run function spraft:weapons/splash_down/particle
これは私が製作している「Spraft」という配布マップのデータの中から、一部を抜粋したものです。
いやぁ〜見づらいですね。
かろうじて#
でタイトルをつけているとはいえ、構文が多すぎて見づらいです。
そこで、#
の後に半角の空白を加えることで、その#
から下をフォルダのように畳むことができます。
見やすくなりましたね!
たくさんのコマンドを扱う際はご活用ください...!!
-tips2-
さて、ふたつ目です。
特殊なアイテムを追加するデータパックを作っていると、どうしてもnbtが長くなってしまいます。
give @s armor_stand{display:{Name:'{"text":"アイテム名","color":"gold","italic":true}',Lore:['{"text":"説明","color":"gray","italic":false}']},Enchantments:[{}],EntityTag:{Silent:1b,Marker:1b,ShowArms:true,NoBasePlate:true,Tags:["tags"]}} 1
これだと、非常に見づらいですし、書き直したくなった際に手間と時間がかかってしまいます。
そこで、.json
形式の「ルートテーブル(loot_table)」を使うことで、時短と形式化、効率化を測ることができます。
フォルダの階層はデータパック名/data/カスタム名/loot_tables/アイテム名.json
です。
アイテム名.json
に記入する内容は以下の通りです。
{
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "item",
"name": "minecraft:armor_stand",
"functions": [
{
"function": "set_name",
"name": [
{
"text": "アイテム名",
"color": "gold",
"italic": false
}
]
},
{
"function": "set_lore",
"lore": [
{
"text": "説明",
"color": "gray",
"italic": false
}
]
},
{
"function": "set_nbt",
"tag": "{Enchantments:[{}],EntityTag:{Silent:1b,Marker:1b,ShowArms:true,NoBasePlate:true,Tags:[\"tags\"]}}"
}
]
}
]
}
]
}
この方がスッキリしていて見やすいですよね。
ルートテーブルに置き換えれば、デバッグの際にコマンドで入手しやすかったり、アイテムを簡単にエンティティで出現させることができたり...と良いことばかりです。
ルートテーブルで管理しているアイテムは/loot
コマンドで管理します。
/loot give @s loot カスタム名:アイテム名
/loot spawn ~ ~ ~ loot カスタム名:アイテム名
便利なルートテーブルですが、一つ注意しなければならないことがあります。それは、アイテムのnbtのこの部分です。
EntityTag:{Tags:["tags"]}
giveコマンドに直接記入する際は、
/give @s armor_stand{EntityTag:{Tags:["tags"]}}
で良いのですが、ルートテーブルの構文にて、nbtの欄に既に""
が使われているため、重複することになり、["tags"]
の部分がエラーとなってしまいます。
なので、nbtを設定する際に""
が入ってしまうときは、""
の直前に\(バックスラッシュ)
を入れましょう。こうしてルートテーブルの形になったnbtがこちらです。
{
"function": "set_nbt",
"tag": "{EntityTag:{Tags:[\"tags\"]}}"
}
脱線しすぎました。話を戻します。
3.寝る
さて、制作を初めてかなり時間が経過したと思います。
アイデアも薄まってきて、さぞ疲れたことでしょう。
そういうときは、無理やり作業を続行しても効率が悪いので、いっそ寝てしまいましょう!
おやすみなさいー
※ここから先は寝てから読みましょう。
4.見た目を作る
ここからはリソースパックの話になります。
やはり、見た目というのは創造心や、やる気を起こしてくれます。
ですから私が最近何かを作るときは必ず見た目から作り始めます。
そのくらい重要な見た目ですが、特に 「絵が得意だよ!」 というようなことがなければ、3Dモデルを作成することをおすすめします。
データパック勢は一回は通る道と言っても過言ではないです。
ソフトは「BlockBench」を使用します。Mac、Windowsどちらにも対応していて、UIもシンプルなので非常に使いやすいです。
3Dの見た目を作りたかったらまずはBlockBenchをマスターしましょう!
BlockBenchの使い方や小技などは今回は割愛します。
こうして出来たモデルファイルをまたフォルダーの中でごちゃごちゃして.json
などと組み合わせて反映していくわけですが、今回は一応コマンドの記事なので、そこら辺は省略させていただきます。
WikiやYouTube動画などに沢山情報がありますのでそちらを参考にしてください。
5.デバッグ
これはここまでの全てが完成した後に限らず、一つ一つの要素を作成した後にも必ずやるべきことです。
所詮1ゲームの追加要素、と言っても、
やはり構文のミスなどによるバグは必ず発生します。
そこで、何かを実装した際に逐一Minecraftで実際にその要素が正常に機能しているかどうかを確認し、していなかったのであれば修正する必要があります。
制作の途中は一人でやるのも良いと思いますが、完成した後、人を呼んでマルチプレイでデバッグを行うのも大切です。そのためにも、
友達は作っておいた方が良いでしょう。
6.配布
こうして完成したデータパックは、個人で所有しているだけではあまりに勿体ないので、インターネットで配布することをおすすめします。
配布の方法について解説している人はあまり見かけないので、少しご紹介します。
まずは、完成したデータパック・リソースパックのフォルダを、.zip
形式のファイルにしましょう。なぜなら、フォルダの形式ではアップロード、ダウンロードを行うことが難しいからです。
Windowsをご使用の方はデフォルトの機能で.zip
に圧縮すれば良いですが、Macは違います。
Macのデフォルトの機能で圧縮を行うと、.zip
ファイルの中に余計なフォルダが混入してしまいます。
ですから圧縮を行えるサイトなどで圧縮を行った方が良いでしょう。
参考程度に、私のおすすめのサイトを貼っておきます!
このようにして.zip
ファイルになったデータパック・リソースパックは、何らかの形でインターネットにアップロードする必要があります。
そこで、いくつかの方法をご紹介します。
1.Google Drive
私も使用している一番おすすめの方法です。
最大15GBまで無料で使えて、ダウンロードリンクを生成することもできるためとても使いやすいです。
Googleが提供しているため安心感もありますね。
2.GitHub
コマンダーおよびプログラマーがこぞって使っています。
フォルダの中に仕込ませるreadme.text
といったテキストファイルでデータパックの説明が表示できたり、中身の構文や階層が簡単に閲覧できたりするため、より開発者向けで、多機能になっています。
専用のURLが作成され、紹介のサイトと同じ役割も果たせるため、楽で良いですね。
おわりに
ここまでの閲覧ありがとうございました。
この記事を見て、データパックを作ってみたくなったあなたは、
今すぐお風呂に行きましょう
私が言えるのはそれぐらいでした。
それではみなさん、よきお風呂コマンドライフを〜!