コマンドとバグの話
執筆開始日:2023-12-05 18:33:11
記事の前提
この記事はMinecraft1.20Javaを前提としています。
ゲームなんだからそりゃバグはある
データパックやコマンドに限らず、ものを作って動かしてみると思ってもみなかったところに不具合が発生することがあります。プログラムを書いたことがある人なら誰しもがこういうバグにぶつかったことがあるはず。プログラムを書いたことが無い人でもバグという言葉を知らないなんて人はここ最近はもうかなり少数派のような気がします。**知らんけど。**Minecraftはゲームとしてはかなり古めのゲームなので、たくさんのバグを抱えています1。種々のバグ報告はバグフォーラムで報告され、必要順に評価され、修正されていっています。実はバグひとつひとつにもやんの担当者が付いて、修正ステータスが更新されているよう2。Minecraftはアップデートが行われると、バグフォーラムで報告されたバグのうちどんなものが修正されたかを必ず報告している。
▽こんな風に全部リストにしてある
▽多いとこんな風に「だいたい150個くらい直したぜ!」ってバグトラッカーのURLになってることもある
ところで、データパックを色々と書いていると、自分自身がバグを作ってしまうこともあれば、ときたま純粋にMinecraftのバグにぶちあたることだってあります。今回はそんな落とし穴バグを紹介しようと思います。何かあって調べたときの情報資料になればなぁとメモに近いですが、何か役に立てばうれしいです。
紹介パート
1. 本とターゲットセレクタ
フォーラム情報:MC-103171
一言で言うと、ターゲットセレクタを含む本を開くとき、管理者権限(op)を持っていない人が開くと正しく解釈されないというものです。この一言でわかる人はこれ以降を読む必要はないと思います(笑)。以下はもっと順番に説明していきます。
本(やその他のテキスト装飾)は厳密なJSON形式をその場で「解釈」して表示します。これに関する詳細は赤石愛氏がかなりわかりやすくまとめてくれている(https://ai-akaishi.hatenablog.jp/entry/ar857358 )のでそちらを見てもらうとしましょう。ここではそのうち、ターゲットセレクタを含むものに注目します。例としてこのようなLootTableを作ってみました。
{
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "item",
"weight": 1,
"name": "minecraft:written_book",
"functions": [
{
"function": "set_count",
"count": 1
},
{
"function": "set_nbt",
"tag": "{title:\"\",author:\"\",pages:['{\"selector\":\"@s\"}']}"
},
{
"function": "set_name",
"name": [
{
"text": "テストブック"
}
]
}
]
}
]
}
]
}
ターゲットセレクタというのは要するに@p
とかああいうやつですね。ここでは@s
のことです。実際にこの本をop無しで開いてみるとこうなります。
loottable用に書いたJSONが解釈されず直接表示されてしまっています。くせでloottableを使っていますが、別にgiveコマンドでも同じです。
opがあればこんな風に正しく表示されます。
脱出マップ作る人は結構これ困る人いるんじゃないですかね・・・?看板使うなどで代用する必要がありそうです。
keepInventoryがあっても効かない
フォーラム情報:MC-234511
keepInventory
をTrue
にしていても、例えばインベントリ内の作業スペースなど「本来はインベントリに戻ってくるはず」のアイテムたちはドロップしてしまうやつです。
Minecraftでワールド設定をする手段のひとつに/gamerule
というのがありますね。その中でも比較的使う機会が多い(たぶん)もののひとつにKeepInventory
というものがあります。死ぬときにアイテムをまき散らすかまき散らさないか、という設定です。まき散らさない(True)ようにしていてもインベントリ内の作業スペースに入れて死ぬとまき散らしてしまうので、アイテムを失うことの可能性を否定できません。脱出マップとかで死に戻りを想定しているのに失ってしまうのは困りそう。
ちなみに、バグ報告ステータスがCommunityConsensus
3となっているので「多くの人がバグだと気づいているけどまだ検証済みではない」もの扱いになってます。つまり優先順位が低いってこと4なんだと思います。
番外編・execute if blocks
フォーラム情報:MC-147480
マイクラのチャットで
/execute if blocks ~ ~ ~ ~ ~ ~ ~ ~ ~ run say a
を打とうとするとエラー表示が出ます。
しかしコマンド自体は失敗せず、正しく実行されます。これもそのうち直って欲しいな...
まとめ
短めですが、このあたりで。今回はコマンドで物作りをする人向けに何かないかな、と思って思い当たるものを書いてみました。バグフォーラム内は結構玉石混交で意味不明な主張から「あ、これ仕様だったんだ」*みたいなものまでいろいろ見つかります(そのうちどこかで紹介する動画チャンネルを立てたいなと思っている)。みなさんも探してみてくださいな。
-
ゲーム批難じゃありませんよ、念のため。 ↩
-
このあたりは実際に報告している人の話を少し聞いたまでで裏どりはちゃんとやっていませんが今回の趣旨とは外れるので割愛 ↩
-
https://www.reddit.com/r/Minecraft/comments/6307wx/bug_tracker_community_consensus_vs_confirmed/ ↩
-
正直バグフォーラムの見方よくわからないんですよね、バグ報告ステータスの説明分かる人いたら教えて欲しいまである。https://help.minecraft.net/hc/en-us/articles/4408887473421 ↩