adam@17: local _, AskMrRobot = ... adam@17: local L = AskMrRobot.L; adam@17: adam@17: -- item link format: |cffa335ee|Hitem:itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:upgradeId:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2...|h[item name]|h|r adam@17: adam@17: -- get an object with all of the parts fo the item link format that we care about adam@17: function AskMrRobot.parseItemLink(itemLink) adam@17: if not itemLink then return nil end adam@17: adam@17: local str = string.match(itemLink, "|Hitem:([\-%d:]+)|") adam@17: if not str then return nil end adam@17: adam@17: local parts = { strsplit(":", str) } adam@17: adam@17: local item = {} adam@17: item.id = tonumber(parts[1]) adam@17: item.enchantId = tonumber(parts[2]) adam@17: item.gemIds = { tonumber(parts[3]), tonumber(parts[4]), tonumber(parts[5]), tonumber(parts[6]) } adam@17: item.suffixId = math.abs(tonumber(parts[7])) -- convert suffix to positive number, that's what we use in our code adam@17: --item.uniqueId = tonumber(parts[8]) adam@17: --item.level = tonumber(parts[9]) adam@17: item.upgradeId = tonumber(parts[10]) adam@17: --item.difficultyId = tonumber(parts[11]) adam@17: adam@17: local numBonuses = tonumber(parts[12]) adam@28: if numBonuses and numBonuses > 0 then adam@17: item.bonusIds = {} adam@17: for i = 13, 12 + numBonuses do adam@17: table.insert(item.bonusIds, tonumber(parts[i])) adam@17: end adam@17: end adam@17: adam@17: return item adam@17: end adam@17: adam@17: -- convenience to get just the item id (or 0 if not a valid link) from an item link adam@17: function AskMrRobot.getItemIdFromLink(itemLink) adam@17: if not itemLink then return 0 end adam@17: local parts = { strsplit(":", itemLink) } adam@17: local id = tonumber(parts[2]) adam@17: return (id and id ~= 0 and id or 0) adam@17: end adam@17: adam@17: function AskMrRobot.getItemUniqueId(item, noUpgrade) adam@17: if item == nil then return "" end adam@17: local ret = item.id .. "" adam@17: if item.bonusIds then adam@17: for i = 1, #item.bonusIds do adam@17: ret = ret .. "b" .. item.bonusIds[i] adam@17: end adam@17: end adam@17: if item.suffixId ~= 0 then adam@17: ret = ret .. "s" .. item.suffixId adam@17: end adam@17: if not noUpgrade and item.upgradeId ~= 0 then adam@17: ret = ret .. "u" .. item.upgradeId adam@17: end adam@17: return ret adam@17: end adam@17: adam@17: AskMrRobot.instanceIds = { adam@17: HeartOfFear = 1009, adam@17: MogushanVaults = 1008, adam@17: SiegeOfOrgrimmar = 1136, adam@17: TerraceOfEndlessSpring = 996, adam@17: ThroneOfThunder = 1098 adam@17: } adam@17: adam@17: -- instances that we currently support logging for adam@17: AskMrRobot.supportedInstanceIds = { adam@17: [1136] = true adam@17: } adam@17: adam@17: -- returns true if currently in a supported instance adam@17: function AskMrRobot.IsSupportedInstance() adam@17: adam@17: local zone, _, difficultyIndex, _, _, _, _, instanceMapID = GetInstanceInfo() adam@17: if AskMrRobot.supportedInstanceIds[tonumber(instanceMapID)] then adam@17: return true adam@17: else adam@17: return false adam@17: end adam@17: end adam@17: adam@17: AskMrRobot.classIds = { adam@17: ["NONE"] = 0, adam@17: ["DEATHKNIGHT"] = 1, adam@17: ["DRUID"] = 2, adam@17: ["HUNTER"] = 3, adam@17: ["MAGE"] = 4, adam@17: ["MONK"] = 5, adam@17: ["PALADIN"] = 6, adam@17: ["PRIEST"] = 7, adam@17: ["ROGUE"] = 8, adam@17: ["SHAMAN"] = 9, adam@17: ["WARLOCK"] = 10, adam@17: ["WARRIOR"] = 11, adam@17: } adam@17: adam@17: AskMrRobot.professionIds = { adam@17: ["None"] = 0, adam@17: ["Mining"] = 1, adam@17: ["Skinning"] = 2, adam@17: ["Herbalism"] = 3, adam@17: ["Enchanting"] = 4, adam@17: ["Jewelcrafting"] = 5, adam@17: ["Engineering"] = 6, adam@17: ["Blacksmithing"] = 7, adam@17: ["Leatherworking"] = 8, adam@17: ["Inscription"] = 9, adam@17: ["Tailoring"] = 10, adam@17: ["Alchemy"] = 11, adam@17: ["Fishing"] = 12, adam@17: ["Cooking"] = 13, adam@17: ["First Aid"] = 14, adam@17: ["Archaeology"] = 15 adam@17: } adam@17: adam@17: AskMrRobot.raceIds = { adam@17: ["None"] = 0, adam@17: ["BloodElf"] = 1, adam@17: ["Draenei"] = 2, adam@17: ["Dwarf"] = 3, adam@17: ["Gnome"] = 4, adam@17: ["Human"] = 5, adam@17: ["NightElf"] = 6, adam@17: ["Orc"] = 7, adam@17: ["Tauren"] = 8, adam@17: ["Troll"] = 9, adam@17: ["Scourge"] = 10, adam@17: ["Undead"] = 10, adam@17: ["Goblin"] = 11, adam@17: ["Worgen"] = 12, adam@17: ["Pandaren"] = 13 adam@17: } adam@17: adam@17: AskMrRobot.factionIds = { adam@17: ["None"] = 0, adam@17: ["Alliance"] = 1, adam@17: ["Horde"] = 2 adam@17: } adam@17: adam@17: AskMrRobot.specIds = { adam@17: [250] = 1, -- DeathKnightBlood adam@17: [251] = 2, -- DeathKnightFrost adam@17: [252] = 3, -- DeathKnightUnholy adam@17: [102] = 4, -- DruidBalance adam@17: [103] = 5, -- DruidFeral adam@17: [104] = 6, -- DruidGuardian adam@17: [105] = 7, -- DruidRestoration adam@17: [253] = 8, -- HunterBeastMastery adam@17: [254] = 9, -- HunterMarksmanship adam@17: [255] = 10, -- HunterSurvival adam@17: [62] = 11, -- MageArcane adam@17: [63] = 12, -- MageFire adam@17: [64] = 13, -- MageFrost adam@17: [268] = 14, -- MonkBrewmaster yellowfive@23: [270] = 15, -- MonkMistweaver yellowfive@23: [269] = 16, -- MonkWindwalker adam@17: [65] = 17, -- PaladinHoly adam@17: [66] = 18, -- PaladinProtection adam@17: [70] = 19, -- PaladinRetribution adam@17: [256] = 20, -- PriestDiscipline adam@17: [257] = 21, -- PriestHoly adam@17: [258] = 22, -- PriestShadow adam@17: [259] = 23, -- RogueAssassination adam@17: [260] = 24, -- RogueCombat adam@17: [261] = 25, -- RogueSubtlety adam@17: [262] = 26, -- ShamanElemental adam@17: [263] = 27, -- ShamanEnhancement adam@17: [264] = 28, -- ShamanRestoration adam@17: [265] = 29, -- WarlockAffliction adam@17: [266] = 30, -- WarlockDemonology adam@17: [267] = 31, -- WarlockDestruction adam@17: [71] = 32, -- WarriorArms adam@17: [72] = 33, -- WarriorFury adam@17: [73] = 34 -- WarriorProtection adam@17: } adam@17: adam@17: -- reverse map of our spec ID to the game's spec ID adam@17: AskMrRobot.gameSpecIds = {} adam@17: for k,v in pairs(AskMrRobot.specIds) do adam@17: AskMrRobot.gameSpecIds[v] = k adam@17: end adam@17: adam@17: -- lookup from our socket color ID to string adam@17: AskMrRobot.socketColorIds = { adam@17: [0] = "Prismatic", adam@17: [1] = "Red", adam@17: [2] = "Yellow", adam@17: [3] = "Blue", adam@17: [4] = "Meta", adam@17: [5] = "Cogwheel", adam@17: [6] = "ShaTouched" adam@17: } adam@17: adam@17: -- map of game slot names to slot IDs (same both in our code and in-game) adam@17: AskMrRobot.slotNameToId = { adam@17: ["HeadSlot"] = 1, adam@17: ["NeckSlot"] = 2, adam@17: ["ShoulderSlot"] = 3, adam@17: ["ChestSlot"] = 5, adam@17: ["WaistSlot"] = 6, adam@17: ["LegsSlot"] = 7, adam@17: ["FeetSlot"] = 8, adam@17: ["WristSlot"] = 9, adam@17: ["HandsSlot"] = 10, adam@17: ["Finger0Slot"] = 11, adam@17: ["Finger1Slot"] = 12, adam@17: ["Trinket0Slot"] = 13, adam@17: ["Trinket1Slot"] = 14, adam@17: ["BackSlot"] = 15, adam@17: ["MainHandSlot"] = 16, adam@17: ["SecondaryHandSlot"] = 17 adam@17: } adam@17: adam@17: -- map of slot ID to display text adam@17: AskMrRobot.slotDisplayText = { adam@17: [1] = _G["HEADSLOT"], adam@17: [2] = _G["NECKSLOT"], adam@17: [3] = _G["SHOULDERSLOT"], adam@17: [5] = _G["CHESTSLOT"], adam@17: [6] = _G["WAISTSLOT"], adam@17: [7] = _G["LEGSSLOT"], adam@17: [8] = _G["FEETSLOT"], adam@17: [9] = _G["WROSTSLOT"], adam@17: [10] = _G["HANDSSLOT"], adam@17: [11] = _G["FINGER0SLOT"], adam@17: [12] = _G["FINGER1SLOT"], adam@17: [13] = _G["TRINKET0SLOT"], adam@17: [14] = _G["TRINKET1SLOT"], adam@17: [15] = _G["BACKSLOT"], adam@17: [16] = _G["MAINHANDSLOT"], adam@17: [17] = _G["SECONDARYHANDSLOT"] adam@17: } adam@17: adam@17: -- all slot IDs that we care about, ordered in our standard display order adam@17: AskMrRobot.slotIds = { 16, 17, 1, 2, 3, 15, 5, 9, 10, 6, 7, 8, 11, 12, 13, 14 } adam@17: adam@17: -- cache slot orders to make slot sorting easier adam@17: local _slotIdToOrder = {} adam@17: for i = 1, #AskMrRobot.slotIds do adam@17: _slotIdToOrder[AskMrRobot.slotIds[i]] = i adam@17: end adam@17: adam@17: -- given a table where the keys are slot IDs, sort in the standard slot order adam@17: function AskMrRobot.sortSlots(t) adam@17: return AskMrRobot.spairs(t, function(x, a, b) adam@17: if a == nil and b == nil then return 0 end adam@17: return _slotIdToOrder[a] < _slotIdToOrder[b] adam@17: end) adam@17: end