宝ファイルとは?
宝(treasure)ファイルは、BetterStructuresのチェストのルートテーブルを決定するものです。通常はジェネレーターに割り当てられますが、個別のビルド設定のレベルで指定することもできます。
これらのルートテーブルは非常に強力ですが、理解するには基本的な統計の概念に関する知識も必要です。
統計の基礎知識
それらの概念についてはここをお読みください。このページの残りの部分は、内容を理解していることを前提としています!
重み付き確率
BetterStructuresとEliteMobs(同じ作者による別のプラグイン)は、どちらもルートシステムで重み付き確率という概念を使用しています。これは単純な問題を解決するためのものです。潜在的に無限の長さになりうるアイテムのリストから1つを選ぶ確率を、どう設定すればよいのでしょうか?
重み付き確率は、各アイテムにウェイトを与えることでこの問題を解決します。100個のアイテムがあり、それぞれのウェイトが1であれば、すべてが等しい確率 — 1% — で選ばれます。さらに1つ追加して合計101個にし、その最後のアイテムにもウェイト1を与えた場合、すべてのアイテムは依然として同じ確率 — 約0.99% — で選ばれます。最後のアイテムにウェイト2を与えると、それが選ばれる確率は上がります。新しい合計ウェイトは102で、最後の要素のウェイトは2、100/102 = 約0.98%なので、0.98%+0.98% = 1.96%の確率で選ばれることになります。最後のアイテムにウェイト100を与えると、新しい合計ウェイトは200になり、そのうち半分が新しいアイテムなので、そのアイテムは50%の確率で選ばれます。
このように、数百もの候補からランダムに選ぶようなリストを扱う場合に便利な仕組みです。
ガウス分布
ガウス分布は、釣り鐘の形をした数学的な関数です。

これがルートシステムとどう関係するのか疑問に思うかもしれません。BetterStructuresがチェストのルートを設定する際に決めなければならないことの1つが、そのチェストにどれだけのルートを入れるかです。その数量は一貫して特定の値の周辺にあるべきですが、理想的には、チェストを開ける楽しみが薄れるほど予測可能であってはいけません。
この半ランダムな効果を実現するために、選ばれるアイテムの個数をランダム化するのにガウス分布が使われます。個数が決まったら、次に重み付き確率が、ウェイトを考慮しつつレアリティテーブルから要素を1つランダムに選びます。
では、ガウス分布はどのように機能するのでしょうか?
幸いなことに、背後の数学がどう動くかを気にする必要はなく、それを調整する2つの設定、つまり平均(mean)と標準偏差(standard deviation)に集中すればよいのです。
平均(Mean)
簡単に言えば、meanはガウス曲線の中心を設定します。つまり、チェストに現れる最も可能性の高いアイテム数を決めるということです。要するに、チェストに通常5個のアイテムを入れたいなら、meanを5に設定します。
標準偏差(Standard deviation)
チェスト内のアイテム数の平均が5だとしましょう。standard deviationは、この数がチェストごとにどれくらい変動しうるかを決めるのに役立ちます。
小さいStandard Deviation(例:1):ほとんどのチェストが平均に非常に近い、たとえば4個、5個、6個といったアイテム数になります。より予測しやすい体験です。たとえば標準偏差が1のチェストであれば、ほぼすべてのチェストが4〜6個のアイテムを持つと考えてよいでしょう。
中程度のStandard Deviation(例:2):ここではもう少しばらつきが出ます。チェストは3〜7個のアイテムを持つかもしれません。5個は依然としてよくある数ですが、それより少し多いものや少ないものが見つかるのも珍しくありません。標準偏差が2であれば、ときどき3個しか入っていないチェストに出会ったり、運がよければ7個入りのチェストを見つけたりします。
大きいStandard Deviation(例:3以上):ここからは本当に予測がつかなくなります!チェストのアイテム数は2個しかないこともあれば、8個以上になることもあります。数個しか入っていないチェストを見つけることもあれば、お宝がぎっしり詰まったチェストに当たる可能性もあるということです。たとえば標準偏差が3なら、チェストの中身は2〜8個のどこかになり、チェストを開けるたびにわくわくする賭けになります。
デフォルトのmeanは4、デフォルトのstandard deviationは3です。
実装の詳細
宝システムが内部でどう動作しているかを理解すると、より効果的に設定できます。
最低アイテム数の保証
ガウス分布の計算結果が0個になる場合でも、システムはチェストに必ず最低1つのアイテムが現れることを保証します。これにより、プレイヤーが完全に空のチェストを見つけることを防いでいます。
ランダムなスロット配置
アイテムは、最初のスロットから順番に埋めていくのではなく、チェスト内のランダムなスロットに配置されます。これにより、人工的な感じの少ない、より自然に見えるルートの分布が生まれます。
エラー処理
アイテムのマテリアルがあなたのMinecraftバージョンに存在しない場合(たとえば、アイテム名が変更された新しいバージョンで古い設定を使っている場合など)、そのアイテムはエラーを発生させるのではなく静かにスキップされます。実在するminecraft:のエンチャントキーに解決できないエンチャントのエントリも同様に静かにスキップされますが、存在しないマテリアルをキーとするprocedurallyGeneratedItemSettingsブロックは、該当ファイル名を示す警告をログに出します。
amountが欠けていたり不正だったりしても、もう壊れたアイテムが生成されることはありません。BetterStructuresはマテリアル名と宝ファイル名を示す警告をログに出したうえで、そのエントリをamount: 1として扱います。
レアリティテーブルのウェイトがすべて0または負の値の場合、そこからはアイテムを選べません。BetterStructuresはこれについてサーバーセッションごとに1回だけ警告し、その後は沈黙します。繰り返し警告が出ることを期待せず、早めにコンソールを確認してください。
特別なフォーマット
宝ファイルには、次のような特別なフォーマットがあります。
isEnabled: true
mean: 4.0
standardDeviation: 3.0
vanillaTreasure: BURIED_TREASURE
items:
common:
weight: 60
items:
- amount: 1-1
material: STONE_PICKAXE
procedurallyGenerateEnchantments: true
weight: 1.0
- amount: 1-1
material: STONE_SHOVEL
procedurallyGenerateEnchantments: true
weight: 1.0
rare:
weight: 30
items:
- amount: 1-1
material: ANVIL
weight: 6.0
- amount: 1-6
material: BEETROOT
weight: 6.0
epic:
weight: 10
items:
- amount: 2-10
material: DIAMOND
weight: 1.0
- amount: 1-1
material: DIAMOND_AXE
weight: 6.0
procedurallyGeneratedItemSettings:
golden_sword:
bane_of_arthropods:
minlevel: 1
maxlevel: 5
chance: 0.2
looting:
minlevel: 1
maxlevel: 3
chance: 0.2
注:これは大幅に簡略化したものです。デフォルトの宝設定は、YAMLに書き出すと約2599行にもなります。膨大なルートテーブルと、考えられるすべてのエンチャントの組み合わせを網羅しているためです。
isEnabled
| キー | 値 | デフォルト |
|---|---|---|
isEnabled | Boolean | true |
mean
| キー | 値 | デフォルト |
|---|---|---|
mean | Double | 4 |
meanを設定します。詳細についてはこちらをお読みください。
standardDeviation
| キー | 値 | デフォルト |
|---|---|---|
standardDeviation | Double | 3 |
standardDeviationを設定します。詳細についてはこちらをお読みください。
vanillaTreasure
| キー | 値 | デフォルト |
|---|---|---|
vanillaTreasure | String | なし |
カスタムルートに加えて使用する、任意のバニラMinecraftルートテーブルを設定します。これはBukkitのLootTables列挙値(例:BURIED_TREASURE、SHIPWRECK_TREASURE、SIMPLE_DUNGEON)を使用します。設定されている場合、itemsセクションで定義されたカスタムアイテムと並行してバニラのルートテーブルも抽選されます。設定されていない場合は、カスタムルートのみが使用されます。
items
多くのオプションを管理者が設定できるため、ここからが少し複雑になります。先ほどの設定ファイルの例を拡大して見てみましょう。
items:
common:
weight: 60
items:
- amount: 1-1
material: STONE_PICKAXE
procedurallyGenerateEnchantments: true
weight: 1.0
- amount: 1-1
material: STONE_SHOVEL
procedurallyGenerateEnchantments: true
weight: 1.0
rare:
weight: 30
items:
- amount: 1-1
material: ANVIL
weight: 6.0
- amount: 1-6
material: BEETROOT
weight: 6.0
ここでは、items設定キーの下にcommonとrareを持つマップがあることが分かります。これらがrarities(レアリティ)です!
rarities
レアリティに決まった名前はありません。同じフォーマットを使う限り、自由に追加・削除したり、好きなだけカスタマイズしたりできます。
これらのレアリティテーブルの出やすさ・出にくさを決めるのは、ルートテーブルのweightである点に注意してください!
デフォルトでは:
commonのデフォルトweightは60rareのデフォルトweightは30epicのデフォルトweightは10
つまり、commonのアイテムはepicのアイテムより6倍ドロップしやすくなっています。weightについての詳細はこちらをお読みください!
ウェイトとは別に、各レアリティテーブルはそれぞれ独自のitemsリストを持ちます。
rarity items
レアリティのアイテムはマップリストで、そのレアリティテーブルが持つすべてのアイテムを列挙します。
これらのアイテムには次の設定があります。
| キー | 値 | デフォルト |
|---|---|---|
amount | min-max Integer | 可変 |
material | Material | 可変 |
procedurallyGenerateEnchantments | Boolean | 可変 |
weight | Double | 可変 |
amount
ドロップする個数を設定します。範囲としてamount: MIN-MAXのように表記することも、固定値としてamount: VALUEのように表記することもできます。例:
- 可変の個数:
amount: 1-5(1〜5個をドロップ) - 固定の個数:
amount: 3(常にちょうど3個をドロップ)
material
ドロップし得るアイテムのマテリアルを、Spigot API名を使って設定します。
特殊なケース - serialized
lootifyコマンドを使用した場合、materialの代わりにlootifyがserialized設定を出力します。これはプラグインによって自動生成されるもので、手動で作成すべきではありません。人間が読める形式ではありません。
mmoitem
MMOItemsプラグインのカスタムアイテムを設定します。これは、バニラのMinecraftマテリアルの代わりにカスタムアイテムを使用するための、materialフィールドの代替手段です。
フォーマットはmmoitem: TYPE@ITEMNAMEです。
例:
- amount: 1-1
mmoitem: SWORD@Excalibur
weight: 1.0
注:これにはMMOItemsプラグインのインストールが必要です。MMOItemsが利用できない場合や、指定されたアイテムが存在しない場合、そのエントリはコンソールログに警告を出したうえでスキップされます。
info
アイテムのエントリにメモやコメントを追加するための任意フィールドです。このフィールドはプラグインによって完全に無視され、管理上の記録目的のためだけに存在します。特定のアイテムをなぜそのように設定したのかを自分向けに書き残すのに使ってください。
例:
- amount: 1-1
material: DIAMOND_SWORD
weight: 1.0
info: "Rare drop for completing the dungeon"
weight
重み付き確率のためのウェイトを設定します。詳細はこちら。
procedurallyGenerateEnchantments
procedurallyGeneratedItemSettingsの設定に基づいて、そのアイテムを手続き的に生成するかどうかを設定します。設定内容によっては、結果としてエンチャントが付かないアイテムが生成されることもある点に注意してください。
procedurallyGeneratedItemSettings
もう一度、設定ファイルの例を見てみましょう。
procedurallyGeneratedItemSettings:
golden_sword:
bane_of_arthropods:
minlevel: 1
maxlevel: 5
chance: 0.2
looting:
minlevel: 1
maxlevel: 3
chance: 0.2
ご覧のとおり、このファイルはマテリアルタイプを列挙し、その下にエンチャント、さらにその下に最小・最大レベルと確率を並べています。
これらの設定に他のプラグインのカスタムマテリアルを追加することはできません。また、他のプラグインのカスタムエンチャントについても、その作者が互換性を持たせたと明言していない限り、おそらく追加できません。
エンチャントの設定については次のとおりです。
| キー | 値 | デフォルト |
|---|---|---|
minlevel | Integer | 可変 |
maxlevel | Integer | 可変 |
chance | Chance | 可変 |
minlevel
エンチャントの最小レベルを設定します。
maxlevel
エンチャントの最大レベルを設定します。
chance
エンチャントが適用される確率を、0.0(決して適用されない)から1.0(常に適用される)の間の小数値として設定します。たとえば0.2は20%の確率を意味します。これはアイテム選択システムのような重み付き確率ではなく、単純な確率判定を使用します。
トラブルシューティング
アイテムがチェストに現れない
- 宝ファイルに
isEnabled: trueが設定されているか確認する - 無効なマテリアルやアイテムに関する警告がコンソールに出ていないか確認する
- カスタムアイテムを使用している場合、MMOItemsがインストールされているか確認する
- マテリアル名はSpigot APIの正確な名称でなければならない
エンチャントが適用されない
- アイテムに
procedurallyGenerateEnchantments: trueを設定する - エンチャント名がMinecraftの名前空間付きキーと一致しているか確認する
- 最小/最大レベルが、そのエンチャントの有効な範囲内にあるか確認する
chanceの値は確率であり(0.2 = 20%)、保証ではないことを忘れない
他プラグインのカスタムエンチャントが動作しない
読み取られるのは、バニラのminecraft:名前空間に登録されたエンチャントのみです。procedurallyGeneratedItemSettingsブロック内のそれ以外のものは警告なしでスキップされるため、カスタムエンチャントが静かに何もしないというのは、バグではなく想定どおりの症状です。互換性についてはそのエンチャントプラグインの作者に確認してください。
空のチェストが現れる
システムは最低1つのアイテムを保証するため、これは起こらないはずです。空のチェストが見つかる場合は、以下を確認してください。
- そのチェストが(他のプラグインではなく)BetterStructuresによって満たされていること
- 宝ファイル内のすべてのアイテムが有効であること(コンソールの警告を確認)
- その宝ファイルが実際に読み込まれていること(起動ログを確認)