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 _control = TGT_CenteredLeaderMarkerControl
local _isActive = false
local _leader = nil
local _player = { Tag = "player" }
--[[
Table TGT_CenteredLeaderMarker
]]--
TGT_CenteredLeaderMarker = {}
TGT_CenteredLeaderMarker.__index = TGT_CenteredLeaderMarker
--[[
===============
PRIVATE METHODS
===============
]]--
--[[
NormalizeAngle calculates angle
]]--
local function NormalizeAngle(s, c)
if c == nil then c = s end
if c > math.pi then return c - 2 * math.pi end
if c < -math.pi then return c + 2 * math.pi end
return c
end
--[[
UpdatePlayer updates player entity position and angle
]]--
local function UpdatePlayer()
-- The method will be called every frame by TGT_CenteredLeaderMarker.OnUpdateControl()
_player.Name = GetUnitName(_player.Tag)
_player.X, _player.Y, _player.Z = GetMapPlayerPosition(_player.Tag)
_player.H = NormalizeAngle(GetPlayerCameraHeading())
end
--[[
UpdateLeader updates leader entity position and leader Tag
]]--
local function UpdateLeader()
-- The method will be called every frame by TGT_CenteredLeaderMarker.OnUpdateControl()
local newLeader = GetGroupLeaderUnitTag()
if (_leader == nil or _leader.Tag ~= newLeader) then
_leader = { Tag = newLeader }
end
if (_leader.Name == _player.Name) then
_leader = nil
end
if (_leader ~= nil) then
_leader.X, _leader.Y, _leader.Z = GetMapPlayerPosition(_leader.Tag)
_leader.Name = GetUnitName(_leader.Tag)
end
end
--[[
UpdateReticle updates position of reticle
]]--
local function UpdateReticle()
-- The method will be called every frame by TGT_CenteredLeaderMarker.OnUpdateControl()
-- Distance offset
local distance = _settingsHandler.SavedVariables.CircleDistance
local dx = _player.X - _leader.X
local dy = _player.Y - _leader.Y
if (_settingsHandler.SavedVariables.LeaderArrowDistance) then
-- magic number 256 to make animation smoother (faster between 0-1, so you get early to max distance)
local minDistance = _settingsHandler.SavedVariables.MinDistance
local maxDistance = _settingsHandler.SavedVariables.MaxDistance
local difference = math.sqrt((dx * dx) + (dy * dy))
local relativeDistance = math.tanh(difference * 256)
distance = distance + math.abs(minDistance + (maxDistance - minDistance) * relativeDistance)
end
local angle = NormalizeAngle(_player.H - math.atan2(dx, dy))
local x = math.sin(math.pi - angle) * distance
local y = math.cos(math.pi - angle) * distance
_control:GetNamedChild("Texture"):ClearAnchors()
_control:GetNamedChild("Texture"):SetAnchor(CENTER, _control, CENTER, x, y)
_control:GetNamedChild("Texture"):SetTextureRotation((math.pi * 2) - angle)
end
--[[
SetControlColor sets control color
]]--
local function SetControlColors(part)
if (part == GROUP_LEADER) then
local controlColor = _settingsHandler.SavedVariables.ModuleColors[part].ArrowColor
_control:GetNamedChild("Texture"):SetColor(controlColor.R, controlColor.G, controlColor.B, controlColor.A)
end
end
--[[
SetControlHidden sets hidden on control
]]--
local function SetControlHidden()
local isActive = _settingsHandler.SavedVariables.IsLeaderArrowActive
-- Only show if control is active, player is grouped and player is NOT the leader
if (isActive and GetIsUnitGrouped() and IsUnitGroupLeader("player") == false) then
_control:SetHidden(CurrentHudHiddenState())
else
_control:SetHidden(true)
end
end
--[[
SetControlActive sets isActive on control
]]--
local function SetControlActive()
SetControlHidden()
local isActive = _settingsHandler.SavedVariables.IsLeaderArrowActive
if (_isActive ~= isActive) then
_isActive = isActive
if (isActive) then
SetControlColors(GROUP_LEADER)
CALLBACK_MANAGER:RegisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
CALLBACK_MANAGER:RegisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
else
CALLBACK_MANAGER:UnregisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
CALLBACK_MANAGER:UnregisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
CALLBACK_MANAGER:UnregisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
end
end
end
--[[
==============
PUBLIC METHODS
==============
]]--
--[[
OnUpdateControl updates position of reticle
]]--
function TGT_CenteredLeaderMarker.OnUpdateControl()
-- If UI visible, the method will be called every frame
if (GetIsUnitGrouped()) then
UpdatePlayer()
UpdateLeader()
if (_leader ~= nil) then
UpdateReticle()
end
end
end
--[[
Initialize initializes TGT_CenteredLeaderMarker
]]--
function TGT_CenteredLeaderMarker.Initialize()
_logger = TGT_LOGGER
SetControlActive()
CALLBACK_MANAGER:RegisterCallback(TGT_ARROW_ACTIVE_CHANGED, SetControlActive)
_logger:logTrace("TGT_CenteredLeaderMarker -> Initialized")
end