From 71011c10b43af7c05aae2059000a7a21c41ae937 Mon Sep 17 00:00:00 2001 From: torhal Date: Sun, 7 Jun 2009 02:58:12 +0000 Subject: [PATCH] Completely reworked tooltip-scanning. --- ARLDatamine.lua | 1085 ++++++++++++++++++++----------------------------------- 1 file changed, 394 insertions(+), 691 deletions(-) diff --git a/ARLDatamine.lua b/ARLDatamine.lua index 8e7feaf..11d4777 100644 --- a/ARLDatamine.lua +++ b/ARLDatamine.lua @@ -1847,7 +1847,7 @@ do recipe_list[i] = master_list[i] end end - local reverselookup = CreateReverseLookup(recipe_list) + local reverse_lookup = CreateReverseLookup(recipe_list) ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE") GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent) @@ -1859,7 +1859,8 @@ do if link then ARLDatamineTT:SetHyperlink(link) - self:ScanToolTip(name, recipe_list, reverselookup, false) + self:ScanToolTip(name, recipe_list, reverse_lookup, false) + self:PrintScanResults() else self:Print("Missing RecipeLink for ID " .. i .. " - " .. name .. " (If these are DK abilities, don't worry, that's normal.") end @@ -1880,7 +1881,7 @@ function addon:ScanVendor() self:Print(L["DATAMINER_NODB_ERROR"]) return end - local reverselookup = CreateReverseLookup(recipelist) + local reverse_lookup = CreateReverseLookup(recipelist) local targetname = UnitName("target") -- Get its name local targetID = tonumber(string.sub(UnitGUID("target"),-12,-7),16) -- Get the NPC ID @@ -1892,7 +1893,8 @@ function addon:ScanVendor() for i = 1, GetMerchantNumItems(), 1 do local name, _, _, _, numAvailable = GetMerchantItemInfo(i) ARLDatamineTT:SetMerchantItem(i) - self:ScanToolTip(name, recipelist, reverselookup, true) + self:ScanToolTip(name, recipelist, reverse_lookup, true) + self:PrintScanResults() end ARLDatamineTT:Hide() else @@ -1912,7 +1914,7 @@ function addon:TooltipScanDatabase() self:Print(L["DATAMINER_NODB_ERROR"]) return end - local reverselookup = CreateReverseLookup(recipelist) + local reverse_lookup = CreateReverseLookup(recipelist) ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE") GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent) @@ -1925,7 +1927,8 @@ function addon:TooltipScanDatabase() if link then ARLDatamineTT:SetHyperlink(link) - self:ScanToolTip(name,recipelist,reverselookup,false) + self:ScanToolTip(name, recipelist, reverse_lookup,false) + self:PrintScanResults() else self:Print("Missing RecipeLink for ID " .. i .. " - " .. name .. " (If these are DK abilities, don't worry, that's normal.") end @@ -1975,15 +1978,15 @@ function addon:TooltipScanRecipe(spellid) return end - local reverselookup = CreateReverseLookup(recipelist) + local reverse_lookup = CreateReverseLookup(recipelist) ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE") GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent) if (recipelist[spellid]) then - local name = recipelist[spellid]["Name"] - local link = recipelist[spellid]["RecipeLink"] + local name = recipelist[spellid]["Name"] + local link = recipelist[spellid]["RecipeLink"] -- If a link exists, we'll scan it. if (link) then @@ -1998,13 +2001,15 @@ function addon:TooltipScanRecipe(spellid) -- Check to see if we're dealing with a recipe if (recipenames[matchtext]) then -- Scan the recipe - self:ScanToolTip(name,recipelist,reverselookup,false) + self:ScanToolTip(name, recipelist, reverse_lookup, false) + self:PrintScanResults() -- We have a reverse look-up for the item which creates the spell (aka the recipe itself) if (spellitem[spellid]) then self:Print(spellitem[spellid]) ARLDatamineTT:SetHyperlink("item:" .. spellitem[spellid] .. ":0:0:0:0:0:0:0") - self:ScanToolTip(name,recipelist,reverselookup,false) + self:ScanToolTip(name,recipelist,reverse_lookup,false) + self:PrintScanResults() end end @@ -2022,771 +2027,469 @@ function addon:TooltipScanRecipe(spellid) end -local specialtytext = { - ["requires spellfire tailoring"] = 26797, - ["requires mooncloth tailoring"] = 26798, - ["requires shadowweave tailoring"] = 26801, - ["dragonscale leatherworking"] = 10657, - ["elemental leatherworking"] = 10659, - ["tribal leatherworking"] = 10661, - ["gnomish engineering"] = 20219, - ["goblin engineering"] = 20222, - ["armorsmith"] = 9788, - ["master axesmith"] = 17041, - ["master hammersmith"] = 17040, - ["master swordsmith"] = 17039, - ["weaponsmith"] = 9787, -} - -local factiontext = { - ["thorium brotherhood"] = 98, - ["zandalar tribe"] = 100, - ["argent dawn"] = 96, - ["timbermaw hold"] = 99, - ["cenarion circle"] = 97, - ["the aldor"] = 101, - ["the consortium"] = 105, - ["the scryers"] = 110, - ["the sha'tar"] = 111, - ["the mag'har"] = 108, - ["cenarion expedition"] = 103, - ["honor hold"] = 104, - ["thrallmar"] = 104, - ["the violet eye"] = 114, - ["sporeggar"] = 113, - ["kurenai"] = 108, - ["keepers of time"] = 106, - ["the scale of the sands"] = 109, - ["lower city"] = 107, - ["ashtongue deathsworn"] = 102, - ["alliance vanguard"] = 131, - ["valiance expedition"] = 126, - ["horde expedition"] = 130, - ["the taunka"] = 128, - ["the hand of vengeance"] = 127, - ["explorers' league"] = 125, - ["the kalu'ak"] = 120, - ["shattered sun offensive"] = 112, - ["warsong offensive"] = 129, - ["kirin tor"] = 118, - ["the wyrmrest accord"] = 122, - ["knights of the ebon blade"] = 117, - ["frenzyheart tribe"] = 116, - ["the oracles"] = 121, - ["argent crusade"] = 115, - ["the sons of hodir"] = 119, -} - -local factionlevels = { - ["neutral"] = 0, - ["friendly"] = 1, - ["honored"] = 2, - ["revered"] = 3, - ["exalted"] = 4, -} - -local tooltipflags = { - boprecipe = false, - bopitem = false, - healer = false, - tank = false, - dps = false, - caster = false, - Deathknight = false, - Druid = false, - Hunter = false, - Mage = false, - Paladin = false, - Priest = false, - Shaman = false, - Rogue = false, - Warlock = false, - Warrior = false, - - Cloth = false, - Leather = false, - Mail = false, - Plate = false, - Cloak = false, - Trinket = false, - Ring = false, - Necklace = false, - Shield = false, - OneHanded = false, - TwoHanded = false, - Axe = false, - Sword = false, - Mace = false, - Polearm = false, - Dagger = false, - Staff = false, - Wand = false, - Thrown = false, - Bow = false, - CrossBow = false, - Ammo = false, - Fist = false, - Gun = false, - - specialty = false, - repid = false, - repidlevel = false, -} +------------------------------------------------------------------------------- +-- Tooltip-scanning code +------------------------------------------------------------------------------- +do + local SPECIALTY_TEXT = { + ["requires spellfire tailoring"] = 26797, + ["requires mooncloth tailoring"] = 26798, + ["requires shadowweave tailoring"] = 26801, + ["dragonscale leatherworking"] = 10657, + ["elemental leatherworking"] = 10659, + ["tribal leatherworking"] = 10661, + ["gnomish engineering"] = 20219, + ["goblin engineering"] = 20222, + ["armorsmith"] = 9788, + ["master axesmith"] = 17041, + ["master hammersmith"] = 17040, + ["master swordsmith"] = 17039, + ["weaponsmith"] = 9787, + } -local function resettooltipscanflags() - - tooltipflags = { - boprecipe = false, - bopitem = false, - healer = false, - tank = false, - dps = false, - caster = false, - Deathknight = false, - Druid = false, - Hunter = false, - Mage = false, - Paladin = false, - Priest = false, - Shaman = false, - Rogue = false, - Warlock = false, - Warrior = false, - - Cloth = false, - Leather = false, - Mail = false, - Plate = false, - Cloak = false, - Trinket = false, - Ring = false, - Necklace = false, - Shield = false, - OneHanded = false, - TwoHanded = false, - Axe = false, - Sword = false, - Mace = false, - Polearm = false, - Dagger = false, - Staff = false, - Wand = false, - Thrown = false, - Bow = false, - CrossBow = false, - Ammo = false, - Fist = false, - Gun = false, - - specialty = false, - repid = false, - repidlevel = false, + local FACTION_TEXT = { + ["thorium brotherhood"] = 98, + ["zandalar tribe"] = 100, + ["argent dawn"] = 96, + ["timbermaw hold"] = 99, + ["cenarion circle"] = 97, + ["the aldor"] = 101, + ["the consortium"] = 105, + ["the scryers"] = 110, + ["the sha'tar"] = 111, + ["the mag'har"] = 108, + ["cenarion expedition"] = 103, + ["honor hold"] = 104, + ["thrallmar"] = 104, + ["the violet eye"] = 114, + ["sporeggar"] = 113, + ["kurenai"] = 108, + ["keepers of time"] = 106, + ["the scale of the sands"] = 109, + ["lower city"] = 107, + ["ashtongue deathsworn"] = 102, + ["alliance vanguard"] = 131, + ["valiance expedition"] = 126, + ["horde expedition"] = 130, + ["the taunka"] = 128, + ["the hand of vengeance"] = 127, + ["explorers' league"] = 125, + ["the kalu'ak"] = 120, + ["shattered sun offensive"] = 112, + ["warsong offensive"] = 129, + ["kirin tor"] = 118, + ["the wyrmrest accord"] = 122, + ["knights of the ebon blade"] = 117, + ["frenzyheart tribe"] = 116, + ["the oracles"] = 121, + ["argent crusade"] = 115, + ["the sons of hodir"] = 119, } -end + local FACTION_LEVELS = { + ["neutral"] = 0, + ["friendly"] = 1, + ["honored"] = 2, + ["revered"] = 3, + ["exalted"] = 4, + } ---- Parses the mining tooltip for certain keywords, comparing them with the database flags. --- @name AckisRecipeList:ScanToolTip --- @return Scans a tooltip, and outputs the missing or extra filter flags. -function addon:ScanToolTip(name, recipelist, isvendor) + local CLASS_TYPES = { + -- Class types + ["Deathknight"] = 21, ["Druid"] = 22, ["Hunter"] = 23, + ["Mage"] = 24, ["Paladin"] = 25, ["Priest"] = 26, + ["Shaman"] = 27, ["Rogue"] = 28, ["Warlock"] = 29, + ["Warrior"] = 30, + } - local recipefound = false - local confirmed_role = false + local ROLE_TYPES = { + -- Player role + ["dps"] = 51, ["tank"] = 52, ["healer"] = 53, + ["caster"] = 54, ["RESERVED1"] = 55, + } - local matchtext + local ITEM_TYPES = { + -- Armor types + ["Cloth"] = 56, ["Leather"] = 57, ["Mail"] = 58, + ["Plate"] = 59, ["Cloak"] = 60, ["Trinket"] = 61, + ["Ring"] = 62, ["Necklace"] = 63, ["Shield"] = 64, + ["RESERVED2"] = 65, - -- Parse all the lines of the tooltip - for i =1 , ARLDatamineTT:NumLines(), 1 do + -- Weapon types + ["OneHanded"] = 66, ["TwoHanded"] = 67, ["Axe"] = 68, + ["Sword"] = 69, ["Mace"] = 70, ["Polearm"] = 71, + ["Dagger"] = 72, ["Staff"] = 73, ["Wand"] = 74, + ["Thrown"] = 75, ["Bow"] = 76, ["CrossBow"] = 77, + ["Ammo"] = 78, ["Fist"] = 79, ["Gun"] = 80, + } - local linetextl = _G["ARLDatamineTTTextLeft" .. i] - local textl = linetextl:GetText() - local linetextr = _G["ARLDatamineTTTextRight" .. i] - local textr = linetextr:GetText() - local text + -- Table to store scanned information. Wiped and re-used every scan. + local scan_data = {} + + --- Parses the mining tooltip for certain keywords, comparing them with the database flags. + -- @name AckisRecipeList:ScanToolTip + -- @return Scans a tooltip, and outputs the missing or extra filter flags. + function addon:ScanToolTip(name, recipe_list, reverse_lookup, is_vendor) + local confirmed_role = false + local matchtext + + twipe(scan_data) + scan_data.match_name = name + scan_data.recipe_list = recipe_list + scan_data.reverse_lookup = reverse_lookup + scan_data.recipe_found = false + + local num_lines = ARLDatamineTT:NumLines() + + -- Parse all the lines of the tooltip + for i = 1, ARLDatamineTT:NumLines(), 1 do + local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText() + local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText() + local text - if (textr) then - text = textl .. " " .. textr - else - text = textl - end + if text_r then + text = text_l .. " " .. text_r + else + text = text_l + end - local text = strlower(text) + local text = strlower(text) - -- Check for recipe/item binding - -- The recipe binding is within the first few lines of the tooltip always - if ((strmatch(text, "binds when picked up")) and (i < 4)) then - tooltipflags.boprecipe = true - elseif ((strmatch(text, "binds when picked up")) and (i > 3)) then - tooltipflags.bopitem = true - end + -- Check for recipe/item binding + -- The recipe binding is within the first few lines of the tooltip always + if ((strmatch(text, "binds when picked up")) and (i < 4)) then + scan_data.boprecipe = true + elseif ((strmatch(text, "binds when picked up")) and (i > 3)) then + scan_data.bopitem = true + end - -- Recipe Specialities - if (specialtytext[text]) then - tooltipflags.specialty = specialtytext[text] - end + -- Recipe Specialities + if SPECIALTY_TEXT[text] then + scan_data.specialty = SPECIALTY_TEXT[text] + end - -- Recipe Reputatons - if (strmatch(text, "Requires (.+) %- (.+)")) then - local rep,replevel = strmatch(text, "Requires (.+) %- (.+)") - if (factiontext[rep]) then - tooltipflags.repid = factiontext[rep] - tooltipflags.repidlevel = factionlevels[replevel] + -- Recipe Reputatons + if (strmatch(text, "Requires (.+) %- (.+)")) then + local rep,replevel = strmatch(text, "Requires (.+) %- (.+)") + if (FACTION_TEXT[rep]) then + scan_data.repid = FACTION_TEXT[rep] + scan_data.repidlevel = FACTION_LEVELS[replevel] + end end - end - -- Certain stats can be considered for a specific role (aka spell hit == caster dps). - -- confirmed_role will be toggled to true when we get to a stat that is specific to that class - if (strmatch(text, "strength")) then - tooltipflags.tank = true - tooltipflags.dps = true - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "agility")) then - tooltipflags.tank = true - tooltipflags.dps = true - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "spirit")) then - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.caster = true - tooltipflags.healer = true - confirmed_role = true - -- tooltipflags.caster stats - elseif (strmatch(text, "spell power")) then - tooltipflags.caster = true - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.healer = true - confirmed_role = true - elseif (strmatch(text, "spell crit")) then - tooltipflags.caster = true - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.healer = true - confirmed_role = true - -- tooltipflags.dps tooltipflags.caster Stats - elseif (strmatch(text, "spell hit")) then - tooltipflags.caster = true - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "spell penetration")) then - tooltipflags.caster = true - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.healer = false - confirmed_role = true - -- tooltipflags.healer Stats - elseif (strmatch(text, "mana every 5 seconds")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = false - tooltipflags.healer = true - confirmed_role = true - -- Melee tooltipflags.dps Stats - elseif (strmatch(text, "attack power")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "expertise")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "melee crit")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "ranged crit")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "melee haste")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "ranged haste")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "melee hit")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "ranged hit")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "armor pen")) then - tooltipflags.caster = false - tooltipflags.tank = false - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "feral attack")) then - tooltipflags.caster = false - tooltipflags.tank = true - tooltipflags.dps = true - tooltipflags.healer = false - confirmed_role = true - -- tooltipflags.tanking Stats - elseif (strmatch(text, "defense")) then - tooltipflags.tank = true - tooltipflags.dps = false - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "block")) then - tooltipflags.tank = true - tooltipflags.dps = false - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "parry")) then - tooltipflags.tank = true - tooltipflags.dps = false - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - elseif (strmatch(text, "dodge")) then - tooltipflags.tank = true - tooltipflags.dps = false - tooltipflags.caster = false - tooltipflags.healer = false - confirmed_role = true - end + -- Certain stats can be considered for a specific role (aka spell hit == caster dps). + -- confirmed_role will be toggled to true when we get to a stat that is specific to that class + if (strmatch(text, "strength")) then + scan_data.tank = true + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "agility")) then + scan_data.tank = true + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "spirit")) then + scan_data.caster = true + scan_data.healer = true + confirmed_role = true + elseif (strmatch(text, "spell power")) then + scan_data.caster = true + scan_data.healer = true + confirmed_role = true + elseif (strmatch(text, "spell crit")) then + scan_data.caster = true + scan_data.healer = true + confirmed_role = true + -- scan_data.dps scan_data.caster Stats + elseif (strmatch(text, "spell hit")) then + scan_data.caster = true + confirmed_role = true + elseif (strmatch(text, "spell penetration")) then + scan_data.caster = true + confirmed_role = true + -- scan_data.healer Stats + elseif (strmatch(text, "mana every 5 seconds")) then + scan_data.healer = true + confirmed_role = true + -- Melee scan_data.dps Stats + elseif (strmatch(text, "attack power")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "expertise")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "melee crit")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "ranged crit")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "melee haste")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "ranged haste")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "melee hit")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "ranged hit")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "armor pen")) then + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "feral attack")) then + scan_data.tank = true + scan_data.dps = true + confirmed_role = true + elseif (strmatch(text, "defense")) then + scan_data.tank = true + confirmed_role = true + elseif (strmatch(text, "block")) then + scan_data.tank = true + confirmed_role = true + elseif (strmatch(text, "parry")) then + scan_data.tank = true + confirmed_role = true + elseif (strmatch(text, "dodge")) then + scan_data.tank = true + confirmed_role = true + end - -- Classes - if (strmatch(text, "death knight")) then - tooltipflags.Deathknight = true - elseif (strmatch(text, "druid")) then - tooltipflags.Druid = true - elseif (strmatch(text, "hunter")) then - tooltipflags.Hunter = true - elseif (strmatch(text, "mage")) then - tooltipflags.Mage = true - elseif (strmatch(text, "paladin")) then - tooltipflags.Paladin = true - elseif (strmatch(text, "priest")) then - tooltipflags.Priest = true - elseif (strmatch(text, "rogue")) then - tooltipflags.Rogue = true - elseif (strmatch(text, "shaman")) then - tooltipflags.Shaman = true - elseif (strmatch(text, "warlock")) then - tooltipflags.Warlock = true - elseif (strmatch(text, "warrior")) then - tooltipflags.Warrior = true - -- Armor types - elseif (strmatch(text, "cloth")) then - tooltipflags.Cloth = true - elseif (strmatch(text, "leather")) then - tooltipflags.Leather = true - elseif (strmatch(text, "mail")) then - tooltipflags.Mail = true - elseif (strmatch(text, "plate")) then - tooltipflags.Plate = true - elseif (strmatch(text, "cloak")) then - tooltipflags.Cloak = true - elseif (strmatch(text, "ring")) then - tooltipflags.Ring = true - elseif (strmatch(text, "necklace")) then - tooltipflags.Necklace = true - elseif (strmatch(text, "shield")) then - tooltipflags.Shield = true - -- Weapon types - elseif (strmatch(text, "1 hand")) or (strmatch(text, "off hand")) then - tooltipflags.OneHanded = true - elseif (strmatch(text, "2 hand")) then - tooltipflags.TwoHanded = true - elseif (strmatch(text, "axe")) then - tooltipflags.Axe = true - elseif (strmatch(text, "sword")) then - tooltipflags.Sword = true - elseif (strmatch(text, "mace")) then - tooltipflags.Mace = true - elseif (strmatch(text, "polearm")) then - tooltipflags.Polearm = true - elseif (strmatch(text, "dagger")) then - tooltipflags.Dagger = true - elseif (strmatch(text, "staff")) then - tooltipflags.Staff = true - elseif (strmatch(text, "wand")) then - tooltipflags.Wand = true - elseif (strmatch(text, "thrown")) then - tooltipflags.Thrown = true - elseif (strmatch(text, "bow")) then - tooltipflags.Bow = true - elseif (strmatch(text, "crossbow")) then - tooltipflags.CrossBow = true - elseif (strmatch(text, "gun")) then - tooltipflags.Gun = true - elseif (strmatch(text, "ammo")) then - tooltipflags.Ammo = true - elseif (strmatch(text, "fist")) then - tooltipflags.Fist = true - end + -- Classes + if (strmatch(text, "death knight")) then + scan_data.Deathknight = true + elseif (strmatch(text, "druid")) then + scan_data.Druid = true + elseif (strmatch(text, "hunter")) then + scan_data.Hunter = true + elseif (strmatch(text, "mage")) then + scan_data.Mage = true + elseif (strmatch(text, "paladin")) then + scan_data.Paladin = true + elseif (strmatch(text, "priest")) then + scan_data.Priest = true + elseif (strmatch(text, "rogue")) then + scan_data.Rogue = true + elseif (strmatch(text, "shaman")) then + scan_data.Shaman = true + elseif (strmatch(text, "warlock")) then + scan_data.Warlock = true + elseif (strmatch(text, "warrior")) then + scan_data.Warrior = true + -- Armor types + elseif (strmatch(text, "cloth")) then + scan_data.Cloth = true + elseif (strmatch(text, "leather")) then + scan_data.Leather = true + elseif (strmatch(text, "mail")) then + scan_data.Mail = true + elseif (strmatch(text, "plate")) then + scan_data.Plate = true + elseif (strmatch(text, "cloak")) then + scan_data.Cloak = true + elseif (strmatch(text, "ring")) then + scan_data.Ring = true + elseif (strmatch(text, "necklace")) then + scan_data.Necklace = true + elseif (strmatch(text, "shield")) then + scan_data.Shield = true + -- Weapon types + elseif (strmatch(text, "1 hand")) or (strmatch(text, "off hand")) then + scan_data.OneHanded = true + elseif (strmatch(text, "2 hand")) then + scan_data.TwoHanded = true + elseif (strmatch(text, "axe")) then + scan_data.Axe = true + elseif (strmatch(text, "sword")) then + scan_data.Sword = true + elseif (strmatch(text, "mace")) then + scan_data.Mace = true + elseif (strmatch(text, "polearm")) then + scan_data.Polearm = true + elseif (strmatch(text, "dagger")) then + scan_data.Dagger = true + elseif (strmatch(text, "staff")) then + scan_data.Staff = true + elseif (strmatch(text, "wand")) then + scan_data.Wand = true + elseif (strmatch(text, "thrown")) then + scan_data.Thrown = true + elseif (strmatch(text, "bow")) then + scan_data.Bow = true + elseif (strmatch(text, "crossbow")) then + scan_data.CrossBow = true + elseif (strmatch(text, "gun")) then + scan_data.Gun = true + elseif (strmatch(text, "ammo")) then + scan_data.Ammo = true + elseif (strmatch(text, "fist")) then + scan_data.Fist = true + end + end -- for + end -end - -function addon:PrintScanResults() + -- Flag data for printing. Wiped and re-used. + local missing_flags = {} + local extra_flags = {} - if (recipefound) then + function addon:PrintScanResults() -- Parse the recipe database until we get a match on the name - local spellid - local recipename = gsub(name, "%a+%?: ", "") + local recipe_name = gsub(scan_data.match_name, "%a+%?: ", "") + local spellid = scan_data.reverse_lookup[recipe_name] - spellid = reverselookup[recipename] - - if (not spellid) then - self:Print("Recipe "..recipename.." has no reverse lookup") + if not spellid then + self:Print("Recipe "..recipe_name.." has no reverse lookup") end - local flags = recipelist[spellid]["Flags"] - local missingflags = {} - local extraflags = {} + local flags = scan_data.recipe_list[spellid]["Flags"] + twipe(missing_flags) + twipe(extra_flags) - if specialty then - self:Print(GetSpellInfo(specialty)) + if scan_data.specialty then + self:Print(GetSpellInfo(scan_data.specialty)) end - if (isvendor) then + if scan_data.is_vendor then -- Vendor Flag if (not flags[4]) then - tinsert(missingflags,"4") + tinsert(missing_flags,"4") end -- PVP Flag if (((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Wintergrasp Fortress")) and (not flags[9])) then - tinsert(missingflags, "9") + tinsert(missing_flags, "9") elseif (flags[9]) then - tinsert(extraflags, "9") + tinsert(extra_flags, "9") end end if (flags[3]) then - boprecipe = true + scan_data.boprecipe = true end -- Classes -- If we've picked up at least one class flag - if ((tooltipflags.Deathknight) or (tooltipflags.Druid) or (tooltipflags.Hunter) or (tooltipflags.Mage) or (tooltipflags.Paladin) or (tooltipflags.Priest) or (tooltipflags.Shaman) - or (tooltipflags.Warlock) or (tooltipflags.Warrior)) then - if (tooltipflags.Deathknight) and (not flags[21]) then - tinsert(missingflags, "21") - elseif (not tooltipflags.Deathknight) and (flags[21]) then - tinsert(extraflags, "21") - end - if (tooltipflags.Druid) and (not flags[22]) then - tinsert(missingflags, "22") - elseif (not tooltipflags.Druid) and (flags[22]) then - tinsert(extraflags, "22") - end - if (tooltipflags.Hunter) and (not flags[23]) then - tinsert(missingflags, "23") - elseif (not tooltipflags.Hunter) and (flags[23]) then - tinsert(extraflags, "23") - end - if (tooltipflags.Mage) and (not flags[24]) then - tinsert(missingflags, "24") - elseif (not tooltipflags.Mage) and (flags[24]) then - tinsert(extraflags, "24") - end - if (tooltipflags.Paladin) and (not flags[25]) then - tinsert(missingflags, "25") - elseif (not tooltipflags.Paladin) and (flags[25]) then - tinsert(extraflags, "25") - end - if (tooltipflags.Priest) and (not flags[26]) then - tinsert(missingflags, "26") - elseif (not tooltipflags.Priest) and (flags[26]) then - tinsert(extraflags, "26") - end - if (tooltipflags.Shaman) and (not flags[27]) then - tinsert(missingflags, "27") - elseif (not tooltipflags.Shaman) and (flags[27]) then - tinsert(extraflags, "27") - end - if (tooltipflags.Rogue) and (not flags[28]) then - tinsert(missingflags, "28") - elseif (not tooltipflags.Rogue) and (flags[28]) then - tinsert(extraflags, "28") - end - if (tooltipflags.Warlock) and (not flags[29]) then - tinsert(missingflags, "29") - elseif (not tooltipflags.Warlock) and (flags[29]) then - tinsert(extraflags, "29") - end - if (tooltipflags.Warrior) and (not flags[30]) then - tinsert(missingflags, "30") - elseif (not tooltipflags.Warrior) and (flags[30]) then - tinsert(extraflags, "30") - end - -- Recipe is not class specific - else - if (not flags[21]) then - tinsert(missingflags, "21") - end - if (not flags[22]) then - tinsert(missingflags, "22") - end - if (not flags[23]) then - tinsert(missingflags, "23") - end - if (not flags[24]) then - tinsert(missingflags, "24") - end - if (not flags[25]) then - tinsert(missingflags, "25") - end - if (not flags[26]) then - tinsert(missingflags, "26") - end - if (not flags[27]) then - tinsert(missingflags, "27") - end - if (not flags[28]) then - tinsert(missingflags, "28") - end - if (not flags[29]) then - tinsert(missingflags, "29") + if ((scan_data.Deathknight) or (scan_data.Druid) or (scan_data.Hunter) or (scan_data.Mage) or (scan_data.Paladin) or (scan_data.Priest) or (scan_data.Shaman) + or (scan_data.Warlock) or (scan_data.Warrior)) then + for k, v in pairs(CLASS_TYPES) do + if scan_data[k] and not flags[v] then + tinsert(missing_flags, tostring(v).." ("..k..")") + elseif not scan_data[k] and flags[v] then + tinsert(extra_flags, tostring(v).." ("..k..")") + end end - if (not flags[30]) then - tinsert(missingflags, "30") + else -- Recipe is not class specific + for i = 21, 30 do + if not flags[i] then + tinsert(missing_flags, tostring(i).." (Class)") + end end end -- BoP Item - if (tooltipflags.bopitem) and (not flags[37]) then - tinsert(missingflags, "37") + if (scan_data.bopitem) and (not flags[37]) then + tinsert(missing_flags, "37") -- If it's a BoP item and flags BoE is set, mark it as extra if (flags[36]) then - tinsert(extraflags, "36") + tinsert(extra_flags, "36") end + -- If it's a BoP item and flags BoA is set, mark it as extra if (flags[38]) then - tinsert(extraflags, "38") + tinsert(extra_flags, "38") end - -- BoE Item, assuming it's not BoA - elseif (not flags[36]) and (not tooltipflags.bopitem) then - tinsert(missingflags, "36") + -- BoE Item, assuming it's not BoA + elseif (not flags[36]) and (not scan_data.bopitem) then + tinsert(missing_flags, "36") -- If it's a BoE item and flags BoP is set, mark it as extra if (flags[37]) then - tinsert(extraflags, "37") + tinsert(extra_flags, "37") end + -- If it's a BoE item and flags BoA is set, mark it as extra if (flags[38]) then - tinsert(extraflags, "38") + tinsert(extra_flags, "38") end end -- BoP Recipe - if (tooltipflags.boprecipe) and (not flags[41]) then - tinsert(missingflags, "41") + if (scan_data.boprecipe) and (not flags[41]) then + tinsert(missing_flags, "41") -- If it's a BoP recipe and flags BoE is set, mark it as extra if (flags[40]) then - tinsert(extraflags, "40") + tinsert(extra_flags, "40") end -- If it's a BoP recipe and flags BoA is set, mark it as extra + if (flags[42]) then - tinsert(extraflags, "42") + tinsert(extra_flags, "42") end - -- Not BoP recipe, assuming it's not BoA - elseif (not flags[40]) and (not tooltipflags.boprecipe) then - tinsert(missingflags, "40") + -- Not BoP recipe, assuming it's not BoA + elseif (not flags[40]) and (not scan_data.boprecipe) then + tinsert(missing_flags, "40") -- If it's a BoE recipe and flags BoP is set, mark it as extra if (flags[41]) then - tinsert(extraflags, "41") + tinsert(extra_flags, "41") end + -- If it's a BoE recipe and flags BoA is set, mark it as extra if (flags[42]) then - tinsert(extraflags, "42") + tinsert(extra_flags, "42") end end - -- Player type - if (tooltipflags.dps) and (not flags[51]) then - tinsert(missingflags, "51") - elseif (flags[51]) and (not tooltipflags.dps) then - tinsert(extraflags, "51") - end - if (tooltipflags.tank) and (not flags[52]) then - tinsert(missingflags, "52") - elseif (flags[52]) and (not tooltipflags.tank) then - tinsert(extraflags, "52") - end - if (tooltipflags.healer) and (not flags[53]) then - tinsert(missingflags, "53") - elseif (flags[53]) and (not tooltipflags.healer) then - tinsert(extraflags, "53") - end - if (tooltipflags.caster) and (not flags[54]) then - tinsert(missingflags, "54") - elseif (flags[54]) and (not tooltipflags.caster) then - tinsert(extraflags, "54") - end - - -- Item Type - if (tooltipflags.Cloth) and (not flags[56]) then - tinsert(missingflags, "56") - elseif (not tooltipflags.Cloth) and (flags[56]) then - tinsert(extraflags, "56") - end - if (tooltipflags.Leather) and (not flags[57]) then - tinsert(missingflags, "57") - elseif (not tooltipflags.Leather) and (flags[57]) then - tinsert(extraflags, "57") - end - if (tooltipflags.Mail) and (not flags[58]) then - tinsert(missingflags, "58") - elseif (not tooltipflags.Mail) and (flags[58]) then - tinsert(extraflags, "58") - end - if (tooltipflags.Plate) and (not flags[59]) then - tinsert(missingflags, "59") - elseif (not tooltipflags.Plate) and (flags[59]) then - tinsert(extraflags, "59") + for k, v in pairs(ROLE_TYPES) do + if scan_data[k] and not flags[v] then + tinsert(missing_flags, tostring(v).." ("..k..")") + elseif not scan_data[k] and flags[v] then + tinsert(extra_flags, tostring(v).." ("..k..")") + end end - -- Weapon type - if (tooltipflags.OneHanded) and (not flags[66]) then - tinsert(missingflags, "66") - elseif (not tooltipflags.OneHanded) and (flags[66]) then - tinsert(extraflags, "66") - end - if (tooltipflags.TwoHanded) and (not flags[67]) then - tinsert(missingflags, "67") - elseif (not tooltipflags.TwoHanded) and (flags[67]) then - tinsert(extraflags, "67") - end - if (tooltipflags.Axe) and (not flags[68]) then - tinsert(missingflags, "68") - elseif (not tooltipflags.Axe) and (flags[68]) then - tinsert(extraflags, "68") - end - if (tooltipflags.Sword) and (not flags[69]) then - tinsert(missingflags, "69") - elseif (not tooltipflags.Sword) and (flags[69]) then - tinsert(extraflags, "69") - end - if (tooltipflags.Mace) and (not flags[70]) then - tinsert(missingflags, "70") - elseif (not tooltipflags.Mace) and (flags[70]) then - tinsert(extraflags, "70") - end - if (tooltipflags.Polearm) and (not flags[71]) then - tinsert(missingflags, "71") - elseif (not tooltipflags.Polearm) and (flags[71]) then - tinsert(extraflags, "71") - end - if (tooltipflags.Dagger) and (not flags[72]) then - tinsert(missingflags, "72") - elseif (not tooltipflags.Dagger) and (flags[72]) then - tinsert(extraflags, "72") - end - if (tooltipflags.Staff) and (not flags[73]) then - tinsert(missingflags, "73") - elseif (not tooltipflags.Staff) and (flags[73]) then - tinsert(extraflags, "73") - end - if (tooltipflags.Wand) and (not flags[74]) then - tinsert(missingflags, "74") - elseif (not tooltipflags.Wand) and (flags[74]) then - tinsert(extraflags, "74") - end - if (tooltipflags.Thrown) and (not flags[75]) then - tinsert(missingflags, "75") - elseif (not tooltipflags.Thrown) and (flags[75]) then - tinsert(extraflags, "75") - end - if (tooltipflags.Bow) and (not flags[76]) then - tinsert(missingflags, "76") - elseif (not tooltipflags.Bow) and (flags[76]) then - tinsert(extraflags, "76") - end - if (tooltipflags.CrossBow) and (not flags[77]) then - tinsert(missingflags, "77") - elseif (not tooltipflags.CrossBow) and (flags[77]) then - tinsert(extraflags, "77") - end - if (tooltipflags.Ammo) and (not flags[78]) then - tinsert(missingflags, "78") - elseif (not tooltipflags.Ammo) and (flags[78]) then - tinsert(extraflags, "78") - end - if (tooltipflags.Fist) and (not flags[79]) then - tinsert(missingflags, "79") - elseif (not tooltipflags.Fist) and (flags[79]) then - tinsert(extraflags, "79") - end - if (tooltipflags.Gun) and (not flags[80]) then - tinsert(missingflags, "80") - elseif (not tooltipflags.Gun) and (flags[80]) then - tinsert(extraflags, "80") + for k, v in pairs(ITEM_TYPES) do + if scan_data[k] and not flags[v] then + tinsert(missing_flags, tostring(v).." ("..k..")") + elseif not scan_data[k] and flags[v] then + tinsert(extra_flags, tostring(v).." ("..k..")") + end end -- Reputations - if (repid) and (not flags[repid]) then - tinsert(missingflags,repid) + local repid = scan_data.repid + + if repid and not flags[repid] then + tinsert(missing_flags, repid) end - if (#missingflags > 0) or (#extraflags > 0) then - self:Print(recipename .. " " .. spellid) - if (#missingflags > 0) then - self:Print("Missing flags: " .. tconcat(missingflags, ", ")) + if (#missing_flags > 0) or (#extra_flags > 0) then + self:Print(recipe_name .. " " .. spellid) + + if (#missing_flags > 0) then + self:Print("Missing flags: " .. tconcat(missing_flags, ", ")) end - if (#extraflags > 0) then - self:Print("Extra flags: " .. tconcat(extraflags, ", ")) + + if (#extra_flags > 0) then + self:Print("Extra flags: " .. tconcat(extra_flags, ", ")) end - if (not tooltipflags.tank) and (not tooltipflags.healer) and (not tooltipflags.caster) and (not tooltipflags.dps) then + + if (not scan_data.tank) and (not scan_data.healer) and (not scan_data.caster) and (not scan_data.dps) then self:Print("No player type flag.") end - if (not tooltipflags.Cloth) or - (not tooltipflags.Leather) or - (not tooltipflags.Mail) or - (not tooltipflags.Plate) or - (not tooltipflags.Cloak) or - (not tooltipflags.Trinket) or - (not tooltipflags.Ring) or - (not tooltipflags.Necklace) or - (not tooltipflags.Shield) or - (not tooltipflags.OneHanded) or - (not tooltipflags.TwoHanded) or - (not tooltipflags.Axe) or - (not tooltipflags.Sword) or - (not tooltipflags.Mace) or - (not tooltipflags.Polearm) or - (not tooltipflags.Dagger) or - (not tooltipflags.Staff) or - (not tooltipflags.Wand) or - (not tooltipflags.Thrown) or - (not tooltipflags.Bow) or - (not tooltipflags.CrossBow) or - (not tooltipflags.Ammo) or - (not tooltipflags.Fist) or - (not tooltipflags.Gun) then - self:Print("Missing: item type flag") + + local count = 0 + + for k, v in pairs(ITEM_TYPES) do + if scan_data[k] then + count = count + 1 + end + end + + if count == 0 then + self:Print("Missing: item type flag") + elseif count > 1 then + self:Print("Extra: item type flag") end end - end -end +end -- do \ No newline at end of file -- 1.7.9.5