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 _playerHandler = TGT_PlayerHandler
local UPDATE = 0.1 -- s
local SPEEDBUFF = SPEEDBUFF_ICON_ID
local _isActive = false
local _isCreated = false
local _control = TGT_SpeedTrackerControl
--[[
Table TGT_SpeedTracker
]]--
TGT_SpeedTracker = {}
TGT_SpeedTracker.__index = TGT_SpeedTracker
--[[
===============
PRIVATE METHODS
===============
]]--
--[[
ShowTrackers
]]--
local function ShowTrackers()
local trackerContainer = _control:GetNamedChild("Container")
local lastTracker = nil
for i, tracker in ipairs(_control.Trackers) do
-- Set hidden state
if (tracker.Player) 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
--[[
UpdateTracker
]]--
local function UpdateTracker(player, tracker)
local startTime = player.Buffs[SPEEDBUFF].startTime
local finishTime = player.Buffs[SPEEDBUFF].finishTime
tracker.Start = startTime
tracker.Finish = finishTime
tracker.TimeRemaining = finishTime - startTime
end
--[[
UpdateSpeed
]]--
local function UpdateSpeed(player)
local tracker = GetPlayerTracker(player)
if (tracker) then
tracker.Player = player
UpdateTracker(player, tracker)
ShowTrackers()
else
_logger:logError("TGT_SpeedTracker -> UpdateSpeed; No tracker")
end
end
--[[
UpdatePlayerBuffs
]]--
local function UpdatePlayerBuffs(player, abilityId)
if (player and abilityId == SPEEDBUFF) then
UpdateSpeed(player)
end
end
--[[
UpdateSpeedFrameHeader sets deto frame header hidden
]]--
local function UpdateSpeedFrameHeader()
local isHidden = _settingsHandler.SavedVariables.IsGroupSpeedHeaderVisible == false
_control:GetNamedChild("HeaderLabel"):SetHidden(isHidden)
end
--[[
SetControlColor sets control color
]]--
local function SetControlColors(part)
if (part == GROUP_SPEED) then
local controlColor = _settingsHandler.SavedVariables.ModuleColors[part].GroupSpeedColor
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.GroupSpeedSize
local height = GROUP_SIZE_MAX * size.Height + _control:GetNamedChild("HeaderLabel"):GetHeight()
_control:SetDimensions(size.Width, height)
end
--[[
ResizeSpeedBars resizes deto bars
]]--
local function ResizeSpeedBars()
local size = _settingsHandler.SavedVariables.GroupSpeedSize
for i, tracker in ipairs(_control.Trackers) do
tracker:SetDimensions(size.Width, size.Height)
tracker.TimeLabel:SetDimensions(size.Width - 10, size.Height - 2)
end
ShowTrackers() -- Resets anchors
ResizeControl()
end
--[[
RestorePosition sets settings position
]]--
local function RestorePosition()
local posX = _settingsHandler.SavedVariables.Position[GROUP_SPEED].PosX
local posY = _settingsHandler.SavedVariables.Position[GROUP_SPEED].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.IsGroupSpeedEnabled 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)SpeedTracker", 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
local playerName = self.Player.PlayerName
if (_settingsHandler.SavedVariables.AccountNames) then
playerName = GetUnitDisplayName(self.Player.PingTag)
end
if (self.TimeRemaining <= 0) then
self.Start = 0
self.Finish = 0
self.TimeRemaining = -1
self.StatusBar:SetValue(0)
self.TimeLabel:SetText(zo_strformat("0 - <<1>>", playerName))
else
local relativeTime = 1 - (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)
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
--[[
SetupPlayers sets players in trackers
]]--
local function SetupPlayers()
-- Clear trackers to refreshes them if player out of group
for i, tracker in ipairs(_control.Trackers) do
tracker.Player = nil
tracker:ClearAnchors()
tracker:SetHidden(true)
end
local players = _playerHandler.GetGroupPlayers()
for i,player in pairs(players) do
local tracker = GetPlayerTracker(player)
if (tracker) then
tracker.Player = player
if (player.Buffs[SPEEDBUFF]) then
UpdateTracker(player, tracker)
end
else
_logger:logError("TGT_SpeedTracker -> UpdateSpeed; No tracker")
end
end
ShowTrackers()
end
--[[
SetControlActive sets hidden on control
]]--
local function SetControlActive()
SetControlHidden()
-- Get isActive from settings
local isActive = _settingsHandler.SavedVariables.IsGroupSpeedEnabled
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()
UpdateSpeedFrameHeader()
SetControlColors(GROUP_SPEED)
ResizeSpeedBars()
SetupPlayers()
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_SPEED_HEADER_CHANGED, UpdateSpeedFrameHeader)
CALLBACK_MANAGER:RegisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_SPEED_SIZE_CHANGED, ResizeSpeedBars)
CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_CLEAR, SetupPlayers)
CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetupPlayers)
CALLBACK_MANAGER:RegisterCallback(TAO_GROUP_CHANGED, SetupPlayers)
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_SPEED_HEADER_CHANGED, UpdateSpeedFrameHeader)
CALLBACK_MANAGER:UnregisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_SPEED_SIZE_CHANGED, ResizeSpeedBars)
CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_CLEAR, SetupPlayers)
CALLBACK_MANAGER:UnregisterCallback(TAO_UNIT_GROUPED_CHANGED, SetupPlayers)
CALLBACK_MANAGER:UnregisterCallback(TAO_GROUP_CHANGED, SetupPlayers)
end
end
end
--[[
==============
PUBLIC METHODS
==============
]]--
--[[
TGT_SpeedTracker_OnMoveStop saves position
]]--
function TGT_SpeedTracker_OnMoveStop(control)
_settingsHandler.SavedVariables.Position[GROUP_SPEED].PosX = control:GetLeft()
_settingsHandler.SavedVariables.Position[GROUP_SPEED].PosY = control:GetTop()
end
--[[
Initialize initializes TGT_SpeedTracker
]]--
function TGT_SpeedTracker.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_SPEED_ENABLED_CHANGED, SetControlActive)
_logger:logTrace("TGT_SpeedTracker -> Initialized")
end