local T, C, L, _ = unpack(select(2, ...)) if C.tooltip.enable ~= true or C.tooltip.average_lvl ~= true then return end ---------------------------------------------------------------------------------------- -- Equipped average item level(Cloudy Unit Info by Cloudyfa) ---------------------------------------------------------------------------------------- --- Variables local currentUNIT, currentGUID local GearDB = {} local nextInspectRequest = 0 local lastInspectRequest = 0 local prefixColor = "|cffF9D700" local detailColor = "|cffffffff" local gearPrefix = STAT_AVERAGE_ITEM_LEVEL..": " --- Create Frame local f = CreateFrame("Frame", "CloudyUnitInfo") f:RegisterEvent("UNIT_INVENTORY_CHANGED") f:RegisterEvent("INSPECT_READY") --- Set Unit Info local function SetUnitInfo(gear) if not gear then return end local _, unit = GameTooltip:GetUnit() if (not unit) or (UnitGUID(unit) ~= currentGUID) then return end local gearLine for i = 2, GameTooltip:NumLines() do local line = _G["GameTooltipTextLeft" .. i] local text = line:GetText() if text and strfind(text, gearPrefix) then gearLine = line end end if gear then gear = prefixColor..gearPrefix..detailColor..gear if gearLine then gearLine:SetText(gear) else GameTooltip:AddLine(gear) end end GameTooltip:Show() end --- PVP Item Detect local function IsPVPItem(link) local itemStats = GetItemStats(link) for stat in pairs(itemStats) do if stat == "ITEM_MOD_RESILIENCE_RATING_SHORT" or stat == "ITEM_MOD_PVP_POWER_SHORT" then return true end end return false end local upgrades = { ["1"] = 8, ["373"] = 4, ["374"] = 8, ["375"] = 4, ["376"] = 4, ["377"] = 4, ["379"] = 4, ["380"] = 4, ["446"] = 4, ["447"] = 8, ["452"] = 8, ["454"] = 4, ["455"] = 8, ["457"] = 8, ["459"] = 4, ["460"] = 8, ["461"] = 12, ["462"] = 16, ["466"] = 4, ["467"] = 8, ["469"] = 4, ["470"] = 8, ["471"] = 12, ["472"] = 16, ["477"] = 4, ["478"] = 8, ["480"] = 8, ["492"] = 4, ["493"] = 8, ["495"] = 4, ["496"] = 8, ["497"] = 12, ["498"] = 16, ["504"] = 12, ["505"] = 16, ["506"] = 20, ["507"] = 24, ["530"] = 5, ["531"] = 10 } --- Unit Gear Info local function UnitGear(unit) if (not unit) or (UnitGUID(unit) ~= currentGUID) then return end local ulvl = UnitLevel(unit) local class = select(2, UnitClass(unit)) local ilvl, boa, pvp = 0, 0, 0 local total, count, delay = 0, 16, nil local mainhand, offhand, twohand = 1, 1, 0 for i = 1, 17 do if i ~= 4 then local itemTexture = GetInventoryItemTexture(unit, i) if itemTexture then local itemLink = GetInventoryItemLink(unit, i) if not itemLink then delay = true else local _, _, quality, level, _, _, _, _, slot = GetItemInfo(itemLink) if (not quality) or (not level) then delay = true else local upgrade = itemLink:match(":(%d+)\124h%[") if upgrades[upgrade] == nil then upgrades[upgrade] = 0 end total = total + (level + upgrades[upgrade]) if quality == 7 then boa = boa + 1 else if IsPVPItem(itemLink) then pvp = pvp + 1 end end if i >= 16 then if (slot == "INVTYPE_2HWEAPON") or (slot == "INVTYPE_RANGED") or ((slot == "INVTYPE_RANGEDRIGHT") and (class == "HUNTER")) then twohand = twohand + 1 end end end end else if i == 16 then mainhand = 0 elseif i == 17 then offhand = 0 end end end end if (mainhand == 0) and (offhand == 0) or (twohand == 1) then count = count - 1 end if not delay then if unit == "player" and GetAverageItemLevel() > 0 then _, ilvl = GetAverageItemLevel() else ilvl = total / count end if ilvl > 0 then ilvl = string.format("%.1f", ilvl) end if boa > 0 then ilvl = ilvl.." |cffe6cc80"..boa.." "..HEIRLOOMS end if pvp > 0 then ilvl = ilvl.." |cffa335ee"..pvp.." "..PVP end else ilvl = nil end return ilvl end --- Scan Current Unit local function ScanUnit(unit, forced) local cachedGear if UnitIsUnit(unit, "player") then cachedGear = UnitGear("player") SetUnitInfo(cachedGear or CONTINUED) else if (not unit) or (UnitGUID(unit) ~= currentGUID) then return end cachedGear = GearDB[currentGUID] -- cachedGear? ok...skip get gear if cachedGear and not forced then SetUnitInfo(cachedGear) end if not (IsShiftKeyDown() or forced) then if UnitAffectingCombat("player") then return end end if not UnitIsVisible(unit) then return end if UnitIsDeadOrGhost("player") or UnitOnTaxi("player") then return end if InspectFrame and InspectFrame:IsShown() then return end -- Press SHIFT to refresh if IsShiftKeyDown() then SetUnitInfo(CONTINUED, CONTINUED) else SetUnitInfo(cachedGear or CONTINUED) end local timeSinceLastInspect = GetTime() - lastInspectRequest if timeSinceLastInspect >= 1.5 then nextInspectRequest = 0 else nextInspectRequest = 1.5 - timeSinceLastInspect end f:Show() end end --- Character Info Sheet hooksecurefunc("PaperDollFrame_SetItemLevel", function(self, unit) if unit ~= "player" then return end local total, equip = GetAverageItemLevel() if total > 0 then total = string.format("%.1f", total) end if equip > 0 then equip = string.format("%.1f", equip) end local ilvl = equip if equip ~= total then ilvl = equip.." / "..total end local ilvlLine = _G[self:GetName().."StatText"] ilvlLine:SetText(ilvl) self.tooltip = detailColor..STAT_AVERAGE_ITEM_LEVEL.." "..ilvl end) --- Handle Events f:SetScript("OnEvent", function(self, event, ...) if event == "UNIT_INVENTORY_CHANGED" then local unit = ... if UnitGUID(unit) == currentGUID then ScanUnit(unit, true) end elseif event == "INSPECT_READY" then local guid = ... if guid ~= currentGUID then return end local gear = UnitGear(currentUNIT) GearDB[currentGUID] = gear if not gear then ScanUnit(currentUNIT, true) else SetUnitInfo(gear) end end end) f:SetScript("OnUpdate", function(self, elapsed) nextInspectRequest = nextInspectRequest - elapsed if nextInspectRequest > 0 then return end self:Hide() if currentUNIT and (UnitGUID(currentUNIT) == currentGUID) then lastInspectRequest = GetTime() NotifyInspect(currentUNIT) end end) GameTooltip:HookScript("OnTooltipSetUnit", function(self) local _, unit = self:GetUnit() if (not unit) or (not CanInspect(unit)) then return end if (UnitLevel(unit) > 0) and (UnitLevel(unit) < 10) then return end currentUNIT, currentGUID = unit, UnitGUID(unit) ScanUnit(unit) end)