この記事は、筑波NSミライラボ Advent Calendar 2023、24日目の記事です。
はじめに
こんにちは、N高等学校通学コース所属の@ShotaKobayashiです
他の人の記事のレベルが高すぎて萎縮しちゃってますが頑張って書いて行きます
作ったもの
マイクラでクエストなどの進行度に応じて本の中身を書き換えるfunction
作ったきっかけ
マイクラでRPGを作成していて、受注したクエストなどがわからないと不便だよなあと思ったので作ることにしました。
作ってみよう
まずは実践あるのみ!早速作って行きましょう
とりあえず今考えている仕組みは
- クエストの進行度を取得し、進行度に応じた本の内容をストレージに保存
- 本を与えるときにストレージの中身を引数として本の中身に代入
意外とこれだけなのですぐできそうですね(フラグ)
ということでとりあえずクエストを2つ作ってきました
トムさんとガイモンさんです
トムさんのクエストを受注してみました。
この状態でのクエストの進行度を管理するストレージの中身はこんな感じ(トムさんのクエストは00)
ここから少しコードを書いて行きます
まずは実際に本を入手するコマンド
clear @p written_book{Tags:["quest"]}
$give @p written_book{pages:[$(str1)$(str2)],title:"受注クエスト一覧",author:LegendaryHori,Tags:["quest"],CustomModelData:1}
$()とは、最近のアップデートで追加されたコマンドマクロというもので、関数の引数として使うことができるものです
このコードでは1行目ですでに持っている本を削除し、2行目で新しく本を与えています
pages:[]の中に文字を入れると、実際に本が書き込まれた状態で取得できます
次はクエストの進行度に応じた本の中身を書いて行きます
これでクエストが未受注、受注、クリア済みの3パターンの記述です
#00未受注
execute if data storage minecraft:quest {00:{is:false,finish:false}} run data merge storage minecraft:questtext {str1:""}
#00受注
execute if data storage minecraft:quest {00:{is:true,finish:false}} run data merge storage minecraft:questtext {str1:'\'["",{"text":"頼まれごと","color":"dark_green","bold":true},{"text":"\\n","color":"reset","bold":true},{"text":"\\n特別なりんご集め\\n","color":"green","bold":true},{"text":"\\n村人のトムがアップルパイ\\nを作りたいみたいだ。\\n材料となる","color":"reset","bold":false},{"text":"特別なりんご","color":"aqua","bold":false},{"text":"を\\n5個持って行ってあげよう","color":"reset","bold":false}]\','}
#00クリア
execute if data storage minecraft:quest {00:{is:true,finish:true}} run data merge storage minecraft:questtext {str1:'\'["",{"text":"頼まれごと","color":"dark_green","bold":true},{"text":"\\n","color":"reset","bold":true},{"text":"\\n特別なりんご集め\\n","color":"green","strikethrough":true,"bold":true},{"text":"\\n村人のトムがアップルパイ\\nを作りたいみたいだ。\\n材料となる","color":"reset","bold":false},{"text":"特別なりんご","color":"aqua","bold":false},{"text":"を\\n5個持って行ってあげよう","color":"reset","bold":false},{"text":"\\n\\nクリア済","color":"red","bold":true}]\','}
実行するときはこう
functionの後にwithで引数となるストレージを指定します
function testdatapacks:function_get_questbook with storage minecraft:questtext
実際に動かしてみるとエラーが起きてしまいました
無効なエスケープシーケンス。。。\nがちゃんと使えてないですね
\nを消してみると一応実行されたのでエラーの原因はこれだけらしい
マイクラのテキストフォーマットについて調べてみるとスペースで改行できるらしい?記事を見つけたのでやってみる
{str1:'\'["",{"text":"頼まれごと ","color":"dark_green","bold":true},{"text":"","color":"reset","bold":true},{"text":" 特別なりんご集め ","color":"green","bold":true},{"text":"村人のトムがアップルパイを作りたいみたいだ。 材料となる","color":"reset","bold":false},{"text":"特別なりんご","color":"aqua","bold":false},{"text":"を5個持って行ってあげよう","color":"reset","bold":false}]\','}
頼まれごと
特別なりんご集め
村人のトムがアップルパイ
を作りたいみたいだ。
材料となる特別なリンゴを
5個持っていってあげよう
引数を使用せずに手打ちで本の中身を入力した際は\nが使えたので何かやり方はあるはず、
\を増やしてみるか..?
#00未受注
execute if data storage minecraft:quest {00:{is:false,finish:false}} run data merge storage minecraft:questtext {str1:""}
#00受注
execute if data storage minecraft:quest {00:{is:true,finish:false}} run data merge storage minecraft:questtext {str1:'\'["",{"text":"頼まれごと","color":"dark_green","bold":true},{"text":"\\\\n","color":"reset","bold":true},{"text":"\\\\n特別なりんご集め\\\\n","color":"green","bold":true},{"text":"\\\\n村人のトムがアップルパイ\\\\nを作りたいみたいだ。\\\\n材料となる","color":"reset","bold":false},{"text":"特別なりんご","color":"aqua","bold":false},{"text":"を\\\\n5個持って行ってあげよう","color":"reset","bold":false}]\','}
#00クリア
execute if data storage minecraft:quest {00:{is:true,finish:true}} run data merge storage minecraft:questtext {str1:'\'["",{"text":"頼まれごと","color":"dark_green","bold":true},{"text":"\\\\n","color":"reset","bold":true},{"text":"\\\\n特別なりんご集め\\\\n","color":"green","strikethrough":true,"bold":true},{"text":"\\\\n村人のトムがアップルパイ\\\\nを作りたいみたいだ。\\\\n材料となる","color":"reset","bold":false},{"text":"特別なりんご","color":"aqua","bold":false},{"text":"を\\\\n5個持って行ってあげよう","color":"reset","bold":false},{"text":"\\\\n\\\\nクリア済","color":"red","bold":true}]\','}
改行部分の記述を試しに\ \ \ \nにしてみると
いけた、なんで、、?
なんかいけました。
いけたからいいか(良くない)
とりあえずいけたのでガイモンさんの方も同じように修正
こんな感じになりました
受注のみ(未クリア)
クリア済み
クエストを受注したとき、クリアしたときに自動的にfunctionを実行してくれるようにしたので常に最新の状態になります
まとめ
今回使用したコマンドマクロという機能はマイクラに追加されたばかりの機能だったのでネットに情報が少なく、調べるのが一番大変でした笑
\nで改行できないのがわからなすぎて同じところで詰まる人がいなくなるといいなあと思います
マイクラでテキストを引数として追加するとき、改行するには「\ \ \ \n」と記入する←これを覚えておきましょう!
ちなみになんで\ \ \ \nでいけたのかいまだにわかってないので誰か教えてください