vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local dewdrop = AceLibrary("Dewdrop-2.0")
local tablet = AceLibrary("Tablet-2.0")
local parser = ParserLib:GetInstance('1.1')
local compost = AceLibrary("Compost-2.0")

local L = AceLibrary("AceLocale-2.0"):new("FuBar_DPS")

FuBar_DPS = AceLibrary("AceAddon-2.0"):new("FuBarPlugin-2.0", "AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "Metrognome-2.0" )

FuBar_DPS:RegisterDB("FuBar_DPS_DB")
FuBar_DPS:RegisterDefaults('profile', {
        myDmgDone = true,
        myDmgTaken = true
})

local _, isPetClass = UnitClass('player')
if not (isPetClass == "WARLOCK" or isPetClass == "HUNTER" ) then
        isPetClass = nil
end

local OnCombatEvent = function(event, info)
        FuBar_DPS:OnCombatEvent(event, info);
end

local optionsTable = {
        type = 'group',
        args = {
                player = {
                        order = 1,
                        type = 'group',
                        name = L["MENU_PLAYER"],
                        desc = L["TOOLTIP_PLAYER"],
                        args = {
                                dps = {
                                        order = 1,
                                        type = 'toggle',
                                        name = L["myDmgDone"],
                                        desc = L["myDmgDone"],
                                        set = 'SetMyDmgDone',
                                        get = 'IsMyDmgDone',
                                },
                                dtps = {
                                        order = 2,
                                        type = 'toggle',
                                        name = L["myDmgTaken"],
                                        desc = L["myDmgTaken"],
                                        set = 'SetMyDmgTaken',
                                        get = 'IsMyDmgTaken',
                                },
                                hps = {
                                        order = 3,
                                        type = 'toggle',
                                        name = L["myHealDone"],
                                        desc = L["myHealDone"],
                                        set = 'SetMyHealDone',
                                        get = 'IsMyHealDone',
                                },
                                htps = {
                                        order = 4,
                                        type = 'toggle',
                                        name = L["myHealTaken"],
                                        desc = L["myHealTaken"],
                                        set = 'SetMyHealTaken',
                                        get = 'IsMyHealTaken',
                                },
                        },
                },
                hideLabel = {
                        order = 5,
                        type = 'toggle',
                        name = L["MENU_HIDE_LABEL"],
                        desc = L["MENU_HIDE_LABEL"],
                        set = 'SetHideLabel',
                        get = "IsHideLabel",
                },
                reset = {
                        order = 7,
                        type = 'execute',
                        name = L["MENU_RESET"],
                        desc = L["MENU_RESET"],
                        func = 'ResetSession',
                }
        
        }
}

FuBar_DPS.eventList = {
        "CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS",
        "CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS",
        "CHAT_MSG_COMBAT_SELF_HITS",
        "CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF",
        "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE",
        "CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS",
        "CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF",
        "CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF",
--              "CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE",
        "CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF",
--              "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE",
        "CHAT_MSG_SPELL_PARTY_BUFF",
--              "CHAT_MSG_SPELL_PARTY_DAMAGE",
        "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS",
        "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE",
        "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS",
        "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE",
        "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS",
        "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE",
        "CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS",
        "CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE",
        "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS",
        "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE",
        "CHAT_MSG_SPELL_SELF_BUFF",
        "CHAT_MSG_SPELL_SELF_DAMAGE",
        "CHAT_MSG_COMBAT_PET_HITS",
        "CHAT_MSG_SPELL_PET_BUFF",
        "CHAT_MSG_SPELL_PET_DAMAGE",    
}
        
FuBar_DPS.myDPS = { "myDmgDone", "myDmgTaken", "myHealDone", "myHealTaken" }
FuBar_DPS.petDPS = {}
FuBar_DPS.colors = {
        myDmgDone = "ff0000",
        myDmgTaken = "ff7f00",
        myHealDone = "00ff00",
        myHealTaken = "2020ff",
        petDmgDone = "ff3030",
        petDmgTaken = "ff7f30",
        petHealDone = "30ff30",
        petHealTaken = "5050ff",
}

FuBar_DPS.stats = {
        session = {
                myDmgDone = 0,
                myDmgTaken = 0,
                myHealDone = 0,
                myHealTaken = 0,
                duration = 0,
        },
        last = {
                myDmgDone = 0,
                myDmgTaken = 0,
                myHealDone = 0,
                myHealTaken = 0,
                duration = 0,
        },
}

FuBar_DPS.vars = {
        inCombat = false
}
        

        
function FuBar_DPS:OnInitialize()

        self:RegisterEvent("PLAYER_REGEN_DISABLED")
        self:RegisterEvent("PLAYER_REGEN_ENABLED")
        self:RegisterMetro(self.name, self.TickCombat, 1, self)

        if isPetClass then
                self:InitializePetClass()
        end
        
end

function FuBar_DPS:OnEnable()
        for i, event in self.eventList do
                parser:RegisterEvent(self.name, event, OnCombatEvent)
        end
end

function FuBar_DPS:OnDisable()
        parser:UnregisterAllEvents(self.name)
end
        
function FuBar_DPS:PLAYER_REGEN_DISABLED()
        for i in self.stats.last do
                self.stats.last[i] = 0
        end
        self.vars.inCombat = true;
        self:StartMetro(self.name)      
end

function FuBar_DPS:PLAYER_REGEN_ENABLED()       
        self:StopMetro(self.name)
        for i, v in self.stats.last do
                self.stats.session[i] = self.stats.session[i] + v
        end     
        self.vars.inCombat = false
end

function FuBar_DPS:OnCombatEvent(event, info)

        if self.vars.inCombat then
                
                if info.type == "hit" then
                
                        if info.source == ParserLib_SELF then
                                self.stats.last.myDmgDone = self.stats.last.myDmgDone + tonumber(info.amount);
                        elseif isPetClass and info.source == UnitName("pet") then
                                self.stats.last.petDmgDone = self.stats.last.petDmgDone + tonumber(info.amount);
                        end
                        
                        if info.victim == ParserLib_SELF then
                                self.stats.last.myDmgTaken = self.stats.last.myDmgTaken + tonumber(info.amount);
                        elseif isPetClass and info.victim == UnitName("pet") then
                                self.stats.last.petDmgTaken = self.stats.last.petDmgTaken + tonumber(info.amount);
                        end
                        
                elseif info.type == "heal" then
                
                        if info.source == ParserLib_SELF then
                                self.stats.last.myHealDone = self.stats.last.myHealDone + tonumber(info.amount);
                        elseif isPetClass and info.source == UnitName("pet") then
                                self.stats.last.petHealDone = self.stats.last.petHealDone + tonumber(info.amount);
                        end
                        
                        if info.victim == ParserLib_SELF then
                                self.stats.last.myHealTaken = self.stats.last.myHealTaken + tonumber(info.amount);
                        elseif isPetClass and info.victim == UnitName("pet") then
                                self.stats.last.petHealTaken = self.stats.last.petHealTaken + tonumber(info.amount);
                        end
                        
                end
                
        end

                        
end


        
function FuBar_DPS:TickCombat(difference)
        self.stats.last.duration = self.stats.last.duration + difference
        self:Update()   
end

function FuBar_DPS:GetDPS(category, field)
        local duration = self.stats[category].duration
        if duration < 1 then duration = 1 end   
        return string.format("|cff%s%.1f|r", self.colors[field], self.stats[category][field] / duration)
end



function FuBar_DPS:ResetSession()
        for i in self.stats.session do
                self.stats.session[i] = 0
        end
end
                
function FuBar_DPS:OnTextUpdate()

        local label, text, petLabel, petText

        if not self.db.profile.hideLabel then
                label = L.LABEL_DPS
                petLabel = L.LABEL_PET
        end
        
        if isPetClass and self.db.profile.mergeDPS then
                self:SetAddedStats();
        end

        text = ""
        for i, v in self.myDPS do
                if self.db.profile[v] then text = text .. "/" .. self:GetDPS("last", v) end
        end
        if string.sub(text, 1, 1) == "/" then text = string.sub(text, 2) end
        if text == "" then label = "" end

        if isPetClass and self.db.profile.mergeDPS then
                self:UnsetAddedStats();
        end

        petText = ""
        for i, v in self.petDPS do
                if self.db.profile[v] then petText = petText .. "/" .. self:GetDPS("last", v) end
        end
        if string.sub(petText, 1, 1) == "/" then petText = string.sub(petText, 2) end           
        if petText == "" then petLabel = nil end
        
        -- Do not turn everything off!
        if text == "" and not label and petText == "" and not petLabel then
                label = L.LABEL_DPS
        end
        
        local t = compost:Acquire()
        if label then table.insert(t, label) end
        if text ~= "" then table.insert(t, text) end
        if petLabel then table.insert(t, petLabel) end
        if petText ~= "" then table.insert(t, petText) end
        self:SetText( table.concat(t, " ") )
        compost:Reclaim(t)      
        
end
        
function FuBar_DPS:OnTooltipUpdate()

        if not self.statsCats then
                self.statsCats = { 'session', 'last' }
        end
        
        for i, statsCat in self.statsCats do
        
                local cat = tablet:AddCategory(
                        'columns', 3,
                        'text', L[statsCat],
                        'text2', string.format("%ds", self.stats[statsCat].duration),
                        'text3', L.TOTAL,
                        'child_textR', 1,
                        'child_textG', 1,
                        'child_textB', 0
                );      
                
                if isPetClass and self.db.profile.showPetTooltip then
                        cat:AddLine(
                                'text', string.format("|cffeda55f%s|r", L.MENU_PLAYER)
                        )
                end
                
                for i, statsType in self.myDPS do                       
                        cat:AddLine(
                                'text', L[statsType], 
                                'text2', self:GetDPS(statsCat, statsType),
                                'text3', self.stats[statsCat][statsType]
                        );
                end
                
                if isPetClass and self.db.profile.showPetTooltip then           
                        cat:AddLine(
                                'text', string.format("|cffeda55f%s|r", L.MENU_PET)
                        )
                        for i, statsType in self.petDPS do                              
                                cat:AddLine(
                                        'text', L[statsType], 
                                        'text2', self:GetDPS(statsCat, statsType),
                                        'text3', self.stats[statsCat][statsType]
                                );
                        end
                end     
        end
        
end
        


-- Set()s and Get()S
function FuBar_DPS:SetHideLabel(v)
        self.db.profile.hideLabel = v
        self:Update()
end

function FuBar_DPS:SetMyDmgDone(v)
 self.db.profile.myDmgDone = v
        self:Update()
end

function FuBar_DPS:SetMyDmgTaken(v)
 self.db.profile.myDmgTaken = v
        self:Update()
end

function FuBar_DPS:SetMyHealDone(v)
        self.db.profile.myHealDone = v
        self:Update()
end

function FuBar_DPS:SetMyHealTaken(v)
        self.db.profile.myHealTaken = v
        self:Update()
end

function FuBar_DPS:IsHideLabel()
        return self.db.profile.hideLabel
end

function FuBar_DPS:IsMyDmgDone()
        return self.db.profile.myDmgDone
end

function FuBar_DPS:IsMyDmgTaken()
        return self.db.profile.myDmgTaken
end

function FuBar_DPS:IsMyHealDone()
        return self.db.profile.myHealDone
end

function FuBar_DPS:IsMyHealTaken()
        return self.db.profile.myHealTaken
end


if isPetClass then
        function FuBar_DPS:SetMergeDPS(v)
                self.db.profile.mergeDPS = v
                self:Update()
        end

        function FuBar_DPS:SetShowPetTooltip(v)
                self.db.profile.showPetTooltip = v
                self:Update()
        end

        function FuBar_DPS:IsMergeDPS()
                return self.db.profile.mergeDPS
        end

        function FuBar_DPS:IsShowPetTooltip()
                return self.db.profile.showPetTooltip
        end

        function FuBar_DPS:SetPetDmgDone(v)
                self.db.profile.petDmgDone = v
                self:Update()
        end

        function FuBar_DPS:SetPetDmgTaken(v)
                self.db.profile.petDmgTaken = v
                self:Update()
        end

        function FuBar_DPS:SetPetHealDone(v)
                self.db.profile.petHealDone = v
                self:Update()
        end

        function FuBar_DPS:SetPetHealTaken(v)
                self.db.profile.petHealTaken = v
                self:Update()
        end

        function FuBar_DPS:IsPetDmgDone()
                return self.db.profile.petDmgDone
        end

        function FuBar_DPS:IsPetDmgTaken()
                return self.db.profile.petDmgTaken
        end

        function FuBar_DPS:IsPetHealDone()
                return self.db.profile.petHealDone
        end

        function FuBar_DPS:IsPetHealTaken()
                return self.db.profile.petHealTaken
        end


        function FuBar_DPS:SetAddedStats()
                if not self.stats.oldLast then self.stats.oldLast = {} end
                
                -- Switch stats to oldStats.
                local tmp = self.stats.oldLast          
                self.stats.oldLast = self.stats.last
                self.stats.last = tmp
                
                local stats = self.stats.last
                local oldStats = self.stats.oldLast
                
                stats.myDmgDone = oldStats.myDmgDone + oldStats.petDmgDone
                stats.myDmgTaken = oldStats.myDmgTaken + oldStats.petDmgTaken
                stats.myHealDone = oldStats.myHealDone + oldStats.petHealDone
                stats.myHealTaken = oldStats.myHealTaken + oldStats.petHealTaken
                stats.duration = oldStats.duration
        end
                
        function FuBar_DPS:UnsetAddedStats()    
                -- Switch back.
                local tmp = self.stats.last
                self.stats.last = self.stats.oldLast
                self.stats.oldLast = tmp
        end


        function FuBar_DPS:InitializePetClass()
                self.stats.session.petDmgDone = 0
                self.stats.session.petDmgTaken = 0
                self.stats.session.petHealDone = 0
                self.stats.session.petHealTaken = 0
                self.stats.last.petDmgDone = 0
                self.stats.last.petDmgTaken = 0
                self.stats.last.petHealDone = 0 
                self.stats.last.petHealTaken = 0
                self.petDPS = { "petDmgDone", "petDmgTaken", "petHealDone", "petHealTaken" }            
        end

        optionsTable.args.mergeDPS = {
                order = 3,
                type = 'toggle',
                name = L["MENU_MERGE_DPS"],
                desc = L["MENU_MERGE_DPS"],
                set = 'SetMergeDPS',
                get = "IsMergeDPS",
        }
        
        optionsTable.args.showPetTooltip = {
                order = 4,
                type = 'toggle',
                name = L["MENU_SHOW_PET_TOOLTIP"],
                desc = L["MENU_SHOW_PET_TOOLTIP"],
                set = 'SetShowPetTooltip',
                get = "IsShowPetTooltip",
        }

        optionsTable.args.pet = {
                order = 2,
                type = 'group',
                name = L["MENU_PET"],
                desc = L["TOOLTIP_PET"],
                args = {
                        petDmgDone = {
                                order = 1,
                                type = 'toggle',
                                name = L["petDmgDone"],
                                desc = L["petDmgDone"],
                                set = 'SetPetDmgDone',
                                get = 'IsPetDmgDone',
                        },
                        petDmgTaken = {
                                order = 2,
                                type = 'toggle',
                                name = L["petDmgTaken"],
                                desc = L["petDmgTaken"],
                                set = 'SetPetDmgTaken',
                                get = 'IsPetDmgTaken',
                        },
                        petHealDone = {
                                order = 3,
                                type = 'toggle',
                                name = L["petHealDone"],
                                desc = L["petHealDone"],
                                set = 'SetPetHealDone',
                                get = 'IsPetHealDone',
                        },
                        petHealTaken = {
                                order = 4,
                                type = 'toggle',
                                name = L["petHealTaken"],
                                desc = L["petHealTaken"],
                                set = 'SetPetHealTaken',
                                get = 'IsPetHealTaken',
                        },
                },
        }

end

FuBar_DPS.OnMenuRequest = optionsTable
FuBar_DPS:RegisterChatCommand( { "/fbdps" }, optionsTable )

Generated by GNU Enscript 1.6.5.90.