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