local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local THREAT = E:GetModule("Threat") local DT = E:GetModule("DataTexts") --Lua functions local pairs, select = pairs, select local wipe = table.wipe --WoW API / Variables local GetNumPartyMembers = GetNumPartyMembers local GetNumRaidMembers = GetNumRaidMembers local GetThreatStatusColor = GetThreatStatusColor local UnitDetailedThreatSituation = UnitDetailedThreatSituation local UnitExists = UnitExists local UnitIsPlayer = UnitIsPlayer local UnitIsUnit = UnitIsUnit local UnitName = UnitName local UnitReaction = UnitReaction local UNKNOWN = UNKNOWN local partyUnits, raidUnits = {}, {} for i = 1, 4 do partyUnits[i] = "party"..i end for i = 1, 40 do raidUnits[i] = "raid"..i end function THREAT:UpdatePosition() if self.db.position == "RIGHTCHAT" then self.bar:SetInside(RightChatDataPanel) self.bar:SetParent(RightChatDataPanel) else self.bar:SetInside(LeftChatDataPanel) self.bar:SetParent(LeftChatDataPanel) end self.bar.text:FontTemplate(nil, self.db.textSize) self.bar:SetFrameStrata("MEDIUM") end function THREAT:GetLargestThreatOnList(percent) local largestValue, largestUnit = 0 for unit, threatPercent in pairs(self.list) do if threatPercent > largestValue then largestValue = threatPercent largestUnit = unit end end return (percent - largestValue), largestUnit end function THREAT:GetColor(unit) if UnitIsPlayer(unit) then local _, class = UnitClass(unit) local color = UnitIsUnit("player", unit) and E.media.herocolor or RAID_CLASS_COLORS[class] if not color then return 194, 194, 194 end return color.r*255, color.g*255, color.b*255 end local unitReaction = UnitReaction(unit, "player") if unitReaction then local reaction = ElvUF.colors.reaction[unitReaction] return reaction[1]*255, reaction[2]*255, reaction[3]*255 else return 194, 194, 194 end end function THREAT:Update() if not UnitExists("target") or (DT and DT.ShowingBGStats) then if self.bar:IsShown() then self.bar:Hide() end return end local _, status, percent = UnitDetailedThreatSituation("player", "target") local petExists = HasPetUI() if percent and percent > 0 and (GetNumPartyMembers() > 0 or petExists == 1) then local name = UnitName("target") self.bar:Show() if percent == 100 then if petExists == 1 then self.list.pet = select(3, UnitDetailedThreatSituation("pet", "target")) end if GetNumRaidMembers() > 0 then for i = 1, 40 do if UnitExists(raidUnits[i]) and not UnitIsUnit(raidUnits[i], "player") then self.list[raidUnits[i]] = select(3, UnitDetailedThreatSituation(raidUnits[i], "target")) end end else for i = 1, 4 do if UnitExists(partyUnits[i]) then self.list[partyUnits[i]] = select(3, UnitDetailedThreatSituation(partyUnits[i], "target")) end end end local leadPercent, largestUnit = self:GetLargestThreatOnList(percent) if leadPercent > 0 and largestUnit then local r, g, b = self:GetColor(largestUnit) self.bar.text:SetFormattedText(L["ABOVE_THREAT_FORMAT"], name, percent, leadPercent, r, g, b, UnitName(largestUnit) or UNKNOWN) if E.Role == "Tank" then self.bar:SetStatusBarColor(0, 0.839, 0) self.bar:SetValue(leadPercent) else self.bar:SetStatusBarColor(GetThreatStatusColor(status)) self.bar:SetValue(percent) end else self.bar:SetStatusBarColor(GetThreatStatusColor(status)) self.bar:SetValue(percent) self.bar.text:SetFormattedText("%s: %.0f%%", name, percent) end else self.bar:SetStatusBarColor(GetThreatStatusColor(status)) self.bar:SetValue(percent) self.bar.text:SetFormattedText("%s: %.0f%%", name, percent) end else self.bar:Hide() end wipe(self.list) end function THREAT:ToggleEnable() if self.db.enable then self:RegisterEvent("PLAYER_TARGET_CHANGED", "Update") self:RegisterEvent("UNIT_THREAT_LIST_UPDATE", "Update") self:RegisterEvent("PARTY_MEMBERS_CHANGED", "Update") self:RegisterEvent("RAID_ROSTER_UPDATE", "Update") self:RegisterEvent("UNIT_PET", "Update") self:Update() else self.bar:Hide() self:UnregisterEvent("PLAYER_TARGET_CHANGED") self:UnregisterEvent("UNIT_THREAT_LIST_UPDATE") self:UnregisterEvent("PARTY_MEMBERS_CHANGED") self:UnregisterEvent("RAID_ROSTER_UPDATE") self:UnregisterEvent("UNIT_PET") end end function THREAT:Initialize() self.db = E.db.general.threat self.bar = CreateFrame("StatusBar", "ElvUI_ThreatBar", E.UIParent) self.bar:CreateBackdrop("Default") self.bar:SetMinMaxValues(0, 100) self.bar:SetStatusBarTexture(E.media.normTex) E:RegisterStatusBar(self.bar) self.bar.text = self.bar:CreateFontString(nil, "OVERLAY") self.bar.text:FontTemplate(nil, self.db.textSize) self.bar.text:Point("CENTER", self.bar, "CENTER") self.list = {} self:UpdatePosition() self:ToggleEnable() self.Initialized = true end local function InitializeCallback() THREAT:Initialize() end E:RegisterModule(THREAT:GetName(), InitializeCallback)