WoWInterface SVN Eui

[/] [Eui/] [unitframe/] [plugin/] [combatfeedback.lua] - Rev 2

Compare with Previous | Blame | View Log

local damage_format = "-%d"
local heal_format = "+%d"
local maxAlpha = 0.6
local updateFrame
local feedback = {}
local originalHeight = {}
local color 
local colors = {
        STANDARD                = { 1, 1, 1 }, -- color for everything not in the list below
        -- damage colors
        IMMUNE                  = { 1, 1, 1 },
        DAMAGE                  = { 1, 0, 0 },
        CRUSHING                = { 1, 0, 0 },
        CRITICAL                = { 1, 0, 0 },
        GLANCING                = { 1, 0, 0 },
        ABSORB                  = { 1, 1, 1 },
        BLOCK                   = { 1, 1, 1 },
        RESIST                  = { 1, 1, 1 },
        MISS                    = { 1, 1, 1 },
        -- heal colors
        HEAL                    = { 0, 1, 0 },
        CRITHEAL                = { 0, 1, 0 },
        -- energize colors
        ENERGIZE                = { 0.41, 0.8, 0.94 },
        CRITENERGIZE    = { 0.41, 0.8, 0.94 },
}

local function createUpdateFrame()
        if updateFrame then return end
        updateFrame = CreateFrame("Frame")
        updateFrame:Hide()
        updateFrame:SetScript("OnUpdate", function()
                if next(feedback) == nil then
                        updateFrame:Hide()
                        return
                end
                for object, startTime in pairs(feedback) do
                        local maxalpha = object.CombatFeedbackText.maxAlpha
                        local elapsedTime = GetTime() - startTime
                        if ( elapsedTime < COMBATFEEDBACK_FADEINTIME ) then
                                local alpha = maxalpha*(elapsedTime / COMBATFEEDBACK_FADEINTIME)
                                object.CombatFeedbackText:SetAlpha(alpha)
                        elseif ( elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME) ) then
                                object.CombatFeedbackText:SetAlpha(maxalpha)
                        elseif ( elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME + COMBATFEEDBACK_FADEOUTTIME) ) then
                                local alpha = maxalpha - maxalpha*((elapsedTime - COMBATFEEDBACK_HOLDTIME - COMBATFEEDBACK_FADEINTIME) / COMBATFEEDBACK_FADEOUTTIME)
                                object.CombatFeedbackText:SetAlpha(alpha)
                        else
                                object.CombatFeedbackText:Hide()
                                feedback[object] = nil
                        end
                end             
        end)
end


local function combat(self, event, unit, eventType, flags, amount, dtype)
        if unit ~= self.unit then return end
        local FeedbackText = self.CombatFeedbackText
        local fColors = FeedbackText.colors
        local font, fontHeight, fontFlags = FeedbackText:GetFont()
        fontHeight = FeedbackText.origHeight -- always start at original height
        local text, arg
        color = fColors and fColors.STANDARD or colors.STANDARD
        if eventType == "IMMUNE" and not FeedbackText.ignoreImmune then
                color = fColors and fColors.IMMUNE or colors.IMMUNE
                fontHeight = fontHeight * 0.75
                text = CombatFeedbackText[eventType]
        elseif eventType == "WOUND" and not FeedbackText.ignoreDamage then
                if amount ~= 0 then
                        if flags == "CRITICAL" then
                                color = fColors and fColors.CRITICAL or colors.CRITICAL
                                fontHeight = fontHeight * 1.5
                        elseif  flags == "CRUSHING" then
                                color = fColors and fColors.CRUSING or colors.CRUSHING
                                fontHeight = fontHeight * 1.5
                        elseif flags == "GLANCING" then
                                color = fColors and fColors.GLANCING or colors.GLANCING
                                fontHeight = fontHeight * 0.75
                        else
                                color = fColors and fColors.DAMAGE or colors.DAMAGE
                        end
                        text = damage_format
                        arg = amount
                elseif flags == "ABSORB" then
                        color = fColors and fColors.ABSORB or colors.ABSORB
                        fontHeight = fontHeight * 0.75
                        text = CombatFeedbackText["ABSORB"]
                elseif flags == "BLOCK" then
                        color = fColors and fColors.BLOCK or colors.BLOCK
                        fontHeight = fontHeight * 0.75
                        text = CombatFeedbackText["BLOCK"]
                elseif flags == "RESIST" then
                        color = fColors and fColors.RESIST or colors.RESIST
                        fontHeight = fontHeight * 0.75
                        text = CombatFeedbackText["RESIST"]
                else
                        color = fColors and fColors.MISS or colors.MISS
                        text = CombatFeedbackText["MISS"]
                end
        elseif eventType == "BLOCK" and not FeedbackText.ignoreDamage then
                color = fColors and fColors.BLOCK or colors.BLOCK
                fontHeight = fontHeight * 0.75
                text = CombatFeedbackText[eventType]
        elseif eventType == "HEAL" and not FeedbackText.ignoreHeal then
                text = heal_format
                arg = amount
                if flags == "CRITICAL" then
                        color = fColors and fColors.CRITHEAL or colors.CRITHEAL
                        fontHeight = fontHeight * 1.3
                else
                        color = fColors and fColors.HEAL or colors.HEAL
                end
        elseif event == "ENERGIZE" and not FeedbackText.ignoreEnergize then
                text = amount
                if flags == "CRITICAL" then
                        color = fColors and fColors.ENERGIZE or colors.ENERGIZE
                        fontHeight = fontHeight * 1.3
                else
                        color = fColors and fColors.CRITENERGIZE or colors.CRITENERGIZE
                end
        elseif not FeedbackText.ignoreOther then
                text = CombatFeedbackText[eventType]
        end

        if text then
                FeedbackText:SetFont(font,fontHeight,fontFlags)
                FeedbackText:SetFormattedText(text, arg)
                FeedbackText:SetTextColor(unpack(color))
                FeedbackText:SetAlpha(0)
                FeedbackText:Show()
                feedback[self] = GetTime()
                updateFrame:Show() -- start our onupdate
        end
end

local function addCombat(object)
        if not object.CombatFeedbackText then return end
        -- store the original starting height
        local font, fontHeight, fontFlags = object.CombatFeedbackText:GetFont()
        object.CombatFeedbackText.origHeight = fontHeight
        object.CombatFeedbackText.maxAlpha = object.CombatFeedbackText.maxAlpha or maxAlpha
        createUpdateFrame()
        object:RegisterEvent("UNIT_COMBAT", combat)
end

for k, object in ipairs(oUF.objects) do addCombat(object) end
oUF:RegisterInitCallback(addCombat)

Compare with Previous | Blame