見出し画像

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コマンドを実行するか再ログインすることで、そのワールドでデータパックが有効化される。

データパックについて : MINECRAFT WIKI

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個までのコマンドが実行される。

https://minecraft.fandom.com/ja/wiki/%E9%96%A2%E6%95%B0_(Bedrock_Edition)

それならJE版も最大10000個までなのかな?

そう思ってたけどJE版では制限がないようです、恐らく

試しに16870行のコマンドをmcfunctionとして作成、
実行してみても16870行が漏れなく実行できました。

だからJE版では実質的制限はないものとみられます。

実行最大コマンド数はメモリが許す限り実行できるはず。
ただしPE版との互換性が必要なら1万行で抑えとくべきです。


JE版のmcfunctionで注意が必要なポイントはこれくらいかな…
他にもあれば追記するかしないかします。

JE版は厳密なのでそこだけは意識した方がいいですね。

この記事が気に入ったらサポートをしてみませんか?