11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

筑波NSミライラボAdvent Calendar 2023

Day 24

マイクラで進行度に応じて本の内容を書き換える

Last updated at Posted at 2023-12-23

この記事は、筑波NSミライラボ Advent Calendar 2023、24日目の記事です。

はじめに

こんにちは、N高等学校通学コース所属の@ShotaKobayashiです
他の人の記事のレベルが高すぎて萎縮しちゃってますが頑張って書いて行きます

作ったもの

マイクラでクエストなどの進行度に応じて本の中身を書き換えるfunction

作ったきっかけ

マイクラでRPGを作成していて、受注したクエストなどがわからないと不便だよなあと思ったので作ることにしました。

作ってみよう

まずは実践あるのみ!早速作って行きましょう
とりあえず今考えている仕組みは

  1. クエストの進行度を取得し、進行度に応じた本の内容をストレージに保存
  2. 本を与えるときにストレージの中身を引数として本の中身に代入

意外とこれだけなのですぐできそうですね(フラグ)

ということでとりあえずクエストを2つ作ってきました
トムさんとガイモンさんです
スクリーンショット 2023-12-17 17.33.50.png
トムさんのクエストを受注してみました。
この状態でのクエストの進行度を管理するストレージの中身はこんな感じ(トムさんのクエストは00)
スクリーンショット 2023-12-17 17.42.52.png

ここから少しコードを書いて行きます
まずは実際に本を入手するコマンド

.mcfunction
clear @p written_book{Tags:["quest"]}
$give @p written_book{pages:[$(str1)$(str2)],title:"受注クエスト一覧",author:LegendaryHori,Tags:["quest"],CustomModelData:1}

$()とは、最近のアップデートで追加されたコマンドマクロというもので、関数の引数として使うことができるものです
このコードでは1行目ですでに持っている本を削除し、2行目で新しく本を与えています
pages:[]の中に文字を入れると、実際に本が書き込まれた状態で取得できます

次はクエストの進行度に応じた本の中身を書いて行きます
これでクエストが未受注、受注、クリア済みの3パターンの記述です

.mcfunction
#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で引数となるストレージを指定します

.mcfunction
function testdatapacks:function_get_questbook with storage minecraft:questtext

実際に動かしてみるとエラーが起きてしまいました
無効なエスケープシーケンス。。。\nがちゃんと使えてないですね
スクリーンショット 2023-12-17 18.15.47.png
\nを消してみると一応実行されたのでエラーの原因はこれだけらしい
スクリーンショット 2023-12-17 18.21.44.png
マイクラのテキストフォーマットについて調べてみるとスペースで改行できるらしい?記事を見つけたのでやってみる

スペースでの改行を試す.
{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個持っていってあげよう

改行に成功はしたが2連続改行はできていない。。
スクリーンショット 2023-12-17 21.38.43.png

引数を使用せずに手打ちで本の中身を入力した際は\nが使えたので何かやり方はあるはず、
\を増やしてみるか..?

.mcfunction
#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にしてみると
いけた、なんで、、?
スクリーンショット 2023-12-17 21.56.52.png
なんかいけました。
いけたからいいか(良くない)
とりあえずいけたのでガイモンさんの方も同じように修正
こんな感じになりました

受注のみ(未クリア)

スクリーンショット 2023-12-17 21.56.52.png

クリア済み

スクリーンショット 2023-12-17 22.05.56.png
クエストを受注したとき、クリアしたときに自動的にfunctionを実行してくれるようにしたので常に最新の状態になります

まとめ

今回使用したコマンドマクロという機能はマイクラに追加されたばかりの機能だったのでネットに情報が少なく、調べるのが一番大変でした笑
\nで改行できないのがわからなすぎて同じところで詰まる人がいなくなるといいなあと思います
マイクラでテキストを引数として追加するとき、改行するには「\ \ \ \n」と記入する←これを覚えておきましょう!
ちなみになんで\ \ \ \nでいけたのかいまだにわかってないので誰か教えてください

11
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?