マイクラのpredicateについて備忘録

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書くのが面倒だよ!

こういうサイトがありました。

misode.github.io