💭

minecraftのjava版 データパック入門

2024/05/20に公開


上記画像のように、プレイヤーが歩いた足跡を作成する。
データパックの作成メモ。

環境

windows10、minecraft 1.20.6 シングルプレイ

フォルダの設置場所

\.minecraft\saves\[ワールドファイル名]\datapacks\[データパック名]\
上記の場所にカラのフォルダを作る

ファイル一覧

フォルダ構成のファイル一覧。vscodeでフォルダを開いて上から順番にコピペで作れる

説明文はなんでも良い。pack_formatの番号は面倒。

pack.mcmeta
{
  "pack":{
    "pack_format": 11,
    "description": "ここにデータパックの説明を入力"
  }
}

ワールドに入った瞬間に起動する関数を登録
testnamespace、onload は自由な文字列を指定可能だが、英語の大文字は使えないので注意。

data\minecraft\tags\functions\load.json
{
  "values":[
    "testnamespace:onload"
  ]
}

読み込み時、scheduleコマンドで関数testnamespace:each_1_secを0.1秒後に実行させる。

data\testnamespace\functions\onload.mcfunction
schedule function testnamespace:each_1_sec 0.1s 

読み込みの0.1秒後に実行される。卵を自分の座標に設置して、0.1秒後に自分を再度実行させる。
卵には当たり判定を無くすMarkerタグ、重力の影響を受けなくなるNoGravityタグを指定している。
このタグのキー名はマイクラ側で定義された値しか使えない。
自分で好きなキーを入れたい場合はtagsを使う。

data\testnamespace\functions\each_1_sec.mcfunction
# @a は全プレイヤー
execute at @a run summon minecraft:egg ~ ~ ~ {Marker:true,NoGravity:true,Tags:["marker-tag"]}
# 1秒後に自分のイベントをコール
schedule function testnamespace:each_1_sec 0.1s 

タナゴを消す方法

以下のコマンドを手動で入力。タグを使う。
/kill @e[tag=marker-tag]
ここで厳密に書こうとして"marker-tag"とダブルクオートで囲むと構文エラーになる。
つまり、自分で卵を消さないと無限に増え続ける。

executeコマンド

このコマンドはプレイヤーが居る位置に卵を出現させるという意図があるが、コマンドの実行コンテキストはonLoadなので現在の位置 という概念がない。
実際には0,0,0 がデフォルトになるらしい。
なので、@aで全てのプレイヤー=シングルだから自分 の場所を基準点に変更している。
execute at @a run summon minecraft:egg ~ ~ ~

作った感想

・関数名や名前空間に英語の大文字が使えない点に注意。
・コマンド構文はjson的だけどjsonではない。key-valueを記載する時に{key=val}{key:val}の両方の書き方がある。コマンド欄にテキストを入れれば構文エラーは教えてくれる。
・実行ごとにコンテキストが初期化?される?変数を作ってその値を計算して。という通常のプログラミング的な思考回路から切り替える必要がある。
・配布されているデータパックが読めるようになってきた。

これが知りたい

卵を延々と並べるだけなのでエンティティ数が膨大になってしまう。
1秒おきに、直前の座標との間にラインを引きたい。
それをするには、直前のプレイヤーの位置座標を取得する必要があるが、変数的なものはどうやって使うのかわからない。スコアボードを使うとか?

同じく、プレイヤーが停止している時にもずっとエンティティを設置し続けている。
これも1秒前と比較して、移動区距離が一定数未満だったらスキップという事をしたい。
それをするには、1秒前の座標を取得して、今の座標との距離を計算する必要がある。
数値の計算をして変数に入れる。という事は出来るのだろうか。

Discussion