Module:Items/UseTables: Difference between revisions

Fix Currencies not being displayed; Add 'table-na' class to cells without any data; Hide Requires and Exp columns if no data is present; Rename some headers to be slightly shorter and consistent with Creation Table; Reduce icon size on Use and Magic tables;
(_getItemUseTable: Add cooking utility (fire/furnace/pot) as a requirement for cooking uses)
(Fix Currencies not being displayed; Add 'table-na' class to cells without any data; Hide Requires and Exp columns if no data is present; Rename some headers to be slightly shorter and consistent with Creation Table; Reduce icon size on Use and Magic tables;)
Line 19: Line 19:
local itemUseArray = {
local itemUseArray = {
Agility = {},
Agility = {},
Astrology = {'melvorF:Stardust', 'melvorF:Golden_Stardust', 'melvorItA:Abyssal_Stardust'},
Astrology = {'melvorF:Stardust', 'melvorF:Golden_Stardust', 'melvorItA:Abyssal_Stardust', 'melvorItA:Eternal_Stardust'},
Archaeology = {},
Archaeology = {},
Attack = {},
Attack = {},
Line 442: Line 442:


function p._getItemUseTable(item)
function p._getItemUseTable(item)
local useArray = {}
local tableData = {}


-- Loop through all upgrades to find anything that can be upgraded using our source
-- Loop through all upgrades to find anything that can be upgraded using our source
Line 448: Line 448:
for j, itemCost in ipairs(upgrade.itemCosts) do
for j, itemCost in ipairs(upgrade.itemCosts) do
if itemCost.id == item.id then
if itemCost.id == item.id then
local rowReq = nil
local reqs = nil
-- Potions do have upgrade requirements though
-- Potions do have upgrade requirements though
local upgradeItem = Items.getItemByID(upgrade.upgradedItemID)
local upgradeItem = Items.getItemByID(upgrade.upgradedItemID)
Line 454: Line 454:
local levelUnlock = GameData.getEntityByProperty(SkillData.Herblore.masteryLevelUnlocks, 'descriptionID', upgradeItem.tier + 1)
local levelUnlock = GameData.getEntityByProperty(SkillData.Herblore.masteryLevelUnlocks, 'descriptionID', upgradeItem.tier + 1)
if levelUnlock ~= nil then
if levelUnlock ~= nil then
rowReq = Icons._MasteryReq(upgradeItem.name, levelUnlock.level)
reqs = Icons._MasteryReq(upgradeItem.name, levelUnlock.level)
end
end
end
end
table.insert(useArray, {item = {id = upgradeItem.id, name = upgradeItem.name}, qty = (upgrade.quantity or 1), mats = upgrade.itemCosts, skill = 'Upgrade', req = rowReq, xp = 'N/A', gp = upgrade.gpCost, sc = upgrade.scCost})
local upgradeCost = Common.getCostString({
["items"] = upgrade.itemCosts,
["currencies"] = upgrade.currencyCosts
})
table.insert(tableData, {
['skill'] = 'Upgrade',
['useType'] = '[[Upgrading Items|Upgrade]]',
['reqs'] = reqs,
['costs'] = upgradeCost,
['productName'] = upgradeItem.name,
['qty'] = (upgrade.quantity or 1)
})
end
end
end
end
Line 494: Line 505:
local recipeItem = Items.getItemByID(recipeItemID)
local recipeItem = Items.getItemByID(recipeItemID)
if recipeItem ~= nil then
if recipeItem ~= nil then
local itemDef = {id = recipe.itemID, name = recipeItem.name}
local lvl, isAbyssal = Skills.getRecipeLevelRealm(recipeSkillID, recipe)
local qty = (recipe.baseQuantity or 1) * (costDef.quantityMultiplier or 1)
local reqs = nil
local rowReq, isAbyssal = Skills.getRecipeLevelRealm(recipeSkillID, recipe)
local reqVal = nil
local xp = recipe.baseAbyssalExperience or recipe.baseExperience
if recipeSkillID == 'melvorD:Cooking' then
if recipeSkillID == 'melvorD:Cooking' then
-- Cooking includes the required utility (fire, furnace, pot) as a special requirement
-- Cooking includes the required utility (fire, furnace, pot) as a special requirement
Line 513: Line 521:
if categoryIconName ~= nil and categoryName ~= nil then
if categoryIconName ~= nil and categoryName ~= nil then
local utilReq = Icons.Icon({'Cooking', categoryName, section = 'Cooking Upgrades', img = categoryIconName, type = 'upgrade'})
local utilReq = Icons.Icon({'Cooking', categoryName, section = 'Cooking Upgrades', img = categoryIconName, type = 'upgrade'})
rowReq = Icons._SkillReq(skillName, rowReq, false, (isAbyssal and "melvorItA:Abyssal" or nil)) .. '<br>' .. utilReq
reqs = Icons._SkillReq(skillName, lvl, false, (isAbyssal and "melvorItA:Abyssal" or nil)) .. '<br>' .. utilReq
end
end
elseif recipeSkillID == 'melvorD:Herblore' then
elseif recipeSkillID == 'melvorD:Herblore' then
Line 520: Line 528:
if levelUnlock ~= nil and levelUnlock.level > 1 then
if levelUnlock ~= nil and levelUnlock.level > 1 then
local masteryReq = Icons._MasteryReq(recipeItem.name, levelUnlock.level)
local masteryReq = Icons._MasteryReq(recipeItem.name, levelUnlock.level)
reqVal = rowReq + levelUnlock.level * 0.01
reqs = Icons._SkillReq(skillName, lvl, false, (isAbyssal and "melvorItA:Abyssal" or nil)) .. '<br>' .. masteryReq
rowReq = Icons._SkillReq(skillName, rowReq, false, (isAbyssal and "melvorItA:Abyssal" or nil)) .. '<br>' .. masteryReq
-- Slightly increase level per potion tier for proper ordering using data-sort-value
lvl = lvl + levelUnlock.level * 0.01
end
end
end
end
table.insert(useArray, {item = itemDef, qty = qty, mats = costDef.itemCosts, gp = recipe.gpCost, sc = recipe.scCost, skill = skillName, reqVal = reqVal, req = rowReq, isAbyssal = isAbyssal, xp = xp})
local costs = Common.getCostString({
["items"] = costDef.itemCosts,
["currencies"] = recipe.currencyCosts
})
table.insert(tableData, {
['skill'] = skillName,
['lvl'] = lvl,
['isAbyssal'] = isAbyssal,
['useType'] = Icons.Icon({skillName, type='skill'}),
['reqs'] = (reqs or Icons._SkillReq(skillName, lvl, false, (isAbyssal and "melvorItA:Abyssal" or nil))),
['costs'] = costs,
['productName'] = recipeItem.name,
['qty'] = (recipe.baseQuantity or 1) * (costDef.quantityMultiplier or 1),
['xp'] = recipe.baseAbyssalExperience or recipe.baseExperience
})
end
end
end
end
Line 538: Line 561:
for i, recipe in ipairs(SkillData.Farming.recipes) do
for i, recipe in ipairs(SkillData.Farming.recipes) do
if recipe.seedCost.id == item.id then
if recipe.seedCost.id == item.id then
local category = GameData.getEntityByID(SkillData.Farming.categories, recipe.categoryID)
local lvl, isAbyssal = Skills.getRecipeLevelRealm('melvorD:Farming', recipe)
local product = Items.getItemByID(recipe.productId)
local product = Items.getItemByID(recipe.productId)
local mat = {{id = recipe.seedCost.id, quantity = recipe.seedCost.quantity}}
 
local rowReq, isAbyssal = Skills.getRecipeLevelRealm('melvorD:Farming', recipe)
table.insert(tableData, {
local category = GameData.getEntityByID(SkillData.Farming.categories, recipe.categoryID)
['skill'] = 'Farming',
local qty = 5 * category.harvestMultiplier
['lvl'] = lvl,
local xp = recipe.baseAbyssalExperience or recipe.baseExperience
['isAbyssal'] = isAbyssal,
table.insert(useArray, {item = {id = product.id, name = product.name}, qty = qty, mats = mat, skill = 'Farming', req = rowReq, isAbyssal = isAbyssal, xp = xp})
['useType'] = Icons.Icon({'Farming', type='skill'}),
['reqs'] = Icons._SkillReq('Farming', lvl, false, (isAbyssal and 'melvorItA:Abyssal' or nil)),
['costs'] = { recipe.seedCost },
['productName'] = product.name,
['qty'] = (5 * category.harvestMultiplier),
['xp'] = recipe.baseAbyssalExperience or recipe.baseExperience
})
end
end
end
end
Line 551: Line 582:
local obstacles = Agility.getObstaclesForItem(item.id)
local obstacles = Agility.getObstaclesForItem(item.id)
for i, obstacle in ipairs(obstacles) do
for i, obstacle in ipairs(obstacles) do
local itemCosts = {}
local costs = Common.getCostString({
for j, itemDef in ipairs(obstacle.itemCosts) do
["items"] = obstacle.itemCosts,
table.insert(itemCosts, {id = itemDef.id, quantity = itemDef.quantity})
["currencies"] = obstacle.currencyCosts
end
})
local req = Agility._getObstacleRequirements(obstacle)
table.insert(tableData, {
--local objType = (obstacle.category == nil and 'Pillar') or 'Obstacle'
['skill'] = 'Agility',
table.insert(useArray, {item = {id = obstacle.id, name = obstacle.name}, qty = 1, mats = itemCosts, gp = obstacle.gpCost, sc = obstacle.scCost, skill = 'Agility', req = req, type = 'skill'})
['lvl'] = Skills.getRecipeLevelRealm('Agility', obstacle),
['isAbyssal'] = obstacle.realm == 'melvorItA:Abyssal',
['useType'] = Icons.Icon({'Agility', type='skill'}),
['reqs'] = Agility._getObstacleRequirements(obstacle),
['costs'] = costs,
['productName'] = obstacle.name,
['iconType'] = 'agility',
['qty'] = 1
})
end
end


Line 590: Line 629:
local recipeCosts = Shared.clone(recipe.itemCosts)
local recipeCosts = Shared.clone(recipe.itemCosts)
local xp = recipe.baseAbyssalExperience or recipe.baseExperience
local xp = recipe.baseAbyssalExperience or recipe.baseExperience
local req, isAbyssal = Skills.getRecipeLevelRealm('melvorD:Summoning', recipe)
local lvl, isAbyssal = Skills.getRecipeLevelRealm('melvorD:Summoning', recipe)
local recipeCosts = {}
local recipeCosts = {}
for k, itemCost in ipairs(recipe.itemCosts) do
for k, itemCost in ipairs(recipe.itemCosts) do
Line 599: Line 638:
local itemValue = math.max(nonShardItem.sellsFor, 20)
local itemValue = math.max(nonShardItem.sellsFor, 20)
local nonShardQty = math.max(1, math.ceil(recipeCost / itemValue))
local nonShardQty = math.max(1, math.ceil(recipeCost / itemValue))
table.insert(recipeCosts, {id = nonShardItemID, quantity = nonShardQty})
table.insert(recipeCosts, { id = nonShardItemID, quantity = nonShardQty })
end
end
table.insert(useArray, {item = {id = recipeItem.id, name = recipeItem.name}, qty = recipe.baseQuantity, mats = recipeCosts, gp = recipe.gpCost, sc = recipe.scCost, skill = 'Summoning', req = req, isAbyssal = isAbyssal, xp = xp})
local costs = Common.getCostString({
["items"] = recipeCosts,
["currencies"] = recipe.currencyCosts
})
table.insert(tableData, {
['skill'] = 'Summoning',
['lvl'] = lvl,
['isAbyssal'] = isAbyssal,
['useType'] = Icons.Icon({ 'Summoning', type='skill' }),
['reqs'] = Icons._SkillReq('Summoning', lvl, false, (isAbyssal and 'melvorItA:Abyssal' or nil)),
['costs'] = costs,
['productName'] = recipeItem.name,
['qty'] = recipe.baseQuantity,
['xp'] = xp
})
end
end
end
end
Line 610: Line 663:
for i, shopUse in ipairs(shopUses) do
for i, shopUse in ipairs(shopUses) do
local purchase = shopUse.purchase
local purchase = shopUse.purchase
local rowReq = Shop.getRequirementString(purchase.purchaseRequirements)
 
local iconType = Common.getPurchaseIconType(purchase)
table.insert(tableData, {
local gpCost = Shop.getCurrencyCostString(purchase.cost, 'gp')
['skill'] = 'Shop',
local scCost = Shop.getCurrencyCostString(purchase.cost, 'slayerCoins')
['lvl'] = (not Shared.tableIsEmpty(purchase.purchaseRequirements) and purchase.purchaseRequirements[1].level or nil),
local rcCost = Shop.getCurrencyCostString(purchase.cost, 'raidCoins')
['useType'] = Icons.Icon({'Shop'}),
table.insert(useArray, {item = {name = Shop._getPurchaseName(purchase)}, qty = 1, mats = purchase.cost.items, skill = 'Shop', req = rowReq, xp = 'N/A', gp = gpCost, sc = scCost, rc = rcCost, type = iconType})
['reqs'] = Common.getRequirementString(purchase.purchaseRequirements),
['costs'] = Common.getCostString(purchase.cost),
['productName'] = Common.getPurchaseName(purchase),
['iconType'] = Common.getPurchaseIconType(purchase),
['qty'] = (purchase.qty or 1)
})
end
end


--Finally build the table using what we've learned
--Finally build the table using what we've learned
table.sort(useArray, function(a, b)
table.sort(tableData, function(a, b)
local aReqVal = a.reqVal ~= nil and a.reqVal or a.req
local aLvl = a.lvl
local bReqVal = b.reqVal ~= nil and b.reqVal or b.req
local bLvl = b.lvl
if a.skill ~= b.skill then
if a.skill ~= b.skill then
return a.skill < b.skill
return a.skill < b.skill
elseif type(aReqVal) ~= type(bReqVal) then
elseif type(aLvl) ~= type(bLvl) then
return tostring(aReqVal) < tostring(bReqVal)
return tostring(aLvl) < tostring(bLvl)
elseif aReqVal ~= bReqVal then
elseif aLvl ~= bLvl then
return aReqVal < bReqVal
return aLvl < bLvl
else
else
return a.item.name < b.item.name
return a.productName < b.productName
end
end
end)
end)


local useTable = p.buildUseTable(item, tableData)
local spellUseTable = p._getSpellUseTable(item)
if spellUseTable ~= nil and spellUseTable ~= '' then
useTable = useTable .. '\r\n===' .. Icons.Icon({'Magic', type='skill', size=30}) .. '===\r\n' .. spellUseTable
end
if useTable == '' then
return ''
else
return '==Uses==\r\n' .. useTable
end
end
function p.buildUseTable(item, tableData)
if Shared.tableIsEmpty(tableData) then return '' end


local resultPart = {}
local showRequirements = false
if not Shared.tableIsEmpty(useArray) then
local showXP = false
local typeTextList = {
 
["Shop"] = Icons.Icon({'Shop'}),
for i, data in ipairs(tableData) do
["Upgrade"] = '[[Upgrading Items|Upgrade]]'
if not showRequirements and tableData[i].reqs ~= nil then showRequirements = true end
}
if not showXP and tableData[i].xp ~= nil then showXP = true end
if showRequirements and showXP then break end
end
 
local resultTable = mw.html.create('table')
resultTable:addClass('wikitable stickyHeader sortable col-1-img')
local tableHeader = resultTable:tag('tr')
:tag('th'):wikitext('Product'):attr('colspan', 2)
:tag('th'):wikitext('Used In')


-- Header
if showRequirements then tableHeader:tag('th'):wikitext('Requires') end
table.insert(resultPart, '{| class="wikitable stickyHeader sortable col-1-img"')
if showXP then tableHeader:tag('th'):wikitext('Exp') end
table.insert(resultPart, '\r\n|- class="headerRow-0"')
tableHeader:tag('th'):wikitext('Costs')
table.insert(resultPart, '\r\n!colspan=2|Item Created!!Type!!Requirements!!XP!!Ingredients')


-- Rows
for i, data in ipairs(tableData) do
for i, row in ipairs(useArray) do
local recipeRow = resultTable:tag('tr')
local qty = row.qty ~= nil and row.qty or 1
:tag('td'):wikitext(Icons.Icon({ data.productName, type=(data.iconType or 'item'), notext=true })):attr('data-sort-value', data.productName) -- Icon Image
local iconType = row.type ~= nil and row.type or 'item'
:tag('td')
local iconName = row.item.name
:wikitext((data.qty ~= nil and data.qty > 1 and ("'''" .. data.qty .. "x''' ") or '')) -- Icon Qty
if row.skill == 'Agility' then
:wikitext(Icons.Icon({ data.productName, type=(data.iconType or 'item'), noicon=true })) -- Icon Text
iconType = 'agility'
:tag('td'):wikitext(data.useType):attr('data-sort-value', (data.skill or nil)) -- Used In
-- Requirements
if showRequirements then
if data.reqs ~= nil then
recipeRow:tag('td'):wikitext(data.reqs):attr('data-sort-value', (data.lvl or 0))
else
recipeRow:tag('td'):wikitext('N/A'):addClass('table-na')
end
end
local typeName = row.skill ~= nil and row.skill or ''
end
local typeText = typeTextList[typeName] or Icons.Icon({typeName, type='skill'}) or ''
-- Exp
local reqVal, reqText = row.reqVal, 'None'
if showXP then
if type(row.req) == 'number' then
if data.skill ~= nil and data.xp ~= nil then
reqVal = row.req
local iconClass = (data.isAbyssal and 'abyss-icon' or nil)
reqText = Icons._SkillReq(typeName, row.req, false, (row.isAbyssal and "melvorItA:Abyssal" or nil))
local xpText = (data.isAbyssal and ' AXP' or ' XP')
elseif type(row.req) == 'string' then
recipeRow:tag('td'):attr('data-sort-value', data.xp)
reqText = row.req
:wikitext(Icons.Icon({ data.skill, notext=true, type='skill', class=iconClass }))
:wikitext(' ' .. Num.formatnum(data.xp) .. xpText)
else
recipeRow:tag('td'):wikitext('N/A'):addClass('table-na'):attr('data-sort-value', 0)
end
end
local xpVal, xpText = 0, 'N/A'
end
if type(row.xp) == 'string' then
-- Costs
xpText = row.xp
local costsRow = recipeRow:tag('td')
elseif type(row.xp) == 'number' then
if type(data.costs) == 'table' then
xpVal = row.xp
for i, mat in ipairs(data.costs) do
xpText = Num.formatnum(row.xp) .. ' ' .. Icons.Icon({typeName, type='skill', notext=true}) .. ' XP'
if i > 1 then costsRow:tag('br') end
end
local matItem = Items.getItemByID(mat.id)
local matRow = {}
if matItem == nil then
if type(row.mats) == 'table' then
costsRow:wikitext(mat.quantity .. 'x ?????')
for j, itemCost in ipairs(row.mats) do
else
local matItemID = itemCost.id or itemCost[1] or -1
costsRow:wikitext(Icons.Icon({ matItem.name, type='item', qty=mat.quantity }))
local matItem = Items.getItemByID(matItemID)
local matQty = itemCost.quantity or itemCost[2] or 1
if matItem == nil then
table.insert(matRow, Shared.printError('Failed to find item with ID "' .. itemCost.id .. '"'))
elseif type(matQty) == 'number' then
table.insert(matRow, Icons.Icon({matItem.name, type='item', qty=matQty}))
else
table.insert(matRow, Icons.Icon({matItem.name, type='item'}))
end
end
end
end
end
if row.gp ~= nil then
else
local gpText = nil
costsRow:wikitext(data.costs)
if type(row.gp) == 'number' and row.gp > 0 then
gpText = Icons._Currency('melvorD:GP', row.gp)
elseif type(row.gp) == 'string' then
gpText = row.gp
end
table.insert(matRow, gpText)
end
if row.sc ~= nil then
local scText = nil
if type(row.sc) == 'number' and row.sc > 0 then
scText = Icons._Currency('melvorD:SlayerCoins', row.sc)
elseif type(row.sc) == 'string' then
scText = row.sc
end
table.insert(matRow, scText)
end
if row.rc ~= nil then
local rcText = nil
if type(row.rc) == 'number' and row.rc > 0 then
rcText = Icons._Currency('melvorD:RaidCoins', row.rc)
elseif type(row.rc) == 'string' then
rcText = row.rc
end
table.insert(matRow, rcText)
end
-- Item created
table.insert(resultPart, '\r\n|-\r\n|data-sort-value="' .. row.item.name .. '"| ')
table.insert(resultPart, Icons.Icon({iconName, row.item.name, type=iconType, notext=true, size=50}))
table.insert(resultPart, '\r\n| ')
if qty > 1 then
table.insert(resultPart, "'''" .. Num.formatnum(qty) .. "x''' ")
end
table.insert(resultPart, Icons.Icon({iconName, row.item.name, type=iconType, noicon=true}))
-- Type
table.insert(resultPart, '\r\n|data-sort-value="' .. typeName .. '"| ' .. typeText)
-- Requirements
table.insert(resultPart, '\r\n|style="text-align:right;"')
if row.reqVal ~= nil then
table.insert(resultPart, ' data-sort-value="' .. reqVal .. '"')
end
table.insert(resultPart, '| ' .. reqText)
-- XP
table.insert(resultPart, '\r\n|style="text-align:right;" data-sort-value="' .. xpVal .. '"| ' .. xpText)
-- Ingredients
table.insert(resultPart, '\r\n| ' .. table.concat(matRow, '<br/>'))
end
end
table.insert(resultPart, '\r\n|}')
end
local spellUseTable = p._getSpellUseTable(item)
if spellUseTable ~= nil and spellUseTable ~= '' then
table.insert(resultPart, '\r\n===' .. Icons.Icon({'Magic', type='skill', size=30}) .. '===\r\n' .. spellUseTable)
end
if Shared.tableIsEmpty(resultPart) then
return ''
else
return '==Uses==\r\n' .. table.concat(resultPart)
end
end
return tostring(resultTable)
end
end


Line 762: Line 789:
return ''
return ''
end
end
 
--Adding a check for if the Items column is needed
--Adding a check for if the Items column is needed
local hasItems = false
local hasItems = false
Line 774: Line 801:
local resultPart = {}
local resultPart = {}
table.insert(resultPart, '{|class="wikitable sortable"\r\n!colspan="2"|Spell')
table.insert(resultPart, '{|class="wikitable sortable"\r\n!colspan="2"|Spell')
table.insert(resultPart, '!!Requirements')
table.insert(resultPart, '!!Requires')
table.insert(resultPart, '!!Type!!style="width:275px"|Description')
table.insert(resultPart, '!!Type!!style="width:275px"|Description')
table.insert(resultPart, '!!Runes')
table.insert(resultPart, '!!Runes')
Line 780: Line 807:
table.insert(resultPart, '!!Item Cost')
table.insert(resultPart, '!!Item Cost')
end
end
 
for i, spell in pairs(spellList) do
for i, spell in pairs(spellList) do
local spellBook = Magic.getSpellBookFromSpell(spell)
local spellBook = Magic.getSpellBookFromSpell(spell)
Line 787: Line 813:
table.insert(rowPart, '\r\n|-\r\n|data-sort-value="'..spell.name..'"|')
table.insert(rowPart, '\r\n|-\r\n|data-sort-value="'..spell.name..'"|')
local iconType = Magic._getSpellIconType(spell)
local iconType = Magic._getSpellIconType(spell)
table.insert(rowPart, Icons.Icon({spell.name, type=iconType, notext=true, size=50}))
table.insert(rowPart, Icons.Icon({spell.name, type=iconType, notext=true}))
table.insert(rowPart, '||'..Icons.Icon({spell.name, type=iconType, noicon=true}))
table.insert(rowPart, '||'..Icons.Icon({spell.name, type=iconType, noicon=true}))
table.insert(rowPart, '||data-sort-value="'..Skills.getRecipeLevel('melvorD:Summoning', spell)..'"|'..Magic._getSpellRequirements(spell))
table.insert(rowPart, '||data-sort-value="'..Skills.getRecipeLevel('melvorD:Summoning', spell)..'"|'..Magic._getSpellRequirements(spell))
Line 796: Line 822:
table.insert(rowPart, Magic._getSpellRunes(spell))
table.insert(rowPart, Magic._getSpellRunes(spell))
if hasItems then
if hasItems then
table.insert(rowPart, '||style="text-align:right"|')
table.insert(rowPart, '||')
table.insert(rowPart, Magic._getSpellItems(spell))
table.insert(rowPart, Magic._getSpellItems(spell))
end
end
Line 816: Line 842:
end
end


--[==[
--[[
-- Uncomment this block and execute 'p.test()' within the debug console
-- Uncomment this block and execute 'p.test()' within the debug console
-- to test after making changes
-- to test after making changes
Line 854: Line 880:
'Abyssal Stone',
'Abyssal Stone',
'Withered Ash',
'Withered Ash',
'Wrath Rune'
'Wrath Rune',
'Magic Bones',
'Bowstring',
'Superior Max Skillcape',
'Abyssal Coin Contract II',
'Dark Summon Consumable II',
'Abyssal Slayer Gear Upgrade Kit',
'Topaz Bolts (Enchanted)',
'Summoning Shard (Black)',
'Dragon Javelin',
}
}
local checkFuncs = {
local checkFuncs = {
p.getItemUses,
--p.getItemUses,
p.getItemUseTable
p.getItemUseTable
}
}
Line 880: Line 915:
end
end
end
end
--]==]
--]]


return p
return p