Module:LootChest2 - minecraft.fandom.com
Jump to navigation
Jump to search
Treść tej podstrony pochodzi z artykułu „Module:LootChest2” w domenie minecraft.fandom.com na licencji CC BY-NC-SA 3.0
Usage[]
TBA
Audit[]
d.items that aren't in any d.chests:
- copper-horn
d.notes that aren't on any d.items:
- none
d.chests containing items that aren't in d.items:
- none
d.items containing notes that aren't in d.notes:
- none
editions:
- bedrock
- java
[view | edit | history | purge]The above documentation is transcluded from Module:LootChest2/doc.
--
-- d: data
--
-- f: helper functions
--
-- p: the package, exposing:
-- audit
-- make_item_table
-- make_chest_table
--
d = {
-- The key-value pairs in d.items define how the item's sprite and label are put together.
--
-- [<item-name>] = { <sprite-sheet> [, <id>] [, <link>] [, <title>] [, <note>] [, <note1>] }
--
-- <item-name>: This is the name used when invoking this module via p.make_item_table().
-- It is also the name used later, in the loot tables in d.chests.
--
-- <sprite-sheet>: Whether the sprite comes from BlockSprite or ItemSprite.
-- "block"
-- | "item"
--
-- <id>: optional: the sprite id from the sprite sheet.
-- If left unspecified, defaults to <item-name>.
--
-- <link>: optional: the wiki page to link to.
-- If left unspecified, defaults to <item-name>, but with dashes turned to spaces, and transformed to title case.
--
-- <title>: optional: the text to display.
-- If left unspecified, defaults to <item-name>, but with dashes turned to spaces, and:
-- * transformed to sentence case and possibly made plural, according to the value of <plural>, in p.make_item_table(), or
-- * transformed to title case, in p.make_chest_table().
--
-- <plural>: optional: either false, or a string having a custom plural form.
-- This affects the header text of p.make_item_table(), which starts with <title>.
-- When false, the <title> is left as-is.
-- When a string is given, <plural> is used in place of <title>.
-- If left unspecified, <title> is run through f.plural().
--
-- <note>, <note2>: optional: up to two notes can be specified, by key.
-- The value of the notes (its text) is defined just below here, in d.notes.
--
-- The order within this list doesn't matter.
items = {
["acacia-log"] = { "block", link="Log" },
["acacia-sapling"] = { "block", link="Sapling" },
["activator-rail"] = { "block" },
["ancient-debris"] = { "block", plural=false },
["apple"] = { "item" },
["arrow"] = { "item" },
["bamboo"] = { "item", plural=false },
["barrel"] = { "block" },
-- ["basalt"] = { "block", plural=false },
["beetroot-seeds"] = { "item", plural=false },
["beetroot-soup"] = { "item", plural=false },
["bell"] = { "block" },
["birch-log"] = { "block", link="Log" },
["birch-sapling"] = { "block", link="Sapling" },
["black-wool"] = { "block", link="Wool", plural=false },
["block-of-gold"] = { "block", plural="Blocks of gold" },
["blue-ice"] = { "block", plural=false },
["bone"] = { "item" },
["bone-block"] = { "block" },
["book"] = { "item" },
["book-and-quill"] = { "item", title="Book and Quill", plural=false },
["bottle-o'-enchanting"] = { "item", title="Bottle o' Enchanting", plural="Bottles o' enchanting" },
["bread"] = { "item", plural=false },
["brown-mushroom"] = { "block", link="Mushroom" },
["brown-wool"] = { "block", link="Wool", plural=false },
["bucket"] = { "item" },
["buried-treasure-map"] = { "item", link="Explorer Map" },
["cactus"] = { "block", plural=false },
["cake"] = { "block", plural=false },
["carrot"] = { "item" },
["chain"] = { "block" },
["chainmail-boots"] = { "item", link="Armor", plural=false },
["chainmail-chestplate"] = { "item", link="Armor" },
["chainmail-helmet"] = { "item", link="Armor" },
["chainmail-leggings"] = { "item", link="Armor", plural=false },
["clay"] = { "item", link="Clay (ball)", plural=false },
["clock"] = { "item" },
["coal"] = { "item", plural=false },
["cocoa-beans"] = { "item", plural=false },
["cooked-cod"] = { "item", plural=false },
["cooked-porkchop"] = { "item" },
["cooked-salmon"] = { "item", plural=false },
["copper-horn"] = { "item" },
["compass"] = { "item" },
["crimson-fungus"] = { "block", link="Fungus", plural="Crimson fungi" },
["crimson-nylium"] = { "block", link="Nylium", plural=false },
["crimson-roots"] = { "block", link="Roots" , plural=false },
["crossbow"] = { "item" },
["crying-obsidian"] = { "block" },
["dandelion"] = { "block", link="Flower" },
["dark-oak-log"] = { "block", link="Log" },
["dark-oak-sapling"] = { "block", link="Sapling" },
["dead-bush"] = { "block", link="Dead Bush" },
["detector-rail"] = { "block" },
["diamond"] = { "item" },
["diamond-chestplate"] = { "item", link="Armor" },
["diamond-hoe"] = { "item", link="Hoe" },
["diamond-horse-armor"] = { "item", link="Horse Armor", plural=false },
["disc-13"] = { "item", id='music-disc-13', title="Music Disc (13)", link="Music Disc", plural="Music discs (13)" },
["disc-cat"] = { "item", id='music-disc-cat', title="Music Disc (cat)", link="Music Disc", plural="Music discs (cat)" },
["disc-mellohi"] = { "item", id='music-disc-mellohi', title="Music Disc (mellohi)", link="Music Disc", plural="Music discs (mellohi)" },
["disc-pigstep"] = { "item", id='music-disc-pigstep', title = "Music Disc (Pigstep)", link="Music Disc", plural="Music discs (Pigstep)" },
["disc-wait"] = { "item", id='music-disc-wait', title="Music Disc (wait)", link="Music Disc", plural="Music discs (wait)" },
["egg"] = { "item" },
["emerald"] = { "item" },
["empty-map"] = { "item", link="Map", title="Empty Map" },
["enchanted-book"] = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", note="enchant-with-levels-30" },
["enchanted-book-rnd"] = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", note="enchant-randomly" },
["enchanted-book-rnd-soul-speed"] = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", note="enchant-randomly-soul-speed" },
["enchanted-fishing-rod"] = { "item", id="fishing-rod", link="Fishing Rod", note="enchant-randomly" },
["enchanted-golden-apple"] = { "item" },
["ender-pearl"] = { "item" },
["feather"] = { "item" },
["fern"] = { "block", link="Grass" },
["fire-charge"] = { "item" },
["flint"] = { "item", plural=false },
["flint-and-steel"] = { "item", plural=false },
["flower-pot"] = { "item" },
["furnace"] = { "block" },
["gilded-blackstone"] = { "block", plural=false },
["glistering-melon-slice"] = { "item" },
["glowstone"] = { "block", plural=false },
["golden-apple"] = { "item" },
["golden-boots"] = { "item", link="Armor", plural=false },
["golden-carrot"] = { "item" },
["golden-chestplate"] = { "item", link="Armor" },
["golden-helmet"] = { "item", link="Armor" },
-- ["golden-hoe"] = { "item", link="Hoe" },
["golden-horse-armor"] = { "item", link="Horse Armor", plural=false },
["golden-leggings"] = { "item", link="Armor", plural=false },
["golden-sword"] = { "item", link="Sword" },
["gold-ingot"] = { "item" },
["gold-nugget"] = { "item" },
["grass"] = { "block", link="Grass", plural=false },
["gray-wool"] = { "block", link="Wool", plural=false },
["green-dye"] = { "item", link="Dye", plural=false },
["gunpowder"] = { "item", plural=false },
["heart-of-the-sea"] = { "item", link="Heart of the Sea", plural=false },
["ink-sac"] = { "item" },
["iron-boots"] = { "item", link="Armor", plural=false },
["iron-chestplate"] = { "item", link="Armor" },
["iron-helmet"] = { "item", link="Armor" },
["iron-horse-armor"] = { "item", link="Horse Armor", plural=false },
["iron-ingot"] = { "item" },
["iron-leggings"] = { "item", link="Armor", plural=false },
["iron-nugget"] = { "item" },
["iron-pickaxe"] = { "item", link="Pickaxe" },
["iron-shovel"] = { "item", link="Shovel" },
["iron-sword"] = { "item", link="Sword" },
["jungle-log"] = { "block", link="Log" },
["jungle-sapling"] = { "block", link="Sapling" },
["lapis-lazuli"] = { "item", plural=false },
["large-fern"] = { "block", link="Grass" },
["lead"] = { "item" },
["leather"] = { "item", plural=false },
["leather-boots"] = { "item", link="Armor", plural=false },
["leather-cap"] = { "item", link="Armor" },
["leather-pants"] = { "item", link="Armor", plural=false },
["leather-tunic"] = { "item", link="Armor" },
["light-gray-wool"] = { "block", link="Wool", plural=false },
["light-weighted-pressure-plate"] = { "block", link="Pressure Plate" },
["lodestone"] = { "block" },
["melon-seeds"] = { "item", plural=false },
-- ["magma-block"] = { "block" },
["magma-cream"] = { "item", plural=false },
["name-tag"] = { "item" },
["netherite-ingot"] = { "item" },
["netherite-scrap"] = { "item", plural=false },
["nether-wart"] = { "item", plural=false },
["nether-quartz"] = { "item", plural=false },
["oak-log"] = { "block", link="Log" },
["oak-planks"] = { "block", link="Planks", id="oak-wood-planks", plural=false },
["oak-sapling"] = { "block", link="Sapling" },
["oak-sign"] = { "item", link="Sign" },
["obsidian"] = { "block", plural=false },
["paper"] = { "item", plural=false },
["poisonous-potato"] = { "item", plural="Poisonous potatoes" },
-- ["polished-basalt"] = { "block", plural=false },
["poppy"] = { "block", link="Flower" },
["potato"] = { "item", plural="Potatoes" },
["potion-of-regeneration"] = { "item", link="Potion", title="Potion of Regeneration", plural="Potions of Regeneration" },
["potion-of-water-breathing"] = { "item", link="Potion", title="Potion of Water Breathing", plural="Potions of Water Breathing" },
["powered-rail"] = { "block", title="Powered Rails", plural=false },
["prismarine-crystals"] = { "item", plural=false },
["pumpkin"] = { "block" },
["pumpkin-pie"] = { "item" },
["pumpkin-seeds"] = { "item", plural=false },
["rail"] = { "block", title="Rails", plural=false },
["raw-beef"] = { "item", plural=false },
["raw-cod"] = { "item", plural=false },
["raw-mutton"] = { "item", plural=false },
["raw-porkchop"] = { "item" },
["raw-salmon"] = { "item", plural=false },
["redstone"] = { "item", id="redstone-dust", title="Redstone Dust", plural=false },
["rotten-flesh"] = { "item", plural=false },
["saddle"] = { "item" },
["sand"] = { "block", plural=false },
["shears"] = { "item", plural=false },
["smooth-stone"] = { "block", plural=false },
["snout-banner-pattern"] = { "item", id="banner-pattern", link="Banner Pattern" },
["snowball"] = { "item", link="Snowball" },
["snow-block"] = { "block", link="Snow Block" },
["soul-sand"] = { "block", plural=false },
["spectral-arrow"] = { "item" },
["spider-eye"] = { "item" },
["spruce-log"] = { "block", link="Log" },
["spruce-sapling"] = { "block", link="Sapling" },
["spruce-sign"] = { "item", link="Sign" },
["stick"] = { "item" },
["stone"] = { "block", plural=false },
["stone-axe"] = { "item", link="Axe" },
["stone-bricks"] = { "block", plural=false },
["stone-pickaxe"] = { "item", link="Pickaxe" },
["string"] = { "item", plural=false },
["suspicious-stew"] = { "item", plural=false, note="suspicious-stew" },
["sweet-berries"] = { "item", plural=false },
["tall-grass"] = { "block", link="Grass", plural=false },
["tnt"] = { "block", title="TNT", plural=false },
["torch"] = { "block" },
["tripwire-hook"] = { "block" },
["water-bucket"] = { "item" },
["wheat"] = { "item" },
["wheat-seeds"] = { "item", plural=false },
["white-wool"] = { "block", link="Wool", plural=false },
["wooden-axe"] = { "item", link="Axe" },
["wooden-pickaxe"] = { "item", link="Pickaxe" },
["yellow-dye"] = { "item", link="Dye", plural=false },
["map"] = { "item", link="Map", note="map" },
-- ["damaged-random-enchanted-netherite-axe"] = { "item", id="netherite-axe", title="Damaged Enchanted Netherite Axe", link="Axe", note="enchant-randomly", note1="damaged-0.15-0.85" },
["damaged-netherite-boots"] = { "item", id="netherite-boots", link="Armor", note="damaged-0.2-0.65", plural=false},
-- ["damaged-level-enchanted-netherite-boots"] = { "item", id="netherite-boots", title="Damaged Enchanted Netherite Boots", link="Armor", note="enchant-with-levels-5-20", note1="damaged-0.2-0.65", plural=false },
["damaged-netherite-chestplate"] = { "item", id="netherite-chestplate", link="Armor", note="damaged-0.2-0.65"},
-- ["damaged-level-enchanted-netherite-chestplate"] = { "item", id="netherite-chestplate", title="Damaged Enchanted Netherite Chestplate", link="Armor", note="enchant-with-levels-5-20", note1="damaged-0.2-0.65" },
["damaged-netherite-helmet"] = { "item", id="netherite-helmet", link="Armor", note="damaged-0.2-0.65"},
-- ["damaged-random-enchanted-netherite-hoe"] = { "item", id="netherite-hoe", title="Damaged Enchanted Netherite Hoe", link="Hoe", note="enchant-randomly", note1="damaged-0.1-0.95" },
-- ["damaged-level-enchanted-netherite-helmet"] = { "item", id="netherite-helmet", title="Damaged Enchanted Netherite Helmet", link="Armor", note="enchant-with-levels-5-20", note1="damaged-0.2-0.65" },
["damaged-netherite-leggings"] = { "item", id="netherite-leggings", link="Armor", note="damaged-0.2-0.65", plural=false},
-- ["damaged-level-enchanted-netherite-leggings"] = { "item", id="netherite-leggings", title="Damaged Enchanted Netherite Leggings", link="Armor", note="enchant-with-levels-5-20", note1="damaged-0.2-0.65", plural=false },
-- ["damaged-random-enchanted-netherite-pickaxe"] = { "item", id="netherite-pickaxe", title="Damaged Enchanted Netherite Pickaxe", link="Pickaxe", note="enchant-randomly", note1="damaged-0.1-0.95" },
["damaged-random-enchanted-netherite-shovel"] = { "item", id="netherite-shovel", title="Damaged Enchanted Netherite Shovel", link="Shovel", note="enchant-randomly", note1="damaged-0.15-0.45"},
["damaged-netherite-sword"] = { "item", id="netherite-sword", link="Sword", note="damaged-0.2-0.65"},
-- ["damaged-level-enchanted-netherite-sword"] = { "item", id="netherite-sword", title="Damaged Enchanted Netherite Sword", link="Sword", note="enchant-with-levels-5-20", note1="damaged-0.2-0.65" },
["damaged-diamond-boots"] = { "item", id="diamond-boots", link="Armor", note="damaged-0.2-0.65", plural=false },
["level-enchanted-diamond-boots"] = { "item", id="diamond-boots", title="Enchanted Diamond Boots", link="Armor", note="enchant-with-levels-20-39", plural=false },
["damaged-random-enchanted-diamond-boots"] = { "item", id="diamond-boots", title="Damaged Enchanted Diamond Boots", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65", plural=false },
["damaged-diamond-chestplate"] = { "item", id="diamond-chestplate", link="Armor", note="damaged-0.2-0.65" },
["level-enchanted-diamond-chestplate"] = { "item", id="diamond-chestplate", title="Enchanted Diamond Chestplate", link="Armor", note="enchant-with-levels-20-39" },
["damaged-random-enchanted-diamond-chestplate"] = { "item", id="diamond-chestplate", title="Damaged Enchanted Diamond Chestplate", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65" },
["damaged-diamond-helmet"] = { "item", id="diamond-helmet", link="Armor", note="damaged-0.2-0.65" },
["level-enchanted-diamond-helmet"] = { "item", id="diamond-helmet", title="Enchanted Diamond Helmet", link="Armor", note="enchant-with-levels-20-39" },
["damaged-random-enchanted-diamond-helmet"] = { "item", id="diamond-helmet", title="Damaged Enchanted Diamond Helmet", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65" },
["damaged-diamond-leggings"] = { "item", id="diamond-leggings", link="Armor", note="damaged-0.2-0.65", plural=false },
["level-enchanted-diamond-leggings"] = { "item", id="diamond-leggings", title="Enchanted Diamond Leggings", link="Armor", note="enchant-with-levels-20-39", plural=false },
["damaged-random-enchanted-diamond-leggings"] = { "item", id="diamond-leggings", title="Damaged Enchanted Diamond Leggings", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65", plural=false },
["level-enchanted-diamond-pickaxe"] = { "item", id="diamond-pickaxe", title="Enchanted Diamond Pickaxe", link="Pickaxe", note="enchant-with-levels-20-39" },
["level-enchanted-diamond-shovel"] = { "item", id="diamond-shovel", title="Enchanted Diamond Shovel", link="Shovel", note="enchant-with-levels-20-39" },
["damaged-random-enchanted-diamond-shovel"] = { "item", id="diamond-shovel", title="Damaged Enchanted Diamond Shovel", link="Shovel", note="enchant-randomly", note1="damaged-0.15-0.45" },
["damaged-diamond-sword"] = { "item", id="diamond-sword", link="Sword", note="damaged-0.2-0.65" },
["level-enchanted-diamond-sword"] = { "item", id="diamond-sword", title="Enchanted Diamond Sword", link="Sword", note="enchant-with-levels-20-39" },
["damaged-random-enchanted-diamond-sword"] = { "item", id="diamond-sword", title="Damaged Enchanted Diamond Sword", link="Sword", note="enchant-randomly", note1="damaged-0.2-0.65" },
["level-enchanted-iron-boots"] = { "item", id="iron-boots", title="Enchanted Iron Boots", link="Armor", note="enchant-with-levels-20-39", plural=false },
["level-enchanted-iron-chestplate"] = { "item", id="iron-chestplate", title="Enchanted Iron Chestplate", link="Armor", note="enchant-with-levels-20-39" },
["level-enchanted-iron-helmet"] = { "item", id="iron-helmet", title="Enchanted Iron Helmet", link="Armor", note="enchant-with-levels-20-39" },
["level-enchanted-iron-leggings"] = { "item", id="iron-leggings", title="Enchanted Iron Leggings", link="Armor", note="enchant-with-levels-20-39", plural=false },
["level-enchanted-iron-pickaxe"] = { "item", id="iron-pickaxe", title="Enchanted Iron Pickaxe", link="Pickaxe", note="enchant-with-levels-20-39" },
["level-enchanted-iron-shovel"] = { "item", id="iron-shovel", title="Enchanted Iron Shovel", link="Shovel", note="enchant-with-levels-20-39" },
["level-enchanted-iron-sword"] = { "item", id="iron-sword", title="Enchanted Iron Sword", link="Sword", note="enchant-with-levels-20-39" },
["random-enchanted-golden-axe"] = { "item", id="golden-axe", title="Enchanted Golden Axe", link="Axe", note="enchant-randomly" },
-- ["level-enchanted-golden-boots"] = { "item", id="golden-boots", title="Enchanted Golden Boots", link="Armor", note="enchant-with-levels-5-15", plural=false },
["random-enchanted-golden-boots"] = { "item", id="golden-boots", title="Enchanted Golden Boots", link="Armor", note="enchant-randomly", plural=false },
["soul-speed-enchanted-golden-boots"] = { "item", id="golden-boots", title="Enchanted Golden Boots with Soul Speed", link="Armor", note="enchant-randomly-soul-speed", plural=false },
-- ["level-enchanted-golden-chestplate"] = { "item", id="golden-chestplate", title="Enchanted Golden Chestplate", link="Armor", note="enchant-with-levels-5-15" },
["random-enchanted-golden-chestplate"] = { "item", id="golden-chestplate", title="Enchanted Golden Chestplate", link="Armor", note="enchant-randomly" },
["random-enchanted-golden-helmet"] = { "item", id="golden-helmet", title="Enchanted Golden Helmet", link="Armor", note="enchant-randomly" },
["random-enchanted-golden-hoe"] = { "item", id="golden-hoe", title="Enchanted Golden Hoe", link="Hoe", note="enchant-randomly" },
["random-enchanted-golden-leggings"] = { "item", id="golden-leggings", title="Enchanted Golden Leggings", link="Armor", note="enchant-randomly", plural=false },
["random-enchanted-golden-pickaxe"] = { "item", id="golden-pickaxe", title="Enchanted Golden Pickaxe", link="Pickaxe", note="enchant-randomly" },
["random-enchanted-golden-shovel"] = { "item", id="golden-shovel", title="Enchanted Golden Shovel", link="Shovel", note="enchant-randomly" },
["random-enchanted-golden-sword"] = { "item", id="golden-sword", title="Enchanted Golden Sword", link="Sword", note="enchant-randomly" },
["random-enchanted-leather-boots"] = { "item", id="leather-boots", title="Enchanted Leather Boots", link="Armor", note="enchant-randomly", plural=false },
["random-enchanted-leather-cap"] = { "item", id="leather-cap", title="Enchanted Leather Cap", link="Armor", note="enchant-randomly" },
["random-enchanted-leather-pants"] = { "item", id="leather-pants", title="Enchanted Leather Pants", link="Armor", note="enchant-randomly", plural=false },
["random-enchanted-leather-tunic"] = { "item", id="leather-tunic", title="Enchanted Leather Tunic", link="Armor", note="enchant-randomly" },
-- ["damaged-level-enchanted-crossbow"] = { "item", id="crossbow", title="Damaged Enchanted Crossbow", link="Crossbow", note="enchant-with-levels-20-25", note1="damaged-0.05-0.15" },
["damaged-random-enchanted-crossbow"] = { "item", id="crossbow", title="Damaged Enchanted Crossbow", link="Crossbow", note="enchant-randomly", note1="damaged-0.1-0.5" },
["damaged-random-enchanted-netherite-helmet"] = { "item", id="netherite-helmet", title="Damaged Enchanted Netherite Helmet", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65" },
["damaged-random-enchanted-netherite-chestplate"] = { "item", id="netherite-chestplate", title="Damaged Enchanted Netherite Chestplate", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65" },
["damaged-random-enchanted-netherite-leggings"] = { "item", id="netherite-leggings", title="Damaged Enchanted Netherite Leggings", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65", plural=false },
["damaged-random-enchanted-netherite-boots"] = { "item", id="netherite-boots", title="Damaged Enchanted Netherite Boots", link="Armor", note="enchant-randomly", note1="damaged-0.2-0.65", plural=false },
["damaged-random-enchanted-netherite-sword"] = { "item", id="netherite-sword", title="Damaged Enchanted Netherite Sword", link="Sword", note="enchant-randomly", note1="damaged-0.2-0.65" },
["empty"] = { "block", id="air", link='', title='Nothing', plural=false, note="nothing" },
},
-- The key-value pairs in d.notes define the text that goes into an item's note, to be displayed in a notelist.
--
-- It gets rendered on the page like so:
-- <ref group='note' name='enchant-randomly'>
--
-- The order within this list doesn't matter.
notes = {
-- ["damaged-0.05-0.15"] = "The item will only have between 5% and 15% of its total durability.",
["damaged-0.1-0.5"] = "The item will only have between 10% and 50% of its total durability.",
-- ["damaged-0.1-0.95"] = "The item will only have between 10% and 95% of its total durability.",
["damaged-0.15-0.45"] = "The item will only have between 15% and 45% of its total durability.",
-- ["damaged-0.15-0.85"] = "The item will only have between 15% and 85% of its total durability.",
["damaged-0.2-0.65"] = "The item will only have between 20% and 65% of its total durability.",
["enchant-randomly"] = "All enchantments are equally probable, ''including'' [[treasure enchantment]]s (except [[Soul Speed]]), and any level of the enchantment is equally probable.",
["enchant-randomly-soul-speed"] = "Enchanted with a random level of [[Soul Speed]].",
-- ["enchant-with-levels-5-15"] = "Enchantment probabilities are the same as a level-5 to level-15 [[enchantment mechanics|enchantment]] would be on an [[enchantment table]] that was able to apply [[treasure enchantment]]s (except [[Soul Speed]]), and where the chance of multiple enchantments is not reduced.",
-- ["enchant-with-levels-5-20"] = "Enchantment probabilities are the same as a level-5 to level-20 [[enchantment mechanics|enchantment]] would be on an [[enchantment table]] that was able to apply [[treasure enchantment]]s (except [[Soul Speed]]), and where the chance of multiple enchantments is not reduced.",
["enchant-with-levels-20-39"] = "Enchantment probabilities are the same as a level-20 to level-39 [[enchantment mechanics|enchantment]] would be on an [[enchantment table]] that had no cap at level 30, and that was able to apply [[treasure enchantment]]s (except [[Soul Speed]]), and where the chance of multiple enchantments is not reduced.",
-- ["enchant-with-levels-20-25"] = "Enchantment probabilities are the same as a level-20 to level-25 [[enchantment mechanics|enchantment]] would be on an [[enchantment table]] that was able to apply [[treasure enchantment]]s (except [[Soul Speed]]), and where the chance of multiple enchantments is not reduced.",
["enchant-with-levels-30"] = "Enchantment probabilities are the same as a level-30 enchantment on an [[enchantment table]] that was able to apply [[treasure enchantment]]s (except [[Soul Speed]]), and where the chance of multiple enchantments is not reduced.",
["map"] = "Named unknown map, but changed to map 0, the scale level is 1:4, Maps from the same stack are stackable, but maps that are not stacked are unstackable despite looking identical.",
["nothing"] = "'Nothing' does not refer to the chance of an empty chest. Instead, it refers to the chance that the random loot generator does not add any loot ''on a single roll''.",
["suspicious-stew"] = "The stew grants one of the following effects: 5–7 seconds of [[Blindness]], 7–10 seconds of [[Jump Boost]], 7-10 seconds of [[Night Vision]], 10–20 seconds of [[Poison]], 7–10 seconds of [[Saturation]], or 6–8 seconds of [[Weakness]]."
},
-- The key-value pairs in d.column_hovertext define the hovertext that goes onto a column header, using the <abbr> tag.
column_hovertext = {
["stacksize"] = 'The size of stacks (or for unstackable items, number) of this item on any given roll.',
["rolls"] = 'The number of times this chest draws item stacks randomly from this item\'s pool.',
["weight"] = 'The weight of this item relative to other items in the pool.',
["items"] = 'The number of items expected per chest, averaged over a large number of chests.',
["chance"] = 'The odds of finding any of this item in a single chest.',
["chests"] = 'The average number of chests the player should expect to search, to find any of this item.'
},
-- The key-value pairs in d.edition_headers maps the <edition> name used in d.chests to the column text for that edition.
-- If d.chests uses an edition not in this list, that's okay. The extra header will still display.
edition_headers = {
["java"] = "Java",
["bedrock"] = "Bedrock",
},
-- The key-value pairs in d.chests define the loot tables.
--
-- [<chest-name>] = {
-- chest_table_display = { header = <header> [, superheader = <superheader>] },
-- item_table_display = { structure_id = <structure-id>, structure_text = <structure-text> [, container = <container>] },
-- loot_tables = { <loot-table> [, <loot-table>] ... }
-- }
--
-- <chest-name>: This is the name used when invoking this module via p.make_chest_table().
--
-- <header>: When invoking this module via p.make_chest_table() with multiple chests, this is a column header with the name of the chest.
-- This header spans all columns generated for this chest.
-- <superheader>: optional: When invoking this module via p.make_chest_table() with multiple chests, this is a column header with the name of the structure.
-- This header spans all columns generated for ALL chests having the same superheader, and sits above the chest header.
-- Typically you use this when one structure has multiple kinds of chests.
-- If left unspecified, the chest will not group with other chests under any superheader.
--
-- <structure-id>: When invoking this module via p.make_item_table(), this id determines the sprite from {{EnvSprite}}.
-- <structure-text>: When invoking this module via p.make_item_table(), this is the text next to the structure sprite.
-- <container>: optional: When invoking this module via p.make_item_table(),
-- Typically you use this when one structure has multiple kinds of chests.
-- If left unspecified, the chest entry will just show the structure link, and will not show any subtitle specifying a chest.
--
-- <loot-table>: { <loot-table> has the meaning: for the editions listed, use these loot_tables.
-- <edition-list>, The first element is an <edition-list>,
-- <pool> ... The rest are <pool> elements.
-- }
--
-- <edition-list>: A list of 1 or more <edition> elements.
-- {
-- <edition>
-- [, <edition>]
-- ...
-- }
--
-- <edition>: These are the current editions, and their -upcoming suffixes.
-- "java"
-- | "bedrock"
-- | "java-upcoming"
-- | "bedrock-upcoming"
-- If there were suddenly to be another edition, for instance "playstation",
-- simply use "playstation" and "playstation-upcoming" also, and the proper columns would appear in the table.
--
-- <pool>:
-- {
-- rolls = { <min-rolls>, <max-rolls> }, Each pool contains a min and a max number of "rolls",
-- items = { and a list of 1 or more <item-entry> elements.
-- <item-entry>
-- [, <item-entry>]
-- ...
-- }
-- }
--
-- <min-rolls>: For each pool in a loot table, the game "rolls" (picks a random entry from the list of items) some number of times: between <min-rolls> and <max-rolls>.
-- <max-rolls>: See above.
--
-- <item-entry>:
-- [<item-name>] = { <min-stack-size>, <max-stack-size>, <weight> }
--
-- <item-name>: This name refers to (and must match) an entry in d.items.
--
-- <min-stack-size>: When the game picks this item, it chooses a stack size between <min-stack-size> and <max-stack-size>.
-- <max-stack-size>: See above.
--
-- <weight>: When the game does a "roll" in pool, each item may have its own "weight", so that higher weights are more likely to be picked.
--
-- The order within this list doesn't matter.
-- in the item table, sorting is alphabetical by <structure_text>, then by <container>.
-- in the chest table, items will sort by chance, then by avg#, then alphabetically.
chests = {
["shipwreck-map"] = { -- shipwreck_map.json
chest_table_display = { header="Map", superheader="[[Shipwreck]]" },
item_table_display = { structure_id="shipwreck", structure_text="Shipwreck", container="Map chest" },
loot_tables = {
{
{"java"},
{
rolls = {1,1},
items = {
["buried-treasure-map"] = {1,1,1},
}
},
{
rolls = {3,3},
items = {
["compass"] = {1,1,1},
["empty-map"] = {1,1,1},
["clock"] = {1,1,1},
["paper"] = {1,10,20},
["feather"] = {1,5,10},
["book"] = {1,5,5},
}
},
},
{
{"bedrock"},
{
rolls = {1,1},
items = {
["buried-treasure-map"] = {1,1,1},
}
},
{
rolls = {3,3},
items = {
["compass"] = {1,1,1},
["map"] = {1,1,1},
["clock"] = {1,1,1},
["paper"] = {1,10,20},
["feather"] = {1,5,10},
["book"] = {1,5,5},
}
},
},
}
},
["shipwreck-supply"] = { -- shipwreck_supply.json
chest_table_display = { header="Supply", superheader="[[Shipwreck]]" },
item_table_display = { structure_id="shipwreck", structure_text="Shipwreck", container="Supply chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,10},
items = {
["paper"] = {1,12,8},
["potato"] = {2,6,7},
["poisonous-potato"] = {2,6,7},
["carrot"] = {4,8,7},
["wheat"] = {8,21,7},
["coal"] = {2,8,6},
["rotten-flesh"] = {5,24,5},
["bamboo"] = {1,3,2},
["suspicious-stew"] = {1,1,10},
["pumpkin"] = {1,3,2},
["gunpowder"] = {1,5,3},
["tnt"] = {1,2,1},
["random-enchanted-leather-cap"] = {1,1,3},
["random-enchanted-leather-tunic"] = {1,1,3},
["random-enchanted-leather-pants"] = {1,1,3},
["random-enchanted-leather-boots"] = {1,1,3},
}
},
},
}
},
["shipwreck-treasure"] = { -- shipwreck_treasure.json
chest_table_display = { header="Treasure", superheader="[[Shipwreck]]" },
item_table_display = { structure_id="shipwreck", structure_text="Shipwreck", container="Treasure chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,6},
items = {
["iron-ingot"] = {1,5,90},
["gold-ingot"] = {1,5,10},
["emerald"] = {1,5,40},
["diamond"] = {1,1,5},
["bottle-o'-enchanting"] = {1,1,5},
}
},
{
rolls = {2,5},
items = {
["iron-nugget"] = {1,10,50},
["gold-nugget"] = {1,10,10},
["lapis-lazuli"] = {1,10,20},
}
},
},
}
},
["buried-treasure"] = { -- buried_treasure.json
chest_table_display = { header="[[Buried treasure]]" },
item_table_display = { structure_id="buried-treasure", structure_text="Buried treasure" },
loot_tables = {
{
{"java"},
{
rolls = {1,1},
items = {
["heart-of-the-sea"] = {1,1,1},
}
},
{
rolls = {5,8},
items = {
["iron-ingot"] = {1,4,20},
["gold-ingot"] = {1,4,10},
["tnt"] = {1,2,5},
}
},
{
rolls = {1,3},
items = {
["emerald"] = {4,8,5},
["diamond"] = {1,2,5},
["prismarine-crystals"] = {1,5,5},
}
},
{
rolls = {0,1},
items = {
["leather-tunic"] = {1,1,1},
["iron-sword"] = {1,1,1},
}
},
{
rolls = {2,2},
items = {
["cooked-cod"] = {2,4,1},
["cooked-salmon"] = {2,4,1},
}
},
},
{
{"bedrock"},
{
rolls = {1,1},
items = {
["heart-of-the-sea"] = {1,1,1},
}
},
{
rolls = {5,12},
items = {
["prismarine-crystals"] = {1,5,5},
["iron-ingot"] = {3,5,20},
["gold-ingot"] = {1,5,10},
["tnt"] = {1,2,10},
["diamond"] = {1,1,15},
["disc-wait"] = {1,1,5},
["disc-mellohi"] = {1,1,5},
["name-tag"] = {1,1,10},
["chainmail-chestplate"] = {1,1,20},
["chainmail-helmet"] = {1,1,20},
["chainmail-leggings"] = {1,1,20},
["chainmail-boots"] = {1,1,20},
["book-and-quill"] = {1,2,5},
["lead"] = {1,3,10},
["bottle-o'-enchanting"] = {1,1,3},
["potion-of-water-breathing"] = {1,1,15},
["potion-of-regeneration"] = {1,1,10},
["cake"] = {1,1,1},
}
},
},
}
},
["underwater-ruin-big"] = { -- underwater_ruin_big.json
chest_table_display = { header="Big", superheader="[[Underwater ruins]]" },
item_table_display = { structure_id="underwater-ruins", structure_text="Underwater ruins", container="Big chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,8},
items = {
["coal"] = {1,4,10},
["gold-nugget"] = {1,3,10},
["emerald"] = {1,1,1},
["wheat"] = {2,3,10},
}
},
{
rolls = {1,1},
items = {
["golden-apple"] = {1,1,1},
["enchanted-book-rnd"] = {1,1,5},
["leather-tunic"] = {1,1,1},
["golden-helmet"] = {1,1,1},
["enchanted-fishing-rod"] = {1,1,5},
["buried-treasure-map"] = {1,1,10},
}
},
},
}
},
["underwater-ruin-small"] = { -- underwater_ruin_small.json
chest_table_display = { header="Small", superheader="[[Underwater ruins]]" },
item_table_display = { structure_id="underwater-ruins", structure_text="Underwater ruins", container="Small chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,8},
items = {
["coal"] = {1,4,10},
["stone-axe"] = {1,1,2},
["rotten-flesh"] = {1,1,5},
["emerald"] = {1,1,1},
["wheat"] = {2,3,10},
}
},
{
rolls = {1,1},
items = {
["leather-tunic"] = {1,1,1},
["golden-helmet"] = {1,1,1},
["enchanted-fishing-rod"] = {1,1,5},
["buried-treasure-map"] = {1,1,5},
}
},
},
}
},
["village-armorer"] = { -- village\village_armorer.json
chest_table_display = { header="Armorer", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Armorer's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["iron-ingot"] = {1,3,2},
["bread"] = {1,4,4},
["iron-helmet"] = {1,1,1},
["emerald"] = {1,1,1}
}
},
},
},
},
["village-butcher"] = { -- village\village_butcher.json
chest_table_display = { header="Butcher", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Butcher's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["emerald"] = {1,1,1},
["raw-porkchop"] = {1,3,6},
["wheat"] = {1,3,6},
["raw-beef"] = {1,3,6},
["raw-mutton"] = {1,3,6},
["coal"] = {1,3,3}
}
},
},
},
},
["village-cartographer"] = { -- village\village_cartographer.json
chest_table_display = { header="Cartographer", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Cartographer's chest" },
loot_tables = {
{
{"java"},
{
rolls = {1,5},
items = {
["empty-map"] = {1,3,10},
["paper"] = {1,5,15},
["compass"] = {1,1,5},
["bread"] = {1,4,15},
["stick"] = {1,2,5}
}
},
},
{
{"bedrock"},
{
rolls = {1,5},
items = {
["map"] = {1,3,10},
["paper"] = {1,5,15},
["compass"] = {1,1,5},
["bread"] = {1,4,15},
["oak-sapling"] = {1,2,5}
}
},
},
},
},
["village-fisherman"] = { -- village\village_fisher.json, Java-exclusive as of Java 1.14 / Bedrock 1.12
chest_table_display = { header="Fisherman", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Fisherman's chest" },
loot_tables = {
{
{"java"},
{
rolls = {1,5},
items = {
["emerald"] = {1,1,1},
["raw-cod"] = {1,3,2},
["raw-salmon"] = {1,3,1},
["water-bucket"] = {1,3,1},
["barrel"] = {1,3,1},
["wheat-seeds"] = {1,3,3},
["coal"] = {1,3,2}
}
},
},
},
},
["village-fletcher"] = { -- village\village_fletcher.json
chest_table_display = { header="Fletcher", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Fletcher's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["emerald"] = {1,1,1},
["arrow"] = {1,3,2},
["feather"] = {1,3,6},
["egg"] = {1,3,2},
["flint"] = {1,3,6},
["stick"] = {1,3,6}
}
},
},
},
},
["village-mason"] = { -- village\village_mason.json
chest_table_display = { header="Mason", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Mason's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["clay"] = {1,3,1},
["flower-pot"] = {1,1,1},
["stone"] = {1,1,2},
["stone-bricks"] = {1,1,2},
["bread"] = {1,4,4},
["yellow-dye"] = {1,1,1},
["smooth-stone"] = {1,1,1},
["emerald"] = {1,1,1}
}
},
},
},
},
["village-shepherd"] = { -- village\village_shepherd.json
chest_table_display = { header="Shepherd", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Shepherd's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["white-wool"] = {1,8,6},
["black-wool"] = {1,3,3},
["gray-wool"] = {1,3,2},
["brown-wool"] = {1,3,2},
["light-gray-wool"] = {1,3,2},
["emerald"] = {1,1,1},
["shears"] = {1,1,1},
["wheat"] = {1,6,6}
}
},
},
},
},
["village-tannery"] = { -- village\village_tannery.json
chest_table_display = { header="Tannery", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Tanner's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,5},
items = {
["leather"] = {1,3,1},
["leather-tunic"] = {1,1,2},
["leather-boots"] = {1,1,2},
["leather-cap"] = {1,1,2},
["bread"] = {1,4,5},
["leather-pants"] = {1,1,2},
["saddle"] = {1,1,1},
["emerald"] = {1,4,1}
}
},
},
},
},
["village-temple"] = { -- village\village_temple.json
chest_table_display = { header="Temple", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Temple chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["redstone"] = {1,4,2},
["bread"] = {1,4,7},
["rotten-flesh"] = {1,4,7},
["lapis-lazuli"] = {1,4,1},
["gold-ingot"] = {1,4,1},
["emerald"] = {1,4,1}
}
},
},
},
},
["village-toolsmith"] = { -- village\village_toolsmith.json
chest_table_display = { header="Toolsmith", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Toolsmith's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["diamond"] = {1,3,1},
["iron-ingot"] = {1,5,5},
["gold-ingot"] = {1,3,1},
["bread"] = {1,3,15},
["iron-pickaxe"] = {1,1,5},
["coal"] = {1,3,1},
["stick"] = {1,3,20},
["iron-shovel"] = {1,1,5}
}
},
},
},
},
["village-weaponsmith"] = { -- village\village_weaponsmith.json
chest_table_display = { header="Weaponsmith", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Weaponsmith's chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["diamond"] = {1,3,3},
["iron-ingot"] = {1,5,10},
["gold-ingot"] = {1,3,5},
["bread"] = {1,3,15},
["apple"] = {1,3,15},
["iron-pickaxe"] = {1,1,5},
["iron-sword"] = {1,1,5},
["iron-chestplate"] = {1,1,5},
["iron-helmet"] = {1,1,5},
["iron-leggings"] = {1,1,5},
["iron-boots"] = {1,1,5},
["obsidian"] = {3,7,5},
["oak-sapling"] = {3,7,5},
["saddle"] = {1,1,3},
["iron-horse-armor"] = {1,1,1},
["golden-horse-armor"] = {1,1,1},
["diamond-horse-armor"] = {1,1,1}
}
},
},
},
},
["village-desert-house"] = { -- village\village_desert_house.json
chest_table_display = { header="Desert House", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Desert house chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["clay"] = {1,1,1},
["green-dye"] = {1,1,1},
["cactus"] = {1,4,10},
["wheat"] = {1,7,10},
["bread"] = {1,4,10},
["book"] = {1,1,1},
["dead-bush"] = {1,3,2},
["emerald"] = {1,3,1}
}
},
},
},
},
["village-plains-house"] = { -- village\village_plains_house.json
chest_table_display = { header="Plains house", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Plains house chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["gold-nugget"] = {1,3,1},
["dandelion"] = {1,1,2},
["poppy"] = {1,1,1},
["potato"] = {1,7,10},
["bread"] = {1,4,10},
["apple"] = {1,5,10},
["book"] = {1,1,1},
["feather"] = {1,1,1},
["emerald"] = {1,4,2},
["oak-sapling"] = {1,2,5}
}
},
},
},
},
["village-savanna-house"] = { -- village\village_savanna_house.json
chest_table_display = { header="Savanna House", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Savanna house chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["gold-nugget"] = {1,3,1},
["grass"] = {1,1,5},
["tall-grass"] = {1,1,5},
["bread"] = {1,4,10},
["wheat-seeds"] = {1,5,10},
["emerald"] = {1,4,2},
["acacia-sapling"] = {1,2,10},
["saddle"] = {1,1,1},
["torch"] = {1,2,1},
["bucket"] = {1,1,1}
}
},
},
},
},
["village-snowy-house"] = { -- village\village_snowy_house.json
chest_table_display = { header="Snowy House", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Snowy house chest" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {3,8},
items = {
["blue-ice"] = {1,1,1},
["snow-block"] = {1,1,4},
["potato"] = {1,7,10},
["bread"] = {1,4,10},
["beetroot-seeds"] = {1,5,10},
["beetroot-soup"] = {1,1,1},
["furnace"] = {1,1,1},
["emerald"] = {1,4,1},
["snowball"] = {1,7,10},
["coal"] = {1,4,5}
}
},
},
},
},
["village-taiga-house"] = { -- village\village_taiga_house.json
chest_table_display = { header="Taiga House", superheader="[[Village]]" },
item_table_display = { structure_id="village", structure_text="Village", container="Taiga house chest" },
loot_tables = {
{
{"java"},
{
rolls = {3,8},
items = {
["iron-nugget"] = {1,5,1},
["fern"] = {1,1,2},
["large-fern"] = {1,1,2},
["potato"] = {1,7,10},
["sweet-berries"] = {1,7,5},
["bread"] = {1,4,10},
["pumpkin-seeds"] = {1,5,5},
["pumpkin-pie"] = {1,1,1},
["emerald"] = {1,4,2},
["spruce-sapling"] = {1,5,5},
["spruce-sign"] = {1,1,1},
["spruce-log"] = {1,5,10}
}
},
},
{
{"bedrock"},
{
rolls = {3,8},
items = {
["iron-nugget"] = {1,5,1},
["fern"] = {1,1,2},
["large-fern"] = {1,1,2},
["potato"] = {1,7,10},
["bread"] = {1,4,10},
["pumpkin-seeds"] = {1,5,5},
["pumpkin-pie"] = {1,1,1},
["emerald"] = {1,4,2},
["spruce-sapling"] = {1,5,5},
["oak-sign"] = {1,1,1},
["spruce-log"] = {1,5,10}
}
},
},
},
},
["stronghold-altar"] = { -- stronghold_corridor.json
chest_table_display = { header="Altar", superheader="[[Stronghold]]" },
item_table_display = { structure_id="stronghold", structure_text="Stronghold", container="Altar chest" },
loot_tables = {
{
{"java"},
{
rolls = {2,3},
items = {
["ender-pearl"] = {1,1,10},
["diamond"] = {1,3,3},
["iron-ingot"] = {1,5,10},
["gold-ingot"] = {1,3,5},
["redstone"] = {4,9,5},
["bread"] = {1,3,15},
["apple"] = {1,3,15},
["iron-pickaxe"] = {1,1,5},
["iron-sword"] = {1,1,5},
["iron-chestplate"] = {1,1,5},
["iron-helmet"] = {1,1,5},
["iron-leggings"] = {1,1,5},
["iron-boots"] = {1,1,5},
["golden-apple"] = {1,1,1},
["saddle"] = {1,1,1},
["iron-horse-armor"] = {1,1,1},
["golden-horse-armor"] = {1,1,1},
["diamond-horse-armor"] = {1,1,1},
["enchanted-book"] = {1,1,1},
}
},
},
{
{"bedrock"},
{
rolls = {2,3},
items = {
["ender-pearl"] = {1,1,50},
["emerald"] = {1,3,15},
["diamond"] = {1,3,15},
["iron-ingot"] = {1,5,50},
["gold-ingot"] = {1,3,25},
["redstone"] = {4,9,25},
["bread"] = {1,3,75},
["apple"] = {1,3,75},
["iron-pickaxe"] = {1,1,25},
["iron-sword"] = {1,1,25},
["iron-chestplate"] = {1,1,25},
["iron-helmet"] = {1,1,25},
["iron-leggings"] = {1,1,25},
["iron-boots"] = {1,1,25},
["golden-apple"] = {1,1,5},
["saddle"] = {1,1,5},
["iron-horse-armor"] = {1,1,5},
["golden-horse-armor"] = {1,1,5},
["diamond-horse-armor"] = {1,1,5},
["enchanted-book"] = {1,1,6},
}
},
},
},
},
["stronghold-library"] = { -- stronghold_library.json
chest_table_display = { header="Library", superheader="[[Stronghold]]" },
item_table_display = { structure_id="stronghold", structure_text="Stronghold", container="Library chest" },
loot_tables = {
{
{"java"},
{
rolls = {2,10},
items = {
["book"] = {1,3,20},
["paper"] = {2,7,20},
["empty-map"] = {1,1,1},
["compass"] = {1,1,1},
["enchanted-book"] = {1,1,10},
}
},
},
{
{"bedrock"},
{
rolls = {2,10},
items = {
["book"] = {1,3,100},
["paper"] = {2,7,100},
["map"] = {1,1,5},
["compass"] = {1,1,5},
["enchanted-book"] = {1,1,60},
}
},
},
},
},
["stronghold-storeroom"] = { -- stronghold_crossing.json
chest_table_display = { header="Storeroom", superheader="[[Stronghold]]" },
item_table_display = { structure_id="stronghold", structure_text="Stronghold", container="Storeroom chest" },
loot_tables = {
{
{"java"},
{
rolls = {1,4},
items = {
["iron-ingot"] = {1,5,10},
["gold-ingot"] = {1,3,5},
["redstone"] = {4,9,5},
["coal"] = {3,8,10},
["bread"] = {1,3,15},
["apple"] = {1,3,15},
["iron-pickaxe"] = {1,1,1},
["enchanted-book"] = {1,1,1},
}
},
},
{
{"bedrock"},
{
rolls = {1,4},
items = {
["iron-ingot"] = {1,5,50},
["gold-ingot"] = {1,3,25},
["redstone"] = {4,9,25},
["coal"] = {3,8,50},
["bread"] = {1,3,75},
["apple"] = {1,3,75},
["iron-pickaxe"] = {1,1,5},
["enchanted-book"] = {1,1,6},
["ink-sac"] = {1,3,75},
}
},
},
},
},
["bonus"] = { -- spawn_bonus_chest.json
chest_table_display = { header="[[Chest#Bonus chest|Bonus]]" },
item_table_display = { structure_id="day", structure_text="Bonus chest" },
loot_tables = {
{
{"java"},
{
rolls = {1,1},
items = {
["stone-axe"] = {1,1,1},
["wooden-axe"] = {1,1,3},
}
},
{
rolls = {1,1},
items = {
["stone-pickaxe"] = {1,1,1},
["wooden-pickaxe"] = {1,1,3}
}
},
{
rolls = {3,3},
items = {
["apple"] = {1,2,5},
["bread"] = {1,2,3},
["raw-salmon"] = {1,2,3},
}
},
{
rolls = {4,4},
items = {
["stick"] = {1,12,10},
["oak-planks"] = {1,12,10},
["oak-log"] = {1,3,3},
["spruce-log"] = {1,3,3},
["birch-log"] = {1,3,3},
["jungle-log"] = {1,3,3},
["acacia-log"] = {1,3,3},
["dark-oak-log"] = {1,3,3},
}
},
},
{
{"bedrock"},
{
rolls = {1,1},
items = {
["stone-axe"] = {1,1,1},
["wooden-axe"] = {1,1,3},
}
},
{
rolls = {1,1},
items = {
["stone-pickaxe"] = {1,1,1},
["wooden-pickaxe"] = {1,1,3}
}
},
{
rolls = {1,1},
items = {
["apple"] = {1,2,1}
}
},
{
rolls = {1,1},
items = {
["bread"] = {1,2,1}
}
},
{
rolls = {1,1},
items = {
["raw-salmon"] = {1,2,1}
}
},
{
rolls = {1,1},
items = {
["stick"] = {1,12,1}
}
},
{
rolls = {1,1},
items = {
["oak-planks"] = {1,12,1}
}
},
{
rolls = {1,1},
items = {
["dark-oak-log"] = {1,3,1},
["acacia-log"] = {1,3,1},
}
},
{
rolls = {1,1},
items = {
["oak-log"] = {1,3,1},
["spruce-log"] = {1,3,1},
["birch-log"] = {1,3,1},
["jungle-log"] = {1,3,1},
}
},
{
rolls = {1,1},
items = {
["potato"] = {1,2,3},
["carrot"] = {1,2,3},
}
},
{
rolls = {1,1},
items = {
["oak-sapling"] = {4,4,2},
["spruce-sapling"] = {4,4,2},
["birch-sapling"] = {4,4,2},
["jungle-sapling"] = {4,4,4},
["dark-oak-sapling"] = {4,4,2},
["acacia-sapling"] = {4,4,2},
}
},
{
rolls = {1,1},
items = {
["melon-seeds"] = {1,2,3},
["pumpkin-seeds"] = {1,2,3},
["beetroot-seeds"] = {1,2,3},
}
},
{
rolls = {1,1},
items = {
["cactus"] = {1,2,3},
["cocoa-beans"] = {1,2,2},
}
},
{
rolls = {1,1},
items = {
["brown-mushroom"] = {1,2,2},
}
},
},
},
},
["dungeon"] = { -- simple_dungeon.json
chest_table_display = { header="[[Dungeon]]" },
item_table_display = { structure_id="dungeon", structure_text="Dungeon" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,3},
items = {
["saddle"] = {1,1,20},
["golden-apple"] = {1,1,15},
["enchanted-golden-apple"] = {1,1,2},
["disc-13"] = {1,1,15},
["disc-cat"] = {1,1,15},
["name-tag"] = {1,1,20},
["golden-horse-armor"] = {1,1,10},
["iron-horse-armor"] = {1,1,15},
["diamond-horse-armor"] = {1,1,5},
["enchanted-book-rnd"] = {1,1,10},
}
},
{
rolls = {1,4},
items = {
["iron-ingot"] = {1,4,10},
["gold-ingot"] = {1,4,5},
["bread"] = {1,1,20},
["wheat"] = {1,4,20},
["bucket"] = {1,1,10},
["redstone"] = {1,4,15},
["coal"] = {1,4,15},
["melon-seeds"] = {2,4,10},
["pumpkin-seeds"] = {2,4,10},
["beetroot-seeds"] = {2,4,10},
}
},
{
rolls = {3,3},
items = {
["bone"] = {1,8,10},
["gunpowder"] = {1,8,10},
["rotten-flesh"] = {1,8,10},
["string"] = {1,8,10},
}
},
},
},
},
["mineshaft"] = { -- abandoned_mineshaft.json
chest_table_display = { header="[[Mineshaft]]" },
item_table_display = { structure_id="abandoned-mineshaft", structure_text="Mineshaft" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {1,1},
items = {
["golden-apple"] = {1,1,20},
["enchanted-golden-apple"] = {1,1,1},
["name-tag"] = {1,1,30},
["enchanted-book-rnd"] = {1,1,10},
["iron-pickaxe"] = {1,1,5},
["empty"] = {1,1,5},
}
},
{
rolls = {2,4},
items = {
["iron-ingot"] = {1,5,10},
["gold-ingot"] = {1,3,5},
["redstone"] = {4,9,5},
["lapis-lazuli"] = {4,9,5},
["diamond"] = {1,2,3},
["coal"] = {3,8,10},
["bread"] = {1,3,15},
["melon-seeds"] = {2,4,10},
["pumpkin-seeds"] = {2,4,10},
["beetroot-seeds"] = {2,4,10},
}
},
{
rolls = {3,3},
items = {
["rail"] = {4,8,20},
["powered-rail"] = {1,4,5},
["detector-rail"] = {1,4,5},
["activator-rail"] = {1,4,5},
["torch"] = {1,16,15},
}
},
},
},
},
["nether-fortress"] = { -- nether_bridge.json
chest_table_display = { header="[[Nether fortress]]" },
item_table_display = { structure_id="nether-fortress", structure_text="Nether fortress" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,4},
items = {
["diamond"] = {1,3,5},
["iron-ingot"] = {1,5,5},
["gold-ingot"] = {1,3,15},
["golden-sword"] = {1,1,5},
["golden-chestplate"] = {1,1,5},
["flint-and-steel"] = {1,1,5},
["nether-wart"] = {3,7,5},
["saddle"] = {1,1,10},
["golden-horse-armor"] = {1,1,8},
["iron-horse-armor"] = {1,1,5},
["diamond-horse-armor"] = {1,1,3},
["obsidian"] = {2,4,2},
}
},
},
},
},
["desert-temple"] = { -- desert_pyramid.json
chest_table_display = { header="[[Desert temple]]" },
item_table_display = { structure_id="desert-temple", structure_text="Desert temple" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,4},
items = {
["diamond"] = {1,3,5},
["iron-ingot"] = {1,5,15},
["gold-ingot"] = {2,7,15},
["emerald"] = {1,3,15},
["bone"] = {4,6,25},
["spider-eye"] = {1,3,25},
["rotten-flesh"] = {3,7,25},
["saddle"] = {1,1,20},
["iron-horse-armor"] = {1,1,15},
["golden-horse-armor"] = {1,1,10},
["diamond-horse-armor"] = {1,1,5},
["enchanted-book-rnd"] = {1,1,20},
["golden-apple"] = {1,1,20},
["enchanted-golden-apple"] = {1,1,2},
["empty"] = {1,1,15},
}
},
{
rolls = {4,4},
items = {
["bone"] = {1,8,10},
["gunpowder"] = {1,8,10},
["rotten-flesh"] = {1,8,10},
["string"] = {1,8,10},
["sand"] = {1,8,10},
}
},
},
},
},
["jungle-temple"] = { -- jungle_temple.json
chest_table_display = { header="Chest", superheader="[[Jungle temple]]" },
item_table_display = { structure_id="jungle-temple", structure_text="Jungle temple", container="Chest" },
loot_tables = {
{
{"java"},
{
rolls = {2,6},
items = {
["diamond"] = {1,3,3},
["iron-ingot"] = {1,5,10},
["gold-ingot"] = {2,7,15},
["emerald"] = {1,3,2},
["bone"] = {4,6,20},
["bamboo"] = {1,3,15},
["rotten-flesh"] = {3,7,16},
["saddle"] = {1,1,3},
["iron-horse-armor"] = {1,1,1},
["golden-horse-armor"] = {1,1,1},
["diamond-horse-armor"] = {1,1,1},
["enchanted-book"] = {1,1,1}
}
},
},
{
{"bedrock"},
{
rolls = {2,6},
items = {
["diamond"] = {1,3,15},
["iron-ingot"] = {1,5,50},
["gold-ingot"] = {2,7,75},
["emerald"] = {1,3,10},
["bone"] = {4,6,100},
["rotten-flesh"] = {3,7,80},
["bamboo"] = {1,3,75},
["saddle"] = {1,1,15},
["iron-horse-armor"] = {1,1,5},
["golden-horse-armor"] = {1,1,5},
["diamond-horse-armor"] = {1,1,5},
["enchanted-book"] = {1,1,6}
}
},
},
},
},
["jungle-temple-dispenser"] = { -- jungle_temple_dispenser.json
chest_table_display = { header="Dispenser", superheader="[[Jungle temple]]" },
item_table_display = { structure_id="jungle-temple", structure_text="Jungle temple", container="Dispenser" },
loot_tables = {
{
{"java"},
{
rolls = {1,2},
items = {
["arrow"] = {2,7,30}
}
},
},
{
{"bedrock"},
{
rolls = {2,2},
items = {
["arrow"] = {2,7,30}
}
},
},
},
},
["end-city"] = { -- end_city_treasure.json
chest_table_display = { header="[[End city]]" },
item_table_display = { structure_id="end-city", structure_text="End city" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,6},
items = {
["diamond"] = {2,7,5},
["iron-ingot"] = {4,8,10},
["gold-ingot"] = {2,7,15},
["emerald"] = {2,6,2},
["beetroot-seeds"] = {1,10,5},
["saddle"] = {1,1,3},
["iron-horse-armor"] = {1,1,1},
["golden-horse-armor"] = {1,1,1},
["diamond-horse-armor"] = {1,1,1},
["level-enchanted-diamond-sword"] = {1,1,3},
["level-enchanted-diamond-boots"] = {1,1,3},
["level-enchanted-diamond-chestplate"] = {1,1,3},
["level-enchanted-diamond-leggings"] = {1,1,3},
["level-enchanted-diamond-helmet"] = {1,1,3},
["level-enchanted-diamond-pickaxe"] = {1,1,3},
["level-enchanted-diamond-shovel"] = {1,1,3},
["level-enchanted-iron-sword"] = {1,1,3},
["level-enchanted-iron-boots"] = {1,1,3},
["level-enchanted-iron-chestplate"] = {1,1,3},
["level-enchanted-iron-leggings"] = {1,1,3},
["level-enchanted-iron-helmet"] = {1,1,3},
["level-enchanted-iron-pickaxe"] = {1,1,3},
["level-enchanted-iron-shovel"] = {1,1,3},
}
},
},
},
},
["igloo"] = {
chest_table_display = { header="[[Igloo]]" },
item_table_display = { structure_id="igloo", structure_text="Igloo" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {2,8},
items = {
["apple"] = {1,3,15},
["coal"] = {1,4,15},
["gold-nugget"] = {1,3,10},
["stone-axe"] = {1,1,2},
["rotten-flesh"] = {1,1,10},
["emerald"] = {1,1,1},
["wheat"] = {2,3,10}
}
},
{
rolls = {1,1},
items = {
["golden-apple"] = {1,1,1},
}
},
},
},
},
["pillager-outpost"] = {
chest_table_display = { header="[[Pillager outpost]]" },
item_table_display = { structure_id="pillager-outpost", structure_text="Pillager outpost" },
loot_tables = {
{
{"java","bedrock"},
{
rolls = {0,1},
items = {
["crossbow"] = {1,1,1},
}
},
{
rolls = {2,3},
items = {
["wheat"] = {3,5,7},
["potato"] = {2,5,5},
["carrot"] = {3,5,5}
}
},
{
rolls = {1,3},
items = {
["dark-oak-log"] = {2,3,1}
}
},
{
rolls = {2,3},
items = {
["bottle-o'-enchanting"] = {1,1,7},
["string"] = {1,6,4},
["arrow"] = {2,7,4},
["tripwire-hook"] = {1,3,3},
["iron-ingot"] = {1,3,3},
["enchanted-book-rnd"] = {1,1,1}
}
},
},
},
},
["bastion-bridge"] = { -- bastion_bridge.json
chest_table_display = { header="Bridge", superheader="[[Bastion remnant]]" },
item_table_display = { structure_id="bastion-remnant", structure_text="Bastion remnant", container="Bridge chest" },
loot_tables = {
{
{"java-upcoming"},
{
rolls = {1,1},
items = {
["lodestone"] = {1,1,1},
}
},
{
rolls = {1,2},
items = {
["damaged-random-enchanted-crossbow"] = {1,1,1},
["spectral-arrow"] = {2,12,1},
["gilded-blackstone"] = {5,8,1},
["crying-obsidian"] = {3,8,1},
["block-of-gold"] = {1,1,1},
["gold-ingot"] = {2,8,1},
["iron-ingot"] = {2,8,1},
["golden-sword"] = {1,1,1},
["random-enchanted-golden-chestplate"] = {1,1,1},
["random-enchanted-golden-helmet"] = {1,1,1},
["random-enchanted-golden-leggings"] = {1,1,1},
["random-enchanted-golden-boots"] = {1,1,1},
}
},
{
rolls = {2,4},
items = {
["string"] = {1,6,1},
["leather"] = {1,3,1},
["arrow"] = {5,17,1},
["iron-nugget"] = {2,6,1},
["gold-nugget"] = {2,6,1},
}
}
},
{
{"bedrock-upcoming"},
{
rolls = {1,1},
items = {
["lodestone"] = {1,1,1},
}
},
{
rolls = {1,2},
items = {
["arrow"] = {5,18,1},
["gilded-blackstone"] = {5,10,1},
["crying-obsidian"] = {3,8,1},
["block-of-gold"] = {1,1,1},
["gold-ingot"] = {2,8,1},
["iron-ingot"] = {2,8,1},
["golden-sword"] = {1,1,1},
["random-enchanted-golden-chestplate"] = {1,1,1},
["random-enchanted-golden-helmet"] = {1,1,1},
["random-enchanted-golden-leggings"] = {1,1,1},
["random-enchanted-golden-boots"] = {1,1,1},
}
},
{
rolls = {2,4},
items = {
["string"] = {1,6,1},
["leather"] = {1,3,1},
["arrow"] = {5,17,1},
["iron-nugget"] = {2,6,1},
["gold-nugget"] = {2,6,1}
}
}
},
},
},
["bastion-hoglin-stable"] = { -- bastion_hoglin_stable.json
chest_table_display = { header="Hoglin stable", superheader="[[Bastion remnant]]" },
item_table_display = { structure_id="bastion-remnant", structure_text="Bastion remnant", container="Hoglin stable chest" },
loot_tables = {
{
{"java-upcoming"},
{
rolls = {1,1},
items = {
["damaged-random-enchanted-diamond-shovel"] = {1,1,5},
["netherite-scrap"] = {1,1,2},
["ancient-debris"] = {1,1,3},
["saddle"] = {1,1,10},
["block-of-gold"] = {2,4,25},
["random-enchanted-golden-hoe"] = {1,1,15},
["empty"] = {1,1,45},
}
},
{
rolls = {3,4},
items = {
["glowstone"] = {1,5,1},
["gilded-blackstone"] = {1,5,1},
["soul-sand"] = {2,7,1},
["crimson-nylium"] = {2,7,1},
["gold-nugget"] = {2,8,1},
["leather"] = {1,3,1},
["arrow"] = {5,17,1},
["string"] = {3,8,1},
["raw-porkchop"] = {2,5,1},
["cooked-porkchop"] = {2,5,1},
["crimson-fungus"] = {2,7,1},
["crimson-roots"] = {2,7,1},
}
},
},
{
{"bedrock-upcoming"},
{
rolls = {1,1},
items = {
["damaged-random-enchanted-netherite-shovel"] = {1,1,10},
["netherite-scrap"] = {1,1,10},
["ancient-debris"] = {1,1,10},
["saddle"] = {1,1,15},
["block-of-gold"] = {2,4,10},
["random-enchanted-golden-hoe"] = {1,1,10},
["empty"] = {1,1,10}
}
},
{
rolls = {3,4},
items = {
["glowstone"] = {1,5,1},
["gilded-blackstone"] = {1,5,1},
["soul-sand"] = {2,7,1},
["crimson-nylium"] = {2,7,1},
["gold-nugget"] = {2,8,1},
["leather"] = {1,3,1},
["arrow"] = {5,17,1},
["string"] = {3,8,1},
["raw-porkchop"] = {2,5,1},
["cooked-porkchop"] = {2,5,1},
["crimson-fungus"] = {2,7,1},
["crimson-roots"] = {2,7,1}
}
}
},
},
},
["bastion-other"] = { -- bastion_other.json
chest_table_display = { header="Other", superheader="[[Bastion remnant]]" },
item_table_display = { structure_id="bastion-remnant", structure_text="Bastion remnant", container="Other chest" },
loot_tables = {
{
{"java-upcoming"},
{
rolls = {1,1},
items = {
["damaged-random-enchanted-crossbow"] = {1,1,12},
["ancient-debris"] = {1,1,2},
["netherite-scrap"] = {1,1,2},
["spectral-arrow"] = {2,15,6},
["snout-banner-pattern"] = {1,1,5},
["disc-pigstep"] = {1,1,3},
["enchanted-book-rnd-soul-speed"] = {1,1,10},
["empty"] = {1,1,50},
}
},
{
rolls = {2,2},
items = {
["soul-speed-enchanted-golden-boots"] = {1,1,1},
["block-of-gold"] = {1,1,1},
["crossbow"] = {1,1,1},
["gold-ingot"] = {1,6,1},
["iron-ingot"] = {1,6,1},
["golden-sword"] = {1,1,1},
["golden-chestplate"] = {1,1,1},
["golden-helmet"] = {1,1,1},
["golden-leggings"] = {1,1,1},
["golden-boots"] = {1,1,1},
["empty"] = {1,1,2},
}
},
{
rolls = {3,5},
items = {
["crying-obsidian"] = {1,5,1},
["gilded-blackstone"] = {1,5,1},
["chain"] = {2,10,1},
["magma-cream"] = {2,6,1},
["bone-block"] = {3,6,1},
["iron-nugget"] = {2,8,1},
["obsidian"] = {4,6,1},
["gold-nugget"] = {2,8,1},
["string"] = {4,6,1},
["arrow"] = {5,17,2},
}
},
},
{
{"bedrock-upcoming"},
{
rolls = {1,1},
items = {
["damaged-random-enchanted-crossbow"] = {1,1,10},
["ancient-debris"] = {1,1,5},
["netherite-scrap"] = {1,1,5},
["arrow"] = {5,20,10},
["snout-banner-pattern"] = {1,1,10},
["disc-pigstep"] = {1,1,10},
["empty"] = {1,1,10},
}
},
{
rolls = {2,2},
items = {
["enchanted-book-rnd-soul-speed"] = {1,1,1},
["soul-speed-enchanted-golden-boots"] = {1,1,1},
["block-of-gold"] = {1,1,1},
["crossbow"] = {1,1,1},
["gold-ingot"] = {1,6,1},
["iron-ingot"] = {1,6,1},
["golden-sword"] = {1,1,1},
["golden-chestplate"] = {1,1,1},
["golden-helmet"] = {1,1,1},
["golden-leggings"] = {1,1,1},
["golden-boots"] = {1,1,1},
["empty"] = {1,1,2},
}
},
{
rolls = {3,5},
items = {
["crying-obsidian"] = {1,5,1},
["gilded-blackstone"] = {1,5,1},
["chain"] = {2,10,1},
["magma-cream"] = {2,6,1},
["bone-block"] = {3,6,1},
["iron-nugget"] = {2,8,1},
["obsidian"] = {4,6,1},
["gold-nugget"] = {2,8,1},
["string"] = {4,6,1},
["arrow"] = {5,17,2},
}
}
},
},
},
["bastion-treasure"] = { -- bastion_treasure.json
chest_table_display = { header="Treasure", superheader="[[Bastion remnant]]" },
item_table_display = { structure_id="bastion-remnant", structure_text="Bastion remnant", container="Treasure chest" },
loot_tables = {
{
{"java-upcoming"},
{
rolls = {1,2},
items = {
["netherite-ingot"] = {1,1,10},
["ancient-debris"] = {1,1,14},
["netherite-scrap"] = {1,1,10},
["ancient-debris"] = {2,2,1},
["damaged-random-enchanted-diamond-sword"] = {1,1,10},
["damaged-random-enchanted-diamond-chestplate"] = {1,1,6},
["damaged-random-enchanted-diamond-helmet"] = {1,1,6},
["damaged-random-enchanted-diamond-leggings"] = {1,1,6},
["damaged-random-enchanted-diamond-boots"] = {1,1,6},
["damaged-diamond-sword"] = {1,1,6},
["damaged-diamond-chestplate"] = {1,1,5},
["damaged-diamond-helmet"] = {1,1,5},
["damaged-diamond-leggings"] = {1,1,5},
["damaged-diamond-boots"] = {1,1,5},
["diamond"] = {1,3,5},
}
},
{
rolls = {2,4},
items = {
["spectral-arrow"] = {5,21,1},
["block-of-gold"] = {2,5,1},
["gold-ingot"] = {3,9,1},
["iron-ingot"] = {3,9,1},
["crying-obsidian"] = {1,5,1},
["nether-quartz"] = {8,23,1},
["gilded-blackstone"] = {1,5,1},
["magma-cream"] = {2,8,1},
["iron-nugget"] = {8,16,1},
}
},
},
{
{"bedrock-upcoming"},
{
rolls = {1,1},
items = {
["netherite-ingot"] = {1,1,10},
["ancient-debris"] = {1,1,10},
["netherite-scrap"] = {1,1,10},
["ancient-debris"] = {2,2,5},
["damaged-random-enchanted-netherite-sword"] = {1,1,10},
["damaged-random-enchanted-netherite-chestplate"] = {1,1,6},
["damaged-random-enchanted-netherite-helmet"] = {1,1,6},
["damaged-random-enchanted-netherite-leggings"] = {1,1,6},
["damaged-random-enchanted-netherite-boots"] = {1,1,6},
["damaged-netherite-sword"] = {1,1,6},
["damaged-netherite-chestplate"] = {1,1,5},
["damaged-netherite-helmet"] = {1,1,5},
["damaged-netherite-boots"] = {1,1,5},
["damaged-netherite-leggings"] = {1,1,5},
["diamond"] = {1,3,5},
}
},
{
rolls = {2,4},
items = {
["arrow"] = {5,21,1},
["block-of-gold"] = {2,5,1},
["gold-ingot"] = {3,9,1},
["iron-ingot"] = {3,9,1},
["crying-obsidian"] = {1,5,1},
["nether-quartz"] = {8,23,1},
["gilded-blackstone"] = {1,5,1},
["magma-cream"] = {2,8,1},
["iron-nugget"] = {8,16,1},
}
}
},
},
},
["ruined-portal"] = { --ruined_portal.json
chest_table_display = { header="[[Ruined portal]]" },
item_table_display = { structure_id="ruined-portal", structure_text="Ruined portal" },
loot_tables = {
{
{"java-upcoming"},
{
rolls = {4,8},
items = {
["obsidian"] = {1,2,40},
["flint"] = {1,4,40},
["iron-nugget"] = {9,18,40},
["flint-and-steel"] = {1,1,40},
["fire-charge"] = {1,1,40},
["golden-apple"] = {1,1,15},
["gold-nugget"] = {4,24,15},
["random-enchanted-golden-sword"] = {1,1,15},
["random-enchanted-golden-axe"] = {1,1,15},
["random-enchanted-golden-hoe"] = {1,1,15},
["random-enchanted-golden-shovel"] = {1,1,15},
["random-enchanted-golden-pickaxe"] = {1,1,15},
["random-enchanted-golden-helmet"] = {1,1,15},
["random-enchanted-golden-chestplate"] = {1,1,15},
["random-enchanted-golden-leggings"] = {1,1,15},
["random-enchanted-golden-boots"] = {1,1,15},
["glistering-melon-slice"] = {4,12,5},
["golden-horse-armor"] = {1,1,5},
["light-weighted-pressure-plate"] = {1,1,5},
["golden-carrot"] = {4,12,5},
["clock"] = {1,1,5},
["gold-ingot"] = {2,8,5},
["bell"] = {1,1,1},
["enchanted-golden-apple"] = {1,1,1},
["block-of-gold"] = {1,2,1},
}
},
},
{
{"bedrock-upcoming"},
{
rolls = {4,8},
items = {
["obsidian"] = {1,2,40},
["flint"] = {1,4,40},
["iron-nugget"] = {9,18,40},
["flint-and-steel"] = {1,1,40},
["fire-charge"] = {1,1,40},
["golden-apple"] = {1,1,15},
["gold-nugget"] = {4,24,15},
["random-enchanted-golden-sword"] = {1,1,15},
["random-enchanted-golden-axe"] = {1,1,15},
["random-enchanted-golden-hoe"] = {1,1,15},
["random-enchanted-golden-shovel"] = {1,1,15},
["random-enchanted-golden-pickaxe"] = {1,1,15},
["random-enchanted-golden-helmet"] = {1,1,15},
["random-enchanted-golden-chestplate"] = {1,1,15},
["random-enchanted-golden-leggings"] = {1,1,15},
["random-enchanted-golden-boots"] = {1,1,15},
["glistering-melon-slice"] = {1,1,5},
["golden-horse-armor"] = {1,1,5},
["light-weighted-pressure-plate"] = {1,1,5},
["golden-carrot"] = {4,12,5},
["clock"] = {1,1,5},
["gold-ingot"] = {2,8,5},
["bell"] = {1,1,1},
["enchanted-golden-apple"] = {1,1,1},
["block-of-gold"] = {1,2,1},
}
},
},
},
},
["woodland-mansion"] = { -- woodland_mansion.json
chest_table_display = { header="[[Woodland mansion]]" },
item_table_display = { structure_id="woodland-mansion", structure_text="Woodland mansion" },
loot_tables = {
{
{"java"},
{
rolls = {1,3},
items = {
["lead"] = {1,1,20},
["golden-apple"] = {1,1,15},
["enchanted-golden-apple"] = {1,1,2},
["disc-13"] = {1,1,15},
["disc-cat"] = {1,1,15},
["name-tag"] = {1,1,20},
["chainmail-chestplate"] = {1,1,10},
["diamond-hoe"] = {1,1,15},
["diamond-chestplate"] = {1,1,5},
["enchanted-book-rnd"] = {1,1,10},
}
},
{
rolls = {1,4},
items = {
["iron-ingot"] = {1,4,10},
["gold-ingot"] = {1,4,5},
["bread"] = {1,1,20},
["wheat"] = {1,4,20},
["bucket"] = {1,1,10},
["redstone"] = {1,4,15},
["coal"] = {1,4,15},
["melon-seeds"] = {2,4,10},
["pumpkin-seeds"] = {2,4,10},
["beetroot-seeds"] = {2,4,10},
}
},
{
rolls = {3,3},
items = {
["bone"] = {1,8,10},
["gunpowder"] = {1,8,10},
["rotten-flesh"] = {1,8,10},
["string"] = {1,8,10},
}
},
},
{
{"bedrock"},
{
rolls = {1,3},
items = {
["lead"] = {1,1,100},
["golden-apple"] = {1,1,75},
["enchanted-golden-apple"] = {1,1,10},
["disc-13"] = {1,1,75},
["disc-cat"] = {1,1,75},
["name-tag"] = {1,1,100},
["chainmail-chestplate"] = {1,1,50},
["diamond-hoe"] = {1,1,75},
["diamond-chestplate"] = {1,1,25},
["enchanted-book-rnd"] = {1,1,60},
}
},
{
rolls = {1,4},
items = {
["iron-ingot"] = {1,4,50},
["gold-ingot"] = {1,4,25},
["bread"] = {1,1,100},
["wheat"] = {1,4,100},
["bucket"] = {1,1,50},
["redstone"] = {1,4,75},
["coal"] = {1,4,75},
["melon-seeds"] = {2,4,50},
["pumpkin-seeds"] = {2,4,50},
["beetroot-seeds"] = {2,4,50},
}
},
{
rolls = {3,3},
items = {
["bone"] = {1,8,50},
["gunpowder"] = {1,8,50},
["rotten-flesh"] = {1,8,50},
["string"] = {1,8,50},
}
},
},
},
},
}
}
f = {
-- this math is at the top simply for ease of inspection.
calc_average_amount_this_item_per_pool = function(
min_stacksize, max_stacksize,
min_pool_rolls, max_pool_rolls,
item_weight, pool_total_item_weight )
local avg_stacksize = ( min_stacksize + max_stacksize ) / 2
local avg_rolls = ( min_pool_rolls + max_pool_rolls ) / 2
return avg_stacksize * avg_rolls * item_weight / pool_total_item_weight
end,
calc_chance_any_of_this_item_per_pool = function(
min_pool_rolls, max_pool_rolls,
item_weight, pool_total_item_weight )
local inverse_result = 0 -- 1 - inverse_result = return value
local inverse_item_weight = pool_total_item_weight - item_weight
-- will be used for the division in the for loop to avoid the slightly
-- less performant math.pow(). The divisor already includes the probability
-- of picking any specific number of rolls.
local cur_dividend = inverse_item_weight
local cur_divisor = pool_total_item_weight * (max_pool_rolls - min_pool_rolls + 1)
for i = 1, max_pool_rolls do
if i >= min_pool_rolls then
inverse_result = inverse_result + cur_dividend / cur_divisor
end
cur_dividend = cur_dividend * inverse_item_weight -- simulate pow
cur_divisor = cur_divisor * pool_total_item_weight -- simulate pow
end
return 1 - inverse_result
end,
get_item = function( item_key, item_display_name )
local html = {}
local item_title = item_display_name
local item_link = item_display_name
local item_id = item_key
local sprite_type = d.items[item_key][1]
local note_key = d.items[item_key].note
local note_key_1 = d.items[item_key].note1
if d.items[item_key].title ~= nil then
item_title = d.items[item_key].title
end
if d.items[item_key].link ~= nil then
item_link = d.items[item_key].link
end
if d.items[item_key].id ~= nil then
item_id = d.items[item_key].id
end
if sprite_type == "item" or sprite_type == "block" then
table.insert( html, p.current_frame:expandTemplate{ title = f.title_case(sprite_type) .. 'Link', args = { item_link , item_title , id = item_id, wrap = true } } )
end
if note_key ~= nil and d.notes[note_key] ~= nil then
table.insert( html, p.current_frame:extensionTag( 'ref', d.notes[note_key], { group='note', name=note_key } ) )
end
if note_key_1 ~= nil and d.notes[note_key_1] ~= nil then
if note_key == nil or d.notes[note_key] == nil or note_key ~= note_key_1 then
table.insert( html, p.current_frame:extensionTag( 'ref', d.notes[note_key_1], { group='note', name=note_key_1 } ) )
end
end
return table.concat( html )
end,
lpad = function(str, len, char)
if char == nil then char = ' ' end
return string.rep(char, len - #str) .. str
end,
find_chances_for_items = function( item_names )
local chances = {}
local all_editions = f.get_editions_hash()
for chest_name, chest in pairs(d.chests) do
for _, loot_table in pairs(chest.loot_tables or {}) do
local editions, editions_upcoming = {}, {}
for _, edition in pairs(loot_table[1]) do
if edition:gsub( '-upcoming', '' ) == edition then
editions[edition] = true
else
editions_upcoming[edition] = true
end
end
for edition, _ in pairs(editions) do
if editions_upcoming[edition] == nil then
table.insert( loot_table[1], edition .. '-upcoming' )
end
end
for _, item_name in pairs(item_names) do
for pool_idx, pool in pairs(loot_table) do
if pool_idx > 1 then
local item_numbers = pool.items[item_name]
if item_numbers ~= nil then
local min_stacksize = item_numbers[1]
local max_stacksize = item_numbers[2]
local min_poolrolls = pool.rolls[1]
local max_poolrolls = pool.rolls[2]
local stack_size = min_stacksize
if min_stacksize ~= max_stacksize then
stack_size = min_stacksize .. "–" .. max_stacksize
end
local item_weight = item_numbers[3]
local pool_total_item_weight = 0
for item_name, item in pairs(pool.items) do
pool_total_item_weight = pool_total_item_weight + item[3]
end
local chance = f.calc_chance_any_of_this_item_per_pool(
min_poolrolls, max_poolrolls,
item_weight, pool_total_item_weight )
local rolls = min_poolrolls
if min_poolrolls ~= max_poolrolls then
rolls = min_poolrolls .. "–" .. max_poolrolls
end
local num_items = string.format( "%.3f", f.calc_average_amount_this_item_per_pool(
min_stacksize, max_stacksize,
min_poolrolls, max_poolrolls,
item_weight, pool_total_item_weight ) )
local weight_frac = p.current_frame:expandTemplate{ title = 'frac', args = { item_weight, pool_total_item_weight } }
local chance_per_chest = string.format( "%.1f", chance * 100 )
local avg_num_chests = string.format( "%.1f", 1 / chance )
local key = item_name .. '|' .. chest_name .. '|' .. stack_size .. '|' .. rolls .. '|' .. weight_frac .. '|' .. num_items .. '|' .. chance_per_chest .. '|' .. avg_num_chests
if chances[key] == nil then
chances[key] = {}
chances[key].editions = {}
chances[key].edition_variants = {}
chances[key].unknown_editions = {}
end
for _, edition in pairs(loot_table[1]) do
chances[key].editions[edition] = true
end
end
end
end
end
end
-- check for edition variants,
-- so instead of reporting table-cell "No", it reports "Variant".
local variants = {}
for _, item_name in pairs(item_names) do
local item_chest = item_name .. '|' .. chest_name .. '|'
variants[item_chest] = {}
for key, _ in pairs(chances) do
if key:sub(1, #item_chest) == item_chest then
for edition, _ in pairs( chances[key].editions ) do
variants[item_chest][edition] = true
end
end
end
end
for key, chance in pairs(chances) do
for item_chest, editions in pairs( variants ) do
if key:sub(1, #item_chest) == item_chest then
for edition, _ in pairs( editions ) do
if chances[key].editions[edition] == nil then
chances[key].edition_variants[edition] = true
end
end
for edition, _ in pairs( all_editions ) do
if chances[key].editions[edition] == nil
and chances[key].edition_variants[edition] == nil then
chances[key].unknown_editions[edition] = true
end
end
end
end
end
end
-- add figure spaces for padding: each space is exactly the width of a digit.
local numperchest_width_max = 0
local chance_width_max = 0
local numchests_width_max = 0
local numperchest_width_min = 1000
local chance_width_min = 1000
local numchests_width_min = 1000
for key, _ in pairs(chances) do
for avg_num_per_chest, chance_per_chest, avg_num_chests in key:gmatch ".*|([%d%.]+)|([%d%.]+)|([%d%.]+)$" do
numperchest_width_max = math.max( numperchest_width_max, string.len(avg_num_per_chest) )
chance_width_max = math.max( chance_width_max, string.len(chance_per_chest) )
numchests_width_max = math.max( numchests_width_max, string.len(avg_num_chests) )
numperchest_width_min = math.min( numperchest_width_min, string.len(avg_num_per_chest) )
chance_width_min = math.min( chance_width_min, string.len(chance_per_chest) )
numchests_width_min = math.min( numchests_width_min, string.len(avg_num_chests) )
end
end
local padded_chances = {}
if chance_width_max ~= chance_width_min
or numchests_width_max ~= numchests_width_min
or numperchest_width_max ~= numperchest_width_min then
for key, chance in pairs(chances) do
for rest, avg_num_per_chest, chance_per_chest, avg_num_chests in key:gmatch "(.*)|([%d%.]+)|([%d%.]+)|([%d%.]+)$" do
-- these spaces are "figure spaces", not normal spaces.
key = rest .. '|'
.. f.lpad( avg_num_per_chest, numperchest_width_max, " " ) .. '|'
.. f.lpad( chance_per_chest, chance_width_max, " " ) .. '|'
.. f.lpad( avg_num_chests, numchests_width_max, " " )
padded_chances[key] = chance
end
end
chances = padded_chances
end
return chances
end,
-- this is so cell templates only get expanded once.
upcoming_v_expanded = {},
upcoming_expanded = {},
until_expanded = {},
yes_expanded = nil,
no_expanded = nil,
planned_expanded = nil,
unknown_expanded = nil,
needs_testing_expanded = nil,
warning_comment_expanded = nil,
yes_comment_expanded = nil,
info_comment_expanded = nil,
upcoming_cell = function( edition )
if f.upcoming_v_expanded[edition] == nil then
f.upcoming_v_expanded[edition] = p.current_frame:expandTemplate{ title = 'v', args = { edition .. '-upcoming', link = 'none' } }
end
if f.upcoming_expanded[edition] == nil then
f.upcoming_expanded[edition] = p.current_frame:expandTemplate{ title = 'Upcoming', args = { edition .. ' ' .. f.upcoming_v_expanded[edition] } }
end
return f.upcoming_expanded[edition]
end,
until_cell = function( edition )
if f.upcoming_v_expanded[edition] == nil then
f.upcoming_v_expanded[edition] = p.current_frame:expandTemplate{ title = 'v', args = { edition .. '-upcoming', link = 'none' } }
end
if f.until_expanded[edition] == nil then
f.until_expanded[edition] = p.current_frame:expandTemplate{ title = 'Until', args = { edition .. ' ' .. f.upcoming_v_expanded[edition] } }
end
return f.until_expanded[edition]
end,
yes_cell = function()
if f.yes_expanded == nil then
f.yes_expanded = p.current_frame:expandTemplate{ title = 'Table Choice', args = { 'Yes' } }
end
return f.yes_expanded
end,
no_cell = function()
if f.no_expanded == nil then
f.no_expanded = p.current_frame:expandTemplate{ title = 'Table Choice', args = { 'No' } }
end
return f.no_expanded
end,
planned_cell = function()
if f.planned_expanded == nil then
f.planned_expanded = p.current_frame:expandTemplate{ title = 'Table Choice', args = { 'Planned', 'Yes' } }
end
return f.planned_expanded
end,
-- not currently used.
unknown_cell = function()
if f.needs_testing_expanded == nil then
f.needs_testing_expanded = p.current_frame:expandTemplate{ title = 'needs testing', args = { 'This loot information has not been tested, in this edition.' } }
end
if f.unknown_expanded == nil then
f.unknown_expanded = p.current_frame:expandTemplate{ title = 'Table Choice', args = { 'Unknown' } } .. ' ' .. f.needs_testing_expanded
end
return f.unknown_expanded
end,
warning_comment = function()
if f.warning_comment_expanded == nil then
f.warning_comment_expanded = p.current_frame:expandTemplate{ title = 'Comment', args = { '!', '' } }
end
return f.warning_comment_expanded
end,
yes_comment = function()
if f.yes_comment_expanded == nil then
f.yes_comment_expanded = p.current_frame:expandTemplate{ title = 'Comment', args = { 'y', '' } }
end
return f.yes_comment_expanded
end,
info_comment = function()
if f.info_comment_expanded == nil then
f.info_comment_expanded = p.current_frame:expandTemplate{ title = 'Comment', args = { 'i', '' } }
end
return f.info_comment_expanded
end,
has_entries = function(_table)
for _ in pairs(_table) do
return true
end
return false
end,
has_one_entry = function(_table)
local first = false
local second = false
for _ in pairs(_table) do
if first then
second = true
end
first = true
if first and second then
return false
end
end
return first and not second
end,
round = function(num, num_decimal_places)
local mult = 10^(num_decimal_places or 0)
return math.floor(num * mult + 0.5) / mult
end,
split = function (s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result;
end,
title_case = function( str )
local buf = {}
for word in string.gfind(str, "%S+") do
if word == "and" then
table.insert( buf, word )
else
local first, rest = string.sub( word, 1, 1 ), string.sub( word, 2 )
table.insert( buf, string.upper(first) .. string.lower(rest) )
end
end
return table.concat( buf, " " )
end,
capitalize = function( str )
return ( string.lower(str):gsub( "^%l", string.upper ) )
end,
plural = function( item_name )
if string.sub( item_name, -2 ) == 'ch'
or string.sub( item_name, -2 ) == 'sh'
or string.sub( item_name, -2 ) == 'zh'
or string.sub( item_name, -1 ) == 's'
or string.sub( item_name, -1 ) == 'x'
or string.sub( item_name, -1 ) == 'z' then
return item_name .. 'es'
end
if string.sub( item_name, -1 ) == 'y' then
if string.sub( item_name, -2 ) == 'ay'
or string.sub( item_name, -2 ) == 'ey'
or string.sub( item_name, -2 ) == 'oy'
or string.sub( item_name, -2 ) == 'uy' then
return item_name .. 's'
end
return string.sub( item_name, 1, -2 ) .. 'ies'
end
if string.sub( item_name, -1 ) == 'f' then
if string.sub( item_name, -2 ) == 'ff' then
return item_name .. 's'
end
return string.sub( item_name, 1, -2 ) .. 'ves'
end
if string.sub( item_name, -2 ) == 'fe' then
return string.sub( item_name, 1, -3 ) .. 'ves'
end
return item_name .. 's'
end,
discover_item_properties = function( item_key )
local item = d.items[item_key];
if item.material == nil then
item.material = 0
if string.find( item_key, "leather-" ) ~= nil then item.material = 1 end
if string.find( item_key, "iron-" ) ~= nil then item.material = 2 end
if string.find( item_key, "golden-" ) ~= nil then item.material = 3 end
if string.find( item_key, "chainmail-" ) ~= nil then item.material = 4 end
if string.find( item_key, "diamond-" ) ~= nil then item.material = 5 end
if string.find( item_key, "netherite-" ) ~= nil then item.material = 6 end
end
if item.armor == nil then
item.armor = 0
if string.find( item_key, "-helmet" ) ~= nil or string.find( item_key, "-cap" ) ~= nil then item.armor = 1 end
if string.find( item_key, "-chestplate" ) ~= nil or string.find( item_key, "-tunic" ) ~= nil then item.armor = 2 end
if string.find( item_key, "-leggings" ) ~= nil or string.find( item_key, "-pants" ) ~= nil then item.armor = 3 end
if string.find( item_key, "-boots" ) ~= nil then item.armor = 4 end
end
end,
sort_item_table = function( a, b )
local item_key_a, chest_key_a, _, _, _, num_items_a, chance_a = unpack( f.split( a.pipe_separated_details, '|' ) )
local item_key_b, chest_key_b, _, _, _, num_items_b, chance_b = unpack( f.split( b.pipe_separated_details, '|' ) )
f.discover_item_properties(item_key_a)
f.discover_item_properties(item_key_b)
-- material first, in tier order
if d.items[item_key_a].material ~= d.items[item_key_b].material then return ( d.items[item_key_a].material < d.items[item_key_b].material ) end
-- armor goes in head-to-toe order
if d.items[item_key_a].armor ~= d.items[item_key_b].armor then return ( d.items[item_key_a].armor < d.items[item_key_b].armor ) end
-- after that, item name, alphabetically
if item_key_a ~= item_key_b then return ( item_key_a < item_key_b ) end
-- container's structure's name, alphabetically
if d.chests[chest_key_a].item_table_display.structure_text ~= d.chests[chest_key_b].item_table_display.structure_text then
return ( d.chests[chest_key_a].item_table_display.structure_text < d.chests[chest_key_b].item_table_display.structure_text )
end
-- "bastion-other" comes last among containers
-- it's a little awkward having "other" float in the middle of the list.
if ( chest_key_a == 'bastion-other' ) ~= ( chest_key_b == 'bastion-other' ) then return ( chest_key_b == 'bastion-other' ) end
-- container name, alphabetically
if ( d.chests[chest_key_a].item_table_display.container or 'Chest' ) ~= ( d.chests[chest_key_b].item_table_display.container or 'Chest' ) then
return ( ( d.chests[chest_key_a].item_table_display.container or 'Chest' ) < ( d.chests[chest_key_b].item_table_display.container or 'Chest' ) )
end
-- if num_items_a ~= num_items_b then return ( num_items_a < num_items_b ) end
-- if chance_a ~= chance_b then return ( chance_a < chance_b ) end
-- a[2]
return a.pipe_separated_details < b.pipe_separated_details
end,
item_lookahead_fn = function( item_key, item_key_lookahead )
return item_key == item_key_lookahead
end,
structure_lookahead_fn = function( item_key, item_key_lookahead, chest_key, chest_key_lookahead )
return item_key == item_key_lookahead
and d.chests[chest_key].item_table_display.structure_id == d.chests[chest_key_lookahead].item_table_display.structure_id
end,
container_lookahead_fn = function( item_key, item_key_lookahead, chest_key, chest_key_lookahead )
return item_key == item_key_lookahead
and d.chests[chest_key].item_table_display.structure_id == d.chests[chest_key_lookahead].item_table_display.structure_id
and chest_key == chest_key_lookahead
end,
find_rowspan = function( chances_list, ch_idx, item_key, chest_key, lookahead_fn )
local span = 0
for ch_idx_lookahead = ch_idx, #chances_list do
local item_key_lookahead, chest_key_lookahead = unpack( f.split( chances_list[ch_idx_lookahead].pipe_separated_details, '|' ) )
if lookahead_fn( item_key, item_key_lookahead, chest_key, chest_key_lookahead ) then
span = span + 1
else
break
end
end
return span
end,
get_availability = function( edition, edition_lists )
local availability
if edition_lists.available[edition] ~= nil and edition_lists.available[edition .. '-upcoming'] == nil then
return f.availability.UNTIL
elseif edition_lists.available[edition] == nil and edition_lists.available[edition .. '-upcoming'] ~= nil then
return f.availability.UPCOMING
elseif edition_lists.available[edition] ~= nil and edition_lists.available[edition .. '-upcoming'] ~= nil then
return f.availability.YES
elseif edition_lists.variants[edition] ~= nil or edition_lists.variants[edition .. '-upcoming'] ~= nil then
return f.availability.VARIANT
elseif edition_lists.unknown[edition] ~= nil then
return f.availability.UNKNOWN
else
return f.availability.NO
end
end,
cell_for = function( edition, availability )
local switch = {
[f.availability.UNTIL] = f.planned_cell() .. ' ' .. f.until_cell( edition ),
[f.availability.UPCOMING] = f.planned_cell() .. ' ' .. f.upcoming_cell( edition ),
[f.availability.YES] = f.yes_cell(),
[f.availability.VARIANT] = '<abbr style="color: gray;" title="In this edition, this item in this chest has different chances.">Variant</abbr>',
[f.availability.NO] = f.no_cell(),
[f.availability.UNKNOWN] = '<abbr style="color: gray;" title="No data yet for this edition.">?</abbr>',
}
return switch[availability]
end,
availability = {
UNKNOWN = 0,
YES = 1,
NO = 2,
UNTIL = 3,
UPCOMING = 4,
VARIANT = 5,
},
get_editions_hash = function()
local editions_hash = {}
for chest_key, _ in pairs( d.chests ) do
for _, loot_table in pairs( d.chests[chest_key].loot_tables ) do
for _, edition in pairs( loot_table[1] ) do
if edition:gsub( '-upcoming', '' ) == edition then
editions_hash[edition] = true
end
end
end
end
return editions_hash
end,
get_editions = function()
local editions = {}
for edition, _ in pairs( f.get_editions_hash() ) do
table.insert( editions, edition )
end
table.sort(
editions,
function( a, b )
return ( d.edition_headers[a] or f.capitalize(a) )
< ( d.edition_headers[b] or f.capitalize(b) )
end )
return editions
end
}
p = {
audit = function()
p.current_frame = mw.getCurrentFrame()
local html = {}
--
local deficiencies = {}
for item_key, _ in pairs( d.items ) do
local item_found = false
for chest_key, _ in pairs( d.chests ) do
for _, loot_table in pairs( d.chests[chest_key].loot_tables ) do
for pool_idx, pool in pairs( loot_table ) do
if pool_idx > 1 then
for item_in_chest, _ in pairs( pool.items ) do
if item_in_chest == item_key then
item_found = true
break
end
end
end
if item_found then
break
end
end
if item_found then
break
end
end
if item_found then
break
end
end
if not item_found then
table.insert( deficiencies, '* ' .. item_key .. '\n' )
end
end
if #deficiencies == 0 then
table.insert( html, f.yes_comment() )
else
table.insert( html, f.warning_comment() )
end
table.insert( html, ' d.items that aren\'t in any d.chests:\n' )
if #deficiencies == 0 then
table.insert( html, '* \'\'none\'\'\n' )
else
for _, deficiency in pairs(deficiencies) do
table.insert( html, deficiency )
end
end
--
deficiencies = {}
for note_key, _ in pairs( d.notes ) do
local note_found = false
for item_key, item_def in pairs( d.items ) do
if ( item_def.note ~= nil and item_def.note == note_key )
or ( item_def.note1 ~= nil and item_def.note1 == note_key ) then
note_found = true
break
end
end
if not note_found then
table.insert( deficiencies, '* ' .. note_key .. '\n' )
end
end
if #deficiencies == 0 then
table.insert( html, f.yes_comment() )
else
table.insert( html, f.warning_comment() )
end
table.insert( html, ' d.notes that aren\'t on any d.items:\n' )
if #deficiencies == 0 then
table.insert( html, '* \'\'none\'\'\n' )
else
for _, deficiency in pairs(deficiencies) do
table.insert( html, deficiency )
end
end
--
deficiencies = {}
for chest_key, _ in pairs( d.chests ) do
for _, loot_table in pairs( d.chests[chest_key].loot_tables ) do
for pool_idx, pool in pairs( loot_table ) do
if pool_idx > 1 then
for item_in_chest, _ in pairs( pool.items ) do
if d.items[item_in_chest] == nil then
table.insert( deficiencies, '* ' .. chest_key .. ' -> ' .. item_in_chest .. '\n' )
end
end
end
end
end
end
if #deficiencies == 0 then
table.insert( html, f.yes_comment() )
else
table.insert( html, f.warning_comment() )
end
table.insert( html, ' d.chests containing items that aren\'t in d.items:\n' )
if #deficiencies == 0 then
table.insert( html, '* \'\'none\'\'\n' )
else
for _, deficiency in pairs(deficiencies) do
table.insert( html, deficiency )
end
end
--
deficiencies = {}
for item_key, item_def in pairs( d.items ) do
if item_def.note ~= nil and d.notes[item_def.note] == nil then
table.insert( deficiencies, '* ' .. item_key .. ' -> ' .. item_def.note .. '\n' )
end
if item_def.note1 ~= nil and d.notes[item_def.note1] == nil then
table.insert( deficiencies, '* ' .. item_key .. ' -> ' .. item_def.note1 .. '\n' )
end
end
if #deficiencies == 0 then
table.insert( html, f.yes_comment() )
else
table.insert( html, f.warning_comment() )
end
table.insert( html, ' d.items containing notes that aren\'t in d.notes:\n' )
if #deficiencies == 0 then
table.insert( html, '* \'\'none\'\'\n' )
else
for _, deficiency in pairs(deficiencies) do
table.insert( html, deficiency )
end
end
--
table.insert( html, f.info_comment() )
table.insert( html, ' editions:\n' )
local editions = f.get_editions()
if #editions == 0 then
table.insert( html, '* \'\'none\'\'\n' )
else
for _, edition in pairs( editions ) do
table.insert( html, '* ' .. edition .. '\n' )
end
end
--
return table.concat( html )
end,
make_item_table = function( ... )
p.current_frame = mw.getCurrentFrame()
local args = { ... }
if args[1] == p.current_frame then
args = require( 'Module:ProcessArgs' ).merge( true )
else
args = args[1]
end
local error_msg = ""
local item_names = {}
if args[1] == "ALL" then
for item_name, v in pairs( d.items ) do
table.insert( item_names, item_name )
end
else
item_names = mw.text.split( args[1]:gsub( '%s+', '' ), ',' )
end
-- error message for unknown items,
-- and restrict it to a distinct set of items
local available_item_names = {}
local distinct_item_names = {}
for x, item_name in pairs( item_names ) do
if distinct_item_names[item_name] == nil then
if d.items[item_name] == nil then
error_msg = error_msg .. "<span class='error'>Unknown item '" .. item_name .. "'.</span><br>\n"
else
table.insert( available_item_names, item_name )
end
distinct_item_names[item_name] = true
end
end
item_names = available_item_names
local single_item = f.has_one_entry( item_names )
-- calculate the chances, change from associative to plain array, sort
local chance_info = f.find_chances_for_items( item_names )
local chances_list = {}
for pipe_separated_details, ed in pairs( chance_info ) do
table.insert( chances_list,
{
pipe_separated_details = pipe_separated_details,
edition_lists = {
available = ed.editions,
variants = ed.edition_variants,
unknown = ed.unknown_editions
}
}
)
end
table.sort( chances_list, f.sort_item_table )
-- build the html
local html = {}
table.insert( html, error_msg )
if f.has_entries( chances_list ) then
if single_item then
local item_display_name, item_key
item_key = item_names[1]
if d.items[item_key].plural ~= nil and d.items[item_key].plural ~= false then
item_display_name = d.items[item_key].plural
else
if d.items[item_key].title ~= nil then
item_display_name = f.capitalize( d.items[item_key].title )
else
item_display_name = f.capitalize( string.gsub( item_key, '-', ' ' ) )
end
if d.items[item_key].plural == nil or d.items[item_key].plural ~= false then
item_display_name = f.plural( item_display_name )
end
end
table.insert( html, item_display_name .. ' may be found in the following chests, with the following distribution: \n' )
end
table.insert( html, '{| class="wikitable sortable" \n' )
if not single_item then
table.insert( html, '! Item \n' )
end
table.insert( html, '! Structure \n' )
table.insert( html, '! Container \n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['stacksize'] )
table.insert( html, '"> Stack Size </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['stacksize'], args = { name = 'stacksize', group = 'FN' }
} )
table.insert( html, '</span>\n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['rolls'] )
table.insert( html, '"> Rolls </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['rolls'], args = { name = 'rolls', group = 'FN' }
} )
table.insert( html, '</span>\n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['weight'] )
table.insert( html, '"> Weight </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['weight'], args = { name = 'weight', group = 'FN' }
} )
table.insert( html, '</span>\n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['chance'] )
table.insert( html, '"> Chance </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['chance'], args = { name = 'chance', group = 'FN' }
} )
table.insert( html, '</span>\n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['items'] )
table.insert( html, '"> Avg. # items<br>per chest </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['items'], args = { name = 'items', group = 'FN' }
} )
table.insert( html, '</span>\n' )
table.insert( html, '! <abbr title="' )
table.insert( html, d.column_hovertext['chests'] )
table.insert( html, '"> Avg # chests<br>to search </abbr> <span class=mobileonly>' )
table.insert( html, p.current_frame:extensionTag{
name = "ref", content = d.column_hovertext['chests'], args = { name = 'chests', group = 'FN' }
} )
table.insert( html, '</span>\n' )
for _, edition_name in pairs( f.get_editions() ) do
table.insert( html, '! ' .. ( d.edition_headers[edition_name] or f.capitalize(edition_name) ) .. ' \n' )
end
end
local item_span = 1
local structure_span = 1
local container_span = 1
local item_expanded = {}
local chest_expanded = {}
for ch_idx, chances in pairs( chances_list ) do
local item_key, chest_key, stack_size, rolls, weight, num_items, chance, num_chests = unpack( f.split( chances.pipe_separated_details, '|' ) )
item_span = item_span - 1
local do_item_row = false
if item_span == 0 then
item_span = f.find_rowspan( chances_list, ch_idx, item_key, chest_key, f.item_lookahead_fn )
do_item_row = true
end
structure_span = structure_span - 1
local do_structure_row = false
if structure_span == 0 then
structure_span = f.find_rowspan( chances_list, ch_idx, item_key, chest_key, f.structure_lookahead_fn )
do_structure_row = true
end
container_span = container_span - 1
local do_container_row = false
if container_span == 0 then
container_span = f.find_rowspan( chances_list, ch_idx, item_key, chest_key, f.container_lookahead_fn )
do_container_row = true
end
local item_display_name
if d.items[item_key].title ~= nil then
item_display_name = d.items[item_key].title
else
item_display_name = f.title_case( string.gsub( item_key, '-', ' ' ) )
end
if not single_item and item_expanded[item_key] == nil then
item_expanded[item_key] = f.get_item( item_key, item_display_name )
end
local item_table_display = d.chests[chest_key].item_table_display
if chest_expanded[chest_key] == nil then
chest_expanded[chest_key] = p.current_frame:expandTemplate{ title = 'EnvLink', args = { item_table_display.structure_text, id = item_table_display.structure_id, wrap = true } }
end
table.insert( html, '|-\n' )
if not single_item then
if do_item_row then
if item_span > 1 then
table.insert( html, "|rowspan=" .. item_span )
end
table.insert( html, "|" .. item_expanded[item_key] .. "\n" )
end
end
if do_structure_row then
if structure_span > 1 then
table.insert( html, "|rowspan=" .. structure_span )
end
table.insert( html, "|" .. chest_expanded[chest_key] .. '\n' )
end
if do_container_row then
if container_span > 1 then
table.insert( html, "|rowspan=" .. container_span )
end
table.insert( html, "|" .. ( item_table_display.container or 'Chest' ) .. '\n' )
end
table.insert( html, "|style='text-align:center;'|" .. stack_size .. '\n' )
table.insert( html, "|style='text-align:center;'|" .. rolls .. '\n' )
table.insert( html, "|style='text-align:center;'|" .. weight .. '\n' )
table.insert( html, "|style='text-align:center;'|" .. chance .. '%\n' )
table.insert( html, "|style='text-align:center;'|" .. num_items .. '\n' )
table.insert( html, "|style='text-align:center;'|" .. num_chests .. '\n' )
for _, edition_name in pairs( f.get_editions() ) do
local availability = f.get_availability( edition_name, chances.edition_lists )
table.insert( html, '|' .. f.cell_for( edition_name, availability ) .. '\n' )
end
end
if f.has_entries( chances_list ) then
table.insert( html, '|}' )
table.insert( html, '<div class=mobileonly>' )
table.insert( html, p.current_frame:expandTemplate{ title = 'FNlist', args = {} } )
table.insert( html, '</div>' )
table.insert( html, p.current_frame:extensionTag( 'references', "", { group="note" } ) )
table.insert( html, '\n' )
end
return table.concat( html )
end,
make_chest_table = function( ... )
end
}
return p