vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local XPerl_Party_Pet_Events = {}
local PartyPetFrames = {}

-- XPerl_Party_Pet_RegisterForPet
local function XPerl_Party_Pet_RegisterForPet()
        local reg
        for i = 1,4 do
                if (UnitExists("partypet"..i)) then
                        reg = true
                end
        end

        if (reg) then
                XPerl_Party_Pet_EventFrame:RegisterEvent("UNIT_FACTION")
                XPerl_Party_Pet_EventFrame:RegisterEvent("UNIT_AURA")
                XPerl_Party_Pet_EventFrame:RegisterEvent("PARTY_MEMBER_ENABLE")
                XPerl_Party_Pet_EventFrame:RegisterEvent("PARTY_MEMBER_DISABLE")
                XPerl_Party_Pet_EventFrame:RegisterEvent("UNIT_FLAGS")
                XPerl_Party_Pet_EventFrame:RegisterEvent("UNIT_DYNAMIC_FLAGS")
                XPerl_RegisterBasics(XPerl_Party_Pet_EventFrame)
                XPerl_Party_Pet_EventFrame:Show()               -- For OnUpdate
        end
end

-- XPerl_Party_Pet_UnregisterForPet
local function XPerl_Party_Pet_UnregisterForPet()
        local reg
        for i = 1,4 do
                if (UnitExists("partypet"..i)) then
                        reg = true
                end
        end

        if (not reg) then
                XPerl_Party_Pet_EventFrame:UnregisterEvent("UNIT_FACTION")
                XPerl_Party_Pet_EventFrame:UnregisterEvent("UNIT_AURA")
                XPerl_Party_Pet_EventFrame:UnregisterEvent("PARTY_MEMBER_ENABLE")
                XPerl_Party_Pet_EventFrame:UnregisterEvent("PARTY_MEMBER_DISABLE")
                XPerl_Party_Pet_EventFrame:UnregisterEvent("UNIT_FLAGS")
                XPerl_Party_Pet_EventFrame:UnregisterEvent("UNIT_DYNAMIC_FLAGS")
                XPerl_UnregisterBasics(XPerl_Party_Pet_EventFrame)
        end
end

----------------------
-- Loading Function --
----------------------
function XPerl_Party_Pet_OnLoadEvents()
        this.time = 0
        XPerl_Party_Pet_EventFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
        XPerl_Party_Pet_EventFrame:RegisterEvent("PLAYER_LEAVING_WORLD")

        -- Set here to reduce amount of function calls made
        XPerl_Party_Pet_EventFrame:SetScript("OnEvent", XPerl_Party_Pet_OnEvent)
        XPerl_Party_Pet_EventFrame:SetScript("OnUpdate", XPerl_Party_Pet_OnUpdate)
end

-- XPerl_Party_Pet_OnLoad
function XPerl_Party_Pet_OnLoad()
        this.partyunit = "party"..this:GetID()
        this.petunit = "partypet"..this:GetID()

        PartyPetFrames[this.petunit] = this

        XPerl_InitFadeFrame(this)

        XPerl_RegisterHighlight(getglobal(this:GetName().."_CastClickOverlay"), 2)
        XPerl_RegisterPerlFrames(this, {"NameFrame", "StatsFrame"})

        this.FlashFrames = {getglobal(this:GetName().."_NameFrame"),
                                getglobal(this:GetName().."_LevelFrame"),
                                getglobal(this:GetName().."_StatsFrame") }
end

-------------------------
-- The Update Function --
-------------------------

-- XPerl_Party_Pet_CheckPet
-- returns true if full update required (frame shown)

function XPerl_Party_Pet_CheckPet(argFrame)
        if (XPerlConfig.ShowPartyPets == 1) then
                if (UnitExists(argFrame.partyunit) and UnitExists(argFrame.petunit) and UnitIsConnected(argFrame.petunit) and not UnitIsDead(argFrame.petunit)) then   -- and not UnitIsDeadOrGhost(argFrame.partyunit)
                        if (not argFrame:IsShowing()) then
                                if (XPerlConfig.ShowPartyRaid == 1 or not UnitInRaid("player")) then
                                        if (XPerlConfig.ShowPartyRaid == 1) then
                                                XPerl_Party_Pet_RegisterForPet()
                                                XPerl_CancelFade(argFrame)
                                                argFrame:Show()
                                                return true
                                        end
                                end
                        end
                        return false
                end
        end

        if (argFrame:IsShowing()) then
                XPerl_Party_Pet_UnregisterForPet()
                XPerl_StartFade(argFrame)
        end

        return false
end

-- XPerl_Party_Pet_UpdateName
local function XPerl_Party_Pet_UpdateName(argFrame)
        if (argFrame.petunit == nil) then
                return
        end

        local Partypetname = UnitName(argFrame.petunit)

        if (Partypetname ~= nil) then
                -- Set name
                --if (strlen(Partypetname) > 40) then
                --      Partypetname = strsub(Partypetname, 1, 39).."..."
                --end
                if (XPerlConfig.ShowPartyPetNames == 1) then
                        getglobal(argFrame:GetName().."_NameFrame"):Show()
                end
                getglobal(argFrame:GetName().."_NameFrameText"):SetText(Partypetname)

                if (UnitIsPVP(argFrame.partyunit)) then
                        getglobal(argFrame:GetName().."_NameFrameText"):SetTextColor(0,1,0)
                else
                        getglobal(argFrame:GetName().."_NameFrameText"):SetTextColor(0.5,0.5,1)
                end
        end
end

-- XPerl_Party_Pet_UpdateHealth
local function XPerl_Party_Pet_UpdateHealth(argFrame)
        local Partypethealth = UnitHealth(argFrame.petunit)
        local Partypethealthmax = UnitHealthMax(argFrame.petunit)

        local healthPct = Partypethealth / Partypethealthmax
        local phealthPct = string.format("%3.0f", healthPct * 100)

        getglobal(argFrame:GetName().."_StatsFrame_HealthBar"):SetMinMaxValues(0, Partypethealthmax)
        getglobal(argFrame:GetName().."_StatsFrame_HealthBar"):SetValue(Partypethealth)
        XPerl_SetSmoothBarColor(getglobal(argFrame:GetName().."_StatsFrame_HealthBar"), healthPct)

        if (UnitIsDead(argFrame.petunit)) then
                --getglobal(this:GetName().."_StatsFrame_HealthBar_HealthBarPercentText"):SetText(XPERL_LOC_DEAD)
                --getglobal(this:GetName().."_StatsFrame_HealthBar_HealthBarPercentText"):Hide()
                XPerl_StartFade(argFrame)
        else
                local t = getglobal(argFrame:GetName().."_StatsFrame_HealthBarText")
                if (XPerlConfig.HealerMode == 1) then
                        if (XPerlConfig.HealerModeType == 1) then
                                t:SetText(string.format("%d/%d", Partypethealth - Partypethealthmax, Partypethealthmax))
                        else
                                t:SetText(Partypethealth - Partypethealthmax)
                        end
                else
                        t:SetText(string.format("%d",(100*(Partypethealth / Partypethealthmax))+0.5).."%")
                end

                getglobal(argFrame:GetName().."_StatsFrame_HealthBarText"):Show()
        end
end

-- XPerl_Party_Pet_UpdateManaType
local function XPerl_Party_Pet_UpdateManaType(argFrame)
        local frameName = argFrame:GetName().."_StatsFrame_ManaBar"
        XPerl_SetManaBarType(argFrame.petunit, getglobal(frameName), getglobal(frameName.."BG"))
end

-- XPerl_Party_Pet_UpdateMana
local function XPerl_Party_Pet_UpdateMana(argFrame)
        local Partypetmana = UnitMana(argFrame.petunit)
        local Partypetmanamax = UnitManaMax(argFrame.petunit)

        getglobal(argFrame:GetName().."_StatsFrame_ManaBar"):SetMinMaxValues(0, Partypetmanamax)
        getglobal(argFrame:GetName().."_StatsFrame_ManaBar"):SetValue(Partypetmana)

        pmanaPct = (Partypetmana * 100.0) / Partypetmanamax
        pmanaPct =  string.format("%3.0f", pmanaPct)
        getglobal(argFrame:GetName().."_StatsFrame_ManaBarText"):Show()
        if (UnitPowerType(argFrame.petunit) >= 1) then
                getglobal(argFrame:GetName().."_StatsFrame_ManaBarText"):SetText(Partypetmana)
        else
                getglobal(argFrame:GetName().."_StatsFrame_ManaBarText"):SetText(string.format("%d",(100*(Partypetmana / Partypetmanamax))+0.5).."%")
        end
        if (XPerlConfig.ShowPartyPetPercent == 0) then
                getglobal(argFrame:GetName().."_StatsFrame_ManaBarText"):Hide()
        end
end

-- XPerl_Party_Pet_UpdateLevel
local function XPerl_Party_Pet_UpdateLevel(argFrame)
        local Partypetlevel = UnitLevel(argFrame.petunit)
        --local PartypetClassification = UnitClassification(this.petunit)
        local color = GetDifficultyColor(Partypetlevel)

        getglobal(argFrame:GetName().."_NameFrameLevelText"):SetTextColor(color.r,color.g,color.b)

        if (Partypetlevel == 0) then
                Partypetlevel = ""
        end
        getglobal(argFrame:GetName().."_NameFrameLevelText"):SetText(Partypetlevel)
end

--------------------
-- Buff Functions --
--------------------

-- GetBuffButton
local function GetBuffButton(thisFrame, buffnum, debuff, createIfAbsent)

        local buffType
        if (debuff == 1) then
                buffType = "DeBuff"
        else
                buffType = "Buff"
        end
        local name = thisFrame:GetName().."_BuffFrame_"..buffType..buffnum
        local button = getglobal(name)

        if (not button and createIfAbsent) then
                button = CreateFrame("Button", name, getglobal(thisFrame:GetName().."_BuffFrame"), "XPerl_"..buffType.."Template")
                button:SetID(buffnum)

                button:SetHeight(12)
                button:SetWidth(12)

                if (debuff == 1) then
                        button:SetScript("OnEnter", XPerl_Party_Pet_SetDeBuffTooltip)
                else
                        button:SetScript("OnEnter", XPerl_Party_Pet_SetBuffTooltip)
                end
                button:SetScript("OnLeave", XPerl_PlayerTipHide)

                button:ClearAllPoints()
                if (buffnum == 1) then
                        if (debuff == 1) then
                                button:SetPoint("TOPLEFT", 0, -14)
                        else
                                button:SetPoint("TOPLEFT", 0, 0)
                        end
                else
                        local prevButton = getglobal(thisFrame:GetName().."_BuffFrame_"..buffType..(buffnum - 1))
                        button:SetPoint("TOPLEFT", prevButton, "TOPRIGHT", 1 + debuff, 0)
                end
        end

        return button
end

-- XPerl_Party_Pet_Buff_UpdateAll
function XPerl_Party_Pet_Buff_UpdateAll(argFrame)
        local buffFrame = getglobal(argFrame:GetName().."_BuffFrame")
        if (XPerlConfig.ShowPartyPetBuffs == 1) then
                if (UnitExists(argFrame.partyunit) and UnitExists(argFrame.petunit)) then
                        buffFrame:Show()

                        for buffnum=1,10 do
                                local buff = XPerl_UnitBuff(argFrame.petunit, buffnum, XPerlConfig.PartyCastableBuffs)
                                if (buff) then
                                        local button = GetBuffButton(argFrame, buffnum, 0, buff)
                                        local icon = getglobal(button:GetName().."Icon")
                                        icon:SetTexture(buff)
                                        button:Show()
                                elseif (button) then
                                        local button = getglobal(argFrame:GetName().."_BuffFrame_Buff"..buffnum)
                                        if (button) then
                                                button:Hide()
                                        end
                                end
                        end
                        for buffnum=1,8 do
                                local buff = XPerl_UnitDebuff(argFrame.petunit, buffnum, XPerlConfig.PartyCurableDebuffs)
                                if (buff) then
                                        local button = GetBuffButton(argFrame, buffnum, 1, buff)
                                        local icon = getglobal(button:GetName().."Icon")
                                        icon:SetTexture(buff)
                                        button:Show()
                                elseif (button) then
                                        local button = getglobal(argFrame:GetName().."_BuffFrame_DeBuff"..buffnum)
                                        if (button) then
                                                button:Hide()
                                        end
                                end
                        end
                else
                        buffFrame:Hide()
                end
        else
                buffFrame:Hide()
        end

        XPerl_CheckDebuffs(argFrame.petunit, {getglobal(argFrame:GetName().."_NameFrame"), getglobal(argFrame:GetName().."_StatsFrame")})
end

function XPerl_Party_Pet_SetBuffTooltip()
        local partyid = "partypet"..this:GetParent():GetParent():GetID()
        GameTooltip:SetOwner(this,"ANCHOR_BOTTOMRIGHT",30,0)
        --GameTooltip:SetUnitBuff(partyid, this:GetID(), XPerlConfig.PartyCastableBuffs)
        XPerl_TooltipSetUnitBuff(GameTooltip, partyid, this:GetID(), XPerlConfig.PartyCastableBuffs)
end
function XPerl_Party_Pet_SetDeBuffTooltip()
        local partyid = "partypet"..this:GetParent():GetParent():GetID()
        GameTooltip:SetOwner(this,"ANCHOR_BOTTOMRIGHT",30,0)
        --GameTooltip:SetUnitDebuff(partyid, this:GetID(), XPerlConfig.PartyCurableDebuffs)
        XPerl_TooltipSetUnitDebuff(GameTooltip, partyid, this:GetID(), XPerlConfig.PartyCurableDebuffs)
end

function XPerl_Party_Pet_UpdateDisplayAll()
        for i,frame in pairs(PartyPetFrames) do
                XPerl_Party_Pet_UpdateDisplay(frame)
        end
end

function XPerl_Party_Pet_UpdateDisplay(argFrame)
        if (XPerl_Party_Pet_CheckPet(argFrame)) then
                XPerl_Party_Pet_UpdateName(argFrame)
                XPerl_Party_Pet_UpdateHealth(argFrame)
                XPerl_Party_Pet_UpdateLevel(argFrame)
                XPerl_Party_Pet_UpdateManaType(argFrame)
                XPerl_Party_Pet_UpdateMana(argFrame)
                XPerl_Party_Pet_UpdateCombat(argFrame)
                XPerl_Party_Pet_Buff_UpdateAll(argFrame)
        end
end


--------------------
-- Click Handlers --
--------------------
Perl_Party_Pet_FindID = XPerl_Frame_FindID

-- XPerl_Party_Pet_OnClick
function XPerl_Party_Pet_OnClick(button)
        local unit = this:GetParent().petunit
        if (XPerl_OnClick_Handler(button, unit)) then
                return
        end
end

-- XPerl_Party_Pet_PlayerTip
function XPerl_Party_Pet_PlayerTip()
        local unit = this:GetParent().petunit
        if (UnitExists(unit)) then
                XPerl_PlayerTip(unit)
        end
end

-- XPerl_Party_Pet_Update_Control
local function XPerl_Party_Pet_Update_Control(argFrame)
        if (UnitIsVisible(argFrame.petunit) and UnitIsCharmed(argFrame.petunit)) then
                getglobal(argFrame:GetName().."_NameFrame_Warning"):Show()
        else
                getglobal(argFrame:GetName().."_NameFrame_Warning"):Hide()
        end
end

-- XPerl_Party_Pet_UpdateCombat
function XPerl_Party_Pet_UpdateCombat(argFrame)
        if (UnitExists(argFrame.partyunit) and UnitExists(argFrame.petunit)) then
                if (UnitAffectingCombat(argFrame.petunit)) then
                        getglobal(argFrame:GetName().."_NameFrameLevelText"):Hide()
                        getglobal(argFrame:GetName().."_NameFrame_ActivityStatus"):Show()
                else
                        getglobal(argFrame:GetName().."_NameFrame_ActivityStatus"):Hide()
                        getglobal(argFrame:GetName().."_NameFrameLevelText"):Show()
                end
                XPerl_Party_Pet_Update_Control(argFrame)
        end
end

-- XPerl_Party_Pet_CombatFlash
local function XPerl_Party_Pet_CombatFlash(f, elapsed, argNew, argGreen)
        if (XPerl_CombatFlashSet (elapsed, f, argNew, argGreen)) then
                XPerl_CombatFlashSetFrames(f)
        end
end

-- XPerl_Party_Pet_OnUpdate
function XPerl_Party_Pet_OnUpdate()
        local any
        for i,f in pairs(PartyPetFrames) do
                if (f:IsShown()) then
                        any = true
                        if (f.PlayerFlash) then
                                XPerl_Party_Pet_CombatFlash(f, arg1, false)
                        end
                        XPerl_ProcessFade(f)
                end
        end

        if (not any) then
                XPerl_Party_Pet_EventFrame:Hide()               -- Stop processing OnUpdate
        end
end

-------------------
-- Event Handler --
-------------------
local function XPerl_Party_Pet_RegisterSome()
        XPerl_Party_Pet_EventFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
        XPerl_Party_Pet_EventFrame:RegisterEvent("UNIT_PET")
end

local function XPerl_Party_Pet_UnregisterSome()
        XPerl_Party_Pet_EventFrame:UnregisterEvent("PARTY_MEMBERS_CHANGED")
        XPerl_Party_Pet_EventFrame:UnregisterEvent("UNIT_PET")
end

-- XPerl_Party_Pet_OnEvent
function XPerl_Party_Pet_OnEvent()
        local func = XPerl_Party_Pet_Events[event]
        if (func) then
                func()
        else
XPerl_ShowMessage("EXTRA EVENT")
        end
end

-- PLAYER_ENTERING_WORLD
function XPerl_Party_Pet_Events:PLAYER_ENTERING_WORLD()
        XPerl_Party_Pet_RegisterSome()
        XPerl_Party_Pet_UpdateDisplayAll()
end

-- PLAYER_LEAVING_WORLD
function XPerl_Party_Pet_Events:PLAYER_LEAVING_WORLD()
        XPerl_Party_Pet_UnregisterSome()
end

-- PARTY_MEMBERS_CHANGED
function XPerl_Party_Pet_Events:PARTY_MEMBERS_CHANGED()
        XPerl_Party_Pet_UpdateDisplayAll()
end

-- UNIT_FLAGS
function XPerl_Party_Pet_Events:UNIT_FLAGS()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateCombat(f) end
end

XPerl_Party_Pet_Events.UNIT_DYNAMIC_FLAGS = XPerl_Party_Pet_Events.PARTY_MEMBERS_CHANGED

-- UNIT_COMBAT
function XPerl_Party_Pet_Events:UNIT_COMBAT()
        local f = PartyPetFrames[arg1]
        if (f) then
                if (arg2 == "HEAL") then
                        XPerl_Party_Pet_CombatFlash(f, 0, true, true)
                elseif (arg4 and arg4 > 0) then
                        XPerl_Party_Pet_CombatFlash(f, 0, true)
                end
        end
end

-- UNIT_PET
function XPerl_Party_Pet_Events:UNIT_PET()
        local petid = strfind(arg1, "party(%d)")
        if (petid) then
                local f = PartyPetFrames["partypet"..petid]
                if (f) then
                        XPerl_Party_Pet_UpdateDisplay(f)
                end
        end
end

-- PARTY_MEMBER_ENABLE
function XPerl_Party_Pet_Events:PARTY_MEMBER_ENABLE()
        local petid = strfind(arg1, "party(%d)")
        if (petid) then
                local f = PartyPetFrames["partypet"..petid]
                if (f) then XPerl_Party_Pet_UpdateDisplay(f) end
        end
end
XPerl_Party_Pet_Events.PARTY_MEMBER_DISABLE = XPerl_Party_Pet_Events.PARTY_MEMBER_ENABLE

-- UNIT_NAME_UPDATE
function XPerl_Party_Pet_Events:UNIT_NAME_UPDATE()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateName(f) end
end

-- UNIT_FACTION
function XPerl_Party_Pet_Events:UNIT_FACTION()
        local f = PartyPetFrames[arg1]
        if (f) then
                XPerl_Party_Pet_UpdateName(f)
                XPerl_Party_Pet_UpdateCombat(f)
        end
end

-- UNIT_LEVEL
function XPerl_Party_Pet_Events:UNIT_LEVEL()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateLevel(f) end
end

-- UNIT_HEALTH
function XPerl_Party_Pet_Events:UNIT_HEALTH()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateHealth(f) end
end

-- UNIT_MAXHEALTH
function XPerl_Party_Pet_Events:UNIT_MAXHEALTH()
        local f = PartyPetFrames[arg1]
        if (f) then
                XPerl_Party_Pet_UpdateHealth(f)
                XPerl_Party_Pet_UpdateLevel(f)
        end
end

-- UNIT_AURA
function XPerl_Party_Pet_Events:UNIT_AURA()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_Buff_UpdateAll(f) end
end

-- UNIT_DISPLAYPOWER
function XPerl_Party_Pet_Events:UNIT_DISPLAYPOWER()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateManaType(f) end
end

-- UNIT_MANA
function XPerl_Party_Pet_Events:UNIT_MANA()
        local f = PartyPetFrames[arg1]
        if (f) then XPerl_Party_Pet_UpdateMana(f) end
end

XPerl_Party_Pet_Events.UNIT_MAXMANA     = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_RAGE                = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_MAXRAGE     = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_FOCUS       = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_MAXFOCUS    = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_ENERGY      = XPerl_Party_Pet_Events.UNIT_MANA
XPerl_Party_Pet_Events.UNIT_MAXENERGY   = XPerl_Party_Pet_Events.UNIT_MANA

-- XPerl_Party_Pet_Set_Name
function XPerl_Party_Pet_Set_Name()
        for i,frame in pairs(PartyPetFrames) do
                local f = getglobal(frame:GetName().."_NameFrame")
                if (XPerlConfig.ShowPartyPetName == 1) then
                        f:Show()
                        f:SetHeight(24)
                else
                        f:Hide()
                        f:SetHeight(3)
                end

                XPerl_Party_Pet_Buff_UpdateAll(frame)
        end
end

-- XPerl_ScalePartyPets(num)
function XPerl_ScalePartyPets(num)
        XPerl_partypet4:SetScale(num)
        XPerl_partypet3:SetScale(num)
        XPerl_partypet2:SetScale(num)
        XPerl_partypet1:SetScale(num)
end