ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [ui/] [groupdeto/] [DetonationTracker.lua] - Rev 136

Compare with Previous | Blame | View Log

--[[
        Addon: Taos Group Tools
        Author: TProg Taonnor
        Created by @Taonnor
]]--

--[[
        Local variables
]]--
local _logger = nil
local _settingsHandler = TGT_SettingsHandler

local UPDATE = 0.1 -- s
local DETONATON = DETONATON_ICON_ID

local _isActive = false
local _isCreated = false
local _control = TGT_DetonationTrackerControl

--[[
        Table TGT_DetonationTracker
]]--
TGT_DetonationTracker = {}
TGT_DetonationTracker.__index = TGT_DetonationTracker

--[[
        ===============
    PRIVATE METHODS
    ===============
]]--

--[[
        Compare
]]--
local function Compare(trackerLeft, trackerRight)
    return trackerLeft.Finish > trackerRight.Finish
end

--[[
        SortTrackers
]]--
local function SortTrackers()
    -- Sort by longest first
    table.sort(_control.Trackers, Compare)

    local trackerContainer = _control:GetNamedChild("Container")
    local lastTracker = nil

    for i, tracker in ipairs(_control.Trackers) do
        -- Set hidden state
        if (tracker.Player and tracker.TimeRemaining >= 0) then
            -- Set anchor
            tracker:ClearAnchors()
        
            if (i == 1) then
                tracker:SetAnchor(TOPLEFT, trackerContainer, TOPLEFT, 0, 3)
            else
                        tracker:SetAnchor(TOPLEFT, lastTracker, BOTTOMLEFT, 0, 3)
                end

            lastTracker = tracker
            tracker:SetHidden(false)
        else
            tracker:ClearAnchors()
            tracker:SetHidden(true)
        end
    end
end

--[[
        GetPlayerTracker
]]--
local function GetPlayerTracker(player)
    -- search player
    for i, tracker in ipairs(_control.Trackers) do
        if (tracker.Player ~= nil and tracker.Player.PlayerName == player.PlayerName) then
            return tracker
        end
    end

    -- search free
    for i, tracker in ipairs(_control.Trackers) do
        if (tracker.Player == nil) then
            return tracker
        end
    end

    return nil
end

--[[
        SetupTracker
]]--
local function SetupTracker(player, tracker)
    local startTime = player.Buffs[DETONATON].startTime
    local finishTime = player.Buffs[DETONATON].finishTime

    tracker.Start = startTime
    tracker.Finish = finishTime
    tracker.TimeRemaining = finishTime - startTime
end

--[[
        StartDetonation
]]--
local function StartDetonation(player)
    local tracker = GetPlayerTracker(player)

    if (tracker) then
        tracker.Player = player

        SetupTracker(player, tracker)
        SortTrackers()
    else
        _logger:logError("TGT_DetonationTracker -> StartDetonation; No tracker")
    end
end

--[[
        UpdatePlayerBuffs
]]--
local function UpdatePlayerBuffs(player)
        if (player and player.Buffs[DETONATON] and player.Buffs[DETONATON].isActive) then
        StartDetonation(player)
    end
end

--[[
        UpdateDetoFrameHeader sets deto frame header hidden
]]--
local function UpdateDetoFrameHeader()
    local isHidden = _settingsHandler.SavedVariables.IsGroupDetoHeaderVisible == false
    _control:GetNamedChild("HeaderLabel"):SetHidden(isHidden)
end

--[[
        SetControlColor sets control color
]]--
local function SetControlColors(part)
    if (part == GROUP_DETONATION) then
        local controlColor = _settingsHandler.SavedVariables.ModuleColors[part].GroupDetoColor
        local labelColor = GetAdjustedLabelColor(controlColor)
            
        for i, tracker in ipairs(_control.Trackers) do
            tracker.StatusBar:SetColor(controlColor.R, controlColor.G, controlColor.B, controlColor.A)
            tracker.TimeLabel:SetColor(labelColor.R, labelColor.G, labelColor.B, labelColor.A)
        end
    end
end

--[[
        ResizeControl resizes container control
]]--
local function ResizeControl()
    local size = _settingsHandler.SavedVariables.GroupDetoSize
    local height = GROUP_SIZE_MAX * size.Height + _control:GetNamedChild("HeaderLabel"):GetHeight()

    _control:SetDimensions(size.Width, height)
end

--[[
        ResizeDetoBars resizes deto bars
]]--
local function ResizeDetoBars()
    local size = _settingsHandler.SavedVariables.GroupDetoSize

    for i, tracker in ipairs(_control.Trackers) do
        tracker:SetDimensions(size.Width, size.Height)
        tracker.TimeLabel:SetDimensions(size.Width - 10, size.Height - 2)
    end

    SortTrackers() -- Resets anchors
    ResizeControl()
end

--[[
        RestorePosition sets settings position
]]--
local function RestorePosition()
    local posX = _settingsHandler.SavedVariables.Position[GROUP_DETONATION].PosX
    local posY = _settingsHandler.SavedVariables.Position[GROUP_DETONATION].PosY

    _control:ClearAnchors()
    _control:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, posX, posY)
end

--[[
        SetControlMovable sets the Movable and MouseEnabled flag in UI elements
]]--
local function SetControlMovable()
    local isMovable = _settingsHandler.SavedVariables.Movable

    _control:GetNamedChild("MovableControl"):SetHidden(isMovable == false)

    _control:SetMovable(isMovable)
        _control:SetMouseEnabled(isMovable)
end

--[[
        SetControlHidden sets hidden on control
]]--
local function SetControlHidden()
    -- Get isActive from settings
    if (_settingsHandler.SavedVariables.IsGroupDetoEnabled and _isCreated) then
        if (GetIsUnitGrouped()) then
                        _control:SetHidden(CurrentHudHiddenState())
        else
            _control:SetHidden(true)
        end
    else
        _control:SetHidden(true)
    end
end

--[[
        CreateTrackers creates tracker sub controls
]]--
local function CreateTrackers()
    local trackerContainer = _control:GetNamedChild("Container")
    _control.Trackers = {}

    for i=1, GROUP_SIZE_MAX, 1 do
        local tracker = CreateControlFromVirtual("$(parent)DetionationTracker", trackerContainer, "TimedBuffTrackerControl", i)
        tracker.StatusBar = tracker:GetNamedChild("StatusBar")
        tracker.TimeLabel = tracker:GetNamedChild("TimeLabel")
        tracker.Start = 0
        tracker.Finish = 0
        tracker.NextUpdate = 0
        tracker.TimeRemaining = -1

        -- Update handler for castbar
            local function OnUpdate(self, updateTime)
                    if (updateTime >= self.NextUpdate and self.Player) then
                            self.TimeRemaining = self.Finish - updateTime

                            if (self.TimeRemaining <= 0) then -- cast complete, stop cast
                    self.Start = 0
                    self.Finish = 0
                    self.TimeRemaining = -1
                    self.StatusBar:SetValue(0)
                    self.Player = nil
                                    self:SetHidden(true)
                            else
                    local relativeTime = (updateTime - self.Start) / (self.Finish - self.Start)
                    ZO_StatusBar_SmoothTransition(self.StatusBar, relativeTime, 1, false)
                    local timeString = ZO_FormatTime(self.TimeRemaining, TIME_FORMAT_STYLE_DESCRIPTIVE_MINIMAL_SHOW_TENTHS_SECS, TIME_FORMAT_PRECISION_TENTHS, TIME_FORMAT_DIRECTION_DESCENDING)

                    local playerName = self.Player.PlayerName
                    if (_settingsHandler.SavedVariables.AccountNames) then
                        playerName = GetUnitDisplayName(self.Player.PingTag)
                    end

                                    self.TimeLabel:SetText(zo_strformat("<<1>> - <<2>>", timeString, playerName))
                            end

                            nextUpdate = updateTime + UPDATE
            end
            end

            tracker:SetHandler('OnUpdate', OnUpdate)

        tracker:ClearAnchors()
        tracker:SetHidden(true)

        _control.Trackers[i] = tracker
    end
end

--[[
        SetControlActive sets hidden on control
]]--
local function SetControlActive()
    SetControlHidden()

    -- Get isActive from settings
    local isActive = _settingsHandler.SavedVariables.IsGroupDetoEnabled

    if (_isActive ~= isActive) then
        _isActive = isActive

        if (isActive) then
            -- Workaround: To avoid "Too many anchors processed" error; Thank you ZOS for stealing hours of my life!
            if (_isCreated == false) then
                _isCreated = true
                CreateTrackers()
            end

            SetControlMovable()
            RestorePosition()
            UpdateDetoFrameHeader()
            SetControlColors(GROUP_DETONATION)
            ResizeDetoBars()
            
            CALLBACK_MANAGER:RegisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_BUFFS_CHANGED, UpdatePlayerBuffs)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_DETO_HEADER_CHANGED, UpdateDetoFrameHeader)
            CALLBACK_MANAGER:RegisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_DETO_SIZE_CHANGED, ResizeDetoBars)
        else
            CALLBACK_MANAGER:UnregisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_BUFFS_CHANGED, UpdatePlayerBuffs)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_DETO_HEADER_CHANGED, UpdateDetoFrameHeader)
            CALLBACK_MANAGER:UnregisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_DETO_SIZE_CHANGED, ResizeDetoBars)
        end
    end
end

--[[
        ==============
    PUBLIC METHODS
    ==============
]]--

--[[
        TGT_DetonationTracker_OnMoveStop saves position
]]--
function TGT_DetonationTracker_OnMoveStop(control)
    _settingsHandler.SavedVariables.Position[GROUP_DETONATION].PosX = control:GetLeft()
    _settingsHandler.SavedVariables.Position[GROUP_DETONATION].PosY = control:GetTop()
end

--[[
        Initialize initializes TGT_DetonationTracker
]]--
function TGT_DetonationTracker.Initialize()
    _logger = TGT_LOGGER

    CALLBACK_MANAGER:RegisterCallback(TGT_IS_ZONE_CHANGED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_ACTIVATED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_DETO_ENABLED_CHANGED, SetControlActive)
    
    _logger:logTrace("TGT_DetonationTracker -> Initialized")
end

Compare with Previous | Blame