LootTableを使ったガチャ装置の作り方

ランダムに色々なアイテムが出てくる「ガチャ(ガシャ)」装置。例えば「運が良ければダイヤモンドが出てくる」「運が悪ければゴミアイテムが出てくる」など、マルチプレイのサーバーや配布ワールドに設置してみたいですよね。今回はバージョン1.9の新機能「Loot Table」を使って、コマンド最少1つだけ(回路無し)でのガチャ装置の作り方を解説します。この方法なら、json文書を編集するだけで高度な条件/確率の設定ができるんです。世界に一つだけのガチャを作ってみませんか。

記事公開当初は「コマンドは最低2つ」としていましたが、なんと1コマンドだけで実現できたのでコマンド解説の部分を書き直しました。棒レンジ氏、ありがとうございました!


スポンサーリンク
お待ち! この記事は最後の更新から1年以上経過している古い記事だ。新しいバージョンに合わせて装置を作り直してスクショを取り直して解説を書き直す面倒臭さが君には分かるかい? 分からないなら読まないほうがいいぜ。
この記事で解説する装置は、Minecraftバージョン1.9以上でしか動きませんのでご注意下さい。

マイクラで「ガチャ」ってどんな感じ? ダイヤ等を投入して回せます

ガチャの会場

どこかで見たことあるようなないようなこのレッドカーペットの通路。奥にはドラゴンが構えています。御存知の通り某ソシャゲのガチャ画面を再現したわけですが、果たしてマイクラではどのようにガチャを回すのでしょうか。

新ガチャ

事前に特別な「オーブ」というアイテムが用意されていて、それを5個ホッパーに投入するとポイッとアイテムが出てきます。"回す"と言うより"出す"ガチャですね。

経験値を消費して回す例

ただアイテムを投入して引くだけでなく、経験値を消費して引く、だとか様々な方法でガチャを回せます。単純にボタンを押すと回せる、でもいいですし、配布ワールドで「ランダムに○○する」イベントを発動するきっかけの装置にもできます。

各アイテムには出やすさが設定できます

もちろんただアイテムがポンポン出ているだけではなく、各アイテムごとに出やすさを設定できます。「運」効果を持っていれば特定のアイテムを出やすくすることも可能です。

ガチャの必要最低限のコマブロはこれだけ

もう少し噛み砕いていいますと、なんと▲1コマンドだけでガチャが作れちゃうんです。「アイテムを複数出したりできるの?」と心配な方もいらっしゃるかもしれませんが、マイクラ1.9からはたった1つのコマンドで大量の種類のアイテムを自由自在な確率で出すことが可能なんです。そう、Loot Tableがあればね。


LootTableを使ったガチャ装置の仕組み

いつもの雑パワポ図解にするとこんな感じ。ガチャで出てくるアイテムを、あらかじめLoot TableのJSONファイルに書いておいて、出やすさやエンチャ等を設定しておきます。それをマイクラ内でガチャを引く時に、Loot Tableを設定した、即死ぬ透明なエンダーマイトを召喚すればドロップ表に設定してあるアイテムが出てくるわけですよ。これならコマンドは1つだけで済みます。

「エンダーマイトって敵だからピースフルじゃ使えないでしょ」とお思いの方、私も最初はそう思っていたのですがどちらにせよ即死するのでこのエンダーマイトはピースフルでも使えます。


アイテムの種類や量、出てくる確率や条件を決める「Loot Table」を用意しよう

ガチャで出てくるアイテムの出やすさや量、エンチャントやNBTタグ等を定義するために、これから「Loot Table」のファイルを作成していきます。JSON形式なので書き方はとっても単純。

これがLoot Tableだ

こちらがLoot Tableを実際に書いてみた例です。"pools"(=まとまり)に出てくるアイテムの合計量を指定して、"entries"(=項目)にアイテムを書いていきます。それぞれに"function"(=機能)を設定してエンチャント効果やNBTタグなどを付けていきます。さらにpool/entry(アイテム)/functionに多種多様な"condition"(=条件)を設定できます。どんどん書き足すことで、いくらでも複雑なガチャが作れちゃうんです。

「こんなの手書きできねえよ!」と思った方も安心して下さい、こちらでJSONを書かずともLootTableが作れるツールを紹介しています。


Loot Table(ドロップ表)のファイルを書く準備

ワールドフォルダー内にsaves→loot_tablesフォルダーを作成

まずは使っているワールドのフォルダーを開き、dataフォルダーの中にloot_tablesフォルダーを作成します。

さらにフォルダーを作成してjsonを配置

loot_tablesフォルダーの中に、さらに好きな名前のフォルダーを作成します。例えば配布ワールドの名前だとか、オリジナルの名前を付けると良いでしょう。このフォルダーの名前が、LootTableを指定する際の"Foo:bar/baz"Foo部分になります。バニラのLoot tableを上書きする場合はminecraftという名前にします。この記事では、napoanという名前にした前提で解説を進めます。

作ったフォルダーの中に、好きな名前のjsonファイルを作成します。Windowsの場合は右クリック→新規作成→テキスト(rytxtファイルを作った後、拡張子をjsonに変更しましょう。


高機能なテキストエディタを使おう
▲ダブルクオーテーションを打ち忘れるなど、間違いがあると分かりやすく視覚的にお知らせしてくれる。

JSONファイルを編集するソフトについてですが、Windows付属のメモ帳ははっきり言ってダメです。SublimeTextやAtomなどの、構文チェックや自動補完機能付きの高機能なテキストエディタを使うことをおすすめします。各テキストエディタの導入方法については割愛させていただきます。


ガチャアイテム一覧のLootTableの書き方を解説

作成したJSONファイルを開いて中身を書いていきます。突然ですが完成品の例。

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond_block",
                    "weight": 1,
                    "quality": 5
                },
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 9,
                    "quality": 2
                },
                {
                    "type": "item",
                    "name": "minecraft:stone",
                    "weight": 10,
                    "quality": 0
                }
            ]
        }
    ]
}

初めての方は、これをコピーしてテキストエディタに貼り付けてください。こちらの記事を既に読まれた方なら構造が丸わかりだと思いますが、読んでいない方のためにも要点を掻い摘んで解説いたします。

  • "rolls": 数値 - 出てくるアイテムの項目(entry)の数です。一般的なガチャの場合は1でいいでしょう。
    • "entries": [] - この中に項目を書いていきます。
      • "type": "種類" - ここでは単純にアイテムを指定するので"item"にします。
      • "name": "アイテムID" - アイテムIDを指定します。必ずminecraft:を付けましょう。
      • "weight": 数値 - そのアイテムの出やすさです。確率というよりは"出る比重"ですね。
      • "quality": 数値 - 運効果による出やすさの増減の大きさです。よく分からない場合は書かなくて構いません。
        "weight"の値 + ("quality"の値 × luck効果のレベル)
        詳しくはこちらで解説しています。

要するにentries:[]の中にアイテムを書いていくわけです。それぞれアイテムIDと出やすさを指定していくだけ。

LootTableで使うJSON記法の基本的なルール
  • 数値はそのまま、文字列は""で囲む!
  • 複数項目があるときは[]で囲む!
  • 最後の項目の後にコンマを付けるとエラーになる

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:iron_ingot",
                    "weight": 6,
                    "functions": [
                        {
                            "function": "minecraft:set_count",
                            "count": {
                                "min": 5,
                                "max": 10
                            }
                        }
                    ]
                },
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1,
                    "functions": [
                        {
                            "function": "minecraft:set_count",
                            "count": {
                                "min": 1,
                                "max": 3
                            }
                        }
                    ]
                },
                {
                    "type": "item",
                    "name": "minecraft:wool",
                    "weight": 3,
                    "functions": [
                        {
                            "function": "minecraft:set_data",
                            "data": 10
                        }
                    ]
                }
            ]
        }
    ]
}
▲(新機能!)マウスオーバーすると説明が表示される箇所を用意しています

Loot Tableはコマンドとは違った方法でアイテムの数やデータ値(羊毛などの種類を指定する数値)を指定します。"weight"等と並べて"functions":[]と書き、中に"function"(機能)を書きます。


各種function、condition等LootTableの全要素を網羅した大長編解説記事はこちら
LootTable(ドロップ表)完全ガイド

ここで登場した機能は全体のほんの一部に過ぎません。この記事では全然解説できてませんので、LootTableの書き方については▲の記事を是非お読みください。全ての機能、さらには"条件"等を片っ端から解説しています。(前も言った気がしますが多分このブログで最長の技術系記事です)


JSONを書くのが面倒な方は、ツールを使って簡単にLoot Tableを生成しよう

め゛ん゛どぐぜえ゛

め゛ん゛どぐぜえ゛!!!


これ使ってみ

「これ使ってみ。」


Loot Tableがクリックポチポチでとっても簡単に作れるサイト
LootTable作成ツール
http://minecraft.tools/en/loots.php

LootTableのJSONを書くのが面倒なあなたに朗報です。いとも簡単にLootTableが作成できてしまうサイトがあるんです。当ブログで度々登場しているサイト「Minecraft Tools」のLootTableコーナーです。

まずモードを選択

サイトにアクセスしたらまずLootTable自体の種類を選びましょう。「Kill a Mob or Entity (Mob Drops)」にします。

※このツールではLootTableを「チェスト用」「ドロップアイテム用」に分けて扱っていますが、実際LootTableは別け隔てなく使えるものです。このツールではこの選択によっていくつかのオプションが非表示になるのでご注意下さい。手書きなら好き放題全機能を使えます。

基本的な設定項目

画面は単純明快なので説明するまでもないかもしれませんが、一応図で項目の場所を示しておきます。

More options

「More Options」をクリックするとさらに設定項目が表示されます。それぞれの項目の効果についてはこちらの記事で詳しく解説していますので是非お読みください。特にエンチャント指定とNBTタグ欄はよく使います。

jsonを生成してファイルをダウンロードするかコピー

「GENERATE YOUR LOOTS TABLE」をクリックするとJSONが生成されます。自動生成ではないので使う度に押しましょう。そして下のClick here to downloadの「here」をクリックします。するとJSONファイルがダウンロードできます

jsonをコピー

記事前半のこちらの解説を読んでLootTable専用フォルダーを作成して下さい。配置する準備が整ったら、ダウンロードしたJSONファイルをloot_tableフォルダー内の好きな場所に設置します。一緒に名前を分かりやすいものに変えておきましょう。


ガチャのコマンドと装置の作り方を解説

ここからはコマンドの解説です

LootTableの作成お疲れ様でした。ここからはコマンドを解説していきます。


アイテムをホッパーに投入して回す方式の作り方

2つの座標を確認

まずは「"オーブ"等のアイテムを投入して回すガチャ」の作り方を解説します。装置作成前に、以下の2つの場所を決めておきましょう。

事前に確認しておく座標
  • ホッパーの座標 - 以下、座標Hとします
  • アイテム排出場所の座標 - 以下、座標Oとします

ガチャを回すためのアイテムを事前に入手しておきましょう▼。コマンドの作成ならMCStackerが便利です

ガチャを回す対価となるアイテムを入手するコマンド
オーブ
/give @p diamond 64 0 {display:{Name:"オーブ",Lore:["ガチャに入れてね","5個で一回回せるよ"]},ench:[{id:34,lvl:5}],HideFlags:1}
▲目立たせるために適当なエンチャント効果を付けていますが、ひでフラグ:1にしてあるためツールチップには表示されません。

アイテム払う場合のガチャ装置

4つコマンドブロックを同じ向きで並べます。

※マウスオーバーすると説明が出る箇所を用意しています。
「1」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/testforblock 座標Hのx y z minecraft:hopper 0 {Items:[{Slot:0b,id:minecraft:diamond,Damage:0s,Count:5b,tag:{display:{Name:"オーブ",Lore:["ガチャに入れてね","5個で一回回せるよ"]},ench:[{id:34,lvl:5}]}}]}
ホッパーの一番左のスロットにオーブが5個入ったかどうかをtestforblocksコマンドで判定します。
「2」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/summon Endermite 座標Oのx y z {Tags:["GachaDeath"],Silent:1,Lifetime:2400,DeathLootTable:"LootTableの場所と名前",ActiveEffects:[{Id:14,Amplifier:0,Duration:100,ShowParticles:0b},{Id:20,Amplifier:127,Duration:20}]}
「1」が成功したら実行。座標Oに、LootTableを設定した、ライフタイム2400でウィザー効果も付けた即死エンダーマイトを召喚します。(ちなみにライフタイムを2400にするのは煙を消すためです)
loottableの指定方法
LootTableの場所と名前についてはこの図の通りです。例: DeathLootTable:"napoan:gacha/gacha1"
「3」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/blockdata 座標Hのx y z {Items:[{Slot:0b,id:minecraft:air}]}
ホッパーの一番左のスロットを空にします。
「4」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/playsound minecraft:entity.player.levelup master @a 音源にしたい座標x y z
▲ガチャを回すと同時に効果音を鳴らします。
数が多すぎると

注意点として、ホッパーに必要以上に一気に入れても認識されませんのでご注意下さい。

※LootTableに変更を加えた場合、ワールドに入り直さないと反映されないのでご注意下さい。

経験値レベルを消費して回す方式の作り方

レベルが足りないと警告してくれる

次は「レベルを消費してガチャを回す」装置の作り方を解説します。

経験値払うガチャ装置
※マウスオーバーすると説明が出る箇所を用意しています。
「a」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/testfor @p[l=9]
最寄りの人のレベルが9以下かどうか判定します。
「b」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/tell @p レベルが足りませんぜ!
レベル9以下なら警告。
「c」Repeat(リピート)Unconditional(無条件)Always Active(常時実行)
/testfor @p[lm=10]
これはUnconditionalなので無条件に実行。今度はレベルが10以上かどうか判定します。
「d」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/xp -10L @p
レベル10以上ならレベルを10マイナス。
「e」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/summon Endermite 排出場所のx y z {Tags:["GachaDeath"],Silent:1,Lifetime:2400,DeathLootTable:"LootTableの場所と名前",ActiveEffects:[{Id:14,Amplifier:0,Duration:100,ShowParticles:0b},{Id:20,Amplifier:127,Duration:20}]}
指定した座標にLootTableを設定した即死エンダーマイトを召喚します。
「f」Chain(チェーン)Conditional(条件付き)Always Active(常時実行)
/playsound minecraft:entity.player.levelup master @a 音源にしたい座標x y z
効果音を鳴らします。

※LootTableに変更を加えた場合、ワールドに入り直さないと反映されないのでご注意下さい。



最後までお読みいただきありがとうございました

Loot Tableさえ用意すれば、後はそれをドロップアイテムに設定した即死エンダーマイトを召喚するだけ。それが新時代のガチャ装置の作り方です。皆さんも自由にLootTableとガチャ装置周辺の回路を設計して、思い通りの"ガチャ"を作ってみてください。最後までお読みいただきありがとうございました。

スポンサーリンク

毎度毎度ツイート、コメント等ありがとうございます。Twitterではブログの更新状況など色々呟いてます。気軽にフォロー下さい。

スポンサーリンク

コメント

お待ち! この記事は最後の更新から1年以上経過している古い記事だ。新しいバージョンに合わせて装置を作り直してスクショを取り直して解説を書き直す面倒臭さが君には分かるかい?
  • GW?なにそれ美味しいの?

    記事投稿お疲れ様です!
    二日間偶に訪れてはF5連打して待っていました!(DOS攻撃ではないです)
    眠気眼を擦って早速製作させて頂きます!

    • おはようござません

      Twitterとかプッシュ通知とか使えよww

    • 豚さんを守る会

      なるほどDOSですね。

  • たつやチャンネル

    スコアボードの値を経験値に表示する方法を教えてほしいです。
    3時間自力でやったんですができませんでした。
    助けてください

    • ookiikuma

      二進数使えばいけますよ

      • たつやチャンネル

        やってみたんですが上手くいきませんでした(´;ω;`)

        • ookiikuma

          スコアボードの値を別のスコアボードに代入して代入した値が2のべき乗(2^n)以上あればxpコマンドで経験値を増やして代入した値からそのべき乗の数を引いてそれを大きい方からやれば行けます
          文字だと非常に分かりにくいですが・・・

      • 豚さんを守る会

        それで理解できる方はかなり少ないかと(´・ω・`)

  • 雨降り暇人

    質問です、この記事で紹介されたガチャ機構を前作のガチャ機構のように
    低確率のアイテムが出てくると「レア!」や「激レア!」といった
    /titleが出るように改造したいのですが、何か方法はありますか?

    • 出てきたアイテムにscoreboardの値を付与して、値が1の時だけtitleコマンドを実行させれば実現できます。
      /scoreboard objectives add gachaTitle dummy
      でスコアボードを作成。

      以下2つを常時実行します
      /scoreboard players add @e[type=Item] gachaTitle 1 {Item:{id:minecraft:アイテムID,Damage:データ値s,tag:{display:{Name:"アイテム名",Lore:[説明文]}}}}

      /execute @e[type=Item,score_gachaTitle_min=1,score_gachaTitle=1] ~ ~ ~ title @a title {“text":"激レア!","color":"yellow"}

  • 漆黒のイデア

    hereを押してもダウンロード出来ません。

    • 使っているブラウザを教えていただければ助かります。

      • 漆黒のイデア

        mac osです。

        • ブラウザ、つまりWebの閲覧に使っているソフトを教えて頂ければ助かります。例えばSafari、Chromeなどです

          • 漆黒のイデア

            すみませんsafariです。

          • Safariですか… 私Macを持っていないので検証できません、申し訳ないです
            Chromeなど他のブラウザーで試してみてください

  • 漆黒のイデア

    すみませんSafariです。

  • なか

    前回のコマンドの上に防具立てを置いてランダムでレッドストーンブロックを設置する方法に関して質問があります。
    excuteコマンドでGachaという防具立ての上にランダムで設置するようにコマンドブロックを入れたのですが
    肝心のGachaという防具立ての出し方がわかりません・・・・
    厳密にいえばgachaという防具立ては出せたのですがそこにレッドストーンが設置できなくなっています。
    防具立てを設置するときはどのようなコマンドでやればよろしいのでしょうか?

    • まずレッドストーンブロックを先に設置して、その上に立ちます。
      次に以下のコマンドで、プレイヤーの1ブロック下に防具立てを召喚します。
      /summon ArmorStand ~ ~-1 ~ {CustonName:"Gacha",CustomNameVisible:1}
      こんな風に相対座標を使えば、最初からブロックと重なった状態でエンティティを召喚できます。

      • なか

        申し訳ございません、試してみたのですが表示が防具立てのままでした・・・
        ちなみにこの場合って前回のガチャの方法で行けばガチャという名の防具立て
        にあるレッドストーンか消えガチャを回すときにまた防具立てにレッドストーンブロックが
        設置されるわけですが、そのまま防具立てに重ねてまた設置できるのでしょうか?

        • ごめんなさいミスタイプで「CustonName」になってました、正しくは
          /summon ArmorStand ~ ~-1 ~ {CustomName:"Gacha",CustomNameVisible:1} です(上のコメントは修正済みです)

          ブロックの設置についてはエンティティの有無にかかわらず設置されるのでレッドストーンブロックはいつでも設置できます。

          • なか

            解決しました!ありがとうございます!!

  • コマンドでメラゾーマ作った人

    自分がある防具を着ているときに感知するコマンドを教えてください

    • でんでん (Minecraft ID:denden0816)

      /testfor @p {ArmorItems:[{},{},{id:diamond_chestplate,Count:1b},{}]}

  • 2222

    前のガチャの記事の方がよかった

  • つるりん@絵師っぽい人

    エンダーマイトが死んでもアイテムが出てきません・・・
    フォルダの構成とかは確認したんですが(コマンドの方も)、jasonが問題ですかね?ツールで作ったんですが
    /summon Endermite 15 80 -4 {Lifetime:2400,silent:1,DeathLootTable:"napoan:gacya/gacya2″,ActiveEffects:[{Id:7,Amplifier:100,Duration:20,ShowParticles:0b},{Id:14,Amplifier:1,Duration:20,ShowParticles:0b}]}
    って感じなんですがナポアンさんの書いてくださったコマンドはあまり変えてないです
    フォルダの中はDesktopsipigotworlddataloot_tablesnapoangacyagasya2.jasonです

    • soushi53

      jasonではなく jsonです

  • でんでん (Minecraft ID:denden0816)

    /give @p diamond 64 0 {display:{Name:"オーブ",Lore:[“ガチャに入れてね","5個で一回回せるよ"]},ench:[{id:34,lvl:5}],HideFlags:1}
    ▲目立たせるために適当なエンチャント効果を付けていますが、ひでフラグ:1にしてあるためツールチップには表示されません。

    というところ、

    /give @p diamond 64 0 {display:{Name:"オーブ",Lore:[“ガチャに入れてね","5個で一回回せるよ"]},ench:[{}]}

    このほうが良いのではないのでしょうか?
    エンチャント効果をつけずに光らせる方法(ネザースターみたいなキラキラ✨)で改造してみたのですが…
    1.11では使えないかもです (>_<)

    • パープルの実況チャンネル!

      1.11で使えましたよ!!

  • 匿名希望

    weightの設定で出やすさを設定するのではなく、確実に出すようにするにはどうしたらいいですか?例えば10個の中から3個を選び、その1個1個にweightの設定がされていると3個選んだのに2個しか出てこないなんてこともあるはずです。上の例でいうなら、10個の中から3個選び、そのアイテムを100%の確率で1個ずつだけ出すようにするにはどうしたらいいでしょう?

  • kumakuma

    here というのをクリックしてもダウンロードできません(´;ω;`)win10です

  • 柊 真冬(あーくん)

    はじめまして、いつも参考にさせていただいております。
    以下の条件で『エンダーマイトは召喚できるが、アイテムをドロップしない』現象になっており教えていただきたく。
    コマンドブロック②で何か間違えていると思うんですが…。

    MCV:1.12.2 サーバ:Spigot
    jsonファイルの場所:略worlddataloot_tablesnms01gachanmsgacha.json
    コマブロ②の内容:/summon Endermite 474 81 259 {Tags:[“GachaDeath"],Silent:1,Lifetime:2400,DeathLootTable:"nms01:gacha/nmsgacha",ActiveEffects:[{Id:14,Amplifier:0,Duration:100,ShowParticles:0b},{Id:20,Amplifier:127,Duration:20}]}

    jsonファイルが別途必要であれば、どこかのアプロダにあげますので…
    何卒、よろしくお願いします。

    • 柊 真冬(あーくん)

      少し試した結果を。
      コマンドの「Lifetime:2400」を1400に変え、エンダーマイトを召喚→普通に攻撃して倒すと、設定したドロップアイテムになりました。もう少し頑張ってみます。

  • サディ実況者

    懐かしい記事だなぁ