08.002.Append by set - MCJE-Tech-Community/Datapack-WIki GitHub Wiki

📥 set操作で要素を追加する

まず、listを削除しておきます。

data remove storage _ list

以下のコマンドを実行する度に、list{result: 0}が追加されます。

data modify storage _ list.[{result: 0b}].result set value 0

また、以下のコマンドを実行する度に、list{result: (コマンドの結果)}が追加されます。

execute store result storage _ list.[{result: 0b}].result int 1 (結果を返すコマンド)

仕組み

NBTパスを用いたデータの書き換え時には、少なくともNBTパスがターゲットとなるNBTを辿っていけるようにデフォルトのNBTが追加されていきます。 例えば空のストレージ_に対して

data modify storage _ a.b.c set value 0

を実行すると、先述の通りストレージ_は以下のようになります。

{
  a: {
    b: {
      c: 0
    }
  }
}

次にlist.[{result: 0b}].resultについて考えてみましょう。 list.[{result: 0b}].resultの最後のresultまで辿り着けるためには、listListTagで、かつその中に{result: 0b}がある必要があります。 そのため、空のストレージ_に対して

data modify storage _ list.[{result: 0b}].result set value 0

を実行すると、ストレージ_の状態は以下のように変化していきます。

  1. {
      list: []
    }
    
  2. {
      list: [{result: 0b}]
    }
    
  3. {
      list: [{result: 0}]
    }
    

最終的にlist{result: 0b}を失っていることに注目してください。 これにより、再び

data modify storage _ list.[{result: 0b}].result set value 0

を実行すると、ストレージ_の状態は以下のように変化していきます。

  1. {
      list: [{result: 0}]
    }
    
  2. {
      list: [{result: 0}, {result: 0b}]
    }
    
  3. {
      list: [{result: 0}, {result: 0}]
    }
    

これがset操作で要素を追加できる仕組みです。