vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local module = ArcHUD:NewModule("Casting")
module.unit = "player"
module.defaults = {
        Enabled = true,
        Outline = true,
        ShowSpell = true,
        ShowTime = true,
        Side = 2,
        Level = -1,
}
module.options = {
        {name = "ShowSpell", text = "SHOWSPELL", tooltip = "SHOWSPELL"},
        {name = "ShowTime", text = "SHOWTIME", tooltip = "SHOWTIME"},
        attach = true,
}
module.localized = true
module.disableEvents = {
        {frame = "CastingBarFrame", hide = TRUE, events = {"SPELLCAST_START", "SPELLCAST_STOP", "SPELLCAST_DELAYED",
                                                                                                                "SPELLCAST_FAILED", "SPELLCAST_INTERRUPTED",
                                                                                                                "SPELLCAST_CHANNEL_START", "SPELLCAST_CHANNEL_UPDATE",
                                                                                                                "SPELLCAST_CHANNEL_STOP"}},
}

function module:Initialize()
        -- Setup the frame we need
        self.f = self:CreateRing(true, ArcHUDFrame)
        self.f:SetAlpha(0)

        self.Text = self:CreateFontString(self.f, "BACKGROUND", {175, 14}, 12, "LEFT", {1.0, 1.0, 1.0}, {"TOP", "ArcHUDFrameCombo", "BOTTOM", -28, 0})
        self.Time = self:CreateFontString(self.f, "BACKGROUND", {40, 14}, 12, "RIGHT", {1.0, 1.0, 1.0}, {"TOPLEFT", self.Text, "TOPRIGHT", 0, 0})

        -- Register timers
        self:RegisterMetro(self.name .. "Taxi", self.Taxi, 0.05, self)
        self:RegisterMetro(self.name .. "Casting", self.Casting, 0.01, self)
end

function module:Update()
        if(self.db.profile.ShowSpell) then
                self.Text:Show()
        else
                self.Text:Hide()
        end

        if(self.db.profile.ShowTime) then
                self.Time:Show()
        else
                self.Time:Hide()
        end

        if(self.db.profile.Outline) then
                self.f.BG:Show()
        else
                self.f.BG:Hide()
        end

        -- Clear all points for the ring
        self.f:ClearAllPoints()
        if(self.db.profile.Side == 1) then
                -- Attach to left side
                self.f:SetPoint("TOPLEFT", self.parent:GetModule("Anchors").Left, "TOPLEFT", self.db.profile.Level * -15, 0)
                self.f.BG:SetReversed(false)
                self.f:SetReversed(false)
        else
                -- Attach to right side
                self.f:SetPoint("TOPRIGHT", self.parent:GetModule("Anchors").Right, "TOPRIGHT", self.db.profile.Level * 15, 0)
                self.f.BG:SetReversed(true)
                self.f:SetReversed(true)
        end
        self.f.BG:SetAngle(180)
end

function module:Enable()
        self.OnTaxi = nil
        self.flying = nil
        self.f.casting = 0
        self.channeling = 0
        self.spellstart = GetTime()
        self.f.fadeIn = 0.25
        self.f.fadeOut = 2

        self.f.dirty = true

        -- Register the events we will use
        self:RegisterEvent("SPELLCAST_START")
        self:RegisterEvent("SPELLCAST_DELAYED")
        self:RegisterEvent("SPELLCAST_CHANNEL_START")
        self:RegisterEvent("SPELLCAST_CHANNEL_UPDATE")

        self:RegisterEvent("SPELLCAST_STOP",                    "SpellcastStop")
        self:RegisterEvent("SPELLCAST_FAILED",                  "SpellcastStop")
        self:RegisterEvent("SPELLCAST_INTERRUPTED",     "SpellcastStop")
        self:RegisterEvent("SPELLCAST_CHANNEL_STOP",    "SpellcastStop")

        -- Do hooks for FlightMap
        self:Debug(2, "Hooking TakeTaxiNode")
        self:Hook("TakeTaxiNode", "TakeTaxiNode")

        -- Activate the timers
        self:StartMetro(self.name .. "Taxi")
        self:StartMetro(self.name .. "Casting")
        self:StartMetro(self.name .. "Alpha")
        self:StartMetro(self.name .. "Fade")

        self.f:Show()
end

function module:Disable()
        if (FlightMapFrame) then
                if (self.FlightMapX and self.FlightMapY) then
                        FlightMapTimesFrame:ClearAllPoints()
                        FlightMapTimesFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", self.FlightMapX, self.FlightMapY )
                end
        end
end

function module:Casting()
        if ( self.f.casting == nil ) then
                self.f.casting = 0 end
        if ( self.channeling == nil ) then
                self.channeling = 0 end
        if ( self.spellstart == nil ) then
                self.spellstart = GetTime() end

        if ( self.f.casting == 1) then
                local status = (GetTime() - self.spellstart)*1000
                local time_remaining = self.f.maxValue - status

                if ( self.channeling == 1) then
                        status = time_remaining
                end

                if ( status > self.f.maxValue ) then
                        status = self.f.maxValue
                end

                self.f:SetValue(status)

                if ( time_remaining < 0 ) then
                        time_remaining = 0
                end

                local texttime = ""
                if((time_remaining/1000) > 60) then
                        local minutes = math.floor(time_remaining/60000)
                        local seconds = math.floor(((time_remaining/60000) - minutes) * 60)
                        if(seconds < 10) then
                                texttime = minutes..":0"..seconds
                        else
                                texttime = minutes..":"..seconds
                        end
                else
                        local intlength = string.len(string.format("%u",time_remaining/1000))
                        texttime = strsub(string.format("%f",time_remaining/1000),1,intlength+2)
                end
                self.Time:SetText(texttime)
        end
end

function module:TakeTaxiNode(id)
        self.hooks["TakeTaxiNode"].orig(id)

        self:Debug(2, "TakeTaxiNode called")
        if (FlightMapTimesFrame) then
                self:Debug(2, "FlightMapTimesFrame exists")
                if (FlightMapTimesFrame:IsVisible()) then
                        self:Debug(2, "FlightMapTimesFrame is visible")
                        -- grab all the values for this casting bar
                        local intDuration = nil

                        if (FlightMapTimesFrame.endTime ~= nil) then
                                intDuration = (FlightMapTimesFrame.endTime - FlightMapTimesFrame.startTime) * 1000
                        end

                        -- Set up casting bar for flight
                        self.OnTaxi = true
                        if(intDuration == 0) then
                                self.Text:SetText(FlightMapTimesFrame.endPoint.. " - Timing")
                                self.taxiDur = 1
                        else
                                self.Text:SetText(FlightMapTimesFrame.endPoint)
                                self.taxiDur = intDuration
                                self.channeling = 1
                                self.f.casting = 1
                                self.spellstart = GetTime()
                        end


                        if(not self.FlightMapX) then
                                self:Debug(2, "Hide the FlightMapTimesFrame frame")
                                -- store the flight map position
                                self.FlightMapX = FlightMapTimesFrame:GetLeft()
                                self.FlightMapY = FlightMapTimesFrame:GetBottom()

                                -- now move the frame off the screen
                                FlightMapTimesFrame:ClearAllPoints()
                                FlightMapTimesFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", -2000, 2000 )
                        end
                end
        end
end

function module:Taxi()
        if(self.OnTaxi) then
                if(not self.flying) then
                        if(UnitOnTaxi(self.unit)) then
                                self.flying = true
                                self.f:SetMax(self.taxiDur)
                                self.f:SetValue(self.taxiDur)
                                self.taxiDur = nil
                                self.f:UpdateColor({["r"] = 0.3, ["g"] = 0.3, ["b"] = 1.0})
                                if(ArcHUD.db.profile.FadeIC > ArcHUD.db.profile.FadeOOC) then
                                        self.f:SetRingAlpha(ArcHUD.db.profile.FadeIC)
                                else
                                        self.f:SetRingAlpha(ArcHUD.db.profile.FadeOOC)
                                end
                        end
                        return
                end

                -- are we on a taxi?
                -- Did we just get off?
                if (not UnitOnTaxi(self.unit)) then
                        self.flying = nil
                        self.OnTaxi = nil
                        self.channeling = 0
                        self.f:SetRingAlpha(0)
                        self.f:SetValue(0)
                        self.f.casting = 0
                        self.Text:SetText("")
                        self.Time:SetText("")
                end
        end
end

function module:SPELLCAST_START()
        self.f:UpdateColor({["r"] = 1.0, ["g"] = 0.7, ["b"] = 0})
        self.Text:SetText(arg1)
        self.startValue = 0
        self.f:SetMax(arg2)
        self.f.casting = 1
        self.channeling = 0
        self.spellstart = GetTime()
        self.stopSet = false
        if(ArcHUD.db.profile.FadeIC > ArcHUD.db.profile.FadeOOC) then
                self.f:SetRingAlpha(ArcHUD.db.profile.FadeIC)
        else
                self.f:SetRingAlpha(ArcHUD.db.profile.FadeOOC)
        end
end

function module:SPELLCAST_CHANNEL_START()
        self.f:UpdateColor({["r"] = 0.3, ["g"] = 0.3, ["b"] = 1.0})
        self.Text:SetText(arg2)
        self.startValue = 0
        self.f:SetMax(arg1)
        self.f:SetValue(arg1)
        self.channeling = 1
        self.f.casting = 1
        self.spellstart = GetTime()
        if(ArcHUD.db.profile.FadeIC > ArcHUD.db.profile.FadeOOC) then
                self.f:SetRingAlpha(ArcHUD.db.profile.FadeIC)
        else
                self.f:SetRingAlpha(ArcHUD.db.profile.FadeOOC)
        end
end

function module:SPELLCAST_CHANNEL_UPDATE()
        self.f:SetValue(self.f.maxValue-arg1)
        self.spellstart = GetTime() - (self.f.endValue/1000)
end

function module:SPELLCAST_DELAYED()
        self.f:SetValue(self.f.startValue - arg1)
        self.spellstart = self.spellstart + (arg1/1000)
end

function module:SpellcastStop()
        if(self.channeling == nil or event == "SPELLCAST_CHANNEL_STOP") then
                self.channeling = 0
        end
        if(self.channeling == 0) then
                if(self.f.casting == 1) then
                        self.f.casting = 0
                        if(event == "SPELLCAST_CHANNEL_STOP") then
                                self.Text:SetText("")
                                self.f:SetValue(0)
                        else
                                self.f:SetValue(self.f.maxValue)
                        end
                        if(event == "SPELLCAST_STOP" or event == "SPELLCAST_CHANNEL_STOP") then
                                self.f:UpdateColor({["r"] = 0, ["g"] = 1.0, ["b"] = 0})
                        else
                                self.f:UpdateColor({["r"] = 1.0, ["g"] = 0, ["b"] = 0})
                                if(event == "SPELLCAST_FAILED") then
                                        self.Text:SetText("Failed")
                                else
                                        self.Text:SetText("Interrupted")
                                end
                        end
                elseif(self.f.casting == 0 and (event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED")) then
                        self.f:UpdateColor({["r"] = 1.0, ["g"] = 0, ["b"] = 0})
                        if(event == "SPELLCAST_FAILED") then
                                self.Text:SetText("Failed")
                        else
                                self.Text:SetText("Interrupted")
                        end
                end
                self.waschanneling = false
                self.Time:SetText("")
                self.f:SetRingAlpha(0)
        end
end