ルッキーのコマンドメモ

主にマイクラのコマンドやデータパックに関することを書いていきます。

(マイクラ コマンド・データパック) 文字列の比較をする方法

文字列の比較をする

今回はstorageを使って文字列の比較をする方法について紹介していきます。
これを利用することで、プレイヤの選択しているアイテムが変化したのを検知してコマンドを実行する、といった操作ができるようになります。

目次

文字列の比較をする方法

文字列の比較は、ストレージにその文字列を代入してみてストレージの中身が変更されたかどうかを調べることにより、実装できます。 例として、testというstorage内のstrAに格納されている文字列とstrBに格納されている文字列が一致するかどうか調べるコマンドを紹介します。

# 比較の結果を入れるためのストレージにstrAをコピーしてくる
data modify storage test compare set from storage test strA

# 比較用の結果を入れるためのストレージにstrBの文字列をコピーし、その成功判定をそのままそのストレージに上書きする
execute store success storage test compare int 1 run data modify storage test compare set from storage test strB

# ストレージの変更に成功していればyesとチャットに表示する
execute if data storage test {compare:1} run say yes 

順番に内容を説明していきます。
まず1つ目のコマンドでは比較の結果を確認するためのストレージにstrAに格納されている値を代入しています。

次に2つ目では、1つ目で文字列を格納したストレージにstrBに格納されている値を代入し、さらにその結果をそのストレージに上書きしています。
もし、strAの値とstrBの値が同じであったならストレージに変更が行われず、結果は0となります。
逆に値が違ったならストレージに変更が行われるため、結果が1になります。

そして3つ目で文字列に変更が行われているか(比較用のストレージに1という値が入っているか)を調べて変更が行われていればyesとチャットに表示しています。

使用例: プレイヤの持っているアイテムが変化したことを検知する

文字列の比較の使用例として、実行したプレイヤの持っているアイテムが変更されたかを調べるコマンドを紹介します。以下のコマンドを毎tick実行します。

# プレイヤが素手の場合
execute unless data entity @s SelectedItem store result storage test compare int 1 if data storage test SelectedItem
execute unless data entity @s SelectedItem run data remove storage test SelectedItem

# プレイヤが何かアイテムを持っている場合
execute if data entity @s SelectedItem store success storage test compare int 1 run data modify storage test SelectedItem set from entity @s SelectedItem

# 結果の表示
execute if data storage test {compare:1} run say yes

少し複雑なコマンドです。
プレイヤが素手の場合、SelectedItemのnbtが存在しないので、ストレージの変更が常に失敗するからです。そのため、プレイヤが素手の場合と何かアイテムを持っている場合で分けてやる必要があります。

まず、プレイヤが素手の場合です。
以下のような流れになります。

  • testストレージにSelectedItemというデータが存在するかを調べ、その結果をtestストレージのcompareに代入する。
    testストレージのSelectedItemには1tick前のプレイヤのSelectedItemのnbtが入っているので、 1tick前のプレイヤが素手ならこのデータは存在せず、compareに0が入る。
    一方、素手でなければデータが存在するため、compareに1が入る。
  • testストレージのSelectedItemのデータを削除する。
    このtickではプレイヤは素手なのでSelectedItemデータを削除する。

次に、プレイヤが素手ではない場合です。
こちらは最初に紹介した文字列の比較をそのまま適用するだけになります。
その際、文字列の比較を行うのと同時にtestストレージのSelectedItemのデータにこのtickのプレイヤのSelectedItemのデータを代入しています。

以上で、文字列の比較が終了です。
executeコマンドを用いてcompareの値が1であるならば(持っているアイテムが変更されているならば)yesとチャットに表示しています。

まとめ

文字列の比較を行いたい場合には、片方の文字列をストレージに代入しておき、もう片方の文字列をそこに代入した結果を確認することで比較結果を調べることができます。