ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [communication/] [Messages.lua] - Rev 89

Compare with Previous | Blame | View Log

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

--[[
        Global values
]]--
COLDHARBOUR_MAP_INDEX = 23

MESSAGE_PLAYER_RESOURCES = 1
MESSAGE_PLAYER_DPS = 2
MESSAGE_PLAYER_HPS = 3

--[[
        Local variables
]]--
local COLDHARBOUR_MAP_STEP_SIZE = 1.4285034012573e-005
local MESSAGE_PLAYER_RESOURCES_IDENTIFIER = 0x1e
local MESSAGE_PLAYER_DPS_IDENTIFIER = 0x32
local MESSAGE_PLAYER_HPS_IDENTIFIER = 0x3c
local EARTHGORE_PROCC_IDENTIFIER = 0xc8

local _logger = nil

local _name = "TGT-Messages"

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

--[[
        ===============
    PRIVATE METHODS
    ===============
]]--

--- Converts normalized map ping coordinates into 4 bytes of data
--- returns 4 integers between 0 and 255
local function DecodeData(x, y)
        local x = math.floor(x / COLDHARBOUR_MAP_STEP_SIZE + 0.5) -- round to next integer
        local y = math.floor(y / COLDHARBOUR_MAP_STEP_SIZE + 0.5)

        local b0 = math.floor(x / 0x100)
        local b1 = x % 0x100
        local b2 = math.floor(y / 0x100)
        local b3 = y % 0x100

        return b0, b1, b2, b3
end

--- Converts 4 bytes of data into coordinates for a map ping
--- b0 to b3 - integers between 0 and 255
--- returns normalized x and y coordinates
local function EncodeData(b0, b1, b2, b3)
        local b0 = b0 or 0
        local b1 = b1 or 0
        local b2 = b2 or 0
        local b3 = b3 or 0

        return (b0 * 0x100 + b1) * COLDHARBOUR_MAP_STEP_SIZE, (b2 * 0x100 + b3) * COLDHARBOUR_MAP_STEP_SIZE
end

--- Converts 3 bytes of data into 24bit integer
--- b0 to b3 - integers between 0 and 255
--- returns 24bit integer
local function BytesToInt24(b1, b2, b3)
    return (b1 * 0x10000) + (b2 * 0x100) + b3
end

--- Converts 24bit integer into 3 bytes of data
--- returns 3 integers between 0 and 255
local function Uint24IntoBytes(value)
    local b1 = math.floor(value / 0x10000)
    local b2 = math.floor((value % 0x10000) / 0x100)
    local b3 = value % 0x100

    return b1, b2, b3
end

--- Converts 8bit integer into bit table
--- returns a table of 8 bits, most significant first.
local function Convert8BitIntegerIntoBitArray(value)
    local bits = 8
    local bitTable = {} -- will contain the bits        

    for index = bits, 1, -1 do
        bitTable[index] = math.fmod(value, 2)
        value = math.floor((value - bitTable[index]) / 2)
    end

    return bitTable
end

--[[
        GetMessagePingForPlayerHPS gets message (MESSAGE_PLAYER_HPS_IDENTIFIER, HPS) as normalized x, y ping
]]--
local function GetMessagePingForPlayerHPS(player)
    local b0 = MESSAGE_PLAYER_HPS_IDENTIFIER
    local b1, b2, b3 = Uint24IntoBytes(player.HealingToSend)

    return EncodeData(b0, b1, b2, b3)
end

--[[
        GetMessagePingForPlayerDPS gets message (MESSAGE_PLAYER_DPS_IDENTIFIER, DPS) as normalized x, y ping
]]--
local function GetMessagePingForPlayerDPS(player)
    local b0 = MESSAGE_PLAYER_DPS_IDENTIFIER
    local b1, b2, b3 = Uint24IntoBytes(player.DamageToSend)

    return EncodeData(b0, b1, b2, b3)
end

--[[
        GetMessagePingForPlayerResources gets message (ulti/earthgore procc, relUlti, relMag, relStam) as normalized x, y ping
]]--
local function GetMessagePingForPlayerResources(player)
    local b0 = player.UltimateGroup.GroupAbilityPing
    local b1 = player.RelativeUltimate
    local b2 = player.RelativeMagicka
    local b3 = player.RelativeStamina

    if (player.IsEarthgoreProcced) then
        player.IsEarthgoreProcced = false
        b0 = EARTHGORE_PROCC_IDENTIFIER
    end

    return EncodeData(b0, b1, b2, b3)
end

--[[
        GetPlayerResources gets player resources from byte informations
]]--
local function GetPlayerResources(b0, b1, b2, b3)
    local pingPlayer = {
        MessageType = MESSAGE_PLAYER_RESOURCES,
        GroupAbilityPing = b0,
        RelativeUltimate = b1,
        RelativeMagicka = b2,
        RelativeStamina = b3
    }

    if (b0 == EARTHGORE_PROCC_IDENTIFIER) then
        pingPlayer.IsEarthgoreProcced = true
    end

    return pingPlayer
end

--[[
        GetPlayerDps gets player DPS from byte informations
]]--
local function GetPlayerDps(b0, b1, b2, b3)
    local pingPlayer = {
        MessageType = MESSAGE_PLAYER_DPS,
        DamageReceived = BytesToInt24(b1, b2, b3)
    }

    return pingPlayer
end

--[[
        GetPlayerHps gets player HPS from byte informations
]]--
local function GetPlayerHps(b0, b1, b2, b3)
    local pingPlayer = {
        MessageType = MESSAGE_PLAYER_HPS,
        HealingReceived = BytesToInt24(b1, b2, b3)
    }

    return pingPlayer
end

--[[
        ==============
    PUBLIC METHODS
    ==============
]]--

--[[
        GetPlayerFromMessagePing gets player as player object from normalized x, y coordinates
]]--
function TGT_Messages.GetPlayerFromMessagePing(x, y)
    local b0, b1, b2, b3 = DecodeData(x, y)

    if ((b0 > 0 and b0 < MESSAGE_PLAYER_RESOURCES_IDENTIFIER) or b0 == EARTHGORE_PROCC_IDENTIFIER) then
        return GetPlayerResources(b0, b1, b2, b3)
    elseif (b0 == MESSAGE_PLAYER_DPS_IDENTIFIER) then
        return GetPlayerDps(b0, b1, b2, b3)
    elseif (b0 == MESSAGE_PLAYER_HPS_IDENTIFIER) then
        return GetPlayerHps(b0, b1, b2, b3)
    else
        -- should not happen
        _logger:logError(zo_strformat("TGT_Messages -> GetPlayerFromMessagePing; Message Type not valid (<<1>>)", b0))
        return nil
    end
end

--[[
        GetMessagePing gets message as normalized x, y ping
]]--
function TGT_Messages.GetMessagePing(messageType, player)
    if (messageType == MESSAGE_PLAYER_RESOURCES) then
        return GetMessagePingForPlayerResources(player)
    elseif (messageType == MESSAGE_PLAYER_DPS) then
        return GetMessagePingForPlayerDPS(player)
    elseif (messageType == MESSAGE_PLAYER_HPS) then
        return GetMessagePingForPlayerHPS(player)
    else
        -- should not happen
        _logger:logError(zo_strformat("TGT_Messages -> GetPlayerFromMessagePing; Message Type not valid (<<1>>)", messageType))
    end
end

--[[
        Initialize initializes TGT_Messages
]]--
function TGT_Messages.Initialize()
    _logger = TGT_LOGGER
    _logger:logTrace("TGT_Messages -> Initialized")
end

Compare with Previous | Blame