Quantcast
local OverLayTimers = {};
local OverLayUpdater = 0.2;
 OverLayTimersActive = 0;
local alreadywarned = {};
local OverLayRemap = {
	[88843] = 19615,
	[93426] = 91342,
	[60349] = 53817,
	[5143] = 79808,
};
SpellOverlayTimerConfig = {};
function SpellOverlayTimer_Init()
	SpellOverlayTimer_timer:UnregisterEvent("ADDON_LOADED");
	hooksecurefunc("SpellActivationOverlay_ShowOverlay", SpellOverlayTimer_OverlayTimerShow);
	hooksecurefunc("SpellActivationOverlay_HideOverlays",SpellOverlayTimer_OverlayTimerHide);
	SpellOverlayTimerConfig:Init();

end


function SpellOverlayTimer_GetBuffTimeLeft(spellid,onwho)
	local i = 1;
	local name, _, _, _, _, _, buff_expiretime, _, _, _, buff_spellid  = UnitBuff(onwho, i);
	while name  do
	 i = i +1;
	 if(buff_spellid==spellid) then
		return floor((GetTime()-buff_expiretime)*-1);
	 end
	--if(onwho=="pet") then
	--	print("d:"..buff_spellid);
	--end

	 name, _, _, _, _, _, buff_expiretime, _, _, _, buff_spellid  = UnitBuff(onwho, i);
	end

	return false;
end

function SpellOverlayTimer_OverlayTimerShow(...)
	if (GetCVarBool("displaySpellActivationOverlays") == false ) then
		return;
	end
	local self, spellID, texturePath, position, scale, r, g, b, vFlip, hFlip = ...;
	local checkwho = "player";
	local origoverlay = SpellActivationOverlay_GetOverlay(self, spellID, position);
	if(OverLayRemap[spellID]) then
		spellID = OverLayRemap[spellID];
	end
	local timeleft = SpellOverlayTimer_GetBuffTimeLeft(spellID,checkwho);
	if(timeleft == false) then
		checkwho = "pet";
		timeleft = SpellOverlayTimer_GetBuffTimeLeft(spellID,checkwho);
	end
	if(timeleft == false) then
		if not (alreadywarned[spellID]) then
			print("|c00FF0000SpellOverlayTimer: |c00FFFFFFCan not find timer infos for spellid "..spellID..", please report this.");
			alreadywarned[spellID] = 1;
		end
		return;
	end

	if not(OverLayTimers[spellID]) then
		local OverlayTimer = SpellOverlayTimer_timer:CreateFontString( spellid, "ARTWORK", "CombatTextFont" );
		OverlayTimer:SetText( timeleft.." s" );
		OverLayTimers[spellID] = {};
		OverLayTimers[spellID].position = position;
		OverLayTimers[spellID].overlay = OverlayTimer;
		OverLayTimers[spellID].active = false;
		OverLayTimers[spellID].checkwho = checkwho;
	end
	if(OverLayTimers[spellID].active == false) then
		OverLayTimersActive = OverLayTimersActive +1;
	end
	OverLayTimers[spellID].active = true;
	OverLayTimers[spellID].overlay:ClearAllPoints();
	if(OverLayTimers[spellID].position ~= position) then
		OverLayTimers[spellID].overlay:SetPoint( "CENTER",  origoverlay, SpellOverlayTimer_Config.FontPosition , 135,0);
	else
		OverLayTimers[spellID].overlay:SetPoint( "CENTER",  origoverlay, SpellOverlayTimer_Config.FontPosition);
	end
	OverLayTimers[spellID].overlay:SetTextColor(unpack(SpellOverlayTimer_Config.FontColor));
	OverLayTimers[spellID].overlay:SetTextHeight(SpellOverlayTimer_Config.FontSize);
	OverLayTimers[spellID].overlay:Show();
	if(OverLayTimersActive==1) then
		SpellOverlayTimer_timer:SetScript("OnUpdate", SpellOverlayTimer_TimerEvent);
	end
end

function SpellOverlayTimer_OverlayTimerHide(...)

	if (GetCVarBool("displaySpellActivationOverlays") == false ) then
		return;
	end
	local self,spellid = ...;
	if(OverLayRemap[spellid]) then
		spellid = OverLayRemap[spellid];
	end
	if not(OverLayTimers[spellid]) then
		return;
	end
	OverLayTimers[spellid].active = false;
	OverLayTimers[spellid].overlay:Hide();
	OverLayTimersActive = OverLayTimersActive-1;
	if(OverLayTimersActive==0) then
		SpellOverlayTimer_timer:SetScript("OnUpdate", nil);
	end
end


function SpellOverlayTimer_TimerEvent(self,elapsed)
	OverLayUpdater = OverLayUpdater - elapsed;
	if(OverLayUpdater > 0 or OverLayTimersActive==0) then
		return;
	else
		OverLayUpdater = 0.2;
	end
	if(OverLayTimers) then
		for index,value in pairs(OverLayTimers) do
			local timeleft = SpellOverlayTimer_GetBuffTimeLeft(index,value.checkwho);
			if(timeleft) then
				value.overlay:SetText(timeleft.." s" );
			end
		end

	end
end

function SpellOverlayTimer_OnEvent(self, event, ...)
	local arg1 = ...;
	if(arg1=="SpellOverlayTimer") then
		SpellOverlayTimer_Init();
	end
end


SpellOverlayTimer_timer = CreateFrame("FRAME");
SpellOverlayTimer_timer:SetScript("OnEvent", SpellOverlayTimer_OnEvent);
SpellOverlayTimer_timer:RegisterEvent("ADDON_LOADED");