ESOUI SVN TaosGroupUltimate

[/] [trunk/] [TaosGroupUltimate/] [logic/] [MapPingHandler.lua] - Rev 37

Go to most recent revision | Compare with Previous | Blame | View Log

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

--[[
        Local variables
]]--
local LOG_ACTIVE = false
local _logger = nil

local REFRESHRATE = 1000 -- ms; RegisterForUpdate is in miliseconds

-- LGS implementation
local LGS = LibStub:GetLibrary("LibGroupSocketLight")
local MESSAGE_TYPE = 20 -- own type, must be between 1-31

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

--[[
        Table Members
]]--
TGU_MapPingHandler.Name = "TGU-MapPingHandler"
TGU_MapPingHandler.IsMocked = false

--[[
        Called on new data from LibGroupSocket
]]--
function TGU_MapPingHandler.OnLgsData(pingTag, data, isSelf)
    if (LOG_ACTIVE) then _logger:logTrace("TGU_MapPingHandler.OnLgsData") end

    local expectedLength = 2
    if(#data < expectedLength) then _logger:logError("TGU_MapPingHandler received only %d of %d byte", #data, expectedLength) return end

    local index = 1
    local abilityPing, index = LGS:ReadUint8(data, index)
    local relativeUltimate, index = LGS:ReadUint8(data, index)

    local ultimateGroup = TGU_UltimateGroupHandler.GetUltimateGroupByAbilityPing(abilityPing)

    if (ultimateGroup ~= nil and relativeUltimate ~= -1) then
        local player = {}
        local playerName = ""
        local isPlayerDead = false

        if (TGU_MapPingHandler.IsMocked == false) then
            playerName = GetUnitName(pingTag)
            isPlayerDead = IsUnitDead(pingTag)
        else
            playerName = pingTag
            isPlayerDead = math.random() > 0.8
        end

        player.PingTag = pingTag
        player.GroupNumber = string.sub(pingTag, string.len("group") + 1)
        player.PlayerName = playerName
        player.IsPlayerDead = isPlayerDead
        player.UltimateGroup = ultimateGroup
        player.UltimateName = GetAbilityName(ultimateGroup.GroupAbilityId)
        player.UltimateIcon = GetAbilityIcon(ultimateGroup.GroupAbilityId)
        player.RelativeUltimate = relativeUltimate

        if (LOG_ACTIVE) then 
            _logger:logDebug("player.PingTag", player.PingTag)
            _logger:logDebug("player.PlayerName", player.PlayerName)
            _logger:logDebug("player.IsPlayerDead", player.IsPlayerDead)
            _logger:logDebug("player.UltimateGroup.GroupName", player.UltimateGroup.GroupName)
            _logger:logDebug("player.RelativeUltimate", player.RelativeUltimate)
        end

        CALLBACK_MANAGER:FireCallbacks("TGU-MapPingChanged", player)
    else
        _logger:logError("TGU_MapPingHandler.OnMapPing, Ping invalid ultimateGroup: " .. tostring(ultimateGroup) .. "; relativeUltimate: " .. tostring(relativeUltimate))
    end
end

--[[
        Called on refresh of timer
]]--
function TGU_MapPingHandler.OnTimedUpdate(eventCode)
    if (LOG_ACTIVE) then _logger:logTrace("TGU_MapPingHandler.OnTimedUpdate") end

        if (IsUnitGrouped("player") == false and TGU_MapPingHandler.IsMocked == false) then return end -- only if player is in group and system is not mocked

        local current, max, effective_max = GetUnitPower("player", POWERTYPE_ULTIMATE)
    local abilityGroup = TGU_UltimateGroupHandler.GetUltimateGroupByAbilityId(TGU_SettingsHandler.SavedVariables.StaticUltimateID)

    if (abilityGroup ~= nil) then
            local abilityCost = math.max(1, GetAbilityCost(abilityGroup.GroupAbilityId))
            local relativeUltimate = math.floor((current / abilityCost) * 100)

            if (relativeUltimate > 100) then
                    relativeUltimate = 100
            end

        local data = {}
                local index = 1
                index = LGS:WriteUint8(data, index, abilityGroup.GroupAbilityPing)
                index = LGS:WriteUint8(data, index, relativeUltimate)

                if(LGS:Send(MESSAGE_TYPE, data)) then
                        if (LOG_ACTIVE) then _logger:logDebug("Send complete") end
                else
                        if (LOG_ACTIVE) then _logger:logDebug("LGS Send failed") end
                end
    else
        _logger:logError("TGU_MapPingHandler.OnTimedUpdate, abilityGroup is nil, change ultimate. StaticID: " .. tostring(TGU_SettingsHandler.SavedVariables.StaticUltimateID))
    end
end

--[[
        Initialize initializes TGU_MapPingHandler
]]--
function TGU_MapPingHandler.Initialize(logger, isMocked)
    if (LOG_ACTIVE) then 
        logger:logTrace("TGU_MapPingHandler.Initialize")
        logger:logDebug("isMocked", isMocked)
    end

    _logger = logger

    TGU_MapPingHandler.IsMocked = isMocked
        LGS.debug = isMocked

    -- Register LibGroupSocket callbacks
    LGS:RegisterCallback(MESSAGE_TYPE, TGU_MapPingHandler.OnLgsData)

        -- Start timer
        EVENT_MANAGER:RegisterForUpdate(TGU_MapPingHandler.Name, REFRESHRATE, TGU_MapPingHandler.OnTimedUpdate)
end

Go to most recent revision | Compare with Previous | Blame