SA:MP Как преобразовать BitStream в структуру?

Flame Castle

Новичок
Автор темы
3
0
Версия SA-MP
  1. Любая
Имеем следующий код:

Lua:
-- Функция отправки бистрима в чистом виде побайтово.
function sendTable(tab)
    local bs = raknetNewBitStream()
    for i = 1, #tab do
        raknetBitStreamWriteInt8(bs, tab[i])
    end

    raknetSendBitStream(bs)
end

sendTable({207, 0, 0, 0, 0, 4, 0, 90, 232, 188, 196, 22, 236, 78, 196, 36, 8, 113, 66, 78, 146, 84, 63, 0, 0, 0, 128, 0, 0, 0, 0, 180, 166, 14, 191, 117, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 4, 232, 128, 0})

-- Строка выше получена следующим образом, где array - это таблица.
function bitStreamStructure(bs)
    local text, array = '', {}
    for i = 1, raknetBitStreamGetNumberOfBytesUsed(bs) do
        local byte = raknetBitStreamReadInt8(bs)
        if byte >= 32 and byte <= 255 and byte ~= 37 then text = text .. string.char(byte) end
        table.insert(array, byte)
    end
    raknetBitStreamResetReadPointer(bs)
    return text, array
end

Мне нужно преобразовать данные для отправки по следующей структуре, используя Lua:

C++:
    struct stOnFootData
    {
        uint16_t    sLeftRightKeys;
        uint16_t    sUpDownKeys;
        union
        {
            uint16_t            sKeys;
            struct stSAMPKeys    stSampKeys;
        };
        float        fPosition[3];
        float        fQuaternion[4];
        uint8_t        byteHealth;
        uint8_t        byteArmor;
        uint8_t        byteCurrentWeapon;
        uint8_t        byteSpecialAction;
        float        fMoveSpeed[3];
        float        fSurfingOffsets[3];
        uint16_t    sSurfingVehicleID;
        short        sCurrentAnimationID;
        short        sAnimFlags;
    };
 

moreveal

Известный
Проверенный
927
622
так в чем проблема? записывай и читай также
Lua:
--[[
local data = {
    leftRightKeys = 0,
    upDownKeys = 0,
    keys = 0,
    position = {x = 0.0, y = 0.0, z = 0.0},
    quaternion = {w = 0.0, x = 0.0, y = 0.0, z = 0.0},
    health = 100.0, armor = 100.0,
    currentWeapon = 0,
    specialAction = 0,
    moveSpeed = {x = 0.0, y = 0.0, z = 0.0},
    surfingOffsets = {x = 0.0, y = 0.0, z = 0.0},
    surfingVehicleId = 65535,
    currentAnimationId = 0,
    animationFlags = 0
}
]]

function sendOnFoot(data)
    local bs = raknetNewBitStream()

    -- Packet ID
    raknetBitStreamWriteInt8(bs, 207)

    -- Structure data
    raknetBitStreamWriteInt16(bs, data.leftRightKeys)
    raknetBitStreamWriteInt16(bs, data.upDownKeys)
    raknetBitStreamWriteInt16(bs, data.keys)
    raknetBitStreamWriteFloat(bs, data.position.x)
    raknetBitStreamWriteFloat(bs, data.position.y)
    raknetBitStreamWriteFloat(bs, data.position.z)
    raknetBitStreamWriteFloat(bs, data.quaternion.w)
    raknetBitStreamWriteFloat(bs, data.quaternion.x)
    raknetBitStreamWriteFloat(bs, data.quaternion.y)
    raknetBitStreamWriteFloat(bs, data.quaternion.z)
    raknetBitStreamWriteInt8(bs, data.health)
    raknetBitStreamWriteInt8(bs, data.armor)
    raknetBitStreamWriteInt8(bs, data.currentWeapon)
    raknetBitStreamWriteInt8(bs, data.specialAction)
    raknetBitStreamWriteFloat(bs, data.moveSpeed.x)
    raknetBitStreamWriteFloat(bs, data.moveSpeed.y)
    raknetBitStreamWriteFloat(bs, data.moveSpeed.z)
    raknetBitStreamWriteFloat(bs, data.surfingOffsets.x)
    raknetBitStreamWriteFloat(bs, data.surfingOffsets.y)
    raknetBitStreamWriteFloat(bs, data.surfingOffsets.z)
    raknetBitStreamWriteInt16(bs, data.surfingVehicleId)
    raknetBitStreamWriteInt16(bs, data.currentAnimationId)
    raknetBitStreamWriteInt16(bs, data.animationFlags)

    raknetSendBitStream(bs)
end

function readOnFoot(bs)
    raknetBitStreamResetReadPointer(bs)
  
    local packetId = raknetBitStreamReadInt8(bs)
    if packetId ~= 207 then return nil end

    local data = {}
    data.leftRightKeys = raknetBitStreamReadInt16(bs)
    data.upDownKeys = raknetBitStreamReadInt16(bs)
    data.keys = raknetBitStreamReadInt16(bs)

    data.position = {
        x = raknetBitStreamReadFloat(bs),
        y = raknetBitStreamReadFloat(bs),
        z = raknetBitStreamReadFloat(bs)
    }

    data.quaternion = {
        w = raknetBitStreamReadFloat(bs),
        x = raknetBitStreamReadFloat(bs),
        y = raknetBitStreamReadFloat(bs),
        z = raknetBitStreamReadFloat(bs)
    }

    data.health = raknetBitStreamReadInt8(bs)
    data.armor = raknetBitStreamReadInt8(bs)
    data.currentWeapon = raknetBitStreamReadInt8(bs)
    data.specialAction = raknetBitStreamReadInt8(bs)

    data.moveSpeed = {
        x = raknetBitStreamReadFloat(bs),
        y = raknetBitStreamReadFloat(bs),
        z = raknetBitStreamReadFloat(bs)
    }

    data.surfingOffsets = {
        x = raknetBitStreamReadFloat(bs),
        y = raknetBitStreamReadFloat(bs),
        z = raknetBitStreamReadFloat(bs)
    }

    data.surfingVehicleId = raknetBitStreamReadInt16(bs)
    data.currentAnimationId = raknetBitStreamReadInt16(bs)
    data.animationFlags = raknetBitStreamReadInt16(bs)

    return data
end
 
Последнее редактирование: