Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
        ___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I   By: Munglunch                              #
##############################################################################
##########################################################
LOCALIZED LUA FUNCTIONS
##########################################################
]]--
--[[ GLOBALS ]]--
local _G = _G;
local unpack    = _G.unpack;
local select    = _G.select;
local pairs     = _G.pairs;
local ipairs    = _G.ipairs;
local type      = _G.type;
local error     = _G.error;
local pcall     = _G.pcall;
local tostring  = _G.tostring;
local tonumber  = _G.tonumber;
local math 		= _G.math;
--[[ MATH METHODS ]]--
local random = math.random;
--[[
##########################################################
GET ADDON DATA
##########################################################
]]--
local SuperVillain, L = unpack(select(2, ...));
local MOD = SuperVillain.Registry:Expose('SVUnit');
local _, ns = ...
local oUF_SuperVillain = ns.oUF
--[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
local assert = enforce;
assert(oUF_SuperVillain, "SVUI was unable to locate oUF.")
--[[
##########################################################
POSITIONING
##########################################################
]]--
local Reposition = function(self)
	local bar = self.ArcaneChargeBar;
	local max = self.MaxClassPower;
	local height = self.db.classbar.height
	local size = (height - 4)
	local width = (size + 2) * max;
	bar:ClearAllPoints()
	bar:Size(width, height)
	if(self.db and self.db.classbar.slideLeft and (not self.db.power.tags or self.db.power.tags == '')) then
		bar:Point("TOPLEFT", self.InfoPanel, "TOPLEFT", 0, -2)
	else
		bar:Point("TOP", self.InfoPanel, "TOP", 0, -2)
	end
	for i = 1, max do
		bar[i]:ClearAllPoints()
		bar[i]:SetHeight(size)
		bar[i]:SetWidth(size)
		bar[i]:SetStatusBarColor(0,0.6,0.9)
		if i==1 then
			bar[i]:SetPoint("LEFT", bar)
		else
			bar[i]:Point("LEFT", bar[i - 1], "RIGHT", -1, 0)
		end
	end
end;
--[[
##########################################################
MAGE CHARGES
##########################################################
]]--
local function UpdateBar(self, elapsed)
	if not self.expirationTime then return end
	self.elapsed = (self.elapsed or 0) + elapsed
	if self.elapsed >= 0.5 then
		local timeLeft = self.expirationTime - GetTime()
		if timeLeft > 0 then
			self:SetValue(timeLeft)
		else
			self:SetScript("OnUpdate", nil)
		end
	end
end

local Update = function(self, event)
	local unit = self.unit or 'player'
	local bar = self.ArcaneChargeBar
	local talentSpecialization = GetSpecialization()
	if talentSpecialization == 1 then
		bar:Show()
	else
		bar:Hide()
	end

	local arcaneCharges, maxCharges, duration, expirationTime = 0, 4
	if bar:IsShown() then
		for index=1, 30 do
			local _, _, _, count, _, start, timeLeft, _, _, _, spellID = UnitDebuff(unit, index)
			if spellID == 36032 then
				arcaneCharges = count or 0
				duration = start
				expirationTime = timeLeft
				break
			end
		end

		for i = 1, maxCharges do
			if duration and expirationTime then
				bar[i]:SetMinMaxValues(0, duration)
				bar[i].duration = duration
				bar[i].expirationTime = expirationTime
			end
			if i <= arcaneCharges then
				bar[i]:Show()
				bar[i]:SetValue(duration)
				if not bar[i].sparks:IsShown() then bar[i].sparks:Show()end;
				if not bar[i].charge:IsShown() then bar[i].charge:Show()end;
				if not bar[i].under.anim:IsPlaying()then bar[i].under.anim:Play()end;
				if not bar[i].sparks.anim:IsPlaying()then bar[i].sparks.anim:Play()end;
				if not bar[i].charge.anim:IsPlaying()then bar[i].charge.anim:Play()end;
				bar[i]:SetScript('OnUpdate', UpdateBar)
			else
				bar[i]:SetValue(0)
				if bar[i].under.anim:IsPlaying()then bar[i].under.anim:Stop()end;
				if bar[i].sparks.anim:IsPlaying()then bar[i].sparks.anim:Stop()end;
				if bar[i].charge.anim:IsPlaying()then bar[i].charge.anim:Stop()end;
				bar[i].sparks:Hide()
				bar[i].charge:Hide()
				bar[i]:SetScript('OnUpdate', nil)
				bar[i]:Hide()
			end
		end
	end
end

function MOD:CreateMageResourceBar(playerFrame)
	local max = 4
	local bar = CreateFrame("Frame",nil,playerFrame)
	bar:SetFrameLevel(playerFrame.InfoPanel:GetFrameLevel() + 30)

	for i = 1, max do
		bar[i] = CreateFrame("StatusBar", nil, bar)
		bar[i]:SetStatusBarTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Unitframe\\Class\\ORB")
		bar[i]:GetStatusBarTexture():SetHorizTile(false)
		bar[i]:SetOrientation("VERTICAL")
		bar[i].noupdate = true;
		local under = CreateFrame("Frame", nil, bar[i])
		under:SetAllPoints()
		under.under = under:CreateTexture(nil, "BORDER")
		under.under:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Unitframe\\Class\\ORB-BG")
		under.bg = under:CreateTexture(nil, "BORDER")
		under.bg:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Unitframe\\Class\\ORB-BG")
		local sparks = under:CreateTexture(nil, "OVERLAY")
		sparks:WrapOuter(under, 3, 3)
		sparks:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Unitframe\\Class\\MAGE-FG-ANIMATION")
		sparks:SetBlendMode("ADD")
		sparks:SetVertexColor(1, 1, 0)
		local charge = under:CreateTexture(nil, "OVERLAY", nil, 2)
		charge:SetAllPoints(under)
		charge:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Unitframe\\Class\\MAGE-BG-ANIMATION")
		charge:SetBlendMode("ADD")
		charge:SetVertexColor(0.5, 1, 1)
		SuperVillain.Animate:Sprite(charge, 10, false, true)
		charge.anim:Play()
		SuperVillain.Animate:Sprite(sparks, 0.08, 5, true)
		sparks.anim:Play()
		bar[i].charge = charge;
		bar[i].sparks = sparks;
		SuperVillain.Animate:Orbit(under, 15, false)
		bar[i].under = under;
		bar[i].bg = under.bg;
	end;

	playerFrame.MaxClassPower = max;
	playerFrame.ClassBarRefresh = Reposition;
	bar.Override = Update;

	return bar
end;