WoWInterface SVN TidyPlatesBeta

[/] [Tanks.lua] - Rev 578

Compare with Previous | Blame | View Log

        
        
        
------------------------------
-- Target Tracker
------------------------------

local TrackedUnits = {}
local TrackedUnitTargets = {}
local TrackedUnitTargetHistory = {}
local TargetWatcher

local inRaid = false

local function TargetWatcherEvents()
        if not inRaid then return end
        
        local widget, plate
        local target, unitid, guid
        local changes = false
        TrackedUnits = wipe(TrackedUnits)
        
        -- Store target history
        for guid, target in pairs(TrackedUnitTargets) do
                TrackedUnitTargetHistory[guid] = target
                TrackedUnitTargets[guid] = nil
        end
        
        -- Reset the Tracking List
        for guid in pairs(TrackedUnits) do TrackedUnits[guid] = nil end
        
        -- Build a list of Trackable targets (via target, focus, and raid members)
        guid = UnitGUID("target")
        if guid then TrackedUnits[guid] = "target" end

        guid = UnitGUID("focus")
        if guid then TrackedUnits[guid] = "focus" end
        
        
        local raidsize = (TidyPlatesUtility.GetNumRaidMembers() or 0 ) - 1
        
        --if raidsize then raidsize = raidsize - 1              -- Check for nils
        --else return end
        
        for index = 1, raidsize do
                unitid = "raid"..index.."target"
                guid = UnitGUID(unitid)
                if guid then TrackedUnits[guid] = unitid end
        end
        
        -- Build a list of the target's targets and check for changes
        for guid, unitid in pairs(TrackedUnits) do
                if unitid then 
                        TrackedUnitTargets[guid] = UnitName(unitid.."target")
                        if TrackedUnitTargets[guid] ~= TrackedUnitTargetHistory[guid] then changes = true end
                end
        end
        
        -- Call for indicator Update, if needed
        if changes then 
                TidyPlates:Update()                     -- To Do: Make a better update hook: either update specific GUIDs or update only indicators
        end
end


---------------
-- Tank Monitor
---------------
local TankNames = {}
local TankWatcher


--[[

        - Druid: Bear form                                      SpellID: 5487           -- UnitAura
        - Paladin: Righteous Fury                       SpellID: 25780
        - Warrior: Defensive stance                     SpellID: 71                     -- GetShapeshiftFormID(), 18
        - Death Knight: Blood Presence          SpellID: 48263
        
        - Monk: 

--]]

local function IsTankedByAnotherTank(unit)
        local targetOf
        if unit.guid then
                if unit.isTarget then targetOf = UnitName("targettarget")                               -- Nameplate is a target
                elseif unit.isMouseover then targetOf = UnitName("mouseovertarget")             -- Nameplate is a mouseover
                else targetOf = TrackedUnitTargets[unit.guid] end
                
                --print(GetTime(), unit.name, unit.guid, targetOf)
                if targetOf and TankNames[targetOf] then return true end
        end
        return false
end

local TankAuras = {
        ["5487"] = true,                -- Druid: Bear Form
        ["25780"] = true,               -- Paladin: Righteous Fury
        -- ["71"] = true, 
        ["48263"] = true,               -- DK: Blood
        ["115069"] = true,              -- Monk: Stance of the Sturdy Ox
}

local TankStances = {
        ["18"] = true,                  -- Warrior: Defensive Stance
        --["23"] = true,                -- Monk: Defensive Stance                               
        --["5"] = true,                 -- Druid: Bear Form
}

--TidyPlatesWidgets.IsTankingAuraActive = false

local function CheckAuras()
        local spellID, name, _
        local tankAura = false
        -- Check Auras
        for i = 1, 40 do
                name, _, _, _, _, _, _, _, _, _, spellID = UnitBuff("player", i)        -- 11th
                if TankAuras[tostring(spellID)] then 
                        tankAura = true
                end
        end
        -- Check Stances
        if GetShapeshiftFormID() == 18 then -- Defensive Stance (Warrior)
                tankAura = true
        end
        
        if GetShapeshiftFormID() == 23 then -- Stance of the Sturdy Ox (Monk)
                tankAura = true
        end
        
        if TidyPlatesWidgets.IsTankingAuraActive ~= tankAura then
                TidyPlatesWidgets.IsTankingAuraActive = tankAura
                TidyPlates:RequestDelegateUpdate()
        end
end

local function TestPartAssignments()
                        local party = "party1"
                        
                        local isAssigned = GetPartyAssignment("MAINTANK", party) or ("TANK" == UnitGroupRolesAssigned(party))
                        
                        if isAssigned then TankNames[UnitName(party)] = true 
                        else TankNames[UnitName(party)] = nil end
                        --print(GetTime(), UnitName(party), isAssigned)
                        
                --for index = 1, 2 do

                --end   
end

local function CheckAssignments()
        local index, size
        if UnitInRaid("player") then
                inRaid = true
                size = TidyPlatesUtility.GetNumRaidMembers() - 1
                for index = 1, size do
                        local raidid = "raid"..tostring(index)
                        
                        local isAssigned = GetPartyAssignment("MAINTANK", raidid) or ("TANK" == UnitGroupRolesAssigned(raidid))
                        
                        if isAssigned then TankNames[UnitName(raidid)] = true 
                        else TankNames[UnitName(raidid)] = nil end
                end                     
        else 
                inRaid = false
                TankNames = wipe(TankNames)
                if HasPetUI("player") and UnitName("pet") then 
                        TankNames[UnitName("pet")] = true                       -- Adds your pet to the list (for you, only)
                end     
        end     
end

local function TankWatcherEvents(frame, event, ...)
        if event == "UNIT_AURA" or event == "UPDATE_SHAPESHIFT_FORM" then
                local unitid = ...
                if unitid == "player" then CheckAuras() end
                return
        end

        CheckAssignments()
        CheckAuras()
end
        

local function EnableTankWatch()
        -- Target-Of Watcher
        if not TargetWatcher then TargetWatcher = CreateFrame("Frame") end
        TargetWatcher:RegisterEvent("PLAYER_ENTERING_WORLD")
        TargetWatcher:RegisterEvent("PLAYER_REGEN_ENABLED")
        TargetWatcher:RegisterEvent("PLAYER_REGEN_DISABLED")
        TargetWatcher:RegisterEvent("PLAYER_TARGET_CHANGED")
        TargetWatcher:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE")
        TargetWatcher:RegisterEvent("UNIT_TARGET")
        TargetWatcher:SetScript("OnEvent", TargetWatcherEvents)
        TargetWatcherEvents()
        
        -- Party Tanks
        if not TankWatcher then TankWatcher = CreateFrame("Frame") end
        TankWatcher:RegisterEvent("RAID_ROSTER_UPDATE")
        TankWatcher:RegisterEvent("PLAYER_ENTERING_WORLD")
        TankWatcher:RegisterEvent("PARTY_MEMBERS_CHANGED")
        TankWatcher:RegisterEvent("PARTY_CONVERTED_TO_RAID")
        TankWatcher:RegisterEvent("UNIT_AURA")
        TankWatcher:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
        TankWatcher:SetScript("OnEvent", TankWatcherEvents)
        TankWatcherEvents()
end

local function DisableTankWatch() 
        -- Target-Of Watcher
        if TargetWatcher then
                TargetWatcher:SetScript("OnEvent", nil)
                TargetWatcher:UnregisterAllEvents()
                TargetWatcher = nil
        end
        
        -- Party Tanks
        if TankWatcher then
                TankWatcher:SetScript("OnEvent", nil)
                TankWatcher:UnregisterAllEvents()
                TankWatcher = nil
        end
end

TidyPlatesWidgets.EnableTankWatch = EnableTankWatch
TidyPlatesWidgets.DisableTankWatch = DisableTankWatch
TidyPlatesWidgets.IsTankedByAnotherTank = IsTankedByAnotherTank

        
        

Compare with Previous | Blame