Compare with Previous | Blame | View Log
--[[ Addon: Taos Group Ultimate Author: TProg Taonnor Created by @Taonnor ]]-- --[[ Local variables ]]-- local LOG_ACTIVE = false local REFRESHRATE = 1000 -- ms; RegisterForUpdate is in miliseconds local TIMEOUT = 4 -- s; GetTimeStamp() is in seconds local _logger = nil local _control = nil local _players = {} --[[ Table TGU_SimpleList ]]-- TGU_SimpleList = {} TGU_SimpleList.__index = TGU_SimpleList --[[ Table Members ]]-- TGU_SimpleList.IsMocked = false --[[ Sets visibility of labels ]]-- function TGU_SimpleList.RefreshList() if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.RefreshList") end for i=1, GROUP_SIZE_MAX, 1 do local row = TGU_SimpleListControlContainerScrollChild:GetNamedChild("Row" .. i) local listPlayer = _players[i] if (listPlayer ~= nil) then local isPlayerNotGrouped = IsUnitGrouped(listPlayer.PingTag) == false if (TGU_SimpleList.IsMocked) then isPlayerNotGrouped = false end local isPlayerTimedOut = (GetTimeStamp() - listPlayer.LastMapPingTimestamp) > TIMEOUT if (isPlayerNotGrouped or isPlayerTimedOut) then if (LOG_ACTIVE) then _logger:logDebug("Player invalid, hide row: " .. tostring(i)) end row:SetHidden(true) table.remove(_players, i) end else if (LOG_ACTIVE) then _logger:logDebug("Row empty, hide: " .. tostring(i)) end row:SetHidden(true) end end if (TGU_SettingsHandler.SavedVariables.IsSortingActive) then -- Sort list with all players TGU_SimpleList.SortList() end end --[[ Sorts swimlane ]]-- function TGU_SimpleList.SortList() if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.SortList") end -- Comparer function compare(playerLeft, playerRight) if (playerLeft.RelativeUltimate == playerRight.RelativeUltimate) then return playerLeft.PingTag < playerRight.PingTag else return playerLeft.RelativeUltimate > playerRight.RelativeUltimate end end table.sort(_players, compare) -- Update sorted swimlane list for i,listPlayer in ipairs(_players) do TGU_SimpleList.UpdateListRow(TGU_SimpleListControlContainerScrollChild:GetNamedChild("Row" .. i), listPlayer) end end --[[ Updates list row ]]-- function TGU_SimpleList.UpdateListRow(row, player) if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.UpdateListRow") end local localizedUltimateName = zo_strformat(SI_ABILITY_TOOLTIP_NAME, player.UltimateName) local nameLength = string.len(localizedUltimateName) if (nameLength > 22) then localizedUltimateName = string.sub(localizedUltimateName, 0, 22) .. "..." end row:GetNamedChild("SenderNameValueLabel"):SetText(player.PlayerName) row:GetNamedChild("UltimateValueLabel"):SetText(localizedUltimateName) row:GetNamedChild("ReadyValueLabel"):SetText(player.RelativeUltimate) if (player.IsPlayerDead) then row:GetNamedChild("SenderNameValueLabel"):SetColor(1.0, 0.0, 0.0, 1) row:GetNamedChild("UltimateValueLabel"):SetColor(1.0, 0.0, 0.0, 1) row:GetNamedChild("ReadyValueLabel"):SetColor(1.0, 0.0, 0.0, 1) elseif (player.RelativeUltimate == 100) then row:GetNamedChild("SenderNameValueLabel"):SetColor(0.0, 1.0, 0.0, 1) row:GetNamedChild("UltimateValueLabel"):SetColor(0.0, 1.0, 0.0, 1) row:GetNamedChild("ReadyValueLabel"):SetColor(0.0, 1.0, 0.0, 1) else row:GetNamedChild("SenderNameValueLabel"):SetColor(1.0, 1.0, 1.0, 1) row:GetNamedChild("UltimateValueLabel"):SetColor(1.0, 1.0, 1.0, 1) row:GetNamedChild("ReadyValueLabel"):SetColor(1.0, 1.0, 1.0, 1) end if (row:IsHidden()) then row:SetHidden(false) end end --[[ Updates list row ]]-- function TGU_SimpleList.UpdatePlayer(player) if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.UpdatePlayer") end if (player) then local row = nil for i,listPlayer in ipairs(_players) do if (LOG_ACTIVE) then _logger:logDebug(listPlayer.PlayerName .. " == " .. player.PlayerName) end if (listPlayer.PlayerName == player.PlayerName) then row = TGU_SimpleListControlContainerScrollChild:GetNamedChild("Row" .. i) end end -- Update timestamp if (row ~= nil) then for i,listPlayer in ipairs(_players) do if (listPlayer.PlayerName == player.PlayerName) then listPlayer.LastMapPingTimestamp = GetTimeStamp() listPlayer.IsPlayerDead = player.IsPlayerDead listPlayer.RelativeUltimate = player.RelativeUltimate break end end else -- Add new player local nextFreeRow = 1 for i,player in ipairs(_players) do nextFreeRow = nextFreeRow + 1 end if (nextFreeRow <= GROUP_SIZE_MAX) then if (LOG_ACTIVE) then _logger:logDebug("TGU_SimpleList.UpdatePlayer, add player " .. tostring(player.PlayerName) .. " to row " .. tostring(nextFreeRow)) end player.LastMapPingTimestamp = GetTimeStamp() _players[nextFreeRow] = player row = TGU_SimpleListControlContainerScrollChild:GetNamedChild("Row" .. nextFreeRow) else if (LOG_ACTIVE) then _logger:logDebug("TGU_SimpleList.UpdatePlayer, too much players for list" .. tostring(nextFreeRow)) end end end -- Only update if player in a row if (row ~= nil) then -- Directly update row with player, sorting will be triggered on RefreshList TGU_SimpleList.UpdateListRow(row, player) end end end --[[ SetControlMovable sets the Movable and MouseEnabled flag in UI elements ]]-- function TGU_SimpleList.SetControlMovable(isMovable) if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.SetControlMovable") _logger:logDebug("isMovable", isMovable) end _control:GetNamedChild("MovableControl"):SetHidden(isMovable == false) _control:SetMovable(isMovable) _control:SetMouseEnabled(isMovable) end --[[ RestorePosition sets TGU_SimpleList on settings position ]]-- function TGU_SimpleList.RestorePosition(posX, posY) if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.RestorePosition") _logger:logDebug("posX, posY", posX, posY) end _control:ClearAnchors() _control:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, posX, posY) end --[[ OnSimpleListMoveStop saves current TGU_SimpleList position to settings ]]-- function TGU_SimpleList.OnSimpleListMoveStop() if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.OnSimpleListMoveStop") end local left = _control:GetLeft() local top = _control:GetTop() TGU_SettingsHandler.SavedVariables.PosX = left TGU_SettingsHandler.SavedVariables.PosY = top if (LOG_ACTIVE) then _logger:logDebug("PosX, PosY", TGU_SettingsHandler.SavedVariables.PosX, TGU_SettingsHandler.SavedVariables.PosY) end end --[[ SetControlHidden sets hidden on control ]]-- function TGU_SimpleList.SetControlHidden(isHidden) if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.SetControlHidden") _logger:logDebug("isHidden", isHidden) end if (TGU_GroupHandler.IsGrouped) then _control:SetHidden(isHidden) else _control:SetHidden(true) end end --[[ SetControlActive sets hidden on control ]]-- function TGU_SimpleList.SetControlActive() if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.SetControlActive") end local isHidden = TGU_SettingsHandler.IsSimpleListVisible() == false if (LOG_ACTIVE) then _logger:logDebug("isHidden", isHidden) end TGU_SimpleList.SetControlHidden(isHidden or CurrentHudHiddenState()) if (isHidden) then -- Stop timeout timer EVENT_MANAGER:UnregisterForUpdate(TGU_SimpleList.Name) CALLBACK_MANAGER:UnregisterCallback(TGU_GROUP_CHANGED, TGU_SimpleList.RefreshList) CALLBACK_MANAGER:UnregisterCallback(TGU_PLAYER_DATA_CHANGED, TGU_SimpleList.UpdatePlayer) CALLBACK_MANAGER:UnregisterCallback(TGU_MOVABLE_CHANGED, TGU_SimpleList.SetControlMovable) CALLBACK_MANAGER:UnregisterCallback(TUI_HUD_HIDDEN_STATE_CHANGED, TGU_SimpleList.SetControlHidden) else TGU_SimpleList.SetControlMovable(TGU_SettingsHandler.SavedVariables.Movable) TGU_SimpleList.RestorePosition(TGU_SettingsHandler.SavedVariables.PosX, TGU_SettingsHandler.SavedVariables.PosY) -- Start timeout timer EVENT_MANAGER:RegisterForUpdate(TGU_SimpleList.Name, REFRESHRATE, TGU_SimpleList.RefreshList) CALLBACK_MANAGER:RegisterCallback(TGU_GROUP_CHANGED, TGU_SimpleList.RefreshList) CALLBACK_MANAGER:RegisterCallback(TGU_PLAYER_DATA_CHANGED, TGU_SimpleList.UpdatePlayer) CALLBACK_MANAGER:RegisterCallback(TGU_MOVABLE_CHANGED, TGU_SimpleList.SetControlMovable) CALLBACK_MANAGER:RegisterCallback(TUI_HUD_HIDDEN_STATE_CHANGED, TGU_SimpleList.SetControlHidden) end end --[[ CreateSimpleListRows creates simple list rows ]]-- function TGU_SimpleList.CreateSimpleListRows() if (LOG_ACTIVE) then _logger:logTrace("TGU_SimpleList.CreateSimpleListRows") end for i=1, GROUP_SIZE_MAX, 1 do local row = CreateControlFromVirtual("$(parent)Row", TGU_SimpleListControlContainerScrollChild, "GroupUltimateSimpleListRow", i) if (LOG_ACTIVE) then _logger:logDebug("Row created " .. row:GetName()) end row:SetHidden(true) -- initial not visible if i == 1 then row:SetAnchor(TOPLEFT, TGU_SimpleListControlContainerScrollChild, TOPLEFT, 0, 0) else row:SetAnchor(TOP, lastRow, BOTTOM, 0, 0) end lastRow = row end end --[[ Initialize initializes TGU_SimpleList ]]-- function TGU_SimpleList.Initialize(logger, isMocked) if (LOG_ACTIVE) then logger:logTrace("TGU_SimpleList.Initialize") end _logger = logger _control = TGU_SimpleListControl TGU_SimpleList.IsMocked = isMocked TGU_SimpleList.CreateSimpleListRows() CALLBACK_MANAGER:RegisterCallback(TGU_STYLE_CHANGED, TGU_SimpleList.SetControlActive) CALLBACK_MANAGER:RegisterCallback(TGU_IS_ZONE_CHANGED, TGU_SimpleList.SetControlActive) CALLBACK_MANAGER:RegisterCallback(TGU_UNIT_GROUPED_CHANGED, TGU_SimpleList.SetControlActive) end