--[[-------------------------------------------------------------------- Ovale Spell Priority Copyright (C) 2011, 2012 Sidoine Copyright (C) 2012, 2013 Johnny C. Lam This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License in the LICENSE file accompanying this program. --]]-------------------------------------------------------------------- local addonName, Ovale = ... local OvaleEquipement = Ovale:NewModule("OvaleEquipement", "AceEvent-3.0") Ovale.OvaleEquipement = OvaleEquipement --<private-static-properties> -- Profiling set-up. local Profiler = Ovale.Profiler local profiler = nil do local group = OvaleEquipement:GetName() Profiler:RegisterProfilingGroup(group) profiler = Profiler:GetProfilingGroup(group) end local pairs = pairs local strgsub = string.gsub local strmatch = string.match local tonumber = tonumber local tostring = tostring local wipe = table.wipe local API_CreateFrame = CreateFrame local API_GetAuctionItemSubClasses = GetAuctionItemSubClasses local API_GetInventoryItemID = GetInventoryItemID local API_GetInventoryItemGems = GetInventoryItemGems local API_GetInventorySlotInfo = GetInventorySlotInfo local API_GetItemInfo = GetItemInfo local API_UnitClass = UnitClass local INVSLOT_AMMO = INVSLOT_AMMO local INVSLOT_BACK = INVSLOT_BACK local INVSLOT_BODY = INVSLOT_BODY local INVSLOT_CHEST = INVSLOT_CHEST local INVSLOT_FEET = INVSLOT_FEET local INVSLOT_FINGER1 = INVSLOT_FINGER1 local INVSLOT_FINGER2 = INVSLOT_FINGER2 local INVSLOT_FIRST_EQUIPPED = INVSLOT_FIRST_EQUIPPED local INVSLOT_HAND = INVSLOT_HAND local INVSLOT_HEAD = INVSLOT_HEAD local INVSLOT_LAST_EQUIPPED = INVSLOT_LAST_EQUIPPED local INVSLOT_LEGS = INVSLOT_LEGS local INVSLOT_MAINHAND = INVSLOT_MAINHAND local INVSLOT_NECK = INVSLOT_NECK local INVSLOT_OFFHAND = INVSLOT_OFFHAND local INVSLOT_RANGED = INVSLOT_RANGED local INVSLOT_SHOULDER = INVSLOT_SHOULDER local INVSLOT_TABARD = INVSLOT_TABARD local INVSLOT_TRINKET1 = INVSLOT_TRINKET1 local INVSLOT_TRINKET2 = INVSLOT_TRINKET2 local INVSLOT_WAIST = INVSLOT_WAIST local INVSLOT_WRIST = INVSLOT_WRIST -- Player's class. local _, self_class = API_UnitClass("player") -- frame for tooltip-scanning local self_tooltip = API_CreateFrame("GameTooltip", addonName .. "ScanningTooltip", nil, "GameTooltipTemplate") do self_tooltip:SetOwner(UIParent, "ANCHOR_NONE") end local OVALE_ITEM_LEVEL_PATTERN = "^" .. strgsub(ITEM_LEVEL, "%%d", "(%%d+)") -- equipment slot names local OVALE_SLOTNAME = { AmmoSlot = true, BackSlot = true, ChestSlot = true, FeetSlot = true, Finger0Slot = true, Finger1Slot = true, HandsSlot = true, HeadSlot = true, LegsSlot = true, MainHandSlot = true, NeckSlot = true, SecondaryHandSlot = true, ShirtSlot = true, ShoulderSlot = true, TabardSlot = true, Trinket0Slot = true, Trinket1Slot = true, WaistSlot = true, WristSlot = true, } do for slotName in pairs(OVALE_SLOTNAME) do OVALE_SLOTNAME[slotName] = API_GetInventorySlotInfo(slotName) end end -- slots that can contain pieces from armor sets local OVALE_ARMORSET_SLOT_IDS = { INVSLOT_CHEST, INVSLOT_HAND, INVSLOT_HEAD, INVSLOT_LEGS, INVSLOT_SHOULDER } -- database of armor set items: OVALE_ARMORSET[itemId] = armorSetName local OVALE_ARMORSET = { -- Death Knight [85314] = "T14_tank", [85315] = "T14_tank", [85316] = "T14_tank", [85317] = "T14_tank", [85318] = "T14_tank", [86654] = "T14_tank", [86655] = "T14_tank", [86656] = "T14_tank", [86657] = "T14_tank", [86658] = "T14_tank", [86918] = "T14_tank", [86919] = "T14_tank", [86920] = "T14_tank", [86921] = "T14_tank", [86922] = "T14_tank", [95225] = "T15_melee", [95226] = "T15_melee", [95227] = "T15_melee", [95228] = "T15_melee", [95229] = "T15_melee", [95230] = "T15_tank", [95231] = "T15_tank", [95232] = "T15_tank", [95233] = "T15_tank", [95234] = "T15_tank", [95825] = "T15_melee", [95826] = "T15_melee", [95827] = "T15_melee", [95828] = "T15_melee", [95829] = "T15_melee", [95830] = "T15_tank", [95831] = "T15_tank", [95832] = "T15_tank", [95833] = "T15_tank", [95834] = "T15_tank", [96569] = "T15_melee", [96570] = "T15_melee", [96571] = "T15_melee", [96572] = "T15_melee", [96573] = "T15_melee", [96574] = "T15_tank", [96575] = "T15_tank", [96576] = "T15_tank", [96577] = "T15_tank", [96578] = "T15_tank", [99039] = "T16_tank", [99040] = "T16_tank", [99048] = "T16_tank", [99049] = "T16_tank", [99060] = "T16_tank", [99057] = "T16_melee", [99058] = "T16_melee", [99059] = "T16_melee", [99066] = "T16_melee", [99067] = "T16_melee", [99179] = "T16_tank", [99188] = "T16_tank", [99189] = "T16_tank", [99190] = "T16_tank", [99191] = "T16_tank", [99186] = "T16_melee", [99187] = "T16_melee", [99192] = "T16_melee", [99193] = "T16_melee", [99194] = "T16_melee", [99323] = "T16_tank", [99324] = "T16_tank", [99325] = "T16_tank", [99330] = "T16_tank", [99331] = "T16_tank", [99335] = "T16_melee", [99336] = "T16_melee", [99337] = "T16_melee", [99338] = "T16_melee", [99339] = "T16_melee", [99564] = "T16_tank", [99604] = "T16_tank", [99605] = "T16_tank", [99640] = "T16_tank", [99652] = "T16_tank", [99571] = "T16_melee", [99572] = "T16_melee", [99608] = "T16_melee", [99609] = "T16_melee", [99639] = "T16_melee", -- Druid [85304] = "T14_caster", [85305] = "T14_caster", [85306] = "T14_caster", [85307] = "T14_caster", [85308] = "T14_caster", [85309] = "T14_melee", [85310] = "T14_melee", [85311] = "T14_melee", [85312] = "T14_melee", [85313] = "T14_melee", [85354] = "T14_heal", [85355] = "T14_heal", [85356] = "T14_heal", [85357] = "T14_heal", [85358] = "T14_heal", [85379] = "T14_tank", [85380] = "T14_tank", [85381] = "T14_tank", [85382] = "T14_tank", [85383] = "T14_tank", [86644] = "T14_caster", [86645] = "T14_caster", [86646] = "T14_caster", [86647] = "T14_caster", [86648] = "T14_caster", [86649] = "T14_melee", [86650] = "T14_melee", [86651] = "T14_melee", [86652] = "T14_melee", [86653] = "T14_melee", [86694] = "T14_heal", [86695] = "T14_heal", [86696] = "T14_heal", [86697] = "T14_heal", [86698] = "T14_heal", [86719] = "T14_tank", [86720] = "T14_tank", [86721] = "T14_tank", [86722] = "T14_tank", [86723] = "T14_tank", [86923] = "T14_melee", [86924] = "T14_melee", [86925] = "T14_melee", [86926] = "T14_melee", [86927] = "T14_melee", [86928] = "T14_heal", [86929] = "T14_heal", [86930] = "T14_heal", [86931] = "T14_heal", [86932] = "T14_heal", [86933] = "T14_caster", [86934] = "T14_caster", [86935] = "T14_caster", [86936] = "T14_caster", [86937] = "T14_caster", [86938] = "T14_tank", [86939] = "T14_tank", [86940] = "T14_tank", [86941] = "T14_tank", [86942] = "T14_tank", [95235] = "T15_melee", [95236] = "T15_melee", [95237] = "T15_melee", [95238] = "T15_melee", [95239] = "T15_melee", [95245] = "T15_caster", [95246] = "T15_caster", [95247] = "T15_caster", [95248] = "T15_caster", [95249] = "T15_caster", [95250] = "T15_tank", [95251] = "T15_tank", [95252] = "T15_tank", [95253] = "T15_tank", [95254] = "T15_tank", [95835] = "T15_melee", [95836] = "T15_melee", [95837] = "T15_melee", [95838] = "T15_melee", [95839] = "T15_melee", [95845] = "T15_caster", [95846] = "T15_caster", [95847] = "T15_caster", [95848] = "T15_caster", [95849] = "T15_caster", [95850] = "T15_tank", [95851] = "T15_tank", [95852] = "T15_tank", [95853] = "T15_tank", [95854] = "T15_tank", [96579] = "T15_melee", [96580] = "T15_melee", [96581] = "T15_melee", [96582] = "T15_melee", [96583] = "T15_melee", [96589] = "T15_caster", [96590] = "T15_caster", [96591] = "T15_caster", [96592] = "T15_caster", [96593] = "T15_caster", [96594] = "T15_tank", [96595] = "T15_tank", [96596] = "T15_tank", [96597] = "T15_tank", [96598] = "T15_tank", [98978] = "T16_tank", [98981] = "T16_tank", [98999] = "T16_tank", [99000] = "T16_tank", [99001] = "T16_tank", [98994] = "T16_caster", [98995] = "T16_caster", [98996] = "T16_caster", [98997] = "T16_caster", [98998] = "T16_caster", [99012] = "T16_heal", [99013] = "T16_heal", [99014] = "T16_heal", [99015] = "T16_heal", [99016] = "T16_heal", [99022] = "T16_melee", [99041] = "T16_melee", [99042] = "T16_melee", [99043] = "T16_melee", [99044] = "T16_melee", [99163] = "T16_tank", [99164] = "T16_tank", [99165] = "T16_tank", [99166] = "T16_tank", [99170] = "T16_tank", [99169] = "T16_caster", [99174] = "T16_caster", [99175] = "T16_caster", [99176] = "T16_caster", [99177] = "T16_caster", [99171] = "T16_heal", [99172] = "T16_heal", [99173] = "T16_heal", [99178] = "T16_heal", [99185] = "T16_heal", [99180] = "T16_melee", [99181] = "T16_melee", [99182] = "T16_melee", [99183] = "T16_melee", [99184] = "T16_melee", [99322] = "T16_melee", [99326] = "T16_melee", [99327] = "T16_melee", [99328] = "T16_melee", [99329] = "T16_melee", [99419] = "T16_tank", [99420] = "T16_tank", [99421] = "T16_tank", [99422] = "T16_tank", [99423] = "T16_tank", [99427] = "T16_caster", [99428] = "T16_caster", [99432] = "T16_caster", [99433] = "T16_caster", [99434] = "T16_caster", [99429] = "T16_heal", [99430] = "T16_heal", [99431] = "T16_heal", [99435] = "T16_heal", [99436] = "T16_heal", [99581] = "T16_heal", [99582] = "T16_heal", [99583] = "T16_heal", [99637] = "T16_heal", [99638] = "T16_heal", [99589] = "T16_melee", [99599] = "T16_melee", [99600] = "T16_melee", [99632] = "T16_melee", [99633] = "T16_melee", [99610] = "T16_tank", [99622] = "T16_tank", [99623] = "T16_tank", [99624] = "T16_tank", [99664] = "T16_tank", [99617] = "T16_caster", [99618] = "T16_caster", [99619] = "T16_caster", [99620] = "T16_caster", [99621] = "T16_caster", -- Hunter [85294] = "T14_melee", [85295] = "T14_melee", [85296] = "T14_melee", [85297] = "T14_melee", [85298] = "T14_melee", [86634] = "T14_melee", [86635] = "T14_melee", [86636] = "T14_melee", [86637] = "T14_melee", [86638] = "T14_melee", [87002] = "T14_melee", [87003] = "T14_melee", [87004] = "T14_melee", [87005] = "T14_melee", [87006] = "T14_melee", [95255] = "T15_melee", [95256] = "T15_melee", [95257] = "T15_melee", [95258] = "T15_melee", [95259] = "T15_melee", [95882] = "T15_melee", [95883] = "T15_melee", [95884] = "T15_melee", [95885] = "T15_melee", [95886] = "T15_melee", [96626] = "T15_melee", [96627] = "T15_melee", [96628] = "T15_melee", [96629] = "T15_melee", [96630] = "T15_melee", [99080] = "T16_melee", [99081] = "T16_melee", [99082] = "T16_melee", [99085] = "T16_melee", [99086] = "T16_melee", [99157] = "T16_melee", [99158] = "T16_melee", [99159] = "T16_melee", [99167] = "T16_melee", [99168] = "T16_melee", [99402] = "T16_melee", [99403] = "T16_melee", [99404] = "T16_melee", [99405] = "T16_melee", [99406] = "T16_melee", [99573] = "T16_melee", [99574] = "T16_melee", [99577] = "T16_melee", [99578] = "T16_melee", [99660] = "T16_melee", -- Mage [85374] = "T14_caster", [85375] = "T14_caster", [85376] = "T14_caster", [85377] = "T14_caster", [85378] = "T14_caster", [86714] = "T14_caster", [86715] = "T14_caster", [86716] = "T14_caster", [86717] = "T14_caster", [86718] = "T14_caster", [87007] = "T14_caster", [87008] = "T14_caster", [87009] = "T14_caster", [87010] = "T14_caster", [87011] = "T14_caster", [95260] = "T15_caster", [95261] = "T15_caster", [95262] = "T15_caster", [95263] = "T15_caster", [95264] = "T15_caster", [95890] = "T15_caster", [95891] = "T15_caster", [95892] = "T15_caster", [95893] = "T15_caster", [95894] = "T15_caster", [96634] = "T15_caster", [96635] = "T15_caster", [96636] = "T15_caster", [96637] = "T15_caster", [96638] = "T15_caster", [99077] = "T16_caster", [99078] = "T16_caster", [99079] = "T16_caster", [99083] = "T16_caster", [99084] = "T16_caster", [99152] = "T16_caster", [99153] = "T16_caster", [99160] = "T16_caster", [99161] = "T16_caster", [99162] = "T16_caster", [99397] = "T16_caster", [99398] = "T16_caster", [99399] = "T16_caster", [99400] = "T16_caster", [99401] = "T16_caster", [99575] = "T16_caster", [99576] = "T16_caster", [99657] = "T16_caster", [99658] = "T16_caster", [99659] = "T16_caster", -- Monk [85394] = "T14_melee", [85395] = "T14_melee", [85396] = "T14_melee", [85397] = "T14_melee", [85398] = "T14_melee", [86734] = "T14_melee", [86735] = "T14_melee", [86736] = "T14_melee", [86737] = "T14_melee", [86738] = "T14_melee", [87084] = "T14_melee", [87085] = "T14_melee", [87086] = "T14_melee", [87087] = "T14_melee", [87088] = "T14_melee", [95270] = "T15_heal", [95271] = "T15_heal", [95272] = "T15_heal", [95273] = "T15_heal", [95274] = "T15_heal", [95275] = "T15_tank", [95276] = "T15_tank", [95277] = "T15_tank", [95278] = "T15_tank", [95279] = "T15_tank", [95900] = "T15_heal", [95901] = "T15_heal", [95902] = "T15_heal", [95903] = "T15_heal", [95904] = "T15_heal", [95905] = "T15_tank", [95906] = "T15_tank", [95907] = "T15_tank", [95908] = "T15_tank", [95909] = "T15_tank", [96644] = "T15_heal", [96645] = "T15_heal", [96646] = "T15_heal", [96647] = "T15_heal", [96648] = "T15_heal", [96649] = "T15_tank", [96650] = "T15_tank", [96651] = "T15_tank", [96652] = "T15_tank", [96653] = "T15_tank", [99050] = "T16_tank", [99051] = "T16_tank", [99063] = "T16_tank", [99064] = "T16_tank", [99065] = "T16_tank", [99061] = "T16_heal", [99062] = "T16_heal", [99068] = "T16_heal", [99069] = "T16_heal", [99070] = "T16_heal", [99071] = "T16_melee", [99072] = "T16_melee", [99073] = "T16_melee", [99074] = "T16_melee", [99075] = "T16_melee", [99140] = "T16_tank", [99141] = "T16_tank", [99142] = "T16_tank", [99143] = "T16_tank", [99144] = "T16_tank", [99145] = "T16_melee", [99146] = "T16_melee", [99154] = "T16_melee", [99155] = "T16_melee", [99156] = "T16_melee", [99147] = "T16_heal", [99148] = "T16_heal", [99149] = "T16_heal", [99150] = "T16_heal", [99151] = "T16_heal", [99381] = "T16_heal", [99388] = "T16_heal", [99389] = "T16_heal", [99390] = "T16_heal", [99391] = "T16_heal", [99382] = "T16_tank", [99383] = "T16_tank", [99384] = "T16_tank", [99385] = "T16_tank", [99386] = "T16_tank", [99392] = "T16_melee", [99393] = "T16_melee", [99394] = "T16_melee", [99395] = "T16_melee", [99396] = "T16_melee", [99552] = "T16_heal", [99553] = "T16_heal", [99554] = "T16_heal", [99641] = "T16_heal", [99642] = "T16_heal", [99555] = "T16_melee", [99556] = "T16_melee", [99653] = "T16_melee", [99654] = "T16_melee", [99655] = "T16_melee", [99565] = "T16_tank", [99606] = "T16_tank", [99607] = "T16_tank", [99643] = "T16_tank", [99644] = "T16_tank", -- Paladin [85319] = "T14_tank", [85320] = "T14_tank", [85321] = "T14_tank", [85322] = "T14_tank", [85323] = "T14_tank", [85339] = "T14_melee", [85340] = "T14_melee", [85341] = "T14_melee", [85342] = "T14_melee", [85343] = "T14_melee", [85344] = "T14_heal", [85345] = "T14_heal", [85346] = "T14_heal", [85347] = "T14_heal", [85348] = "T14_heal", [86659] = "T14_tank", [86660] = "T14_tank", [86661] = "T14_tank", [86662] = "T14_tank", [86663] = "T14_tank", [86679] = "T14_melee", [86680] = "T14_melee", [86681] = "T14_melee", [86682] = "T14_melee", [86683] = "T14_melee", [86684] = "T14_heal", [86685] = "T14_heal", [86686] = "T14_heal", [86687] = "T14_heal", [86688] = "T14_heal", [87099] = "T14_melee", [87100] = "T14_melee", [87101] = "T14_melee", [87102] = "T14_melee", [87103] = "T14_melee", [87104] = "T14_heal", [87105] = "T14_heal", [87106] = "T14_heal", [87107] = "T14_heal", [87108] = "T14_heal", [87109] = "T14_tank", [87110] = "T14_tank", [87111] = "T14_tank", [87112] = "T14_tank", [87113] = "T14_tank", [95280] = "T15_melee", [95281] = "T15_melee", [95282] = "T15_melee", [95283] = "T15_melee", [95284] = "T15_melee", [95290] = "T15_tank", [95291] = "T15_tank", [95292] = "T15_tank", [95293] = "T15_tank", [95294] = "T15_tank", [95910] = "T15_melee", [95911] = "T15_melee", [95912] = "T15_melee", [95913] = "T15_melee", [95914] = "T15_melee", [95920] = "T15_tank", [95921] = "T15_tank", [95922] = "T15_tank", [95923] = "T15_tank", [95924] = "T15_tank", [96654] = "T15_melee", [96655] = "T15_melee", [96656] = "T15_melee", [96657] = "T15_melee", [96658] = "T15_melee", [96664] = "T15_tank", [96665] = "T15_tank", [96666] = "T15_tank", [96667] = "T15_tank", [96668] = "T15_tank", [98979] = "T16_heal", [98980] = "T16_heal", [98982] = "T16_heal", [99003] = "T16_heal", [99076] = "T16_heal", [98985] = "T16_melee", [98986] = "T16_melee", [98987] = "T16_melee", [99002] = "T16_melee", [99052] = "T16_melee", [99026] = "T16_tank", [99027] = "T16_tank", [99028] = "T16_tank", [99029] = "T16_tank", [99031] = "T16_tank", [99124] = "T16_heal", [99125] = "T16_heal", [99133] = "T16_heal", [99134] = "T16_heal", [99135] = "T16_heal", [99126] = "T16_tank", [99127] = "T16_tank", [99128] = "T16_tank", [99129] = "T16_tank", [99130] = "T16_tank", [99132] = "T16_melee", [99136] = "T16_melee", [99137] = "T16_melee", [99138] = "T16_melee", [99139] = "T16_melee", [99364] = "T16_tank", [99368] = "T16_tank", [99369] = "T16_tank", [99370] = "T16_tank", [99371] = "T16_tank", [99372] = "T16_melee", [99373] = "T16_melee", [99379] = "T16_melee", [99380] = "T16_melee", [99387] = "T16_melee", [99374] = "T16_heal", [99375] = "T16_heal", [99376] = "T16_heal", [99377] = "T16_heal", [99378] = "T16_heal", [99566] = "T16_melee", [99625] = "T16_melee", [99651] = "T16_melee", [99661] = "T16_melee", [99662] = "T16_melee", [99593] = "T16_tank", [99594] = "T16_tank", [99595] = "T16_tank", [99596] = "T16_tank", [99598] = "T16_tank", [99626] = "T16_heal", [99648] = "T16_heal", [99656] = "T16_heal", [99665] = "T16_heal", [99666] = "T16_heal", -- Priest [85359] = "T14_heal", [85360] = "T14_heal", [85361] = "T14_heal", [85362] = "T14_heal", [85363] = "T14_heal", [85364] = "T14_caster", [85365] = "T14_caster", [85366] = "T14_caster", [85367] = "T14_caster", [85368] = "T14_caster", [86699] = "T14_heal", [86700] = "T14_heal", [86701] = "T14_heal", [86702] = "T14_heal", [86703] = "T14_heal", [86704] = "T14_caster", [86705] = "T14_caster", [86706] = "T14_caster", [86707] = "T14_caster", [86708] = "T14_caster", [87114] = "T14_heal", [87115] = "T14_heal", [87116] = "T14_heal", [87117] = "T14_heal", [87118] = "T14_heal", [87119] = "T14_caster", [87120] = "T14_caster", [87121] = "T14_caster", [87122] = "T14_caster", [87123] = "T14_caster", [99004] = "T16_caster", [99005] = "T16_caster", [99019] = "T16_caster", [99020] = "T16_caster", [99021] = "T16_caster", [99017] = "T16_heal", [99018] = "T16_heal", [99023] = "T16_heal", [99024] = "T16_heal", [99025] = "T16_heal", [99110] = "T16_caster", [99111] = "T16_caster", [99121] = "T16_caster", [99122] = "T16_caster", [99123] = "T16_caster", [99117] = "T16_heal", [99118] = "T16_heal", [99119] = "T16_heal", [99120] = "T16_heal", [99131] = "T16_heal", [99357] = "T16_heal", [99358] = "T16_heal", [99365] = "T16_heal", [99366] = "T16_heal", [99367] = "T16_heal", [99359] = "T16_caster", [99360] = "T16_caster", [99361] = "T16_caster", [99362] = "T16_caster", [99363] = "T16_caster", [99584] = "T16_heal", [99585] = "T16_heal", [99590] = "T16_heal", [99591] = "T16_heal", [99592] = "T16_heal", [99586] = "T16_caster", [99587] = "T16_caster", [99588] = "T16_caster", [99627] = "T16_caster", [99628] = "T16_caster", -- Rogue [85299] = "T14_melee", [85300] = "T14_melee", [85301] = "T14_melee", [85302] = "T14_melee", [85303] = "T14_melee", [86639] = "T14_melee", [86640] = "T14_melee", [86641] = "T14_melee", [86642] = "T14_melee", [86643] = "T14_melee", [87124] = "T14_melee", [87125] = "T14_melee", [87126] = "T14_melee", [87127] = "T14_melee", [87128] = "T14_melee", [95305] = "T15_melee", [95306] = "T15_melee", [95307] = "T15_melee", [95308] = "T15_melee", [95309] = "T15_melee", [95935] = "T15_melee", [95936] = "T15_melee", [95937] = "T15_melee", [95938] = "T15_melee", [95939] = "T15_melee", [96679] = "T15_melee", [96680] = "T15_melee", [96681] = "T15_melee", [96682] = "T15_melee", [96683] = "T15_melee", [99006] = "T16_melee", [99007] = "T16_melee", [99008] = "T16_melee", [99009] = "T16_melee", [99010] = "T16_melee", [99112] = "T16_melee", [99113] = "T16_melee", [99114] = "T16_melee", [99115] = "T16_melee", [99116] = "T16_melee", [99348] = "T16_melee", [99349] = "T16_melee", [99350] = "T16_melee", [99355] = "T16_melee", [99356] = "T16_melee", [99629] = "T16_melee", [99630] = "T16_melee", [99631] = "T16_melee", [99634] = "T16_melee", [99635] = "T16_melee", -- Shaman [95315] = "T15_melee", [95316] = "T15_melee", [95317] = "T15_melee", [95318] = "T15_melee", [95319] = "T15_melee", [95320] = "T15_caster", [95321] = "T15_caster", [95322] = "T15_caster", [95323] = "T15_caster", [95324] = "T15_caster", [95945] = "T15_melee", [95946] = "T15_melee", [95947] = "T15_melee", [95948] = "T15_melee", [95949] = "T15_melee", [95950] = "T15_caster", [95951] = "T15_caster", [95952] = "T15_caster", [95953] = "T15_caster", [95954] = "T15_caster", [96689] = "T15_melee", [96690] = "T15_melee", [96691] = "T15_melee", [96692] = "T15_melee", [96693] = "T15_melee", [96694] = "T15_caster", [96695] = "T15_caster", [96696] = "T15_caster", [96697] = "T15_caster", [96698] = "T15_caster", [98922] = "T16_melee", [98977] = "T16_melee", [98983] = "T16_melee", [98984] = "T16_melee", [98993] = "T16_melee", [98988] = "T16_heal", [98989] = "T16_heal", [98990] = "T16_heal", [98991] = "T16_heal", [99011] = "T16_heal", [99087] = "T16_caster", [99088] = "T16_caster", [99089] = "T16_caster", [99090] = "T16_caster", [99091] = "T16_caster", [99092] = "T16_caster", [99093] = "T16_caster", [99094] = "T16_caster", [99095] = "T16_caster", [99106] = "T16_caster", [99099] = "T16_heal", [99100] = "T16_heal", [99107] = "T16_heal", [99108] = "T16_heal", [99109] = "T16_heal", [99101] = "T16_melee", [99102] = "T16_melee", [99103] = "T16_melee", [99104] = "T16_melee", [99105] = "T16_melee", [99332] = "T16_caster", [99333] = "T16_caster", [99334] = "T16_caster", [99344] = "T16_caster", [99345] = "T16_caster", [99340] = "T16_melee", [99341] = "T16_melee", [99342] = "T16_melee", [99343] = "T16_melee", [99347] = "T16_melee", [99346] = "T16_heal", [99351] = "T16_heal", [99352] = "T16_heal", [99353] = "T16_heal", [99354] = "T16_heal", [99579] = "T16_caster", [99580] = "T16_caster", [99645] = "T16_caster", [99646] = "T16_caster", [99647] = "T16_caster", [99611] = "T16_heal", [99612] = "T16_heal", [99613] = "T16_heal", [99614] = "T16_heal", [99636] = "T16_heal", [99615] = "T16_melee", [99616] = "T16_melee", [99649] = "T16_melee", [99650] = "T16_melee", [99663] = "T16_melee", --Warlock [85369] = "T14_caster", [85370] = "T14_caster", [85371] = "T14_caster", [85372] = "T14_caster", [85373] = "T14_caster", [86709] = "T14_caster", [86710] = "T14_caster", [86711] = "T14_caster", [86712] = "T14_caster", [86713] = "T14_caster", [87187] = "T14_caster", [87188] = "T14_caster", [87189] = "T14_caster", [87190] = "T14_caster", [87191] = "T14_caster", [95325] = "T15_caster", [95326] = "T15_caster", [95327] = "T15_caster", [95328] = "T15_caster", [95329] = "T15_caster", [95981] = "T15_caster", [95982] = "T15_caster", [95983] = "T15_caster", [95984] = "T15_caster", [95985] = "T15_caster", [96725] = "T15_caster", [96726] = "T15_caster", [96727] = "T15_caster", [96728] = "T15_caster", [96729] = "T15_caster", [99045] = "T16_caster", [99053] = "T16_caster", [99054] = "T16_caster", [99055] = "T16_caster", [99056] = "T16_caster", [99096] = "T16_caster", [99097] = "T16_caster", [99098] = "T16_caster", [99204] = "T16_caster", [99205] = "T16_caster", [99416] = "T16_caster", [99417] = "T16_caster", [99424] = "T16_caster", [99425] = "T16_caster", [99426] = "T16_caster", [99567] = "T16_caster", [99568] = "T16_caster", [99569] = "T16_caster", [99570] = "T16_caster", [99601] = "T16_caster", -- Warrior [85324] = "T14_tank", [85325] = "T14_tank", [85326] = "T14_tank", [85327] = "T14_tank", [85328] = "T14_tank", [85329] = "T14_melee", [85330] = "T14_melee", [85331] = "T14_melee", [85332] = "T14_melee", [85333] = "T14_melee", [86664] = "T14_tank", [86665] = "T14_tank", [86666] = "T14_tank", [86667] = "T14_tank", [86668] = "T14_tank", [86669] = "T14_melee", [86670] = "T14_melee", [86671] = "T14_melee", [86672] = "T14_melee", [86673] = "T14_melee", [87192] = "T14_melee", [87193] = "T14_melee", [87194] = "T14_melee", [87195] = "T14_melee", [87196] = "T14_melee", [87197] = "T14_tank", [87198] = "T14_tank", [87199] = "T14_tank", [87200] = "T14_tank", [87201] = "T14_tank", [95330] = "T15_melee", [95331] = "T15_melee", [95332] = "T15_melee", [95333] = "T15_melee", [95334] = "T15_melee", [95986] = "T15_melee", [95987] = "T15_melee", [95988] = "T15_melee", [95989] = "T15_melee", [95990] = "T15_melee", [96730] = "T15_melee", [96731] = "T15_melee", [96732] = "T15_melee", [96733] = "T15_melee", [96734] = "T15_melee", [99030] = "T16_tank", [99032] = "T16_tank", [99033] = "T16_tank", [99037] = "T16_tank", [99038] = "T16_tank", [99034] = "T16_melee", [99035] = "T16_melee", [99036] = "T16_melee", [99046] = "T16_melee", [99047] = "T16_melee", [99195] = "T16_tank", [99196] = "T16_tank", [99201] = "T16_tank", [99202] = "T16_tank", [99203] = "T16_tank", [99197] = "T16_melee", [99198] = "T16_melee", [99199] = "T16_melee", [99200] = "T16_melee", [99206] = "T16_melee", [99407] = "T16_tank", [99408] = "T16_tank", [99409] = "T16_tank", [99410] = "T16_tank", [99415] = "T16_tank", [99411] = "T16_melee", [99412] = "T16_melee", [99413] = "T16_melee", [99414] = "T16_melee", [99418] = "T16_melee", [99557] = "T16_tank", [99558] = "T16_tank", [99562] = "T16_tank", [99563] = "T16_tank", [99597] = "T16_tank", [99559] = "T16_melee", [99560] = "T16_melee", [99561] = "T16_melee", [99602] = "T16_melee", [99603] = "T16_melee", } local OVALE_WEAPON_CLASS = {} do OVALE_WEAPON_CLASS[1], -- "One-Handed Axes" OVALE_WEAPON_CLASS[2], -- "Two-Handed Axes" OVALE_WEAPON_CLASS[3], -- "Bows" OVALE_WEAPON_CLASS[4], -- "Guns" OVALE_WEAPON_CLASS[5], -- "One-Handed Maces" OVALE_WEAPON_CLASS[6], -- "Two-Handed Maces" OVALE_WEAPON_CLASS[7], -- "Polearms" OVALE_WEAPON_CLASS[8], -- "One-Handed Swords" OVALE_WEAPON_CLASS[9], -- "Two-Handed Swords" OVALE_WEAPON_CLASS[10], -- "Staves" OVALE_WEAPON_CLASS[11], -- "Fist Weapons" OVALE_WEAPON_CLASS[12], -- "Miscellaneous" OVALE_WEAPON_CLASS[13], -- "Daggers" OVALE_WEAPON_CLASS[14], -- "Thrown" OVALE_WEAPON_CLASS[15], -- "Crossbows" OVALE_WEAPON_CLASS[16], -- "Wands" OVALE_WEAPON_CLASS[17] = API_GetAuctionItemSubClasses(1) -- "Fishing Poles" end local OVALE_META_GEM = nil do local _, _, _, _, _, _, name = API_GetAuctionItemSubClasses(8) -- "8" is "Gem" OVALE_META_GEM = name end -- Normalized weapon attack speeds (http://www.wowpedia.org/Normalization) local OVALE_NORMALIZED_WEAPON_SPEED = { [OVALE_WEAPON_CLASS[1]] = 2.4, [OVALE_WEAPON_CLASS[2]] = 3.3, [OVALE_WEAPON_CLASS[3]] = 2.8, [OVALE_WEAPON_CLASS[4]] = 2.8, [OVALE_WEAPON_CLASS[5]] = 2.4, [OVALE_WEAPON_CLASS[6]] = 3.3, [OVALE_WEAPON_CLASS[7]] = 3.3, [OVALE_WEAPON_CLASS[8]] = 2.4, [OVALE_WEAPON_CLASS[9]] = 3.3, [OVALE_WEAPON_CLASS[10]] = 3.3, [OVALE_WEAPON_CLASS[11]] = 2.4, [OVALE_WEAPON_CLASS[12]] = 2.4, -- ?? [OVALE_WEAPON_CLASS[13]] = 1.7, [OVALE_WEAPON_CLASS[14]] = 1.7, -- ?? [OVALE_WEAPON_CLASS[15]] = 2.8, [OVALE_WEAPON_CLASS[16]] = 2.4, [OVALE_WEAPON_CLASS[17]] = 3.3, } --</private-static-properties> --<public-static-properties> -- Whether the equipment information is ready for use by other modules. OvaleEquipement.ready = false -- Item IDs of equipped items, indexed by slot ID. OvaleEquipement.equippedItems = {} -- Item levels of equipped items, indexed by slot ID. OvaleEquipement.equippedItemLevels = {} -- Type of main-hand item equipped. OvaleEquipement.mainHandItemType = nil -- Type of off-hand item equipped. OvaleEquipement.offHandItemType = nil -- Count of equipped pieces of an armor set: armorSetCount[armorSetName] = equippedCount OvaleEquipement.armorSetCount = {} -- Item ID of meta gem if equipped. OvaleEquipement.metaGem = nil -- Normalized weapon speeds for equipped mainhand and offhand weapons. OvaleEquipement.mainHandWeaponSpeed = nil OvaleEquipement.offHandWeaponSpeed = nil --</public-static-properties> --<private-static-methods> local function GetEquippedItemType(slotId) profiler.Start("OvaleEquipement_GetEquippedItemType") local itemId = OvaleEquipement:GetEquippedItem(slotId) local itemType if itemId then local _, _, _, _, _, _, _, _, inventoryType = API_GetItemInfo(itemId) itemType = inventoryType end profiler.Stop("OvaleEquipement_GetEquippedItemType") return itemType end local function GetItemLevel(slotId) profiler.Start("OvaleEquipement_GetItemLevel") self_tooltip:SetInventoryItem("player", slotId) local itemLevel for i = 2, self_tooltip:NumLines() do local text = _G[addonName .. "ScanningTooltipTextLeft" .. i]:GetText() if text then itemLevel = strmatch(text, OVALE_ITEM_LEVEL_PATTERN) if itemLevel then itemLevel = tonumber(itemLevel) break end end end profiler.Stop("OvaleEquipement_GetItemLevel") return itemLevel end local function GetNormalizedWeaponSpeed(slotId) profiler.Start("OvaleEquipement_GetNormalizedWeaponSpeed") local weaponSpeed if slotId == INVSLOT_MAINHAND or slotId == INVSLOT_OFFHAND then local itemId = OvaleEquipement:GetEquippedItem(slotId) if itemId then local _, _, _, _, _, _, weaponClass = API_GetItemInfo(itemId) weaponSpeed = OVALE_NORMALIZED_WEAPON_SPEED[weaponClass] end end profiler.Stop("OvaleEquipement_GetNormalizedWeaponSpeed") return weaponSpeed end --</private-static-methods> --<public-static-methods> function OvaleEquipement:OnEnable() self:RegisterEvent("PLAYER_ENTERING_WORLD", "UpdateEquippedItems") self:RegisterEvent("PLAYER_ALIVE", "UpdateEquippedItems") self:RegisterEvent("PLAYER_AVG_ITEM_LEVEL_READY", "UpdateEquippedItemLevels") self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED") end function OvaleEquipement:OnDisable() self:UnregisterEvent("PLAYER_ENTERING_WORLD") self:UnregisterEvent("PLAYER_ALIVE") self:UnregisterEvent("PLAYER_AVG_ITEM_LEVEL_READY") self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED") end function OvaleEquipement:PLAYER_EQUIPMENT_CHANGED(event, slotId, hasItem) profiler.Start("OvaleEquipement_PLAYER_EQUIPMENT_CHANGED") if hasItem then self.equippedItems[slotId] = API_GetInventoryItemID("player", slotId) self.equippedItemLevels[slotId] = GetItemLevel(slotId) if slotId == INVSLOT_MAINHAND then self.mainHandItemType = GetEquippedItemType(slotId) self.mainHandWeaponSpeed = self:HasMainHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_MAINHAND) elseif slotId == INVSLOT_OFFHAND then self.offHandItemType = GetEquippedItemType(slotId) self.offHandWeaponSpeed = self:HasOffHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_OFFHAND) end else self.equippedItems[slotId] = nil self.equippedItemLevels[slotId] = nil if slotId == INVSLOT_MAINHAND then self.mainHandItemType = nil elseif slotId == INVSLOT_OFFHAND then self.offHandItemType = nil end end self:UpdateArmorSetCount() self:SendMessage("Ovale_EquipmentChanged") profiler.Stop("OvaleEquipement_PLAYER_EQUIPMENT_CHANGED") end do -- Legacy armor set names; no longer documented. local armorSetName = { HUNTER = { ["T14"] = "T14_melee", ["T15"] = "T15_melee", ["T16"] = "T16_melee" }, MAGE = { ["T14"] = "T14_caster", ["T15"] = "T15_caster", ["T16"] = "T16_caster" }, ROGUE = { ["T14"] = "T14_melee", ["T15"] = "T15_melee", ["T16"] = "T16_melee" }, WARLOCK = { ["T14"] = "T14_caster", ["T15"] = "T15_caster" }, } function OvaleEquipement:GetArmorSetCount(name) local count = self.armorSetCount[name] if not count then if armorSetName[self_class] and armorSetName[self_class][name] then name = armorSetName[self_class][name] count = self.armorSetCount[name] end end return count or 0 end end function OvaleEquipement:GetEquippedItem(slotId) if slotId and type(slotId) ~= "number" then slotId = OVALE_SLOTNAME[slotId] end if slotId then return self.equippedItems[slotId] end return nil end function OvaleEquipement:GetEquippedItemLevel(slotId) if slotId and type(slotId) ~= "number" then slotId = OVALE_SLOTNAME[slotId] end if slotId then return self.equippedItemLevels[slotId] end return nil end function OvaleEquipement:HasEquippedItem(itemId, slotId) if slotId and type(slotId) ~= "number" then slotId = OVALE_SLOTNAME[slotId] end if slotId then if self.equippedItems[slotId] == itemId then return slotId end else for slotId, equippedItemId in pairs(self.equippedItems) do if equippedItemId == itemId then return slotId end end end return nil end function OvaleEquipement:HasMainHandWeapon(handedness) if handedness then if handedness == 1 then return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND" elseif handedness == 2 then return self.mainHandItemType == "INVTYPE_2HWEAPON" end else return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND" or self.mainHandItemType == "INVTYPE_2HWEAPON" end return false end function OvaleEquipement:HasOffHandWeapon(handedness) if handedness then if handedness == 1 then return self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONOFFHAND" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND" elseif handedness == 2 then return self.offHandItemType == "INVTYPE_2HWEAPON" end else return self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONOFFHAND" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND" or self.offHandItemType == "INVTYPE_2HWEAPON" end return false end function OvaleEquipement:HasShield() return self.offHandItemType == "INVTYPE_SHIELD" end function OvaleEquipement:HasTrinket(itemId) return self:HasEquippedItem(itemId, INVSLOT_TRINKET1) or self:HasEquippedItem(itemId, INVSLOT_TRINKET2) end function OvaleEquipement:HasTwoHandedWeapon(slotId) if slotId and type(slotId) ~= "number" then slotId = OVALE_SLOTNAME[slotId] end if slotId then if slotId == INVSLOT_MAINHAND then return self.mainHandItemType == "INVTYPE_2HWEAPON" elseif slotId == INVSLOT_OFFHAND then return self.offHandItemType == "INVTYPE_2HWEAPON" end else return self.mainHandItemType == "INVTYPE_2HWEAPON" or self.offHandItemType == "INVTYPE_2HWEAPON" end return false end function OvaleEquipement:HasOneHandedWeapon(slotId) if slotId and type(slotId) ~= "number" then slotId = OVALE_SLOTNAME[slotId] end if slotId then if slotId == INVSLOT_MAINHAND then return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND" elseif slotId == INVSLOT_OFFHAND then return self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND" end else return self.mainHandItemType == "INVTYPE_WEAPON" or self.mainHandItemType == "INVTYPE_WEAPONMAINHAND" or self.offHandItemType == "INVTYPE_WEAPON" or self.offHandItemType == "INVTYPE_WEAPONMAINHAND" end return false end function OvaleEquipement:UpdateArmorSetCount() profiler.Start("OvaleEquipement_UpdateArmorSetCount") wipe(self.armorSetCount) for i = 1, #OVALE_ARMORSET_SLOT_IDS do local itemId = self:GetEquippedItem(OVALE_ARMORSET_SLOT_IDS[i]) if itemId then local name = OVALE_ARMORSET[itemId] if name then if not self.armorSetCount[name] then self.armorSetCount[name] = 1 else self.armorSetCount[name] = self.armorSetCount[name] + 1 end end end end profiler.Stop("OvaleEquipement_UpdateArmorSetCount") end function OvaleEquipement:UpdateEquippedItems() profiler.Start("OvaleEquipement_UpdateEquippedItems") local changed = false local item for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do item = API_GetInventoryItemID("player", slotId) if item ~= self.equippedItems[slotId] then self.equippedItems[slotId] = item changed = true end end local changedMetaGem = self:UpdateMetaGem() local changedItemLevels = self:UpdateEquippedItemLevels() changed = changed or changedMetaGem or changedItemLevels self.mainHandItemType = GetEquippedItemType(INVSLOT_MAINHAND) self.offHandItemType = GetEquippedItemType(INVSLOT_OFFHAND) self.mainHandWeaponSpeed = self:HasMainHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_MAINHAND) self.offHandWeaponSpeed = self:HasOffHandWeapon() and GetNormalizedWeaponSpeed(INVSLOT_OFFHAND) if changed then self:UpdateArmorSetCount() self:SendMessage("Ovale_EquipmentChanged") end self.ready = true profiler.Stop("OvaleEquipement_UpdateEquippedItems") end function OvaleEquipement:UpdateEquippedItemLevels() profiler.Start("OvaleEquipement_UpdateEquippedItemLevels") local changed = false local itemLevel for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do itemLevel = GetItemLevel(slotId) if itemLevel ~= self.equippedItemLevels[slotId] then self.equippedItemLevels[slotId] = itemLevel changed = true end end if changed then self:SendMessage("Ovale_EquipmentChanged") end profiler.Stop("OvaleEquipement_UpdateEquippedItemLevels") return changed end function OvaleEquipement:UpdateMetaGem() profiler.Start("OvaleEquipement_UpdateMetaGem") local changed = false local gemId = API_GetInventoryItemGems(INVSLOT_HEAD) if gemId then local name, link, quality, iLevel, reqLevel, class, subclass = API_GetItemInfo(gemId) if subclass == OVALE_META_GEM then if gemId ~= self.metaGem then self.metaGem = gemId changed = true end end else if self.metaGem then self.metaGem = nil changed = true end end profiler.Stop("OvaleEquipement_UpdateMetaGem") return changed end function OvaleEquipement:Debug() for slotId = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do Ovale:FormatPrint("Slot %d = %s (%d)", slotId, self:GetEquippedItem(slotId), self:GetEquippedItemLevel(slotId)) end Ovale:FormatPrint("Main-hand item type: %s", self.mainHandItemType) Ovale:FormatPrint("Off-hand item type: %s", self.offHandItemType) for k, v in pairs(self.armorSetCount) do Ovale:FormatPrint("Player has %d piece(s) of %s armor set.", v, k) end end --</public-static-methods>