vanilla-wow-addons – Rev 1

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

local myClass

-- XPerl_SetFrameSides
function XPerl_SetFrameSides()
        if (XPerl_Assists_Frame.LastSetView and XPerl_Assists_Frame.LastSetView[1] == XPerlConfigHelper.AssistsFrame and XPerl_Assists_Frame.LastSetView[2] == XPerlConfigHelper.TargettingFrame) then
                -- Frames the same from last time
                return
        end

        if (XPerlConfigHelper.AssistsFrame == 1 or XPerlConfigHelper.TargettingFrame == 1) then
                XPerl_Assists_Frame:Show()

                XPerl_Target_Targetting_ScrollFrame:ClearAllPoints()
                XPerl_Target_Assists_ScrollFrame:ClearAllPoints()

                if (XPerlConfigHelper.AssistsFrame == 1 and XPerlConfigHelper.TargettingFrame == 1) then
                        XPerl_Target_Targetting_ScrollFrame:SetPoint("TOPLEFT", 4, -5)
                        XPerl_Target_Targetting_ScrollFrame:SetPoint("BOTTOMRIGHT", XPerl_Assists_Frame, "BOTTOM", -1, 5)
                        XPerl_Target_Targetting_ScrollFrame:Show()

                        XPerl_Target_Assists_ScrollFrame:SetPoint("TOPLEFT", XPerl_Assists_Frame, "TOP", 0, -5)
                        XPerl_Target_Assists_ScrollFrame:SetPoint("BOTTOMRIGHT", -4, 5)
                        XPerl_Target_Assists_ScrollFrame:Show()

                        XPerlScrollSeperator:Show()
                        XPerlScrollSeperator:ClearAllPoints()
                        XPerlScrollSeperator:SetPoint("TOPLEFT", XPerl_Target_Targetting_ScrollFrame, "TOPRIGHT", 0, 0)
                        XPerlScrollSeperator:SetPoint("BOTTOMRIGHT", XPerl_Target_Assists_ScrollFrame, "BOTTOMLEFT", 0, 0)
                else
                        XPerlScrollSeperator:Hide()

                        if (XPerlConfigHelper.AssistsFrame == 1) then
                                XPerl_Target_Assists_ScrollFrame:SetPoint("TOPLEFT", 4, -5)
                                XPerl_Target_Assists_ScrollFrame:SetPoint("BOTTOMRIGHT", -4, 5)
                                XPerl_Target_Assists_ScrollFrame:Show()
                                XPerl_Target_Targetting_ScrollFrame:Hide()
                        else
                                XPerl_Target_Targetting_ScrollFrame:SetPoint("TOPLEFT", 4, -5)
                                XPerl_Target_Targetting_ScrollFrame:SetPoint("BOTTOMRIGHT", -4, 5)
                                XPerl_Target_Targetting_ScrollFrame:Show()
                                XPerl_Target_Assists_ScrollFrame:Hide()
                        end
                end
        else
                XPerl_Assists_Frame:Hide()
        end

        XPerl_Assists_Frame.LastSetView = {XPerlConfigHelper.AssistsFrame, XPerlConfigHelper.TargettingFrame}
end

-- ToggleAssistsFrame()
function XPerl_ToggleAssistsFrame(param)
        if (param == "assists") then
                if (XPerlConfigHelper.AssistsFrame == 1) then
                        XPerlConfigHelper.AssistsFrame = 0
                else
                        XPerlConfigHelper.AssistsFrame = 1
                end
        else
                if (XPerlConfigHelper.TargettingFrame == 1) then
                        XPerlConfigHelper.TargettingFrame = 0
                else
                        XPerlConfigHelper.TargettingFrame = 1
                end
        end
end

-- XPerl_AssistsView_Close
function XPerl_AssistsView_Open()
        XPerlConfigHelper.AssistsFrame = 1
        XPerlConfigHelper.TargettingFrame = 1
        XPerl_SetFrameSides()
        return true
end

function XPerl_AssistsView_Close()
        XPerlConfigHelper.AssistsFrame = 0
        XPerlConfigHelper.TargettingFrame = 0
        XPerl_SetFrameSides()
end

-- SortByClass(t1, t2)
local function SortByClass(t1, t2)
        if (t1[2] == t2[2]) then
                return t1[1] < t2[1]
        else
                local t1c = t1[2]
                local t2c = t2[2]
                if (t1c == myClass) then
                        t1c = "A"..t1c
                elseif (t1c ~= "") then
                        t1c = "B"..t1c
                else
                        t1c = "Z"
                end
                if (t2c == myClass) then
                        t2c = "A"..t2c
                elseif (t2c ~= "") then
                        t2c = "B"..t2c
                else
                        t1c = "Z"
                end

                return t1c..t1[1] < t2c..t2[1]
        end
end

-- XPerl_MakeAssistsString
function XPerl_MakeAssistsString(List, title)
        local text = title

        if (List ~= nil) then
                local lastClass
                local any = false
                local nAssists = getn(List)
                if (nAssists > 0) then
                        text = text.." "..nAssists
                end
                text = text.."\13"

                sort(List, SortByClass)

                for i,unit in pairs(List) do
                        if (not any) then
                                if (unit[2] == "") then
                                        text = text.."|c00FF0000"..unit[1]
                                else
                                        text = text..XPerlColourTable[unit[2]]..unit[1]
                                end
                                lastClass, any = unit[2], true
                        else
                                if (lastClass) then
                                        if (unit[2] == "" or lastClass ~= unit[2]) then
                                                lastClass = unit[2]

                                                if (unit[2] == "") then
                                                        text = text.."\r|c00FF0000"..unit[1]
                                                else
                                                        text = text.."\r"..XPerlColourTable[unit[2]]..unit[1]
                                                end
                                        else
                                                text = text.." "..unit[1]
                                        end
                                else
                                        text = text.." "..unit[1]

                                        lastClass = unit[2]
                                end
                        end
                end
        end

        return (text)
end

-- FillList
local function FillList(List, cFrame, title)
        local text = XPerl_MakeAssistsString(List, title)
        getglobal("XPerl_Target_Assists_ScrollChild_"..cFrame.."Text"):SetText(text)
end

-- XPerl_ShowAssists()
function XPerl_ShowAssists()
        if (XPerlConfigHelper.AssistsFrame == 1 or XPerlConfigHelper.TargettingFrame == 1) then
                if (XPerlConfigHelper.AssistsFrame == 1 and XPerl_Assists_Frame.assists ~= nil) then
                        FillList(XPerl_Assists_Frame.assists, "Assists", XPERL_TOOLTIP_ASSISTING)
                end

                if (XPerlConfigHelper.TargettingFrame == 1 and XPerl_Assists_Frame.targetting ~= nil) then
                        local title
                        if (getn(XPerl_Assists_Frame.targetting) > 0 and XPerl_Assists_Frame.targetting[1][2] == "") then
                                title = XPERL_TOOLTIP_ENEMYONME
                        else
                                if (XPerlConfigHelper.TargetCountersSelf == 0) then
                                        title = XPERL_TOOLTIP_ALLONME
                                else
                                        title = XPERL_TOOLTIP_HEALERS
                                end
                        end

                        FillList(XPerl_Assists_Frame.targetting, "Targetting", title)
                end
        end
end

-- XPerl_Assists_MouseDown
function XPerl_Assists_MouseDown(button,param)
        if (button == "LeftButton") then
                if (not XPerlConfigHelper or not XPerlConfigHelper.AssistPinned or (IsAltKeyDown() and IsControlKeyDown() and IsShiftKeyDown())) then
                        if (param and (param == "TOPLEFT" or param == "BOTTOMLEFT" or param == "BOTTOMRIGHT")) then
                                XPerl_Assists_Frame:StartSizing(param)
                        else
                                XPerl_Assists_Frame:StartMoving()
                        end
                end

        elseif (button == "RightButton") then
                if (strfind (this:GetName(), "XPerl_Target_Assists_ScrollChild_Targetting")) then
                        param = "targetFrame"
                end

                if (param and param == "targetFrame") then
                        if (XPerlConfigHelper.TargetCountersSelf == 1) then
                                XPerlConfigHelper.TargetCountersSelf = 0
                        else
                                XPerlConfigHelper.TargetCountersSelf = 1
                        end
                end
        end
end

-- XPerl_Assists_MouseUp
function XPerl_Assists_MouseUp(button)
        XPerl_Assists_Frame:StopMovingOrSizing()
end

-- Events
function XPerl_Assists_OnEvent()
        if (event == "PLAYER_TARGET_CHANGED") then
                XPerl_UpdateAssists()
                XPerl_ShowAssists()
        end
end

-- XPerl_Assists_OnUpdate
local UpdateTime = 0
function XPerl_Assists_OnUpdate()

        UpdateTime = arg1 + UpdateTime
        if (UpdateTime >= 0.2) then
                XPerl_UpdateAssists()
                XPerl_ShowAssists()
                UpdateTime = 0
        end
end

---------------------------------
-- Targetting counters         --
---------------------------------

local assists
local targetting

-- XPerl_FoundEnemyBefore
local function XPerl_FoundEnemyBefore(FoundEnemy, name)
        for previous in pairs(FoundEnemy) do
                if (UnitIsUnit(previous.."target", name.."target")) then
                        return true
                end
        end
        return false
end

-- XPerl_AddEnemy
local function XPerl_AddEnemy(anyEnemy, FoundEnemy, name)
        if (UnitIsUnit("player", name.."targettarget")) then
                if (not XPerl_FoundEnemyBefore(FoundEnemy, name)) then
                        FoundEnemy[name] = true
                        tinsert(targetting, {UnitName(name.."target"), ""})
                        return true
                end

        -- 1.8.3 Added check to see if mob is targetting our target, and add to that list
        elseif (UnitIsUnit("target", name.."targettarget")) then
                -- We can still use the FoundEnemy list, because it's not too important if
                -- we're targetting ourself and the mob doesn't show on both self and target lists
                if (not XPerl_FoundEnemyBefore(FoundEnemy, name)) then
                        FoundEnemy[name] = true
                        tinsert(assists, {UnitName(name.."target"), ""})
                        return true
                end
        end

        return false
end

local HealerClasses = {PRIEST = true, SHAMAN = true, PALADIN = true, DRUID = true}

-- XPerl_UpdateAssists
function XPerl_UpdateAssists()

        if (XPerlConfigHelper.TargetCounters == 0) then
                if (XPerl_Target_AssistFrame) then XPerl_Target_AssistFrame:Hide(); end
                if (XPerl_Player_TargettingFrame) then XPerl_Player_TargettingFrame:Hide(); end
                return
        end

        local selfFlag = XPerlConfigHelper.TargetCountersSelf == 1
        local enemyFlag = XPerlConfigHelper.TargetCountersEnemy == 1
        local assistCount, targettingCount, anyEnemy = 0, 0, false
        local start,i,total,prefix,name,petname,raidMembers

        local FoundEnemy = {}
        raidMembers = 0

        if (UnitInRaid("player")) then
                start, prefix, total = 1, "raid", GetNumRaidMembers()
        else
                start, prefix, total = 0, "party", 4
        end

        assists, targetting = {}, {}
        XPerl_Assists_Frame.assists, XPerl_Assists_Frame.targetting = assists, targetting

        local targetname = UnitName("target")
        for i = start,total do
                if (i == 0) then
                        name, petname = "player", "pet"
                else
                        name, petname = prefix..i, prefix.."pet"..i
                end

                if (UnitExists(name) and not UnitIsDeadOrGhost(name)) then
                        local class, engClass = UnitClass(name)
                        raidMembers = raidMembers + 1

                        local hasPet = UnitExists(petname)

                        if (targetname) then
                                if (UnitIsUnit("target", name.."target")) then
                                        assistCount = assistCount + 1
                                        tinsert (assists, {UnitName(name), engClass})
                                end
                                if (hasPet and UnitIsUnit("target", petname.."target")) then
                                        assistCount = assistCount + 1
                                        tinsert (assists, {string.format(XPERL_TOOLTIP_PET, UnitName(name)), "pet"})
                                end
                        end

                        -- 0 for Anyone, 1 for Healers
                        if (not selfFlag or HealerClasses[engClass]) then
                                if (UnitIsUnit("player", name.."target")) then
                                        targettingCount = targettingCount + 1
                                        tinsert(targetting, {UnitName(name), engClass})
                                end
                        end

                        -- Count enemy targetting us?
                        if (enemyFlag) then
                                if (not UnitIsFriend("player", name.."target")) then
                                        if (XPerl_AddEnemy(anyEnemy, FoundEnemy, name)) then
                                                anyEnemy = true
                                                targettingCount = targettingCount + 1
                                        end
                                        if (hasPet) then
                                                if (XPerl_AddEnemy(anyEnemy, FoundEnemy, petname)) then
                                                        anyEnemy = true
                                                        targettingCount = targettingCount + 1
                                                end
                                        end
                                end
                        end
                end
        end

        if (UnitExists("mouseover") and not UnitIsFriend("player", "mouseover")) then
                if (UnitIsUnit("mouseovertarget", "player")) then
                        local foundBefore
                        for previous in pairs(FoundEnemy) do
                                if (UnitIsUnit(previous.."target", "mouseover")) then
                                        foundBefore = true
                                end
                        end

                        if (not foundBefore) then
                                tinsert(targetting, {UnitName("mouseover"), ""})
                                anyEnemy = true
                                targettingCount = targettingCount + 1
                        end
                end
        end

        if (XPerl_Player_TargettingFrame) then
                local conf = XPerlConfig or XPerlConfigHelper
                conf = conf.BorderColour

                if (anyEnemy) then
                        XPerl_Player_TargettingFrame:SetBackdropBorderColor(1, 0.2, 0.2, conf.a)
                else
                        XPerl_Player_TargettingFrame:SetBackdropBorderColor(conf.r, conf.g, conf.b, conf.a)
                end

                if (targettingCount == 0) then
                        XPerl_Player_TargettingFrame:SetTextColor(1,0.5,0.5)
                elseif (targettingCount > 5) then
                        XPerl_Player_TargettingFrame:SetTextColor(0.5,1,0.5)
                else
                        XPerl_Player_TargettingFrame:SetTextColor(0.5,0.5,1)
                end

                XPerl_Player_TargettingFrame:SetText(targettingCount)
                XPerl_Player_TargettingFrame:Show()
        end

        if (XPerl_Target_AssistFrame) then
                if (assistCount < 2) then
                        XPerl_Target_AssistFrame:SetTextColor(1,0.5,0.5)
                elseif (assistCount > (raidMembers / 2)) then
                        XPerl_Target_AssistFrame:SetTextColor(0.5,1,0.5)
                else
                        XPerl_Target_AssistFrame:SetTextColor(0.5,0.5,1)
                end

                if (targetname) then
                        XPerl_Target_AssistFrame:SetText(assistCount)
                end
                XPerl_Target_AssistFrame:Show()
        end
end

-- XPerl_StartAssists
function XPerl_StartAssists()
        local _
        _, myClass = UnitClass("player")

        if (not XPerlColourTable.pet) then
                XPerlColourTable.pet = "|c008080FF"
        end

        XPerl_SetFrameSides()
end