Module:Data
Documentation for this module may be created at Module:Data/doc
local p = {} local utils = require("Module:Utils") local constant = mw.loadJsonData("Module:Constant.json") local data = mw.loadJsonData("Module:Data.json") local id = mw.loadJsonData("Module:ObjectID.json") local lootTable = mw.loadJsonData("Module:LootTable.json") function p.createInfobox(frame) local name = frame.args.name if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end local image = frame.args.image local object = data[name] local str = { image = image, type = '', slot = '', rarity = object.rarity, level = '', melee = '', range = '', aps = object.equip.aps, effects = object.conditionsWhenConsumed and utils.concat(object.conditionsWhenConsumed, "<br>") or utils.concat(object.equip.conditions, "<br>"), seteffects = utils.concat(object.set.effects, "<br>"), setitems = '', secondary = object.equip.secondary, mechanic = object.mechanic, use = object.use, durability = object.equip.durability, fullness = object.equip.fullness, cookable = object.canBeCooked and 'True', paintable = object.canBePainted and 'True', description = object.description } -- or object.type == "NonObtainable" -- or object.type == "Critter" -- or object.type == "Pet" -- or object.type == "Creature" if object.type == "MeleeWeapon" or object.type == "RangeWeapon" then str.type = 'Weapon' end if object.type == "Helm" or object.type == "BreastArmor" or object.type == "PantsArmor" then str.type = 'Armor' str.slot = object.type end if object.type == "Necklace" or object.type == "Ring" or object.type == "Offhand" or object.type == "Bag" or object.type == "Lantern" then str.type = 'Accessory' str.slot = object.type end if object.type == "Shovel" or object.type == "Hoe" or object.type == "MiningPick" or object.type == "PaintTool" or object.type == "FishingRod" or object.type == "BugNet" or object.type == "Sledge" or object.type == "RoofingTool" or object.type == "DrillTool" or object.type == "BeamWeapon" or object.type == "WaterCan" or object.type == "Bucket" or object.type == "Instrument" then str.type = 'Tool' end if object.type == "NonUsable" or object.type == "CastingItem" or object.type == "UniqueCraftingComponent" or object.type == "KeyItem" then str.type = 'Resource' end if object.type == "Eatable" then str.type = 'Consumable' end if object.type == "PlaceablePrefab" or object.type == "Valuable" then str.type = 'Base' end if object.type == "Helm" or object.type == "BreastArmor" or object.type == "PantsArmor" or object.type == "Necklace" or object.type == "Ring" or object.type == "Offhand" or object.type == "Bag" or object.type == "Lantern" or object.type == "MeleeWeapon" or object.type == "RangeWeapon" or object.type == "Shovel" or object.type == "Hoe" or object.type == "MiningPick" or object.type == "Sledge" or object.type == "DrillTool" or object.type == "BeamWeapon" then str.level = object.level end local damage = object.equip.damage and math.ceil(object.equip.damage * 0.9) .. "-" .. math.floor(object.equip.damage * 1.1) str.melee = object.equip.range and '' or damage str.range = object.equip.range and damage if object.set.items then for k, v in ipairs(object.set.items) do str.setitems = str.setitems .. frame:expandTemplate{title = 'Icon', args = {id[v]}} .. '<br>' end str.setitems = str.setitems:sub(1, -5) end return frame:expandTemplate{title = 'Object infobox', args = str} end function p.createDrops(frame) local name = frame.args.name if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end local object = data[name] local str = "" str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Item !! Chance per roll !! Chance for 1 or more' if object.loot.chestLoot or object.loot.chestLootAlt then str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | Boss chest ' if object.loot.chestLoot then local name2 = id[object.loot.chestLoot] str = str .. '\n|- ' str = str .. '\n| colspan=3 | ' .. frame:expandTemplate{title = 'Icon', args = {name2}} end if object.loot.chestLootAlt then local name2 = id[object.loot.chestLootAlt] str = str .. '\n|- ' str = str .. '\n| colspan=3 | ' .. frame:expandTemplate{title = 'Icon', args = {name2}} end end if object.loot.otherLoot then str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | 1 roll' for k, v in pairs(object.loot.otherLoot) do local name2 = id[v.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| colspan=2 | ' .. object.loot.otherLootChance * 100 .. '%' end end if object.loot.lootTable then local lootTableObj = lootTable[object.loot.lootTable] if utils.length(lootTableObj.guaranteedLoot) > 0 then str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | 1 roll' for k, v in pairs(lootTableObj.guaranteedLoot) do local name2 = id[v.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| colspan=2 | ' .. v.chance end end local roll = lootTableObj.roll local s = 's' if utils.length(lootTableObj.guaranteedLoot) > 0 then if type(roll) == 'table' then roll = roll[1] - 1 .. '-' .. roll[2] - 1 else roll = roll - 1 if roll < 2 then s = '' end end else if type(roll) == 'table' then roll = roll[1] .. '-' .. roll[2] else if roll < 2 then s = '' end end end str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | ' .. roll .. ' roll' .. s for k, v in pairs(lootTableObj.loot) do local name2 = id[v.id] local icon = v.id == 0 and 'Nothing' or p.singleIcon(name2, v.amount, frame) str = str .. '\n|- ' str = str .. '\n| ' .. icon str = str .. '\n| ' .. v.chance str = str .. '\n| ' .. v.chanceAtLeastOne end end if object.loot.seasonalLoot then for k, v in pairs(object.loot.seasonalLoot) do str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | 1 roll (season ' .. v.season .. ')' for k2, v2 in pairs(v.loot) do local name2 = id[v2.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v2.amount, frame) str = str .. '\n| colspan=2 | ' .. v2.chance .. '%' end end end str = str .. '\n|}' return str end function p.createAcquisition(frame) local name = frame.args.name if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end local object = data[name] local str = "" if object.acquisition.crafted then local craft = object.acquisition.crafted and object.acquisition.crafted or object.acquisition.refined str = str .. '\n=== Craft ===' for k, v in pairs(craft) do local name2 = id[craft[k]] local object2 = data[name2] local result = utils.find(object2.usage.crafting.canCraft, "id", object.id) str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n| Crafting station' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n|-' str = str .. '\n| Result' str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame) str = str .. '\n|-' str = str .. '\n| Materials' str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame) str = str .. '\n|}' end end if object.acquisition.refined then str = str .. '\n=== Refine ===' for k, v in pairs(object.acquisition.refined) do local name2 = id[object.acquisition.refined[k]] local object2 = data[name2] local result = utils.find(object2.usage.crafting.canCraft, "id", object.id) str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n| Refiner' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n|-' str = str .. '\n| Result' str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame) str = str .. '\n|-' str = str .. '\n| Materials' str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame) str = str .. '\n|}' end end if object.acquisition.produced then str = str .. '\n=== Produce ===' for k, v in pairs(object.acquisition.produced) do local name2 = id[object.acquisition.produced[k]] local object2 = data[name2] local result = utils.find(object2.usage.crafting.canCraft, "id", object.id) str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n| Cattle' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n|-' str = str .. '\n| Produce' str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame) str = str .. '\n|}' end end if object.acquisition.combined then str = str .. '\n=== Combine ===' for k, v in pairs(object.acquisition.combined) do local name2 = id[object.acquisition.combined[k]] local object2 = data[name2] local result = utils.find(object2.usage.crafting.canCraft, "id", object.id) if object2.usage.crafting.requiresNearbyObject > 0 then str = str .. '\nNote: Can only be combined near the ' .. id[object2.usage.crafting.requiresNearbyObject] .. '.' end str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n| Casting item' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n|-' str = str .. '\n| Result' str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame) str = str .. '\n|-' str = str .. '\n| Materials' str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame) str = str .. '\n|}' end end if object.acquisition.fished then str = str .. '\n=== Fishing ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Water !! Location !! Type !! Amount !! Chance' for k, v in pairs(object.acquisition.fished) do local fish = constant.Acquisition.Fishing[v] local loot = utils.find(lootTable[v].loot, "id", object.id) local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount str = str .. '\n|- ' str = str .. '\n| ' .. fish.water str = str .. '\n| ' .. fish.location str = str .. '\n| ' .. fish.type str = str .. '\n| ' .. amount str = str .. '\n| ' .. loot.chance end str = str .. '\n|}' end if object.acquisition.container or object.acquisition.containerTable then str = str .. '\n=== Container ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Item !! Amount !! Chance' if object.acquisition.container then for k, v in pairs(object.acquisition.container) do local name2 = id[object.acquisition.container[k]] local object2 = data[name2] local result = utils.find(object2.usage.container, "id", object.id) local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. amount str = str .. '\n| ' .. result.chance .. '%' end end if object.acquisition.containerTable then for k, v in pairs(object.acquisition.containerTable) do local name2 = id[object.acquisition.containerTable[k]] local object2 = data[name2] local loot = utils.find(lootTable[object2.usage.containerTable].loot, "id", object.id) local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. amount str = str .. '\n| ' .. loot.chance end end str = str .. '\n|}' end if object.acquisition.shop then str = str .. '\n=== Shop ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Item !! Available amount !! Cost !! Requirement' for k, v in pairs(object.acquisition.shop) do local name2 = id[object.acquisition.shop[k]] local object2 = data[name2] local result = utils.find(object2.shop, "id", object.id) str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. result.amount str = str .. '\n| ' str = str .. '\n| ' .. result.requirement end str = str .. '\n|}' end if object.acquisition.damage then str = str .. '\n=== Boulder ===' str = str .. '\nCan be mined with stationary drill from ' for k, v in pairs(object.acquisition.damage) do local name2 = id[object.acquisition.damage[k]] local object2 = data[name2] str = str .. frame:expandTemplate{title = 'Icon', args = {name2}} .. ', ' end str = str:sub(1, -3) .. '.' end if object.acquisition.inventory or object.acquisition.inventoryTable then str = str .. '\n=== Inventory ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Item !! Amount !! Chance' if object.acquisition.inventory then for k, v in pairs(object.acquisition.inventory) do local name2 = id[object.acquisition.inventory[k]] local object2 = data[name2] local amount = '?' local chance = '?' if object2.loot.inventory then local result = utils.find(object2.loot.inventory, "id", object.id) amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount chance = result.chance .. '%' end str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. amount str = str .. '\n| ' .. chance end end if object.acquisition.inventoryTable then for k, v in pairs(object.acquisition.inventoryTable) do local name2 = id[object.acquisition.inventoryTable[k]] local object2 = data[name2] local amount = '?' local chance = '?' if object2.loot.inventoryTable then local loot = utils.find(lootTable[object2.loot.inventoryTable].loot, "id", object.id) amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount chance = loot.chance end str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. amount str = str .. '\n| ' .. chance end end str = str .. '\n|}' end if object.acquisition.drop then str = str .. '\n=== Drop ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Object !! Type !! Amount !! Rolls !! Chance per roll !! Chance for 1 or more' for k, v in pairs(object.acquisition.drop) do local name2 = id[object.acquisition.drop[k]] local object2 = data[name2] if object2 then if object2.loot.chestLoot == object.id or object2.loot.chestLootAlt == object.id then str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| Boss chest' str = str .. '\n| 1' str = str .. '\n| 1' str = str .. '\n| 100%' str = str .. '\n| 100%' end if object2.loot.otherLoot then local result = utils.find(object2.loot.otherLoot, "id", object.id) if result then local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| Loot' str = str .. '\n| ' .. amount str = str .. '\n| 1' str = str .. '\n| ' .. object2.loot.otherLootChance * 100 .. '%' str = str .. '\n| ' .. object2.loot.otherLootChance * 100 .. '%' end end if object2.loot.lootTable then local lootTableObj = lootTable[object2.loot.lootTable] local loot = utils.find(lootTableObj.guaranteedLoot, "id", object.id) if loot then local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount local chance = loot.chance str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| Random loot - one guaranteed drop' str = str .. '\n| ' .. amount str = str .. '\n| 1' str = str .. '\n| ' .. chance str = str .. '\n| ' .. chance end loot = utils.find(lootTableObj.loot, "id", object.id) if loot then local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount local roll = lootTableObj.roll if utils.length(lootTableObj.guaranteedLoot) > 0 then if type(roll) == 'table' then roll = roll[1] - 1 .. '-' .. roll[2] - 1 else roll = roll - 1 end else if type(roll) == 'table' then roll = roll[1] .. '-' .. roll[2] end end local chance = loot.chance local chanceOne = loot.chanceAtLeastOne str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| Random loot' str = str .. '\n| ' .. amount str = str .. '\n| ' .. roll str = str .. '\n| ' .. chance str = str .. '\n| ' .. chanceOne end end if object2.loot.seasonalLoot then for k2, v2 in pairs(object2.loot.seasonalLoot) do local result = utils.find(v2.loot, "id", object.id) if result then local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount local chance = result.chance .. "%" str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| Seasonal loot - season ' .. v2.season str = str .. '\n| ' .. amount str = str .. '\n| 1' str = str .. '\n| ' .. chance str = str .. '\n| ' .. chance end end end end end str = str .. '\n|}' end return str end function p.createUsage(frame) local name = frame.args.name if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end local object = data[name] local str = "" if object.use then if object.use ~= 'Combine the materials' and object.use ~= 'Hatch egg' and object.use ~= 'Open container' then str = str .. '\n=== Other ===' str = str .. '\n' .. object.use end end if object.usage.crafting then str = str .. '\n=== ' .. object.usage.crafting.type .. ' ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Result !! Materials' for k, v in pairs(object.usage.crafting.canCraft) do local name2 = id[v.id] local object2 = data[name2] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| ' .. p.icon(object2.materials, " " , frame) end if utils.length(object.usage.crafting.includes) > 0 then str = str .. '\n|- ' str = str .. '\n| colspan=2 | Also includes all crafting recipes from ' .. p.iconIdOnly(object.usage.crafting.includes, ", " , frame) .. '.' end str = str .. '\n|}' end if object.usage.craftingMaterial then str = str .. '\n=== Crafting material ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Crafting station !! Result !! Materials' for k, v in pairs(object.usage.craftingMaterial) do local name2 = id[v] local object2 = data[name2] for k2, v2 in pairs(object2.usage.crafting.canCraft) do local name3 = id[v2.id] local object3 = data[name3] local find = utils.find(object3.materials, "id", object.id) if find then str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame) str = str .. '\n| ' .. p.icon(object3.materials, " " , frame) end end end str = str .. '\n|}' end if object.usage.refining then str = str .. '\n=== Refining material ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Refiner !! Result !! Materials' for k, v in pairs(object.usage.refining) do local name2 = id[v] local object2 = data[name2] for k2, v2 in pairs(object2.usage.crafting.canCraft) do local name3 = id[v2.id] local object3 = data[name3] local find = utils.find(object3.materials, "id", object.id) if find then str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame) str = str .. '\n| ' .. p.icon(object3.materials, " " , frame) end end end str = str .. '\n|}' end if object.usage.combining then str = str .. '\n=== Combining material ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Combiner !! Result !! Materials' for k, v in pairs(object.usage.combining) do local name2 = id[v] local object2 = data[name2] for k2, v2 in pairs(object2.usage.crafting.canCraft) do local name3 = id[v2.id] local object3 = data[name3] local find = utils.find(object3.materials, "id", object.id) if find then str = str .. '\n|- ' str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}} str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame) str = str .. '\n| ' .. p.icon(object3.materials, " " , frame) end end end str = str .. '\n|}' end if object.usage.container then str = str .. '\n=== ' .. object.use .. ' ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Result !! Chance' for k, v in pairs(object.usage.container) do local name2 = id[v.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| ' .. v.chance .. '%' end str = str .. '\n|}' end if object.usage.containerTable then str = str .. '\n=== ' .. object.use .. ' ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Item !! Chance per roll !! Chance for 1 or more' local lootTableObj = lootTable[object.usage.containerTable] if utils.length(lootTableObj.guaranteedLoot) > 0 then str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | 1 roll ' for k, v in pairs(lootTableObj.guaranteedLoot) do local name2 = id[v.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| colspan=2 | ' .. v.chance end end local roll = lootTableObj.roll local s = 's' if utils.length(lootTableObj.guaranteedLoot) > 0 then if type(roll) == 'table' then roll = roll[1] - 1 .. '-' .. roll[2] - 1 else roll = roll - 1 if roll < 2 then s = '' end end else if type(roll) == 'table' then roll = roll[1] .. '-' .. roll[2] else if roll < 2 then s = '' end end end str = str .. '\n|- class=subheader' str = str .. '\n! colspan=3 | ' .. roll .. ' roll' .. s for k, v in pairs(lootTableObj.loot) do local name2 = id[v.id] str = str .. '\n|- ' str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame) str = str .. '\n| ' .. v.chance str = str .. '\n| ' .. v.chanceAtLeastOne end str = str .. '\n|}' end if object.usage.upgrade then str = str .. '\n=== Upgrade material ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! Level !! Materials' for k, v in pairs(object.usage.upgrade) do local upgrade = constant.UpgradeCost[v] str = str .. '\n|- ' str = str .. '\n| ' .. v str = str .. '\n| ' .. p.icon(upgrade, " " , frame) end str = str .. '\n|}' end if object.conditionsWhenCooked then str = str .. '\n=== Cooking ingredient ===' str = str .. '\n{| class="table table-dark" style="width:auto"' str = str .. '\n! colspan=3 | Effects when cooked' str = str .. '\n|-' str = str .. '\n! Regular !! Rare !! Epic' str = str .. '\n|-' str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.regular, '<br>') str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.rare, '<br>') str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.epic, '<br>') str = str .. '\n|}' end return str end function p.singleIcon(name, amount, frame) if type(amount) == 'table' then amount = amount[1] .. '-' .. amount[2] else amount = amount > 1 and amount or "" end return frame:expandTemplate{title = 'Icon', args = {name, amount}} end function p.icon(t, separator, frame) local str = "" separator = separator and separator or " " local length = -1 - #separator if t ~= nil then for k, v in ipairs(t) do local name = id[v.id] local amount = v.amount if type(amount) == 'table' then amount = amount[1] .. '-' .. amount[2] else amount = amount > 1 and amount or "" end str = str .. frame:expandTemplate{title = 'Icon', args = {name, amount}} .. separator end str = str:sub(1, length) end return str end function p.iconIdOnly(t, separator, frame) local str = "" separator = separator and separator or " " local length = -1 - #separator if t ~= nil then for k, v in ipairs(t) do local name = id[v] str = str .. frame:expandTemplate{title = 'Icon', args = {name}} .. separator end str = str:sub(1, length) end return str end return p