vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
----------------------
-- Loading Function --
----------------------

local XPerl_TargetHistory = {}

-- XPerl_TargetTarget_OnLoad
function XPerl_TargetTarget_OnLoad()
        this.unitid = "targettarget"
        if (this:GetName() == "XPerl_TargetTargetTarget") then
                this.unitid = "targettargettarget"
        else
                XPerl_TargetTarget_Frame = XPerl_TargetTarget
        end

        -- Events
        this:RegisterEvent("PLAYER_ENTERING_WORLD")
        this:RegisterEvent("PLAYER_LEAVING_WORLD")

        this.time = 0
        this.targetname = ""
        this.targethp = 0
        this.targetmana = 0
        this.lastUpdate = 0

        this.SubFrame = function(this, a)
                return getglobal(this:GetName().."_"..a)
        end

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

-- XPerl_TargetTarget_RegisterSome
local function XPerl_TargetTarget_RegisterSome()
        this:RegisterEvent("RAID_TARGET_UPDATE")

        if (this == XPerl_TargetTarget) then
                this:RegisterEvent("PLAYER_TARGET_CHANGED")
                this:RegisterEvent("UNIT_HEALTH");                      -- So health updates are more regular
                this:RegisterEvent("UNIT_MAXHEALTH")
                this:RegisterEvent("UNIT_AURA")
                this:RegisterEvent("UNIT_FACTION")
        end
end

-- XPerl_TargetTarget_UnregisterSome
local function XPerl_TargetTarget_UnregisterSome()
        this:UnregisterEvent("RAID_TARGET_UPDATE")

        if (this == XPerl_TargetTarget) then
                this:UnregisterEvent("PLAYER_TARGET_CHANGED")
                this:UnregisterEvent("UNIT_HEALTH")
                this:UnregisterEvent("UNIT_MAXHEALTH")
                this:UnregisterEvent("UNIT_AURA")
                this:UnregisterEvent("UNIT_FACTION")
        end
end

-------------------------
-- The Update Function --
-------------------------
function XPerl_TargetTarget_UpdatePVP(ttFrame)
        local targetrankname, targetrank=GetPVPRankInfo(UnitPVPRank(ttFrame.unitid), ttFrame.unitid)
        if (targetrank and XPerlConfig.ShowTargetPVPRank==1 and UnitIsPlayer(ttFrame.unitid)) then
                ttFrame:SubFrame("NameFrame_PVPRankIcon"):Show()
                if (targetrank==0) then
                        ttFrame:SubFrame("NameFrame_PVPRankIcon"):Hide()
                else
                        ttFrame:SubFrame("NameFrame_PVPRankIcon"):SetTexture(string.format("Interface\\PVPRankBadges\\PVPRank%02d", targetrank))
                end
        else
                ttFrame:SubFrame("NameFrame_PVPRankIcon"):Hide()
        end
        if (XPerlConfig.ShowTargetPVP == 1 and UnitIsPVP("targettarget")) then
                ttFrame:SubFrame("NameFrame_PVPStatus"):SetTexture("Interface\\TargetingFrame\\UI-PVP-"..(UnitFactionGroup("targettarget") or "FFA"))
                ttFrame:SubFrame("NameFrame_PVPStatus"):Show()
        else
                ttFrame:SubFrame("NameFrame_PVPStatus"):Hide()
        end
end

-- XPerl_TargetTarget_Buff_UpdateAll
local function XPerl_TargetTarget_Buff_UpdateAll(ttFrame)
        local show
        if (ttFrame == XPerl_TargetTarget) then
                show = XPerlConfig.TargetTargetBuffs
        else
                show = XPerlConfig.TargetTargetTargetBuffs
        end

        if (show == 1) then
                ttFrame:SubFrame("BuffFrame"):Show()
                XPerl_Targets_BuffUpdate(ttFrame.unitid, ttFrame:GetName().."_", ttFrame)
        else
                ttFrame:SubFrame("BuffFrame"):Hide()
        end
end

-- XPerl_TargetTarget_RaidIconUpdate
local function XPerl_TargetTarget_RaidIconUpdate(unitid, frameRaidIcon, frameNameFrame)
        XPerl_Update_RaidIcon(unitid, frameRaidIcon)

        frameRaidIcon:ClearAllPoints()
        if (XPerlConfig.AlternateRaidIcon == 1) then
                frameRaidIcon:SetHeight(16)
                frameRaidIcon:SetWidth(16)
                frameRaidIcon:SetPoint("CENTER", frameNameFrame, "TOPRIGHT", -5, -4)
        else
                frameRaidIcon:SetHeight(32)
                frameRaidIcon:SetWidth(32)
                frameRaidIcon:SetPoint("CENTER", frameNameFrame, "CENTER", 0, 0)
        end
end

-- XPerl_TargetTarget_UpdateDisplay
function XPerl_TargetTarget_UpdateDisplay(ttFrame,force)

        local show
        if (ttFrame == XPerl_TargetTarget) then
                show = XPerlConfig.ShowTargetTarget
        else
                show = XPerlConfig.ShowTargetTargetTarget
                if (show == 1 and XPerlConfig.ShowTargetTarget == 0) then
                        show = 0
                end
        end

        if (UnitExists("target") and show == 1 and UnitIsConnected(ttFrame.unitid)) then                -- (UnitName("target")~=nil) and (show==1) and (UnitIsConnected(ttFrame.unitid))) then
                ttFrame.targetname = UnitName(ttFrame.unitid)
                if (ttFrame.targetname ~= nil) then
                        local t = GetTime()
                        if (not force and t < ttFrame.lastUpdate + 0.3) then
                                return
                        end
                        ttFrame.lastUpdate = t

                        XPerl_CancelFade(ttFrame)
                        ttFrame:Show()

                        XPerl_TargetTarget_UpdatePVP(ttFrame)

                        -- Save these 2, so we know whether to update the frame later
                        ttFrame.targethp = UnitHealth(ttFrame.unitid)
                        ttFrame.targetmana = UnitMana(ttFrame.unitid)

                        XPerl_SetUnitNameColor(ttFrame.unitid, ttFrame:SubFrame("NameFrame_NameBarText"))

                        if (XPerlConfig.ShowTargetTargetLevel == 1) then
                                local TargetTargetlevel = UnitLevel(ttFrame.unitid)
                                local color = GetDifficultyColor(TargetTargetlevel)

                                if (TargetTargetLevel == -1) then
                                        if (UnitClassification(ttFrame.unitid) == "worldboss") then
                                                TargetTargetLevel = "Boss"
                                        end
                                elseif (UnitIsPlusMob(ttFrame.unitid) or UnitClassification(ttFrame.unitid) == "elite") then
                                        TargetTargetlevel = TargetTargetlevel.."+"
                                        ttFrame:SubFrame("LevelFrame"):SetWidth(33)
                                else
                                        ttFrame:SubFrame("LevelFrame"):SetWidth(27)
                                end

                                ttFrame:SubFrame("LevelFrameText"):SetText(TargetTargetlevel)

                                if (TargetTargetLevel == "Boss") then
                                        ttFrame:SubFrame("LevelFrame"):SetWidth(ttFrame:SubFrame("LevelFrameText"):GetStringWidth() + 6)
                                        color = {r = 1, g = 0, b = 0}
                                end

                                if (XPerlConfig.ShowTargetTargetPercent == 1) then
                                        ttFrame:SubFrame("NameFrame"):SetWidth(163 - ttFrame:SubFrame("LevelFrame"):GetWidth())
                                else
                                        ttFrame:SubFrame("NameFrame"):SetWidth(131 - ttFrame:SubFrame("LevelFrame"):GetWidth())
                                end

                                ttFrame:SubFrame("LevelFrameText"):SetTextColor(color.r, color.g, color.b)
                        end

                        -- Set name - Must do after level as the NameFrame can change size just above here.
                        local TargetTargetname = ttFrame.targetname
                        ttFrame:SubFrame("NameFrame_NameBarText"):SetText(TargetTargetname)

                        local remCount = 1
                        while ((ttFrame:SubFrame("NameFrame_NameBarText"):GetStringWidth() >= (ttFrame:SubFrame("NameFrame"):GetWidth() - 8)) and (string.len(TargetTargetname) > remCount)) do
                                TargetTargetname = string.sub(TargetTargetname, 1, string.len(TargetTargetname) - remCount)..".."
                                remCount = 3
                                ttFrame:SubFrame("NameFrame_NameBarText"):SetText(TargetTargetname)
                        end

                        -- Set health
                        XPerl_Target_SetHealth(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_HealthBar"), ttFrame:SubFrame("StatsFrame_HealthBarBG"), ttFrame:SubFrame("StatsFrame_HealthBarPercent"), ttFrame:SubFrame("StatsFrame_HealthBarText"), ttFrame:SubFrame("StatsFrame_ManaBarPercent"), XPerlConfig.ShowTargetTargetPercent)

                        -- Set mana
                        XPerl_Target_SetManaType(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_ManaBar"), ttFrame:SubFrame("StatsFrame_ManaBarText"), ttFrame:SubFrame("StatsFrame_ManaBarBG"), ttFrame:SubFrame("StatsFrame"), ttFrame)
                        XPerl_Target_SetMana(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_ManaBar"), ttFrame:SubFrame("StatsFrame_HealthBarPercent"), ttFrame:SubFrame("StatsFrame_ManaBarPercent"), ttFrame:SubFrame("StatsFrame_ManaBarText"))

                        if (XPerlConfig.ShowTargetTargetValues == 1) then
                                ttFrame:SubFrame("StatsFrame_HealthBarText"):Show()
                                ttFrame:SubFrame("StatsFrame_ManaBarText"):Show()
                        else
                                ttFrame:SubFrame("StatsFrame_HealthBarText"):Hide()
                                ttFrame:SubFrame("StatsFrame_ManaBarText"):Hide()
                        end

                        XPerl_TargetTarget_RaidIconUpdate(ttFrame.unitid, ttFrame:SubFrame("NameFrame_RaidIcon"), ttFrame:SubFrame("NameFrame"))

                        XPerl_Targets_BuffPositions(ttFrame.unitid, ttFrame:GetName().."_", ttFrame)
                        XPerl_TargetTarget_Buff_UpdateAll(ttFrame)

                        return
                else
                        ttFrame.targetname = ""
                end
        else
                ttFrame.targetname = ""
        end

        XPerl_StartFade(ttFrame)
end

-- XPerl_TargetTarget_Update_Control
local function XPerl_TargetTarget_Update_Control(ttFrame)
        if (UnitIsVisible(ttFrame.unitid) and UnitIsCharmed(ttFrame.unitid)) then
                ttFrame:SubFrame("NameFrame_Warning"):Show()
        else
                ttFrame:SubFrame("NameFrame_Warning"):Hide()
        end
end

-- XPerl_TargetTarget_Update_Combat
local function XPerl_TargetTarget_Update_Combat(ttFrame)
        if (UnitAffectingCombat(ttFrame.unitid)) then
                ttFrame:SubFrame("NameFrame_ActivityStatus"):Show()
        else
                ttFrame:SubFrame("NameFrame_ActivityStatus"):Hide()
        end
end

-- XPerl_TargetTarget_AddHistory
local function XPerl_TargetTarget_AddHistory(newName, r, g, b)
        if (getn(XPerl_TargetHistory) == 0 or newName ~= XPerl_TargetHistory[1].name) then
                tinsert(XPerl_TargetHistory, 1, {["name"] = newName, ["r"] = r, ["g"] = g, ["b"] = b, ["time"] = GetTime()})

                while (getn(XPerl_TargetHistory) > 10) do
                        tremove(XPerl_TargetHistory, 11)
                end
                XPerl_TargetTarget.FlashChangeStart = GetTime()
        end
end

-- Process_HistoryFlash
local function Process_HistoryFlash()
        if (not this.FlashChangeStart) then
                return
        end

        local timer = (GetTime() - this.FlashChangeStart)
        local r, g, b
        if (timer > 1) then
                this.FlashChangeStart = nil
                r = XPerlConfig.BorderColour.r
                g = XPerlConfig.BorderColour.g
                b = XPerlConfig.BorderColour.b
        else
                r = XPerlConfig.BorderColour.r + 0.5 - (timer / 2)
                g = XPerlConfig.BorderColour.g + 0.5 - (timer / 2)
                b = XPerlConfig.BorderColour.b + 0.5 - (timer / 2)

                if (r < 0) then r = 0; elseif (r > 1) then r = 1; end
                if (g < 0) then g = 0; elseif (g > 1) then g = 1; end
                if (b < 0) then b = 0; elseif (b > 1) then b = 1; end
        end

        this:SubFrame("NameFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
        this:SubFrame("StatsFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
        this:SubFrame("LevelFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)

        if (this == XPerl_TargetTarget) then
                if (XPerl_TargetTarget_History1) then
                        XPerl_TargetTarget_History1:SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
                end
        end
end

-- XPerl_TargetTarget_OnUpdate
function XPerl_TargetTarget_OnUpdate(elapsed, ttFrame)
        --if (not ttFrame.unitid) then
        --      return
        --end

        local newName = UnitName(ttFrame.unitid)
        local newHP = UnitHealth(ttFrame.unitid)
        local newMana = UnitMana(ttFrame.unitid)

        if (not newName) then
                newName = ""
                newHP = 0
                newMana = 0
        end

        if (newName ~= ttFrame.targetname) then
                if (ttFrame == XPerl_TargetTarget) then
                        if (not UnitIsUnit("player", "target")) then
                                if (ttFrame.targetname ~= "") then
                                        if (newName ~= "") then
                                                local r, g, b = ttFrame:SubFrame("NameFrame_NameBarText"):GetTextColor()
                                                XPerl_TargetTarget_AddHistory(XPerl_TargetTarget.targetname, r, g, b)
                                        end
                                end
                        end
                end

                XPerl_TargetTarget_UpdateDisplay(ttFrame,true)

        elseif ((newHP ~= ttFrame.targethp) or (newMana ~= ttFrame.targetmana)) then
                XPerl_TargetTarget_UpdateDisplay(ttFrame)
        end

        if (XPerlConfig.TargetTargetHistory == 1) then
                if (ttFrame == XPerl_TargetTarget) then
                        XPerl_TargetTarget_Update()
                end
        else
                Process_HistoryFlash()

                if (ttFrame == XPerl_TargetTarget) then
                        XPerl_TargetTarget_HideHistory()
                end
        end

        ttFrame.time = elapsed + ttFrame.time
        if (ttFrame.time >= 0.3 and ttFrame.Fading == 0) then
                if (newName ~= "") then
                        if (ttFrame:IsShown()) then
                                XPerl_TargetTarget_Update_Combat(ttFrame)
                                XPerl_TargetTarget_Update_Control(ttFrame)
                                XPerl_TargetTarget_UpdatePVP(ttFrame)
                                XPerl_TargetTarget_Buff_UpdateAll(ttFrame)
                                XPerl_SetUnitNameColor(ttFrame.unitid, ttFrame:SubFrame("NameFrame_NameBarText"))
                        end
                end

                ttFrame.time = 0
        end

        XPerl_ProcessFade(ttFrame)
end

-------------------
-- Event Handler --
-------------------
function XPerl_TargetTarget_OnEvent()

        if (event == "PLAYER_ENTERING_WORLD") then
                XPerl_TargetTarget_RegisterSome()
                XPerl_TargetTarget_ClearHistory()

        elseif (event == "PLAYER_LEAVING_WORLD") then
                XPerl_TargetTarget_UnregisterSome()
                XPerl_TargetTarget:Hide()
                if (XPerl_TargetTargetTarget) then
                        XPerl_TargetTargetTarget:Hide()
                end
                return

        elseif (event == "RAID_TARGET_UPDATE") then
                XPerl_TargetTarget_RaidIconUpdate(XPerl_TargetTarget.unitid, XPerl_TargetTarget_NameFrame_RaidIcon, XPerl_TargetTarget_NameFrame)
                if (XPerl_TargetTargetTarget) then
                        XPerl_TargetTarget_RaidIconUpdate(XPerl_TargetTargetTarget.unitid, XPerl_TargetTarget_NameFrame_RaidIcon, XPerl_TargetTarget_NameFrame)
                end

        elseif (event == "PLAYER_TARGET_CHANGED") then
                XPerl_TargetTarget_ClearHistory()
        end

        if (unit) then
                if (strfind(event, "UNIT_HEALTH UNIT_MAXHEALTH UNIT_AURA UNIT_FACTION")) then
                        if (UnitIsUnit(unit, "targettarget")) then
                                XPerl_TargetTarget_UpdateDisplay(XPerl_TargetTarget,true)
                        elseif (XPerl_TargetTargetTarget and UnitIsUnit(unit, "targettargettarget")) then
                                XPerl_TargetTarget_UpdateDisplay(XPerl_TargetTargetTarget,true)
                        end
                end
        end
end

--------------------
-- Target history --
--------------------

function XPerl_TargetTarget_ClearHistory()
        XPerl_TargetHistory = {}
        XPerl_TargetTarget_Update()
end

-- XPerl_TargetTarget_Update
function XPerl_TargetTarget_Update()

        local alpha = XPerlConfig.Transparency
        local time = GetTime()

        Process_HistoryFlash()

        local offset = -3
        if (XPerlConfig.TargetTargetBuffs == 1) then
                if (UnitExists("targettarget")) then
                        if (XPerl_UnitBuff("targettarget", 1)) then
                                if (offset == -3) then
                                        offset = 0
                                end
                                offset = offset + 20
                                if (UnitBuff("targettarget", 9)) then
                                        offset = offset + 20
                                end
                        end
                        if (XPerl_UnitDebuff("targettarget", 1)) then
                                if (offset == -3) then
                                        offset = 0
                                end
                                offset = offset + 24
                        end
                end
        end

        if (XPerl_TargetTarget_History1) then
                XPerl_TargetTarget_History1:ClearAllPoints()
                XPerl_TargetTarget_History1:SetPoint("TOPLEFT", XPerl_TargetTarget_StatsFrame, "BOTTOMLEFT", 0, -offset)
        end

        for i = 1,10 do
                local frame = getglobal("XPerl_TargetTarget_History"..i)
                local value = XPerl_TargetHistory[i]

                if (value) then
                        if (not frame) then
                                frame = CreateFrame("Frame", "XPerl_TargetTarget_History"..i, UIParent, "XPerl_History_Template")
                                frame:SetID(i)
                                --XPerl_SetupFrame(frame)
                                XPerl_RegisterPerlFrames(frame)
                                frame:SetScale(XPerlConfig.Scale_TargetTargetFrame)
                        end
                        if (XPerlConfig.ShowTargetTargetPercent == 0) then
                                frame:SetWidth(128)
                        else
                                frame:SetWidth(160)
                        end

                        local frameText = getglobal("XPerl_TargetTarget_History"..i.."_NameBarText")

                        frameText:SetText(XPerl_TargetHistory[i].name)
                        frameText:SetTextColor(XPerl_TargetHistory[i].r, XPerl_TargetHistory[i].g, XPerl_TargetHistory[i].b)
                        frame:Show()

                        local minAlpha = 0.2
                        local fadeSeconds = 9
                        if (XPerl_TargetHistory[i].time < time - (fadeSeconds + 1)) then
                                frame:SetAlpha(minAlpha)
                        elseif (XPerl_TargetHistory[i].time < time - fadeSeconds) then
                                local fullRange = XPerlConfig.Transparency - minAlpha
                                local fade = (time - XPerl_TargetHistory[i].time) - fadeSeconds
                                local alphaItem = XPerlConfig.Transparency - (fullRange * fade)

                                frame:SetAlpha(alphaItem)
                        else
                                frame:SetAlpha(XPerlConfig.Transparency)
                        end

                elseif (frame) then
                        frame:Hide()
                end
        end
end

-- XPerl_TargetTarget_ResetFade
function XPerl_TargetTarget_ResetFade()
        local time = GetTime()
        for i = 1,getn(XPerl_TargetHistory) do
                XPerl_TargetHistory[i].time = time
        end
end

-- XPerl_TargetTarget_History_OnEnter
function XPerl_TargetTarget_History_OnEnter()
        local id = this:GetID()
        if (id) then
                XPerl_TargetHistory[id].time = GetTime()
        end
end

-- XPerl_TargetTarget_History_OnMouseUp
function XPerl_TargetTarget_History_OnMouseUp()
        local id = this:GetID()

        if (id) then
                if (XPerl_TargetHistory[id].name) then
                        TargetByName(XPerl_TargetHistory[id].name)
                end
        end
end

-- XPerl_TargetTarget_HideHistory
function XPerl_TargetTarget_HideHistory()
        for i = 1,10 do
                local f = getglobal("XPerl_TargetTarget_History"..i)
                if (f) then
                        f:Hide()
                end
        end
end

-- XPerl_TargetTarget_Set_Bits
function XPerl_TargetTarget_Set_Bits()
        if (not XPerl_TargetTarget) then
                return
        end

        local function Set(frame)
                local statsFrame = getglobal(frame:GetName().."_StatsFrame")
                local statsFrameHealthBarPercent = getglobal(statsFrame:GetName().."_HealthBarPercent")
                local statsFrameManaBarPercent = getglobal(statsFrame:GetName().."_ManaBarPercent")
                local nameFrame = getglobal(frame:GetName().."_NameFrame")
                local levelFrame = getglobal(frame:GetName().."_LevelFrame")

                if (XPerlConfig.ShowTargetTargetLevel==0) then
                        --nameFrame:SetWidth(160)
                        levelFrame:Hide()
                        levelFrame:SetWidth(3)
                else
                        --nameFrame:SetWidth(136)
                        levelFrame:Show()
                        levelFrame:SetWidth(27)
                end

                if (XPerlConfig.ShowTargetTargetPercent == 0) then
                        statsFrame:SetWidth(128)
                        statsFrameHealthBarPercent:Hide()
                        statsFrameManaBarPercent:Hide()

                        if (XPerlConfig.ShowTargetTargetLevel == 1) then
                                nameFrame:SetWidth(104)
                        else
                                nameFrame:SetWidth(128)
                        end
                else
                        statsFrame:SetWidth(160)
                        statsFrameHealthBarPercent:Show()
                        statsFrameManaBarPercent:Show()

                        if (XPerlConfig.ShowTargetTargetLevel == 1) then
                                nameFrame:SetWidth(136)
                        else
                                nameFrame:SetWidth(160)
                        end
                end

                XPerlConfig.TargetBuffSize = tonumber(XPerlConfig.TargetBuffSize) or 20
                XPerl_SetBuffSize(frame:GetName().."_", XPerlConfig.TargetBuffSize, XPerlConfig.TargetBuffSize * 1.2)
        end

        if (XPerlConfig.ShowTargetTargetTarget == 1) then
                if (not XPerl_TargetTargetTarget) then
                        CreateFrame("Frame", "XPerl_TargetTargetTarget", UIParent, "XPerl_TargetTarget_Template")

                        XPerl_TargetTargetTarget:SetPoint("BOTTOMLEFT", XPerl_TargetTarget_StatsFrame, "BOTTOMRIGHT", 5, 0)
                        XPerl_RestorePosition(XPerl_TargetTargetTarget)
                end
        end

        Set(XPerl_TargetTarget)
        if (XPerl_TargetTargetTarget) then
                Set(XPerl_TargetTargetTarget)
        end
end

-- XPerl_ScaleTargetTarget
function XPerl_ScaleTargetTarget(num)
        if (XPerl_TargetTarget) then
                XPerl_TargetTarget:SetScale(num)
                if (XPerl_TargetTargetTarget) then
                        XPerl_TargetTargetTarget:SetScale(num)
                end
                for i = 1,10 do
                        local f = getglobal("XPerl_TargetTarget_History"..i)
                        if (f) then
                                f:SetScale(num)
                        end
                end
        end
end