マイクラのpredicateについて備忘録
- predicateってなんだ?
- どうやって使うんだ?
- どうやってpredicateを書くんだ?
- 他のpredicateはどういうふうに書けばいいんだ?
- もっと書き方のサンプルがほしい
- それでもやっぱりJSON書くのが面倒だよ!
predicateってなんだ?
あちこちでルートテーブルみたいなものって書かれているけど、私にはそれでもピンッと来なかった。 私の中でのpredicateってこういうことだと思ってる。
- 長ったらしい条件に名前を付けられる
- JSONファイルだから、いろんなmcfunctionファイルから呼び出せる
どうやって使うんだ?
例えば、こういうexecuteを書いていたとしよう
execute as @a[team=red,gamemode=survival,level=1..10] run say test
上みたいなやつが下みたいにかける
execute as @a[predicate=x:yowai] run say test
こういうやつが
execute as @a[scores={A=2,B=3,C=10..100}] run say test
こうなる
execute as @a[predicate=x:super-mode] run say test
あんまり書く量が減ってないじゃないかって?
だけども、scores={A=2,B=3,C=10..100}
がsuper-mode
っていう意味なんだって分かりやすくなったことが重要なんです。しばらく時間が空いてしまって、またコマンド組もうと思ったらなんて書いてるのかさっぱりなんてざらじゃない?私だけ?
どうやってpredicateを書くんだ?
まずは、predicateファイルを用意します。下に置いてね。 predicatesフォルダはfunctionsフォルダと同じ場所に置けばOK。
datapacks/<データパック名>/data/<パック名>/predicates/super-mode.json
そしたら、さっきのscores={A=2,B=3,C=10..100}
をsuper-mode.jsonに書いてみよう。
{ "condition": "entity_scores", "entity": "this", "scores": { "A": 2, "B": 3, "C": { "min": 10, "max": 100 } } }
めちゃくちゃ書く量が増えたじゃないか!複雑じゃないか!って思ったあなた。
これがpredicateなんです。ただ、あちこちにscores={A=2,B=3,C=10..100}
って書くのは嫌じゃないですか。
ざっくりコメント入れると下みたいな感じになってます。
{ "condition": "entity_scores", // entity_scoresって条件で呼び出すことを宣言してる "entity": "this", // @aから呼び出されたら@aが、@pから呼び出されたら@pが指定される "scores": { // まあ、スコア一覧だよね "A": 2, "B": 3, "C": { "min": 10, "max": 100 } } }
あとはexecuteで呼び出せばOK。
ちなみに<パック名>をx
にすると、predicate=x:super-mode
だし、sugoi
って<パック名>にするとpredicate=sugoi:super-mode
になります。
他のpredicateはどういうふうに書けばいいんだ?
Wikiを見て!って言うんだけど、残念ながらWikiの日本語化はまだされてないみたい。 だからGoogle翻訳にかけつつ、さぐりさぐりやってみて。 Predicate – Official Minecraft Wiki
もっと書き方のサンプルがほしい
以下、よく使いそうなサンプルです。
しゃがんでいるキャラを検知する
execute as @a[predicate=x:sneak] run say "しゃがんでいる"
{ "condition": "entity_properties", "entity": "this", "predicate": { "flags": { "is_sneaking": true } } }
魔法の杖をメインハンドで使ったキャラを検知する
# 魔法の杖を持っていて、使った(USE)形跡がある execute as @a[predicate=x:magic,predicate=x:use] run say "魔法を使った!" # 魔法を使ったので使ってないことにする scoreboard players set @a[predicate=x:use] USE 0
{ "condition": "minecraft:entity_properties", "entity": "this", "predicate": { "equipment": { "mainhand": { "item": "minecraft:carrot_on_a_stick", "nbt": "{display:{Name:'{\"text\":\"魔法の杖\"}'}}" } } } }
{ "condition": "minecraft:entity_scores", "entity": "this", "scores": { "USE": { "min": 1, "max": 1000 } } }
特定のアイテムを装備しているキャラを検知する
金のヘルメット、チェストプレート、ブーツを全部装備していたときだけ反応する。
execute if entity @a[predicate=x:equip] run say "装備中"
{ "condition": "entity_properties", "entity": "this", "predicate": { "equipment": { "head": {"item":"minecraft:golden_helmet"}, "chest": {"item":"minecraft:golden_chestplate"}, "feet": {"item":"minecraft:golden_boots"} } } }
1/2の確率で成功する
change
は0~1(0%~100%)で設定。だから、サンプルは0.5(50%)。
execute if predicate x:random run say "成功"
{ "condition": "random_chance", "chance": 0.5 }
晴れているかチェックする
execute if predicate x:sunny run say "晴れている"
{ "condition": "weather_check", "raining": false }
それでもやっぱりJSON書くのが面倒だよ!
こういうサイトがありました。