今回は、ルートテーブルの基本をおさえて、実際にゾンビのソースをいじってみたいと思います。
いじるだけじゃゲームに適応されません。ワールドデータに格納する所までやって終わろうと思います。「もう分かるよ!」という方は次の編で掘り下げる予定なのでお楽しみに!
※スマホで見るとソースボックスが崩壊する場合がありますが、横画面モードにすれば普通に見れます。ですがPCで閲覧することをお勧めします。
スポンサーリンク
ページ目次
ルートテーブルとは?
アイテムドロップ表とも言いますね。その名の通り、MOBの落とすアイテムとその確率が記された文です。
こんな感じで、JavaScriptのjson文字列で記されたものがルートテーブルです。
こちらはスライムのルートテーブルですが、これがすべてのMOBに用意されており、バージョン1.9から簡単にいじることができるようになりました。
もちろんプログラミングの知識があればある程度直感的にわかると思いますが、その知識がなくともちょちょんと書き換えたり、コピペして付け加えたり...みたいな感じで全然いけちゃいます。
それでは実際に書き換えていきましょう!
実際に書き換えて保存!
まず、バニラで用意されているゾンビのルートテーブルを見てみましょう。(PCの方はページの表示サイズを少し小さくすると見やすくなるかと思います。)
ちなみに、バニラのルートテーブルは「.minecraft\versions\1.11\1.11.jar\assets\minecraft\loot_tables\」の中に格納されています。7zipなどの解凍ソフトが必要な部分もあります。
編集する際にはテキストエディターを利用しましょう。メモ帳では正直厳しいです^^;
「sublime text 3」「サクラエディタ」などのエディタがオススメです!
(図1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
{ "pools": [ { "rolls": 1, "entries": [ ] }, { "conditions": [ { "condition": "killed_by_player" }, { "condition": "random_chance_with_looting", "chance": 0.025, "looting_multiplier": 0.01 } ], "rolls": 1, "entries": [ { "type": "item", "name": "minecraft:iron_ingot", "weight": 1 }, { "type": "item", "name": "minecraft:carrot", "weight": 1 }, { "type": "item", "name": "minecraft:potato", "weight": 1 } ] } ] } |
通常ドロップアイテムを書き換える
まず上のテキストからゾンビ肉の詳細が記されている所を抜粋して見てみましょう。
(図2,図1の行6~26抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "type": "item", "name": "minecraft:rotten_flesh",//ゾンビ肉 "weight": 1, "functions": [ { "function": "set_count", "count": { "min": 0, "max": 2//0~2個ドロップする } }, { "function": "looting_enchant",//幸運エンチャントのボーナスドロップ "count": { "min": 0, "max": 1//ボーナスドロップ(幸運レベル×0~1)個 } } ] } |
①3行目の「 "name": "minecraft:rotten_flesh",」はアイテムIDが記されています。
例えば、ここを「 "name": "minecraft:diamond",」に書き換えたら、ゾンビが落とすアイテムのうちのゾンビ肉がコロッとそのままダイアモンドに変わってしまうわけです。
②「"functions"」内にある9,10行目にある「"function": "set_count"」の「"min"」と「"max"」の値がそれぞれ0と2になっていますね。
これは、三行目で定義されたアイテムがどれくらいの個数でドロップするかを表しており、これは「"min":0 "max":2」となっているので、0~2個のいずれかをランダムで抽選し、ドロップするということになります。
例えば、これを「"min":1 "max":5」にすれば、1個~5個のゾンビ肉をランダムでドロップする、という事になります。
③14行目の「"function": "looting_enchant"」は名前の通り、幸運のエンチャントでどのくらいのボーナスを発生させるか、というものです。
これも上の②のように、「"min"」と「"max"」で指定してあり、デフォルトでは「"min":0 "max":1」で設定されています。
「幸運エンチャントのレベル×min,maxの値」でボーナスドロップのアイテム数が決まるので、この場合で幸運Ⅲを利用してMOBを倒した場合は、「min×3=0,max×3=3」となるので、発生するボーナスドロップは0~3個の間のランダムとなります。
例えば「"min":1 "max":2」に書き換えて幸運Ⅲを利用した場合はボーナスドロップが3~6個発生するということになります。
スポンサーリンク
プレイヤーが倒した時のボーナス設定
(図3,図1の行29~58抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ "conditions": [ { "condition": "killed_by_player"//プレイヤーがトドメを刺した時 }, { "condition": "random_chance_with_looting", "chance": 0.025,//ドロップ率2.5% "looting_multiplier": 0.01//幸運Ⅰにつきドロップ率+1.0% } ], "rolls": 1,//下の三つから一つ選ぶよ "entries": [ { "type": "item", "name": "minecraft:iron_ingot",//鉄インゴット "weight": 1//出現比率(1/3) }, { "type": "item", "name": "minecraft:carrot",//ニンジン "weight": 1//出現比率(1/3) }, { "type": "item", "name": "minecraft:potato",//ジャガイモ "weight": 1出現比率//(1/3) } ] } |
これはプレイヤー自身がMOBのトドメを刺した時に発生するボーナスが書かれた項目です。キル時に経験値が出る判定の事です。
「"condition": "random_chance_with_looting"」の「chance」が0.025、「looting_multiplier」が0.01に設定されています。
これは0.025(2.5%)の確立で以下のボーナスが発生、幸運エンチャントのレベル1につき+1%されていくようになっています。
幸運Ⅲを使った状態だと、デフォ(2.5%)+幸運Ⅲ(3%)で5.5%の確立でプレイヤーが直接倒した時のボーナスが発生するようになっています。
そのボーナスというのが、13行目の「"entries"」以降に書かれているのが出現比率(entries内に複数指定してあるので、その中から抽選するため)でこれは全部1にしてあります(出る確率は3つとも同じになっている)。
例えば、プレイヤーがトドメを刺した時に「鉄インゴット」「ニンジン」「ジャガイモ」以外にも超激レアドロップで「ダイヤモンド」を落とすようにしたい!他のアイテムより出にくくしたい!という場合は↓こんな感じ↓で書いてあげればオッケーです。
(図4,図3の行12~29抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
"rolls": 1, "entries": [ { "type": "item", "name": "minecraft:iron_ingot",//鉄インゴット "weight": 2//出現比率(2/7) }, { "type": "item", "name": "minecraft:carrot",//ニンジン "weight": 2//出現比率(2/7) }, { "type": "item", "name": "minecraft:potato",//ニンジン "weight": 2//出現比率(2/7) }, { "type": "item", "name": "minecraft:diamond",//ダイヤ "weight": 1//出現比率(1/7) } ] |
これで、1/7の確率でダイヤが選出されるようになります。
ちなみに、勘違いしてしまいがちなのですが、2.5%からの1/7なので、素手で倒してダイヤが落ちる確率は1体あたり1/280(約0.35%)になります( ˙-˙ )
スポンサーリンク
試しに作ってみたよ
エディターに張り付けて拡張子「.json」で保存するもよし。既存のものに張り付けるのもよし。(図5)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
{ "pools": [ { "rolls": 1,//下の二つから一つ選ぶよ "entries": [ { "type": "item", "name": "minecraft:rotten_flesh",//ゾンビ肉 "weight": 199,//199/200なので99.5% "functions": [ { "function": "set_count",//個数 "count": { "min": 0, "max": 2 //0~2個ドロップする } }, { "function": "looting_enchant",//幸運エンチャントのボーナスドロップ "count": { "min": 0, "max": 1 //ボーナスドロップ(幸運レベル×0~1個) } } ] }, { "type": "item", "name": "minecraft:skull",//MOBの頭 "weight": 1,//1/200なので0.5% "functions": [ { "function": "set_data", "data": 2//データ値2(ゾンビの頭) } ] } ] }, { "conditions": [ { "condition": "killed_by_player"//プレイヤーがトドメを刺した時 }, { "condition": "random_chance_with_looting", "chance": 0.05,//ボーナス発生確率5% "looting_multiplier": 0.02//幸運エンチャントⅠにつき+2% } ], "rolls": 1, //下の二つから一つ選ぶよ "entries": [ { "type": "item", "name": "minecraft:iron_ingot",//鉄インゴット "weight": 4//抽選比率4(4/5なので80%) }, { "type": "item", "name": "minecraft:diamond",//ダイヤモンド "weight": 1//抽選比率1(1/5なので20%) } ] } ] } |
バニラのゾンビと基本的には変わらないのですが、0.5%の確率でゾンビ肉ではなくゾンビの頭がドロップするようにしました。
トドメドロップアイテムも諸々変更しました。(確率、野菜系落ちないように、ダイヤ追加)
※文中にある // (ダブルスラッシュ)以降の文字は説明です。
ゲームに適用しよう!
.minecraft内の「saves/"ワールド名"/data」の中に新規フォルダ「loot_tables」を作成。
「loot_tables」の中に更に新規フォルダ「sumple(任意名)」を作成。
その中にjson形式のルートテーブルを入れます。
あとは、そのワールドでこのコマンドを実行したら、そのアイテムドロップ表を持ったゾンビがスポーンします。
/summon zombie ~ ~1 ~ {DeathLootTable:"sumple:ファイル名"} |
「sumple」の部分は先ほど作成したフォルダの名前にします。
うまくいかない場合は、以下の事を確認してみてください。
・「 , 」コンマを忘れていないか。
・記法が正しいか。誤字脱字がないか。
・コマンドやファイル配置が正しいか。
どうしても分からない場合は僕のツイッター(@KzKzKazz)のDMまで来ていただければ、できる範囲で対応したいと思います。
ルートテーブルを使った仕掛け
まとめ
ルートテーブルを活用すればアドベンチャーワールドのクオリティもグッと上がります!覚えていて損はない知識ですね!
これを応用してガチャガチャなんかも作れちゃいますしね~
ご好評であれば、次はもう少し掘り下げて解説しようと思います!
誤字脱字あればご指摘よろしくお願いしますm(_ _)m
スポンサーリンク
コメント
(図4,図3の行12~29抜粋)のコードの15行目のコメント
ドロップアイテムはジャガイモではないでしょうか。
いいね!
lootingはドロップ増加では?
Switch版でも出来ますか….?