vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--      ArcaneBar
--              Adds a second casting bar to the player frame.
--
--      By: Zlixar
--
--      Adds a second casting bar to the player frame.
--
--      Modified by Nymbia for Nymbia's Perl Unitframes

-----------------------------
-- Configuration Functions --
-----------------------------

-- Registers frame to spellcast events.

local XPerl_ArcaneBar_Colors = {
        main = {r = 1.0, g = 0.7, b = 0.0},
        channel = {r = 0.0, g = 1.0, b = 0.0},
        success = {r = 0.0, g = 1.0, b = 0.0},
        failure = {r = 1.0, g = 0.0, b = 0.0}
}

local events = {"SPELLCAST_START", "SPELLCAST_STOP", "SPELLCAST_FAILED", "SPELLCAST_INTERRUPTED",
                "SPELLCAST_DELAYED", "SPELLCAST_CHANNEL_START", "SPELLCAST_CHANNEL_UPDATE"}

function XPerl_ArcaneBar_Register(frame)
        for i,event in pairs(events) do
                frame:RegisterEvent(event)
        end
        frame:SetScript("OnUpdate", XPerl_ArcaneBar_OnUpdate)
end

-- Unregisters from spellcast events.
function XPerl_ArcaneBar_Unregister(frame)
        for i,event in pairs(events) do
                frame:UnregisterEvent(event)
        end
        frame:SetScript("OnUpdate", nil)
end

-- XPerl_ArcaneBar_EnableToggle
function XPerl_ArcaneBar_EnableToggle(value)
        if (value == 1) then
                if (XPerl_ArcaneBarFrame.Enabled ~= 1) then
                        XPerl_ArcaneBar_Register(XPerl_ArcaneBarFrame)
                        XPerl_ArcaneBarFrame.Enabled = 1
                end
        else
                if (XPerl_ArcaneBarFrame.Enabled == 1) then
                        XPerl_ArcaneBar_Unregister(XPerl_ArcaneBarFrame)
                        XPerl_ArcaneBarFrame.Enabled = 0
                        XPerl_ArcaneBarFrame:Hide()
                end
        end
end

-- XPerl_ArcaneBar_OverrideToggle
function XPerl_ArcaneBar_OverrideToggle(value)
        if (value == 1) then
                if (XPerl_ArcaneBarFrame.Overrided ~= 1) then
                        XPerl_ArcaneBar_Unregister(CastingBarFrame)
                        XPerl_ArcaneBarFrame.Overrided = 1
                end
        else
                if (XPerl_ArcaneBarFrame.Overrided == 1) then
                        XPerl_ArcaneBar_Register(CastingBarFrame)
                        XPerl_ArcaneBarFrame.Overrided = 0
                end
        end
end

--------------------------------------------------
--
-- Event/Update Handlers
--
--------------------------------------------------

-- XPerl_ArcaneBar_OnEvent
function XPerl_ArcaneBar_OnEvent()
        if ( event == "SPELLCAST_START" ) then
                XPerl_ArcaneBar:SetStatusBarColor(XPerl_ArcaneBar_Colors.main.r, XPerl_ArcaneBar_Colors.main.g, XPerl_ArcaneBar_Colors.main.b, XPerlConfig.Transparency)
                XPerl_ArcaneBarSpark:Show()
                this.startTime = GetTime()
                this.maxValue = this.startTime + (arg2 / 1000)
                XPerl_ArcaneBar:SetMinMaxValues(this.startTime, this.maxValue)
                XPerl_ArcaneBar:SetValue(this.startTime)
                this:SetAlpha(0.8)
                this.holdTime = 0
                this.casting = 1
                this.fadeOut = nil
                this:Show()
                this.delaySum = 0
                if XPerlConfig.CastTime==1 then XPerl_ArcaneBar_CastTime:Show(); else XPerl_ArcaneBar_CastTime:Hide(); end
                this.mode = "casting"
        elseif ( event == "SPELLCAST_STOP" ) then
                this.delaySum = 0
                this.sign = "+"
                if (not this.casting) then
                        XPerl_ArcaneBar_CastTime:Hide()
                end
                if ( not this:IsVisible() ) then
                        this:Hide()
                end
                if ( this:IsShown() ) then
                        XPerl_ArcaneBar:SetValue(this.maxValue)
                        XPerl_ArcaneBar:SetStatusBarColor(XPerl_ArcaneBar_Colors.success.r, XPerl_ArcaneBar_Colors.success.g, XPerl_ArcaneBar_Colors.success.b, XPerlConfig.Transparency)
                        XPerl_ArcaneBarSpark:Hide()
                        XPerl_ArcaneBarFlash:SetAlpha(0.0)
                        XPerl_ArcaneBarFlash:Show()
                        this.casting = nil
                        this.flash = 1
                        this.fadeOut = 1

                        this.mode = "flash"
                end
        elseif ( event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED" ) then
                if ( this:IsShown() ) then
                        XPerl_ArcaneBar:SetValue(this.maxValue)
                        XPerl_ArcaneBar:SetStatusBarColor(XPerl_ArcaneBar_Colors.failure.r, XPerl_ArcaneBar_Colors.failure.g, XPerl_ArcaneBar_Colors.failure.b, XPerlConfig.Transparency)
                        XPerl_ArcaneBarSpark:Hide()
                        this.casting = nil
                        this.fadeOut = 1
                        this.holdTime = GetTime() + CASTING_BAR_HOLD_TIME
                end
        elseif ( event == "SPELLCAST_DELAYED" ) then
                if( this:IsShown() ) then
                        if arg1 then
                                this.startTime = this.startTime + (arg1 / 1000)
                                this.maxValue = this.maxValue + (arg1 / 1000)
                                this.delaySum = this.delaySum + arg1
                                XPerl_ArcaneBar:SetMinMaxValues(this.startTime, this.maxValue)
                        end
                end
        elseif ( event == "SPELLCAST_CHANNEL_START" ) then
                XPerl_ArcaneBar:SetStatusBarColor(XPerl_ArcaneBar_Colors.channel.r, XPerl_ArcaneBar_Colors.channel.g, XPerl_ArcaneBar_Colors.channel.b, XPerlConfig.Transparency)
                XPerl_ArcaneBarSpark:Show()
                this.maxValue = 1
                this.startTime = GetTime()
                this.endTime = this.startTime + (arg1 / 1000)
                this.duration = arg1 / 1000
                XPerl_ArcaneBar:SetMinMaxValues(this.startTime, this.endTime)
                XPerl_ArcaneBar:SetValue(this.endTime)
                this:SetAlpha(1.0)
                this.holdTime = 0
                this.casting = nil
                this.channeling = 1
                this.fadeOut = nil
                this:Show()
                this.delaySum = 0
                if XPerlConfig.CastTime==1 then XPerl_ArcaneBar_CastTime:Show(); else XPerl_ArcaneBar_CastTime:Hide(); end

        elseif ( event == "SPELLCAST_CHANNEL_UPDATE" ) then
                if ( arg1 == 0 ) then
                        this.channeling = nil
                        this.delaySum = 0
                        XPerl_ArcaneBar_CastTime:Hide()
                elseif ( this:IsShown() ) then
                        local origDuration = this.endTime - this.startTime
                        local elapsedTime = GetTime() - this.startTime
                        local losttime = origDuration*1000 - elapsedTime*1000 - arg1
                        this.delaySum = this.delaySum + losttime
                        this.startTime = this.endTime - origDuration
                        this.endTime = GetTime() + (arg1 / 1000)
                        XPerl_ArcaneBar:SetMinMaxValues(this.startTime, this.endTime)

                end
        else
                this.delaySum = 0
                this.sign = "+"
                XPerl_ArcaneBar_CastTime:Hide()
        end
end

-- XPerl_ArcaneBar_OnUpdate
function XPerl_ArcaneBar_OnUpdate()
        if (not XPerl_ArcaneBar:IsShown()) then
                XPerl_ArcaneBar_CastTime:Hide()
        end
        local current_time = this.maxValue - GetTime()
        if (this.channeling) then
                current_time = this.endTime - GetTime()
        end


        local text = string.sub(math.max(current_time,0)+0.001,1,4)
        if (this.delaySum and this.delaySum ~= 0) then
                local delay = string.sub(math.max(this.delaySum/1000, 0)+0.001,1,4)

                if (this.channeling == 1) then
                        this.sign = "-"
                else
                        this.sign = "+"
                end
                text = "|cffcc0000"..this.sign..delay.."|r "..text
        end
        XPerl_ArcaneBar_CastTime:SetText(text)


        if ( this.casting ) then
                local status = GetTime()
                if ( status > this.maxValue ) then
                        status = this.maxValue
                end
                XPerl_ArcaneBar:SetValue(status)
                XPerl_ArcaneBarFlash:Hide()
                local sparkPosition = ((status - this.startTime) / (this.maxValue - this.startTime)) * 154
                if ( sparkPosition < 0 ) then
                        sparkPosition = 0
                end
                XPerl_ArcaneBarSpark:SetPoint("CENTER", "XPerl_ArcaneBar", "LEFT", sparkPosition, 0)
        elseif ( this.channeling ) then
                local time = GetTime()
                if ( time > this.endTime ) then
                        time = this.endTime
                end
                if ( time == this.endTime ) then
                        this.channeling = nil
                        this.fadeOut = 1
                        return
                end
                local barValue = this.startTime + (this.endTime - time)
                XPerl_ArcaneBar:SetValue( barValue )
                XPerl_ArcaneBarFlash:Hide()
                local sparkPosition = ((barValue - this.startTime) / (this.endTime - this.startTime)) * 154
                XPerl_ArcaneBarSpark:SetPoint("CENTER", "XPerl_ArcaneBar", "LEFT", sparkPosition, 0)
        elseif ( GetTime() < this.holdTime ) then
                return
        elseif ( this.flash ) then
                local alpha = XPerl_ArcaneBarFlash:GetAlpha() + CASTING_BAR_FLASH_STEP
                if ( alpha < 1 ) then
                        XPerl_ArcaneBarFlash:SetAlpha(alpha)
                else
                        this.flash = nil
                end
        elseif ( this.fadeOut ) then
                local alpha = this:GetAlpha() - CASTING_BAR_ALPHA_STEP
                if ( alpha > 0 ) then
                        this:SetAlpha(alpha)
                else
                        this.fadeOut = nil
                        this:Hide()
                end
        end
end

-- XPerl_ArcaneBar_OnLoad
function XPerl_ArcaneBar_OnLoad()
        XPerl_ArcaneBar:SetFrameLevel(XPerl_Player_NameFrame:GetFrameLevel() + 1)
        --XPerl_Player_Name:SetFrameLevel(XPerl_Player_NameFrame:GetFrameLevel() + 2)
        XPerl_ArcaneBarFlashTex:SetTexture("Interface\\AddOns\\XPerl\\Images\\XPerl_ArcaneBarFlash")
        XPerl_ArcaneBarTex:SetTexture("Interface\\AddOns\\XPerl\\Images\\XPerl_StatusBar")
        this.casting = nil
        this.holdTime = 0
        this.Enabled = 0
        this.Overrided = 0
end

-- XPerl_ArcaneBar_Set
function XPerl_ArcaneBar_Set()
        if (XPerl_ArcaneBarFrame) then
                if (XPerlConfig.ArcaneBar == 0) then
                        XPerl_ArcaneBar_EnableToggle(0)
                else
                        XPerl_ArcaneBar_EnableToggle(1)
                end

                if (XPerlConfig.OldCastBar == 0) then
                        XPerl_ArcaneBar_OverrideToggle(1)
                else
                        XPerl_ArcaneBar_OverrideToggle(0)
                end
        end
end