local addonName, addon = ... local L = addon.L local class = select(2, UnitClass("player")) local info = { DRUID = { ["Restoration (Healing)"] = { weights = { SPELL_POWER = 100, MASTERY_RATING = 100, HASTE_RATING = 57, INTELLECT = 51, SPIRIT = 32, CRIT_RATING = 11 }, }, ["Feral (Tank)"] = { weights = { AGILITY = 100, MASTERY_RATING = 100, STAMINA = 75, DODGE_RATING = 65, EXPERTISE_RATING = 16, ARMOR = 10, STRENGTH = 10, HIT_RATING = 8, HASTE_RATING = 5, FERAL_ATTACK_POWER = 4, CRIT_RATING = 3, }, }, ["Feral (DPS)"] = { weights = { AGILITY = 100, MASTERY_RATING = 100, STRENGTH = 80, CRIT_RATING = 55, EXPERTISE_RATING = 50, HIT_RATING = 50, FERAL_ATTACK_POWER = 40, HASTE_RATING = 35, }, }, ["Balance (DPS)"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, SPELL_POWER = 66, HASTE_RATING = 54, CRIT_RATING = 43, INTELLECT = 22, SPIRIT = 22, }, }, }, WARRIOR = { ["Protection (Tank)"] = { weights = { STAMINA = 100, MASTERY_RATING = 100, DODGE_RATING = 90, PARRY_RATING = 67, AGILITY = 67, STRENGTH = 48, EXPERTISE_RATING = 19, HIT_RATING = 10, CRIT_RATING = 7, ARMOR = 6, HASTE_RATING = 1, }, }, ["Fury (DPS)"] = { weights = { MASTERY_RATING = 100, EXPERTISE_RATING = 100, STRENGTH = 82, CRIT_RATING = 66, AGILITY = 53, HIT_RATING = 48, HASTE_RATING = 36, ARMOR = 5, }, }, ["Arms (DPS)"] = { weights = { MASTERY_RATING = 100, STRENGTH = 100, HIT_RATING = 90, EXPERTISE_RATING = 85, CRIT_RATING = 80, AGILITY = 65, HASTE_RATING = 50, ARMOR = 1, }, }, }, DEATHKNIGHT = { ["Blood (Tank)"] = { weights = { DAMAGE_PER_SECOND = 500, MASTERY_RATING = 100, STAMINA = 100, AGILITY = 69, DODGE_RATING = 50, PARRY_RATING = 43, EXPERTISE_RATING = 38, STRENGTH = 31, CRIT_RATING = 22, ARMOR = 18, HASTE_RATING = 16, HIT_RATING = 16, ARMOR = 11, }, }, ["Frost (DPS)"] = { weights = { DAMAGE_PER_SECOND = 337, MASTERY_RATING = 100, HIT_RATING = 100, STRENGTH = 97, EXPERTISE_RATING = 81, CRIT_RATING = 45, HASTE_RATING = 28, ARMOR = 1, }, }, ["Unholy (DPS)"] = { weights = { DAMAGE_PER_SECOND = 209, STRENGTH = 100, MASTERY_RATING = 100, HIT_RATING = 66, EXPERTISE_RATING = 51, HASTE_RATING = 48, CRIT_RATING = 45, ARMOR = 1, }, }, }, HUNTER = { ["Beast Mastery"] = { weights = { DAMAGE_PER_SECOND = 213, HIT_RATING = 100, MASTERY_RATING = 100, AGILITY = 58, CRIT_RATING = 40, INTELLECT = 37, HASTE_RATING = 21, }, }, ["Marksmanship"] = { weights = { DAMAGE_PER_SECOND = 379, HIT_RATING = 100, MASTERY_RATING = 100, AGILITY = 74, CRIT_RATING = 57, INTELLECT = 39, HASTE_RATING = 24, }, }, ["Survival"] = { weights = { DAMAGE_PER_SECOND = 181, HIT_RATING = 100, MASTERY_RATING = 100, AGILITY = 76, CRIT_RATING = 42, INTELLECT = 35, HASTE_RATING = 31, }, }, }, MAGE = { ["Arcane"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, HASTE_RATING = 54, SPELL_POWER = 49, CRIT_RATING = 37, INTELLECT = 34, SPIRIT = 14, }, }, ["Fire"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, HASTE_RATING = 53, SPELL_POWER = 46, CRIT_RATING = 43, INTELLECT = 13, }, }, ["Frost"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, HASTE_RATING = 42, SPELL_POWER = 39, CRIT_RATING = 19, INTELLECT = 6, }, }, }, PALADIN = { ["Holy (Healing)"] = { weights = { INTELLECT = 100, MASTERY_RATING = 100, SPELL_POWER = 58, CRIT_RATING = 46, HASTE_RATING = 35, }, }, ["Protection (Tank)"] = { weights = { MASTERY_RATING = 100, STAMINA = 100, AGILITY = 60, EXPERTISE_RATING = 59, DODGE_RATING = 55, PARRY_RATING = 30, STRENGTH = 16, ARMOR = 8, }, }, ["Retribution (DPS)"] = { weights = { MASTERY_RATING = 100, STAMINA = 100, AGILITY = 60, EXPERTISE_RATING = 59, DODGE_RATING = 55, PARRY_RATING = 30, STRENGTH = 16, ARMOR = 8, }, }, }, PRIEST = { ["Discipline (Healing)"] = { weights = { SPELL_POWER = 100, MASTERY_RATING = 100, INTELLECT = 65, HASTE_RATING = 59, CRIT_RATING = 48, SPIRIT = 22, }, }, ["Holy (Healing)"] = { weights = { MASTERY_RATING = 100, INTELLECT = 69, SPELL_POWER = 60, SPIRIT = 52, CRIT_RATING = 38, HASTE_RATING = 31, }, }, ["Shadow Magic (DPS)"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, SPELL_POWER = 76, CRIT_RATING = 54, HASTE_RATING = 50, INTELLECT = 16, SPIRIT = 16, }, }, }, ROGUE = { ["Assassination"] = { weights = { DAMAGE_PER_SECOND = 170, AGILITY = 100, MASTERY_RATING = 100, EXPERTISE_RATING = 87, HIT_RATING = 83, CRIT_RATING = 81, HASTE_RATING = 64, STRENGTH = 55, }, }, ["Combat"] = { weights = { DAMAGE_PER_SECOND = 220, AGILITY = 100, MASTERY_RATING = 100, EXPERTISE_RATING = 82, HIT_RATING = 80, CRIT_RATING = 75, HASTE_RATING = 73, STRENGTH = 55, }, }, ["Subtlety"] = { weights = { DAMAGE_PER_SECOND = 228, EXPERTISE_RATING = 100, AGILITY = 100, MASTERY_RATING = 100, HIT_RATING = 80, HASTE_RATING = 75, CRIT_RATING = 75, STRENGTH = 55, }, }, }, SHAMAN = { ["Elemental Combat (DPS)"] = { weights = { MASTERY_RATING = 100, HIT_RATING = 100, SPELL_POWER = 60, HASTE_RATING = 56, CRIT_RATING = 40, INTELLECT = 11, }, }, ["Enhancement (DPS)"] = { weights = { DAMAGE_PER_SECOND = 135, HIT_RATING = 100, MASTERY_RATING = 100, EXPERTISE_RATING = 84, INTELLECT = 55, AGILITY = 55, CRIT_RATING = 55, HASTE_RATING = 42, STRENGTH = 35, SPELL_POWER = 29, }, }, ["Restoration (Healing)"] = { weights = { MASTERY_RATING = 100, INTELLECT = 85, SPELL_POWER = 77, CRIT_RATING = 62, HASTE_RATING = 35, }, }, }, WARLOCK = { ["Affliction"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, SPELL_POWER = 72, HASTE_RATING = 61, CRIT_RATING = 38, SPIRIT = 34, INTELLECT = 15, }, }, ["Demonology"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, HASTE_RATING = 50, SPELL_POWER = 45, CRIT_RATING = 31, SPIRIT = 29, INTELLECT = 13, }, }, ["Destruction"] = { weights = { MASTERY_RATING = 100, HIT_RATING = 100, SPELL_POWER = 47, HASTE_RATING = 46, SPIRIT = 26, CRIT_RATING = 16, INTELLECT = 13, }, }, }, } local function GetWeights(link) if not info[class] then return {} end local scores = {} for wname, info in pairs(info[class]) do if not link then return scores end local stats = GetItemStats(link) if not stats then return scores end local total = 0 local score = 0 for stat, weight in pairs(info.weights) do total = total + weight local key, value if stat == "ARMOR" then key = "RESISTANCE0_NAME" value = stats[key] else key = "ITEM_MOD_" .. stat .. "_SHORT" value = stats[key] end if not value then key = "ITEM_MOD_" .. stat value = stats[key] end if not value then value = 0 end score = score + value * weight end scores[wname] = score / total end return scores end -- Hook all of the relevant tooltips local lineAdded = {} local function OnTooltipSetItem(tooltip, ...) if not lineAdded[tooltip] then -- Get the item link and fetch the scores local link = select(2, tooltip:GetItem()) local scores = GetWeights(link) local sort = {} for name, score in pairs(scores) do table.insert(sort, name) end table.sort(sort) -- If all scores are 0, then don't display anything local max = 0 for name, score in pairs(scores) do if score > max then max = score end end if max > 0 then tooltip:AddLine(" ") tooltip:AddLine("Equipment ratings from Wowhead.com:") for idx, name in ipairs(sort) do local val = string.format("%0.2f", scores[name]) tooltip:AddDoubleLine(name .. ":", val, 1.0, 1.0, 1.0) end tooltip:AddLine(" ") end lineAdded[tooltip] = true end end local function OnTooltipCleared(tooltip, ...) lineAdded[tooltip] = false end local tooltips = { GameTooltip, ItemRefTooltip, ShoppingTooltip1, ShoppingTooltip2, ShoppingTooltip3, } for idx, tooltip in ipairs(tooltips) do tooltip:HookScript("OnTooltipSetItem", OnTooltipSetItem) tooltip:HookScript("OnTooltipCleared", OnTooltipCleared) end function addon:Enable() -- Calculate the player's 'WowheadGearScore' local slotNames = { "BackSlot", "ChestSlot", "FeetSlot", "Finger0Slot", "Finger1Slot", "HeadSlot", "HandsSlot", "LegsSlot", "NeckSlot", "RangedSlot", "ShoulderSlot", "Trinket0Slot", "Trinket1Slot", "WaistSlot", "WristSlot", "MainHandSlot", "SecondaryHandSlot", } -- local gscores = {} -- for idx, slotName in ipairs(slotNames) do -- local slotNum = GetInventorySlotInfo(slotName) -- local link = GetInventoryItemLink("player", slotNum) -- if link then -- local scores = GetWeights(link) -- for name, score in pairs(scores) do -- if not gscores[name] then gscores[name] = 0 end -- gscores[name] = gscores[name] + score -- end -- end -- end -- for name, score in pairs(gscores) do -- self:Printf("Your '%s' gearscore is %d", name, score) -- end end