![見出し画像](https://assets.st-note.com/production/uploads/images/80441163/rectangle_large_type_2_b8aa7d18d971a4f97d39c251d5bac244.png?width=1200)
MineCraft Java版でmcfunctionが実行できない時の確認リスト
MineCraft Java版いわゆるJE版での話
データパックの中でmcfunction実行
構文が正しいはずなのに実行できない
エラーも出ないから原因も分からない
ポケット版(PE版)と比べ、JE版はすこし厳格な感じです。
その仕様の差になかなか戸惑ってしまいました。
JE版でmcfunctionを作る時の注意点などを適当に覚え書き
JE版ではデータパック内でmcfunctionの実行ができる
マイクラの拡張機能を作りたい場合・・・
PE版 : ビヘイビアーパック (behavior pack)
JE版 : データパック (datapack)
こういう仕組みがそれぞれのエディションで用意されてます。
JE版ではデータパック内でmcfunctionが利用可能です。
▼ 詳しくはWikiとか見ればいい
データパックは、.minecraft/saves/(ワールド)/datapacks フォルダに配置する。各データパックは、datapacks フォルダ内のサブフォルダまたは .zip ファイルとなる。データパックをフォルダに入れ、/reloadコマンドを実行するか再ログインすることで、そのワールドでデータパックが有効化される。
mcfunctionの置き場所は次のようになってます。
▼ データパック内でのmcfunctionの位置
(データパック名)
pack.mcmeta
pack.png
data
(名前空間)
functions
(関数).mcfunction
この構成もまた複雑で厄介だった…
PE版のビヘイビアーパックだと直下にfunctionsを作ればいいんですが、
JE版だと data/名前空間/functions の下に作らないとダメです。
もしmcfunctionに問題がないのに動かないなら、
まず配置場所が間違ってないか疑った方がいいです。
× 半角スペースは2つ以上続けて書いたらダメ
まずハマりがちなのがこれ
「半角スペースを2つ以上続けて書かないこと」
例えばこういうコマンドがあるとします。
▼ 草ブロックを自分座標に配置するコマンド
setblock ~ ~ ~ minecraft:grass
▼ このようなエラーが出る
Unknowun block type 'minecraft' at position 15 ...lock ~ ~
普通の手打ちコマンドならエラーにすぐ気づけます。
だってこういう風にエラーが出てくれるんだから。
でも諸事情でプログラム的にコマンド生成が必要でした。
▼ こういうコードを書いていた(JavaScriptコード)
let blockId = 'grass'
let flag = true
let mcfunc = `setblock ~ ~ ~ `
+ flag ? ` grass` : ' air'
こういう風に空白スペース2つ以上出現する確率が高いです。
PE版だと気を利かせてくれるからエラーが出ないんですが、
JE版はなぜか厳密みたいなので注意が必要です。
× コマンド行の先頭・最後に空白を置いてはいけない
これも気を付けないといけない
「コマンド行の先頭・最後に空白1つでもあるとNG」
▼ 例えばダメなコマンドの例(mcfunction)
setblock ~10 ~2 ~13 clay
# ↑ ここに空白
fill ~10 ~2 ~14 ~10 ~2 ~15 bedrock
setblock ~10 ~3 ~-2 stone
これもエラーが出ないから気づきにくいです。
特にコード的・動的にコマンドを組み立てているなら、
コマンド行の最後にスペースがないかチェックすべきです。
ちょっと面倒
× PE版とJE版ではブロックIDにかなりの差異がある
これはsetblockとかfillを使う場合に困ること
「PE版とJE版ではブロックID・仕様が一部異なる」
例えば羊毛の場合だと次の違いがあります。
▼ JE版での各色の羊毛ブロックID
白色 : white_wool
オレンジ : orange_wool
マゼンタ : magenta_wool
薄青色 : light_blue_wool
黄色 : yellow_wool
(以下略
▼ PE版での各色の羊毛ブロックの表し方
白色 : wool 0
オレンジ : wool 1
マゼンタ : wool 2
薄青色 : wool 3
黄色 : wool 4
(以下略
JE版だと色名をプリフィックスにしたブロックIDなのに、
PE版だと wool のあとに識別IDをつける書き方になってます。
だからPE版とJE版ではmcfunctionの使いまわしはできません。
もし使いまわすなら次の工夫が必要になります。
コマンドの順序・引数などのリライト
ブロックID・状態をPE/JE版向けに置き換え
コマンド全てを置き換えするのは不可能に近いですが、
setblockとかfillコマンドなら置き換えもある程度できます。
そこはマイクラWikiと格闘しながらやってください。
JE版には最大10000行までのコマンド数制限はない
一番大事なことを忘れてた
「JE版の実行可能コマンド数は制限がない」
PE版だと1度の実行可能コマンドは10000行に制限されてます。
それは次のようにWIKIにも書いていることです。
1度の関数の実行では、他の関数の呼び出し、つまり再帰を含め最大10000個までのコマンドが実行される。
それならJE版も最大10000個までなのかな?
そう思ってたけどJE版では制限がないようです、恐らく
試しに16870行のコマンドをmcfunctionとして作成、
実行してみても16870行が漏れなく実行できました。
だからJE版では実質的制限はないものとみられます。
実行最大コマンド数はメモリが許す限り実行できるはず。
ただしPE版との互換性が必要なら1万行で抑えとくべきです。
JE版のmcfunctionで注意が必要なポイントはこれくらいかな…
他にもあれば追記するかしないかします。
JE版は厳密なのでそこだけは意識した方がいいですね。