17,101
edits
(_getThievingNPCLootTables: Correct visibility of total row for common drops table) |
(Update for v1.0.2) |
||
Line 20: | Line 20: | ||
for i, const in ipairs(SkillData.Astrology.Constellations) do | for i, const in ipairs(SkillData.Astrology.Constellations) do | ||
if const.name == constName then | if const.name == constName then | ||
return const | return const | ||
end | end | ||
end | end | ||
Line 172: | Line 172: | ||
result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50}) | result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50}) | ||
result = result..'||'..Icons.Icon({logName, type='item', noicon=true}) | result = result..'||'..Icons.Icon({logName, type='item', noicon=true}) | ||
result = result..'||style="text-align:right"|'..tree. | result = result..'||style="text-align:right"|'..tree.levelRequired | ||
result = result..'||style="text-align:right"|'..tree. | result = result..'||style="text-align:right"|'..tree.baseExperience | ||
result = result..'||style="text-align:right" data-sort-value="'..tree. | result = result..'||style="text-align:right" data-sort-value="'..tree.baseInterval..'"|'..Shared.timeString(tree.baseInterval/1000, true) | ||
local XPs = tree. | local XPs = tree.baseExperience / (tree.baseInterval / 1000) | ||
local Log = Items.getItemByID( | local Log = Items.getItemByID(tree.logID) | ||
local GPs = Log.sellsFor / (tree. | local GPs = Log.sellsFor / (tree.baseInterval / 1000) | ||
result = result..'||style="text-align:right"|'..Shared.round(XPs, 2, 2) | result = result..'||style="text-align:right"|'..Shared.round(XPs, 2, 2) | ||
result = result..'||style="text-align:right" data-sort-value="'..GPs..'"|'..Icons.GP(Shared.round(GPs, 2, 2)) | result = result..'||style="text-align:right" data-sort-value="'..GPs..'"|'..Icons.GP(Shared.round(GPs, 2, 2)) | ||
Line 220: | Line 220: | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!colspan="2"|Item!!Value' | result = result..'\r\n!colspan="2"|Item!!Value' | ||
local itemArray = Items.getItems(function(item) return item.type == "Junk" end) | local itemArray = Items.getItems(function(item) return item.type == "Junk" end) | ||
Line 308: | Line 308: | ||
local cookStr = "N/A" | local cookStr = "N/A" | ||
if fish.cookingLevel ~= nil then | if fish.cookingLevel ~= nil then | ||
cookStr = fish.cookingLevel | cookStr = fish.cookingLevel | ||
end | end | ||
Line 361: | Line 361: | ||
npc = p.getThievingNPC(npc) | npc = p.getThievingNPC(npc) | ||
end | end | ||
local result = nil | local result = nil | ||
for i, area in Shared.skpairs(SkillData.Thieving.Areas) do | for i, area in Shared.skpairs(SkillData.Thieving.Areas) do | ||
Line 376: | Line 376: | ||
function p._getThievingNPCStat(npc, statName) | function p._getThievingNPCStat(npc, statName) | ||
local result = nil | local result = nil | ||
if statName == 'level' then | if statName == 'level' then | ||
result = Icons._SkillReq('Thieving', npc.level) | result = Icons._SkillReq('Thieving', npc.level) | ||
Line 387: | Line 387: | ||
result = npc[statName] | result = npc[statName] | ||
end | end | ||
if result == nil then | if result == nil then | ||
result = '' | result = '' | ||
end | end | ||
return result | return result | ||
end | end | ||
Line 402: | Line 402: | ||
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]" | return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]" | ||
end | end | ||
return p._getThievingNPCStat(npc, statName) | return p._getThievingNPCStat(npc, statName) | ||
end | end | ||
Line 413: | Line 413: | ||
local thisItem = Items.getItemByID(drop.itemID) | local thisItem = Items.getItemByID(drop.itemID) | ||
local odds = drop.chance | local odds = drop.chance | ||
rareTxt = rareTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | rareTxt = rareTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | ||
rareTxt = rareTxt..'||1||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor) | rareTxt = rareTxt..'||1||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor) | ||
Line 426: | Line 426: | ||
local result = '' | local result = '' | ||
local sectionTxt = {} | local sectionTxt = {} | ||
--Five sections here: GP, normal loot, area loot, rare loot, and unique item | --Five sections here: GP, normal loot, area loot, rare loot, and unique item | ||
--First up, GP: | --First up, GP: | ||
local gpTxt = 'Successfully pickpocketing the '..npc.name..' will always give '..Icons.GP(1, npc.maxGP) | local gpTxt = 'Successfully pickpocketing the '..npc.name..' will always give '..Icons.GP(1, npc.maxGP) | ||
table.insert(sectionTxt, gpTxt) | table.insert(sectionTxt, gpTxt) | ||
--Next up, normal loot: | --Next up, normal loot: | ||
--(Skip if no loot) | --(Skip if no loot) | ||
Line 439: | Line 439: | ||
local lootChance = thievingNormalLootChance | local lootChance = thievingNormalLootChance | ||
local lootValue = 0 | local lootValue = 0 | ||
--First loop through to get the total weight so we have it for later | --First loop through to get the total weight so we have it for later | ||
for i, loot in pairs(npc.lootTable) do | for i, loot in pairs(npc.lootTable) do | ||
totalWt = totalWt + loot[2] | totalWt = totalWt + loot[2] | ||
end | end | ||
normalTxt = normalTxt..'\r\n{|class="wikitable sortable"' | normalTxt = normalTxt..'\r\n{|class="wikitable sortable"' | ||
normalTxt = normalTxt..'\r\n!Item!!Qty' | normalTxt = normalTxt..'\r\n!Item!!Qty' | ||
normalTxt = normalTxt..'!!Price!!colspan="2"|Chance' | normalTxt = normalTxt..'!!Price!!colspan="2"|Chance' | ||
--Then sort the loot table by weight | --Then sort the loot table by weight | ||
table.sort(npc.lootTable, function(a, b) return a[2] > b[2] end) | table.sort(npc.lootTable, function(a, b) return a[2] > b[2] end) | ||
Line 460: | Line 460: | ||
end | end | ||
normalTxt = normalTxt..'||style="text-align:right" data-sort-value="'..maxQty..'"|' | normalTxt = normalTxt..'||style="text-align:right" data-sort-value="'..maxQty..'"|' | ||
if maxQty > 1 then | if maxQty > 1 then | ||
normalTxt = normalTxt.. '1 - ' | normalTxt = normalTxt.. '1 - ' | ||
end | end | ||
normalTxt = normalTxt..Shared.formatnum(row[3]) | normalTxt = normalTxt..Shared.formatnum(row[3]) | ||
--Adding price columns | --Adding price columns | ||
local itemPrice = 0 | local itemPrice = 0 | ||
Line 478: | Line 478: | ||
end | end | ||
end | end | ||
--Getting the drop chance | --Getting the drop chance | ||
local dropChance = (row[2] / totalWt * lootChance) | local dropChance = (row[2] / totalWt * lootChance) | ||
Line 490: | Line 490: | ||
end | end | ||
normalTxt = normalTxt..'style="text-align:right"|'..Shared.round(dropChance, 2, 2)..'%' | normalTxt = normalTxt..'style="text-align:right"|'..Shared.round(dropChance, 2, 2)..'%' | ||
--Adding to the average loot value based on price & dropchance | --Adding to the average loot value based on price & dropchance | ||
lootValue = lootValue + (dropChance * 0.01 * itemPrice * ((1 + maxQty) / 2)) | lootValue = lootValue + (dropChance * 0.01 * itemPrice * ((1 + maxQty) / 2)) | ||
Line 506: | Line 506: | ||
table.insert(sectionTxt, normalTxt) | table.insert(sectionTxt, normalTxt) | ||
end | end | ||
--After normal drops, add in rare drops | --After normal drops, add in rare drops | ||
local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket' | local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket' | ||
rareTxt = rareTxt..'\r\n'..p.getThievingGeneralRareTable() | rareTxt = rareTxt..'\r\n'..p.getThievingGeneralRareTable() | ||
table.insert(sectionTxt, rareTxt) | table.insert(sectionTxt, rareTxt) | ||
local areaTxt = '===Possible Area Unique Drops===' | local areaTxt = '===Possible Area Unique Drops===' | ||
areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. ' | areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. ' | ||
areaTxt = areaTxt..'\r\nEach Area Unique Drop is rolled for separately, so it is possible to receive multiple Area Unique Drops from a single action. ' | areaTxt = areaTxt..'\r\nEach Area Unique Drop is rolled for separately, so it is possible to receive multiple Area Unique Drops from a single action. ' | ||
areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.' | areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.' | ||
local area = p.getThievingNPCArea(npc) | local area = p.getThievingNPCArea(npc) | ||
areaTxt = areaTxt..'\r\n{|class="wikitable sortable"' | areaTxt = areaTxt..'\r\n{|class="wikitable sortable"' | ||
Line 540: | Line 540: | ||
areaTxt = areaTxt..'\r\n|}' | areaTxt = areaTxt..'\r\n|}' | ||
table.insert(sectionTxt, areaTxt) | table.insert(sectionTxt, areaTxt) | ||
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then | if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then | ||
local uniqueTxt = '===Possible NPC Unique Drop===' | local uniqueTxt = '===Possible NPC Unique Drop===' | ||
Line 552: | Line 552: | ||
uniqueTxt = uniqueTxt..Icons.Icon({thisItem.name, type='item'}) | uniqueTxt = uniqueTxt..Icons.Icon({thisItem.name, type='item'}) | ||
end | end | ||
table.insert(sectionTxt, uniqueTxt) | table.insert(sectionTxt, uniqueTxt) | ||
end | end | ||
return table.concat(sectionTxt, '\r\n') | return table.concat(sectionTxt, '\r\n') | ||
end | end | ||
Line 565: | Line 565: | ||
return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]" | return "ERROR: Invalid Thieving NPC "..npcName.."[[Category:Pages with script errors]]" | ||
end | end | ||
return p._getThievingNPCLootTables(npc) | return p._getThievingNPCLootTables(npc) | ||
end | end | ||
Line 599: | Line 599: | ||
end | end | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
return result | return result | ||
end | end | ||
Line 608: | Line 608: | ||
table.insert(resultPart, '\r\n|- class="headerRow-0"') | table.insert(resultPart, '\r\n|- class="headerRow-0"') | ||
table.insert(resultPart, '\r\n!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!NPCs!!Unique Drops') | table.insert(resultPart, '\r\n!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!NPCs!!Unique Drops') | ||
local areaArray = Shared.clone(SkillData.Thieving.Areas) | local areaArray = Shared.clone(SkillData.Thieving.Areas) | ||
table.sort(areaArray, function(a, b) return a.id < b.id end) | table.sort(areaArray, function(a, b) return a.id < b.id end) | ||
Line 627: | Line 627: | ||
table.insert(npcList, '') | table.insert(npcList, '') | ||
end | end | ||
-- Build area unique item list | -- Build area unique item list | ||
if area.uniqueDrops ~= nil and Shared.tableCount(area.uniqueDrops) > 0 then | if area.uniqueDrops ~= nil and Shared.tableCount(area.uniqueDrops) > 0 then | ||
Line 645: | Line 645: | ||
table.insert(areaItemList, '') | table.insert(areaItemList, '') | ||
end | end | ||
-- Generate table row | -- Generate table row | ||
table.insert(resultPart, '\r\n|-') | table.insert(resultPart, '\r\n|-') | ||
Line 654: | Line 654: | ||
end | end | ||
table.insert(resultPart, '\r\n|}') | table.insert(resultPart, '\r\n|}') | ||
return table.concat(resultPart) | return table.concat(resultPart) | ||
end | end | ||
Line 660: | Line 660: | ||
function p.getThievingSourcesForItem(itemID) | function p.getThievingSourcesForItem(itemID) | ||
local resultArray = {} | local resultArray = {} | ||
local areaNPCs = {} | local areaNPCs = {} | ||
--First check area unique drops | --First check area unique drops | ||
--If an area drops the item, add all the NPC ids to the list so we can add them later | --If an area drops the item, add all the NPC ids to the list so we can add them later | ||
Line 677: | Line 677: | ||
end | end | ||
end | end | ||
--Now go through and get drop chances on each NPC if needed | --Now go through and get drop chances on each NPC if needed | ||
for i, npc in pairs(SkillData.Thieving.NPCs) do | for i, npc in pairs(SkillData.Thieving.NPCs) do | ||
Line 693: | Line 693: | ||
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * thievingNormalLootChance, totalWt = totalWt * 100, level = npc.level}) | table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * thievingNormalLootChance, totalWt = totalWt * 100, level = npc.level}) | ||
end | end | ||
--Chance of -1 on unique drops is to indicate variable chance | --Chance of -1 on unique drops is to indicate variable chance | ||
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID == itemID then | if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID == itemID then | ||
table.insert(resultArray, {npc = npc.name, minQty = npc.uniqueDrop.qty, maxQty = npc.uniqueDrop.qty, wt = -1, totalWt = -1, level = npc.level}) | table.insert(resultArray, {npc = npc.name, minQty = npc.uniqueDrop.qty, maxQty = npc.uniqueDrop.qty, wt = -1, totalWt = -1, level = npc.level}) | ||
end | end | ||
if areaNPCs[npc.id] ~= nil then | if areaNPCs[npc.id] ~= nil then | ||
table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = thievingAreaLootChance, totalWt = 100, level = npc.level}) | table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = thievingAreaLootChance, totalWt = 100, level = npc.level}) | ||
end | end | ||
end | end | ||
for i, drop in pairs(SkillData.Thieving.RareItems) do | for i, drop in pairs(SkillData.Thieving.RareItems) do | ||
if drop.itemID == itemID then | if drop.itemID == itemID then | ||
Line 709: | Line 709: | ||
end | end | ||
end | end | ||
return resultArray | return resultArray | ||
end | end | ||
Line 736: | Line 736: | ||
return false | return false | ||
end | end | ||
local addToArray = function(modArray, modNew) | local addToArray = function(modArray, modNew) | ||
if not isDistinct or (isDistinct and not containsMod(modArray, modNew)) then | if not isDistinct or (isDistinct and not containsMod(modArray, modNew)) then | ||
Line 742: | Line 742: | ||
end | end | ||
end | end | ||
local modArray = {} | local modArray = {} | ||
local isSkillMod = {} | local isSkillMod = {} | ||
Line 769: | Line 769: | ||
table.insert(skillArray, SkillData.Skills[skillID + 1]) | table.insert(skillArray, SkillData.Skills[skillID + 1]) | ||
end | end | ||
for i, modName in ipairs(cons.uniqueModifiers) do | for i, modName in ipairs(cons.uniqueModifiers) do | ||
-- The most important thing we're getting here is the modText and modBase | -- The most important thing we're getting here is the modText and modBase | ||
Line 788: | Line 788: | ||
end | end | ||
end | end | ||
if asKeyValue then | if asKeyValue then | ||
local modArrayKV = {} | local modArrayKV = {} | ||
Line 814: | Line 814: | ||
result = result..'\r\n!colspan="2"|Constellation!!'..Icons.Icon({"Astrology", type='skill', notext='true'})..' Level' | result = result..'\r\n!colspan="2"|Constellation!!'..Icons.Icon({"Astrology", type='skill', notext='true'})..' Level' | ||
result = result..'!!XP!!Skills!!Standard Modifiers!!Unique Modifiers' | result = result..'!!XP!!Skills!!Standard Modifiers!!Unique Modifiers' | ||
for i, cons in Shared.skpairs(SkillData.Astrology.Constellations) do | for i, cons in Shared.skpairs(SkillData.Astrology.Constellations) do | ||
local name = cons.name | local name = cons.name | ||
Line 820: | Line 820: | ||
result = result..'\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='constellation', size='50', notext=true})..'||'..name | result = result..'\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='constellation', size='50', notext=true})..'||'..name | ||
result = result..'||'..cons.level..'||'..cons.provides.xp | result = result..'||'..cons.level..'||'..cons.provides.xp | ||
local skillIconArray = {} | local skillIconArray = {} | ||
for j, skillID in ipairs(cons.skills) do | for j, skillID in ipairs(cons.skills) do | ||
Line 826: | Line 826: | ||
end | end | ||
result = result..'||'..table.concat(skillIconArray, '<br/>') | result = result..'||'..table.concat(skillIconArray, '<br/>') | ||
local standModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, true, false, false, false) | local standModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, true, false, false, false) | ||
local standMods = {} | local standMods = {} | ||
Line 834: | Line 834: | ||
end | end | ||
result = result..'|| '..table.concat(standMods, '<br/>') | result = result..'|| '..table.concat(standMods, '<br/>') | ||
--Building the list of all Unique Modifiers | --Building the list of all Unique Modifiers | ||
local uModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, false, true, false, false) | local uModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, false, true, false, false) | ||
Line 844: | Line 844: | ||
end | end | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
return result | return result | ||
end | end |