マルチプレイなら『シン・VPS』がおすすめ!

【マイクラ】value_checkで値を比較する【predicate】

【マイクラ】value_checkで値を比較する【predicate】

この記事では、Minecraft Java Edition(バージョン1.20.4)の情報をもとに執筆しています。
そのほかのバージョンや機種などでの動作は保証できません。

こんにちは!
マインクラフターのなつめ(@natsume_717b)です。

なつめ

2016年からマイクラを楽しんでおり、最近はクリエイティブモードでコマンドを駆使して遊んでいます!

この記事では、こんな疑問を解決します!

本記事の内容
  • value_checkで値の比較を行える
  • 実際の例

value_checkは値の比較を行うことのできるpredicateの項目です。

スコアボードを組み込むことができるため、変動する値を扱えるのも強みですね。

この記事を読めば簡単に使えるようになりますので、ぜひ参考にしてくださいね。

それでは、見ていきましょう!

本記事で紹介するデータパックのサンプルはGitHubにてダウンロードできます。

value_checkで値の比較を行える

value_checkでは値の比較を行えます。

特定の値同士を比較することもできますが、決まった値を比べるだけでは有意義とは言い難いです。
本質としては、スコアボードを指示することで、決まった数字でない値の比較が可能な点にあります。

例えばですが、「スコアボードの値と指示した値の範囲が適切な関係かどうか」ですね。
「スコアボードの値が0~100の間にある場合に、真とみなす」といった指示ができます。

また、範囲となる値の部分にもスコアボードを指示することができるので、範囲自体も変数のように扱うことが可能です。

詳しくは次項で見ていきましょう。

実際の例

value_checkにはvalue(値)とrange(範囲)の2要素があり、そのどちらにもスコアボードが指示できます。

そこで、「値にスコアボードを指示したもの」、「範囲の一方にスコアボードを指示したもの」、「両方をスコアボードで指示したもの」の3通りを見ていきます。

共通する作業(データパックの構造など)

データパックの構造は以下の通りです。

  • datapack本体
    • data
      • sample
        • predicates
          • scoreboard_value.json
          • scoreboard_range.json
          • scoreboard_ranges.json
    • pack.mcmeta

pack.mcmetaの内容はこちら。

{
  "pack": {
    "pack_format": 26,
    "description": ""
  }
}

また、pack.mcmetaとjsonファイル以外は全てフォルダになります。

jsonファイルの命名は各自で好きにつけて問題ありません。
本記事では、スコアボードをどこに使用しているのかを分かりやすいように命名しました。

jsonファイルの記述には、生成サイトを利用することをおすすめします。

valueにスコアボードを指示した場合

valueにスコアボードを指示した場合はこちら。
本記事では、scoreboard_value.jsonに記述したとします。

{
  "condition": "minecraft:value_check",
  "value": {
    "type": "minecraft:score",
    "target": "this",
    "score": "sample_score",
    "scale": 1
  },
  "range": {
    "min": 0,
    "max": 100
  }
}

value部分でスコアボードの情報を記述し、rangeでは最小を0、最大を100としました。

なので、スコアボード(sample_score)の値が0から100以内であれば、真となります。

実行するコマンド例としては

/execute if predicate sample:scoreboard_value run give @a diamond 1

といった感じです。

rangeの一方にスコアボードを指示した場合

rangeの一方にスコアボードを指示した場合はこちら。
本記事では、scoreboard_range.jsonに記述したとします。

{
    "condition": "minecraft:value_check",
    "value": 50,
    "range": {
      "min": {
        "type": "minecraft:score",
        "target": "this",
        "score": "sample_score",
        "scale": 1
      },
      "max": 100
    }
  }

まず値(value)に50を指定しています。
その上で範囲の最大値が100、最小はスコアボードの値によって変動するようにしました。

参照するスコアボードであるsample_scoreの値が10である時は、10~100の間に50が存在する(適切である)ため、真となります。

もしsample_scoreの値が70であれば、70~100となるため、50が適切な値とみなせないわけですね。

実行するコマンド例としてはこちら。

/execute if predicate sample:scoreboard_range run give @a diamond 1

rangeの両方にスコアボードを指示した場合

rangeの両方にスコアボードを指示した場合はこちら。
当記事では、scoreboard_ranges.jsonに記述したとします。

{
    "condition": "minecraft:value_check",
    "value": 50,
    "range": {
      "min": {
        "type": "minecraft:score",
        "target": "this",
        "score": "sample_score",
        "scale": 1
      },
      "max": {
        "type": "minecraft:score",
        "target": "this",
        "score": "sample_score",
        "scale": 10
      }
    }
  }

valueには50を指定。
範囲を示す最小と最大の値は、どちらもsample_scoreというスコアボードの値を参照します。

ただし、scaleを指示しているため、そのままの値が適用されるわけではありません。

仮にスコアボードの値が10だとすると、最小はscaleに1を指示したので、1×10で10のままです。
最大はscaleの値が10であるために、10×10の積である100となります。

つまりsample_scoreの値が10である場合は、「10~100の間に50が含まれているか」ということですね。
もちろん含まれているため、真となります。

scaleは簡単に言えば「倍率」で、スコアボードに掛ける値と思えばOKです。

実行するコマンド例としてはこちら。

/execute if predicate sample:scoreboard_ranges run give @a diamond 1

すべてに共通しますが、最小と最大の関係が反転しており矛盾するなどといった場合には上手くいきません。

まとめ

というわけで、今回のまとめです。

ポイント
  • value_checkはスコアボードの値などと組み合わせることで、複雑な比較が簡単に行える。

この記事は以上になります。

  • 【まとめ】functionコマンドの基本から応用【マイクラ】
  • 【まとめ】カスタムストラクチャーの実装・カスタム方法【マイクラ】