見出し画像

【1.20.5以降】advancementsのiconにcomponentsを【datapack】

こんにちは[・・]/ もめんどうふです
最近datapackを触れてますが、自作進捗であるadvancementsが、1.20.4→1.20.6のアプデで壊れました(´;ω;`)
サークルのminigameで使っているので直したかったんです

調べても(現時点で)新しいバージョンでの構文が見つからないので、
今回は治し方と、components化に伴う好きなプレイヤーの頭をiconにする現在の方法を書いていきます

なお、datapackの作成やadvancementsについてなど前提の説明は省きます

追記:1.21でも同様に動作しますが、
フォルダ名を単数形の  advancement  に変更してください


1.20.6~アプデで変えられたiconの記述

何が変わった? +全体像の例

今までは、iconにただの釣竿を指定するときは
"icon"{
"item":"minecraft:fishing_rod"
}

でしたが、今回からは

・item が id   に変更
・"count":1 が追加
・nbt が components に変更

という変更がされました 逆に言えば他はそのままです(達成条件は確認しきれませんでしたが…)
ただ、公式の進捗にはcountが追加されましたが無くても動きます(今回は有りで進めてます)
countは達成可能回数というAI君の話や、値を大きくすると他の進捗が消えたりといまいちわからないので分かり次第追記します 弱者ですみません

つまり先ほどの文は
"icon": {
"count":1,
"id": "minecraft:fishing_rod"
}
になります

以下に以前作ったミニゲーム用進捗を例として載せておきます
(achievementコマンドでしか達成できない進捗です)

{
  "parent": "tofu_turi:turi/root",
  "display": {
    "icon": {
      "count":1,
      "id": "minecraft:fishing_rod"
    },
    "title": "釣りゲームはじめました",
    "description": "初めて釣りゲームをプレイした",
    "frame":"goal"
  },
  "criteria": {
   "run_command": {
     "trigger": "minecraft:impossible"
   }
 }
 }

旧verの物を治すにはどうする?


・itemをidに書き換え
・countを書き足し(任意?)
・components移行作業

この時"icon":{      }内で要素の陳列(?)を示す
            ,  (半角カンマ)
陳列最後尾以外の要素の最後に付けることを忘れ(間違え)ないよう気を付けてください

A,
B,
C

これで動くと思いますが、問題は最後のコンポネ移行です
今回は個人的に使用頻度が高いものの複雑な
カスタムヘッド(任意のプレイヤーのスキンを反映した頭)
を設定する方法と、
単純に済むcustom_model_dataの指定を紹介します

カスタムヘッドをiconにしたい

componentsを指定しよう

変更もなにも変わり過ぎなので先に完成形です
mhf_pufferfishというプレイヤーの頭を指定しています
pufferfishとはフグのことです
つまりうちのサークルの象徴です

{
    "display": {
      "icon": {
        "components":{
          "minecraft:profile":{
            "name":"MHF_pufferfish"
          }
        },
        "count":1,
        "id": "minecraft:player_head"
      },
      "title": "釣りゲーム",
      "description": "ただ釣るだけの簡単なゲーム",
      "background": "minecraft:textures/block/light_blue_wool.png",
      "frame": "task",
      "show_toast": false
    },
    "criteria": {
      "run_command": {
        "trigger": "minecraft:impossible"
      }
    }
}

ちなみに今までの書き方は
"icon": {
  "item": "minecraft:player_head",
  "nbt":"{SkullOwner:'MHF_pufferfish'}"
 }

です 

componentでは、
コンポネ内容の名前 : { 中身 }
のような形を取ります
そのため今回は

components  としての
profile            に含まれる
name              が
「MHF_pufferfish」

という指定をしています

{}などの構文は、上の文を使い説明すると

最下層(nameのところ)は   { "内容の名称" : "任意の物" }
例 {
"name":"MHF_pufferfish"}

中層(profile)は         {"内容の名称" : 最下層 }
 {"minecraft:profile":{"name":"MHF_pufferfish"}}    
最下層{ }は""で囲わないこと

最上層(components)は            "components" : 中層
(完成) "components" : {
                        "minecraft:profile":{"name":"MHF_pufferfish"}
                  } 
最上層だけ{}で囲わないのは icon{}の中に入れるからです

tellrawコマンドなどで複雑な文を作るときの
{"text":"あいうえお","color":"aqua"}
の書き方に近いですね

これでプレイヤーの頭を自由に指定できます
これのコンポネが複雑なのはprofileのnameのように要素を入れ子構造?のように持つため、{ }に{ }が入るからです
次のcunstom_model_dataは入れ子にならないのでより単純です

おまけ custom_model_data を指定してみる

player_headと同じで絵柄に自由度の高いcustom_model_data、
テクスチャ作成は別途必要ですが進捗アイコンの幅が大きく広がります
そしてなによりcomponentsが簡単です
以下ではcustom_model_data=1で作成済みの生鱈を指定してます

{
  "parent": "tofu_turi:turi/root",
  "display": {
    "icon": {
      "count":1,
      "id": "minecraft:cod",
      "components":{
          "custom_model_data":1
        }
          
    },
    "title": "釣りゲームはじめました",
    "description": "初めて釣りゲームをプレイした",
    "frame":"goal"
  },
  "criteria": {
   "run_command": {
     "trigger": "minecraft:impossible"
   }
 }
 }

"components":{
          "custom_model_data":1
}
で終わりです 前述した要素指定で"custom_model_data"が1であることを示すだけです(数なので"1"にはならない所は注意)
さっきは1の代わりに入れ子としてもう一段階踏んだので複雑に見えただけなんです

因みに場面は少なそうですが、複数コンポネを指定するときは
,(カンマ)からの次の要素を書けば大丈夫です
"custom_model_data":1,
"nanikashira":"nanika"
}


大雑把ですがこれで紹介は終わりです
新verでの進捗作りに役に立てれば幸いです
拙い文章ですが見ていただきありがとうございます

実際に使っていた自作進捗ツリー

(余談)無知でも書けたわけ

無知なのでいきなり壊れて、調べても旧ver情報しか出ず焦りましたが、何とか冷静にバニラのデータを展開して公式進捗を1.20.4と1.20.6で読み比べました

その結果iconの変更とわかり、真似したらなおったものの、今度はplayer_head の旧nbt指定が分からない  公式進捗も当然ただのアイテムでcomponentsなんて指定されていない..

そこで進捗を考えて、唯一nbt指定があるものを思いつきました
…不吉な旗です あれは旗に模様を指定している物なんです
そして襲撃関連の進捗を見比べると無事旗模様のcomponents記述を発見

救世主

次に1.20.5対応giveコマンド生成ツールでplayer_headを指定しprofileなどの書き方を把握

最後に旗模様を参考に{}や""を確認してprofile系を書いていった結果完成させられました
componentsの構文知識があれば余裕なんだろうなと思いつつも完成時は嬉しいものです
不吉な旗を思いついた授業中のひらめきを誰か褒めてください()




いいなと思ったら応援しよう!