141 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
 | |
| local DB = E:GetModule('DataBars')
 | |
| 
 | |
| local pairs, select, wipe = pairs, select, wipe
 | |
| 
 | |
| local GetThreatStatusColor = GetThreatStatusColor
 | |
| local IsInGroup, IsInRaid = IsInGroup, IsInRaid
 | |
| local UnitClass = UnitClass
 | |
| local UnitAffectingCombat = UnitAffectingCombat
 | |
| local UnitDetailedThreatSituation = UnitDetailedThreatSituation
 | |
| local UnitExists = UnitExists
 | |
| local UnitIsPlayer = UnitIsPlayer
 | |
| local UnitIsUnit = UnitIsUnit
 | |
| local UnitName = UnitName
 | |
| local UnitReaction = UnitReaction
 | |
| local UNKNOWN = UNKNOWN
 | |
| -- GLOBALS: ElvUF
 | |
| 
 | |
| function DB:ThreatBar_GetLargestThreatOnList(percent)
 | |
| 	local largestValue, largestUnit = 0, nil
 | |
| 	for unit, threatPercent in pairs(DB.StatusBars.Threat.list) do
 | |
| 		if threatPercent > largestValue then
 | |
| 			largestValue = threatPercent
 | |
| 			largestUnit = unit
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	return (percent - largestValue), largestUnit
 | |
| end
 | |
| 
 | |
| function DB:ThreatBar_GetColor(unit)
 | |
| 	local unitReaction = UnitReaction(unit, 'player')
 | |
| 	local _, unitClass = UnitClass(unit)
 | |
| 	if (UnitIsPlayer(unit)) then
 | |
| 		local class = E:ClassColor(unitClass)
 | |
| 		if not class then return 194, 194, 194 end
 | |
| 		return class.r*255, class.g*255, class.b*255
 | |
| 	elseif (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 DB:ThreatBar_Update()
 | |
| 	local bar = DB.StatusBars.Threat
 | |
| 	local isInGroup, isInRaid, petExists = IsInGroup(), IsInRaid(), UnitExists('pet')
 | |
| 
 | |
| 	if UnitAffectingCombat('player') and (isInGroup or petExists) then
 | |
| 		local _, status, percent = UnitDetailedThreatSituation('player', 'target')
 | |
| 		local name = UnitName('target') or UNKNOWN
 | |
| 		bar.showBar = true
 | |
| 
 | |
| 		if percent == 100 then
 | |
| 			if petExists then
 | |
| 				bar.list.pet = select(3, UnitDetailedThreatSituation('pet', 'target'))
 | |
| 			end
 | |
| 
 | |
| 			if isInRaid then
 | |
| 				for i = 1, 40 do
 | |
| 					if UnitExists('raid'..i) and not UnitIsUnit('raid'..i, 'player') then
 | |
| 						bar.list['raid'..i] = select(3, UnitDetailedThreatSituation('raid'..i, 'target'))
 | |
| 					end
 | |
| 				end
 | |
| 			elseif isInGroup then
 | |
| 				for i = 1, 4 do
 | |
| 					if UnitExists('party'..i) then
 | |
| 						bar.list['party'..i] = select(3, UnitDetailedThreatSituation('party'..i, 'target'))
 | |
| 					end
 | |
| 				end
 | |
| 			end
 | |
| 
 | |
| 			local leadPercent, largestUnit = DB:ThreatBar_GetLargestThreatOnList(percent)
 | |
| 			if leadPercent > 0 and largestUnit ~= nil then
 | |
| 				local r, g, b = DB:ThreatBar_GetColor(largestUnit)
 | |
| 				bar.text:SetFormattedText(L["ABOVE_THREAT_FORMAT"], name, percent, leadPercent, r, g, b, UnitName(largestUnit) or UNKNOWN)
 | |
| 
 | |
| 				if E.myrole == 'TANK' then
 | |
| 					bar:SetStatusBarColor(0, 0.839, 0)
 | |
| 					bar:SetValue(leadPercent)
 | |
| 				else
 | |
| 					bar:SetStatusBarColor(GetThreatStatusColor(status))
 | |
| 					bar:SetValue(percent)
 | |
| 				end
 | |
| 			else
 | |
| 				bar:SetStatusBarColor(GetThreatStatusColor(status))
 | |
| 				bar.text:SetFormattedText('%s: %.0f%%', name, percent)
 | |
| 				bar:SetValue(percent)
 | |
| 			end
 | |
| 		elseif percent then
 | |
| 			bar:SetStatusBarColor(GetThreatStatusColor(status))
 | |
| 			bar.text:SetFormattedText('%s: %.0f%%', name, percent)
 | |
| 			bar:SetValue(percent)
 | |
| 		else
 | |
| 			bar.showBar = false
 | |
| 		end
 | |
| 	else
 | |
| 		bar.showBar = false
 | |
| 	end
 | |
| 
 | |
| 	DB:SetVisibility(bar) -- lower visibility because of using showBar variable
 | |
| 
 | |
| 	wipe(bar.list)
 | |
| end
 | |
| 
 | |
| function DB:ThreatBar_Toggle()
 | |
| 	local bar = DB.StatusBars.Threat
 | |
| 	bar.db = DB.db.threat
 | |
| 
 | |
| 	if bar.db.enable then
 | |
| 		E:EnableMover(bar.holder.mover:GetName())
 | |
| 
 | |
| 		DB:RegisterEvent('PLAYER_TARGET_CHANGED', 'ThreatBar_Update')
 | |
| 		DB:RegisterEvent('UNIT_THREAT_LIST_UPDATE', 'ThreatBar_Update')
 | |
| 		DB:RegisterEvent('GROUP_ROSTER_UPDATE', 'ThreatBar_Update')
 | |
| 		DB:RegisterEvent('UNIT_FLAGS', 'ThreatBar_Update')
 | |
| 		DB:RegisterEvent('UNIT_PET', 'ThreatBar_Update')
 | |
| 
 | |
| 		DB:ThreatBar_Update()
 | |
| 	else
 | |
| 		E:DisableMover(bar.holder.mover:GetName())
 | |
| 
 | |
| 		DB:UnregisterEvent('PLAYER_TARGET_CHANGED')
 | |
| 		DB:UnregisterEvent('UNIT_THREAT_LIST_UPDATE')
 | |
| 		DB:UnregisterEvent('GROUP_ROSTER_UPDATE')
 | |
| 		DB:UnregisterEvent('UNIT_FLAGS')
 | |
| 		DB:UnregisterEvent('UNIT_PET')
 | |
| 	end
 | |
| end
 | |
| 
 | |
| function DB:ThreatBar()
 | |
| 	local Threat = DB:CreateBar('ElvUI_ThreatBar', 'Threat', DB.ThreatBar_Update, nil, nil, {'TOPRIGHT', E.UIParent, 'TOPRIGHT', -3, -245})
 | |
| 	Threat:SetMinMaxValues(0, 100)
 | |
| 	Threat.list = {}
 | |
| 
 | |
| 	E:CreateMover(Threat.holder, 'ThreatBarMover', L["Threat Bar"], nil, nil, nil, nil, nil, 'databars,threat')
 | |
| 
 | |
| 	DB:ThreatBar_Toggle()
 | |
| end
 |