local addonName, addon = ... local L = addon.L local class = select(2, UnitClass("player")) local info = { DRUID = { ["Balance (DPS)"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, SPELL_POWER = 66, HASTE_RATING = 54, CRIT_RATING = 43, INTELLECT = 22, SPIRIT = 22, }, }, ["Feral (Tank)"] = { weights = { STAMINA = 100, ARMOR = 75, AGILITY = 48, DODGE_RATING = 41, ---------------------------------------------- ADDITIONAL_ARMOR = 21, ---------------------------------------------- MASTERY_RATING = 16, CRIT_RATING = 13, STRENGTH = 10, EXPERTISE_RATING = 10, ---------------------------------------------- HEALTH = 7, ---------------------------------------------- FERAL_ATTACK_POWER = 5, ATTACK_POWER = 5, HIT_RATING = 5, HASTE_RATING = 1, }, }, ["Feral (DPS)"] = { weights = { DAMAGE_PER_SECOND = 151, AGILITY = 100, STRENGTH = 78, ATTACK_POWER = 37, MASTERY_RATING = 35, HASTE_RATING = 32, EXPERTISE_RATING = 29, HIT_RATING = 28, CRIT_RATING = 28, }, }, ["Restoration (Healing)"] = { weights = { SPELL_POWER = 100, HASTE_RATING = 57, INTELLECT = 51, MASTERY_RATING = 45, SPIRIT = 32, CRIT_RATING = 11, }, }, }, 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 = 2, }, }, }, 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 = { STRENGTH = 100, DAMAGE_PER_SECOND = 100, HIT_RATING = 43, EXPERTISE_RATING = 41, HASTE_RATING = 37, MASTERY_RATING = 35, ATTACK_POWER = 32, CRIT_RATING = 26, }, }, ["Unholy (DPS)"] = { weights = { STRENGTH = 100, DAMAGE_PER_SECOND = 100, HIT_RATING = 25, HASTE_RATING = 25, ATTACK_POWER = 23, EXPERTISE_RATING = 21, CRIT_RATING = 20, MASTERY_RATING = 8, }, }, }, HUNTER = { ["Beast Mastery"] = { weights = { AGILITY = 100, DAMAGE_PER_SECOND = 100, -- This is actually RANGED_DPS. HIT_RATING = 80, CRIT_RATING = 60, MASTERY_RATING = 40, HASTE_RATING = 20, -- Where is attack power? -- Is intellect no longer used? Was a primary stat for BM }, }, ["Marksmanship"] = { weights = { AGILITY = 100, DAMAGE_PER_SECOND = 100, -- ranged dps HIT_RATING = 80, CRIT_RATING = 60, MASTERY_RATING = 40, HASTE_RATING = 20, }, }, ["Survival"] = { weights = { AGILITY = 100, DAMAGE_PER_SECOND = 100, HIT_RATING = 80, CRIT_RATING = 60, MASTERY_RATING = 20, HASTE_RATING = 40, }, }, }, MAGE = { ["Arcane"] = { weights = { SPELL_POWER = 100, INTELLECT = 100, HIT_RATING = 80, HASTE_RATING = 50, CRIT_RATING = 45, MASTERY_RATING = 40, }, }, ["Fire"] = { weights = { INTELLECT = 100, HIT_RATING = 82, SPELL_POWER = 68, CRIT_RATING = 52, MASTERY_RATING = 37, HASTE_RATING = 35, }, }, ["Frost"] = { weights = { HIT_RATING = 100, MASTERY_RATING = 100, HASTE_RATING = 42, SPELL_POWER = 39, CRIT_RATING = 19, INTELLECT = 6, }, }, }, PALADIN = { ["Holy (Healing)"] = { weights = { SPELL_POWER = 100, INTELLECT = 100, HASTE_RATING = 80, SPIRIT = 50, MASTERY_RATING = 50, CRIT_RATING = 25, }, }, ["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 = { STRENGTH = 100, DAMAGE_PER_SECOND = 100, ATTACK_POWER = 44, HIT_RATING = 35, EXPERTISE_RATING = 22, HASTE_RATING = 18, CRIT_RATING = 16, MASTERY_RATING = 9, }, }, }, PRIEST = { ["Discipline (Healing)"] = { weights = { INTELLECT = 100, SPIRIT = 80, SPELL_POWER = 19, CRIT_RATING = 11, HASTE_RATING = 10, MASTERY_RATING = 6, }, }, ["Holy (Healing)"] = { weights = { MASTERY_RATING = 100, INTELLECT = 69, SPELL_POWER = 60, SPIRIT = 52, CRIT_RATING = 38, HASTE_RATING = 31, }, }, ["Shadow Magic (DPS)"] = { weights = { INTELLECT = 100, SPELL_POWER = 79, HASTE_RATING = 50, CRIT_RATING = 40, MASTERY_RATING = 38, SPIRIT = 37, HIT_RATING = 37, }, }, }, ROGUE = { ["Assassination"] = { weights = { DAMAGE_PER_SECOND = 100, AGILITY = 100, MASTERY_RATING = 50, EXPERTISE_RATING = 42, HIT_RATING = 67, CRIT_RATING = 35, HASTE_RATING = 46, }, }, ["Combat"] = { weights = { DAMAGE_PER_SECOND = 100, AGILITY = 100, MASTERY_RATING = 33, EXPERTISE_RATING = 59, HIT_RATING = 70, CRIT_RATING = 35, HASTE_RATING = 56, }, }, ["Subtlety"] = { weights = { DAMAGE_PER_SECOND = 100, -- melee EXPERTISE_RATING = 33, AGILITY = 100, MASTERY_RATING = 20, HIT_RATING = 40, HASTE_RATING = 37, CRIT_RATING = 31, -- where is attack power? }, }, }, SHAMAN = { ["Elemental Combat (DPS)"] = { weights = { HIT_RATING = 100, SPELL_POWER = 80, INTELLECT = 80, HASTE_RATING = 60, MASTERY_RATING = 40, CRIT_RATING = 20, }, }, ["Enhancement (DPS)"] = { weights = { DAMAGE_PER_SECOND = 124, AGILITY = 100, HIT_RATING = 60, EXPERTISE_RATING = 48, MASTERY_RATING = 44, STRENGTH = 42, ATTACK_POWER = 40, INTELLECT = 36, SPELL_POWER = 36, CRIT_RATING = 28, HASTE_RATING = 16, }, }, ["Restoration (Healing)"] = { weights = { INTELLECT = 100, SPELL_POWER = 83, SPIRIT = 75, HASTE_RATING = 67, CRIT_RATING = 58, MASTERY_RATING = 42, STAMINA = 8, }, }, }, WARLOCK = { ["Affliction"] = { weights = { INTELLECT = 100, SPELL_POWER = 81, HIT_RATING = 52, HASTE_RATING = 43, CRIT_RATING = 32, MASTERY_RATING = 30, STAMINA = 1, }, }, ["Demonology"] = { weights = { INTELLECT = 100, SPELL_POWER = 79, HIT_RATING = 63, HASTE_RATING = 40, CRIT_RATING = 35, MASTERY_RATING = 31, STAMINA = 1, }, }, ["Destruction"] = { weights = { INTELLECT = 100, SPELL_POWER = 77, HIT_RATING = 64, HASTE_RATING = 36, CRIT_RATING = 34, MASTERY_RATING = 29, STAMINA = 1, }, }, }, } 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