Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
        ___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I   By: Munglunch                              #
##############################################################################
--]]
local SuperVillain, L = unpack(select(2, ...));
local _, ns = ...
local oUF_SuperVillain = ns.oUF
--[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
local assert = enforce;
assert(oUF_SuperVillain, "SVUI was unable to locate oUF.")
local MOD = SuperVillain.Registry:Expose('SVUnit');
--[[
##########################################################
LOCAL VARIABLES
##########################################################
]]--
local find, gsub, split, format, min, abs, tremove, tinsert, twipe = string.find, string.gsub, string.split, string.format, math.min, math.abs, table.remove, table.insert, table.wipe;
local GetNumGroupMembers, GetNumSubgroupMembers = GetNumGroupMembers, GetNumSubgroupMembers
local IsInRaid, IsInGroup, GetTime = IsInRaid, IsInGroup, GetTime;
local playerId, healGlowFrame, healGlowTime;
local spells, groupUnits, frameBuffers, frameGroups = {}, {}, {}, {5, 10, 25, 40};
local glowingSpells = {102792, 130654, 124040, 115464, 116670, 114852, 114871, 82327, 85222, 121148, 34861, 64844, 110745, 122128, 120692, 120696, 23455, 596, 1064};
--[[
##########################################################
LOCAL FUNCTIONS
##########################################################
]]--
local ShowHealGlows = function(self, elapsed)
	self.elapsed = (self.elapsed or 0)  +  elapsed;
	if(self.elapsed < .1) then return end;
	self.elapsed = 0;
	local current = GetTime();
	local expireTime = 0;
	for _, u in pairs(groupUnits)do
		expireTime = u[2]  +  healGlowTime;
		for _, group in ipairs(frameGroups)do
			for _, frame in pairs(frameBuffers[group])do
				if(frame.unit == u[1]) then
					frame.HealGlow:SetShown(current < expireTime)
				end
			end
		end
	end
end;

function MOD:InitHealGlow()
	playerId = UnitGUID("player")
	for _, spellID in ipairs(glowingSpells) do
		local name, rank, icon, _, _, _, _, _, _ = GetSpellInfo(spellID)
		if name then
			spells[name] = {spellID, icon}
		end
	end
	twipe(frameBuffers)
	for _, mark in ipairs(frameGroups) do
		frameBuffers[mark] = {}
		local x = mark  /  5
		for i = 1, x do
			for k = 1, 5 do
				frame = mark == 5 and _G[("SVUI_PartyGroup%dUnitButton%i"):format(i, k)] or _G[("SVUI_Raid%dGroup%dUnitButton%i"):format(mark, i, k)]
				if frame then
					frame.HealGlow = MOD:CreateHealGlow(frame, ((mark == 5 and "party%d" or "raid%d")):format(i))
					tinsert(frameBuffers[mark], frame)
				end
			end
		end
	end
	healGlowFrame = CreateFrame("Frame")
	healGlowFrame:SetScript("OnEvent", function(self, event, ...)
		if event == "COMBAT_LOG_EVENT_UNFILTERED"then
			local _, subevent, _, source, _, _, _, dest, _, _, _, _, name = select(1, ...)
			if not(source == playerId and subevent == "SPELL_HEAL" and spells[name]) then return end;
			if groupUnits[dest] then
				groupUnits[dest][2] = GetTime()
			end
		end
	end)
	MOD:UpdateGlowSettings()
end;

function MOD:UpdateGlowSettings()
	local color = self.db.glowcolor;
	for _, group in ipairs(frameGroups)do
		for _, frame in ipairs(frameBuffers[group])do
			frame.HealGlow:SetBackdropBorderColor(color[1], color[2], color[3])
		end
	end;
	healGlowTime = self.db.glowtime;
	if self.db.healglow then
		healGlowFrame:SetScript("OnUpdate", ShowHealGlows)
		healGlowFrame:RegisterUnitEvent("COMBAT_LOG_EVENT_UNFILTERED", playerId)
	else
		healGlowFrame:SetScript("OnUpdate", nil)
		healGlowFrame:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
	end
end;

function MOD:UpdateGlowRoster()
	twipe(groupUnits)
	local count = IsInRaid() and GetNumGroupMembers() or IsInGroup() and GetNumSubgroupMembers() or 0;
	local str = IsInRaid() and "raid%d" or IsInGroup() and "party%d" or "solo";
	local result;
	for i = 1, count do
		result = (str):format(i)
		if not UnitIsUnit(result, "player") then
			groupUnits[UnitGUID(result)] = {result, 0}
		end
	end;
	if str == "solo" then
		groupUnits[UnitGUID("player")] = {"player", 0}
	end
end;

function MOD:CreateHealGlow(frame)
	local shadow = CreateFrame("Frame", nil, frame)
	shadow:SetFrameLevel(1)
	shadow:SetFrameStrata(frame:GetFrameStrata())
	shadow:WrapOuter(frame, 3, 3)
	shadow:SetBackdrop({edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]], edgeSize = 3});
	shadow:SetBackdropColor(0, 0, 0, 0)
	shadow:SetBackdropBorderColor(0, 0, 0, 0.9)
	shadow:Hide()
	return shadow
end;