RAKBOT выдает хрень при получении пакетов ONFOOT других игроков

Karagiozis

Известный
Автор темы
27
2
Версия MoonLoader
Другое
Помогите плиз. Уже заебался.
Нашел данную тему https://www.blast.hk/threads/29052/ где ракбот посылает свою ONFOOT инфу.
Мне надо получить ИД анимации других игроков. Если игрок стоит то ид анимация 1189.
Если я считываю ид анимации, которую посылает ракбот, то он выдает как раз ид анимации 1189.
Вот код:
Код:
local playerSync = {
    read = function(bs, size)
        local bs = bitStreamInit(bs, size)
        local data = {}
        data.packetId = bitStreamReadWord(bs)
        data.leftRightKeys = bitStreamReadWord(bs)
        data.upDownKeys = bitStreamReadWord(bs)
        data.keysData = bitStreamReadWord(bs)
        data.keys = bitStreamReadWord(bs)
        bitStreamSetReadOffset(bs, 7)
        data.position = {}
        data.position.x = bitStreamReadFloat(bs)
        data.position.y = bitStreamReadFloat(bs)
        data.position.z = bitStreamReadFloat(bs)
        data.quaternion = {}
        data.quaternion[1] = bitStreamReadFloat(bs)
        data.quaternion[2] = bitStreamReadFloat(bs)
        data.quaternion[3] = bitStreamReadFloat(bs)
        data.quaternion[4] = bitStreamReadFloat(bs)
        data.health = bitStreamReadByte(bs)
        data.armor = bitStreamReadByte(bs)
        data.weapon = bitStreamReadByte(bs)
        data.specialAction = bitStreamReadByte(bs)
        data.moveSpeed = {}
        data.moveSpeed.x = bitStreamReadFloat(bs)
        data.moveSpeed.y = bitStreamReadFloat(bs)
        data.moveSpeed.z = bitStreamReadFloat(bs)
        data.surfingOffsets = {}
        data.surfingOffsets.x = bitStreamReadFloat(bs)
        data.surfingOffsets.y = bitStreamReadFloat(bs)
        data.surfingOffsets.z = bitStreamReadFloat(bs)
        data.surfingVehicleId = bitStreamReadWord(bs)
        data.animationId = bitStreamReadWord(bs)
        data.animationFlags = bitStreamReadWord(bs)
        return data
    end,
    write = function(bs, data,size)
        local bs = bitStreamInit(bs, size)
        bitStreamSetWriteOffset(bs, 0)
        bitStreamWriteWord(bs,data.packetId)
        bitStreamWriteWord(bs,data.leftRightKeys)
        bitStreamWriteWord(bs,data.upDownKeys)
        bitStreamWriteWord(bs,data.keysData)
        bitStreamWriteWord(bs,data.keys)
        bitStreamSetWriteOffset(bs, 7)
        bitStreamWriteFloat(bs,data.position.x)
        bitStreamWriteFloat(bs,data.position.y)
        bitStreamWriteFloat(bs,data.position.z)
        bitStreamWriteFloat(bs,data.quaternion[1])
        bitStreamWriteFloat(bs,data.quaternion[2])
        bitStreamWriteFloat(bs, data.quaternion[3])
        bitStreamWriteFloat(bs,data.quaternion[4])
        bitStreamWriteByte(bs,data.health)
        bitStreamWriteByte(bs,data.armor)
        bitStreamWriteByte(bs,data.weapon)
        bitStreamWriteByte(bs,data.specialAction)
        bitStreamWriteFloat(bs,data.moveSpeed.x)
        bitStreamWriteFloat(bs,data.moveSpeed.y)
        bitStreamWriteFloat(bs,data.moveSpeed.z)
        bitStreamWriteFloat(bs,data.surfingOffsets.x)
        bitStreamWriteFloat(bs,data.surfingOffsets.y)
        bitStreamWriteFloat(bs,data.surfingOffsets.z)
        bitStreamWriteWord(bs,data.surfingVehicleId)
        bitStreamWriteWord(bs,data.animationId)
        bitStreamWriteWord(bs,data.animationFlags)
    end
}


function onSendPacket(pId, bs, size)
    if pId == 207 then
            local inf = playerSync.read(bs,size)
            printLog('animationId: '..tostring(inf.animationId)..' pos z: '..tostring(inf.position.z))
    end
end

Когда я меняю onSendPacket на onRecvPacket, то он уже выдает какую-то фигню, то есть другие значение
Не могу понять почему он правильно отображает инфу которую посылает, но при этом не правильно отображает когда получает эту же инфу от других игроков.
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,743
4,804
Как минимум ID пакета это uint8_t(1 байт), а не word
Насчет битов обманул. Вот точно рабочая структура:

C++:
short m_sLeftStickX; // move/steer left = -128, right = 128
    short m_sLeftStickY; // move back = 128, forwards = -128
    union {
        struct {
            unsigned char m_bLeftShoulder1 : 1;  // fire weapon alt
            unsigned char m_bShockButtonL : 1;   // crouch
            unsigned char m_bButtonCircle : 1;   // fire weapon
            unsigned char m_bButtonCross : 1;    // sprint, accelerate
            unsigned char m_bButtonTriangle : 1; // enter/exit vehicle
            unsigned char m_bButtonSquare : 1;   // jump, reverse
            unsigned char m_bRightShoulder2 : 1; // look right (incar)
            unsigned char m_bRightShoulder1 : 1; // hand brake, target

            unsigned char m_bLeftShoulder2 : 1; // look left
            unsigned char m_bShockButtonR : 1;  // look behind
            unsigned char m_bPedWalk : 1;       // walking
            unsigned char m_bRightStickDown : 1;
            unsigned char m_bRightStickUp : 1;
            unsigned char m_bRightStickRight : 1; // num 4
            unsigned char m_bRightStickLeft : 1;  // num 6
                                                  // 16th bit is unused
        };
        short m_value;
    };

C++:
struct CVector {
    float x, y, z;
};

union {
        struct {
            unsigned short m_nId : 16;
            unsigned char  m_nFramedelta : 8;
            unsigned char  m_nLoopA : 1;
            unsigned char  m_nLockX : 1;
            unsigned char  m_nLockY : 1;
            unsigned char  m_nLockF : 1;
            unsigned char  m_nTime : 2;
        };
    int m_value;
};
struct onFootData{
ControllerState    m_controllerState;
CVector   m_position;
float    m_fQuaternion[4];
unsigned char      m_nHealth;
unsigned char      m_nArmor;
unsigned char      m_nCurrentWeapon;
unsigned char      m_nSpecialAction;
CVector     m_speed;
CVector     m_surfingOffset;
uint16_t     m_nSurfingVehicleId;
Animation       m_animation;
};
 
Последнее редактирование:

Karagiozis

Известный
Автор темы
27
2
Спасибо за ответ. Я в С++ плох, но то что дал выше вроде не то, да и к тому же можешь показать как это использовать в луа?
Насчет битов.
Для теста в игре я сделал луа скрипт который отобразил инфу о положении и нажатии кнопки. Вот код:
Код:
local sampev = require 'lib.samp.events'
local memory = require 'memory'

function sampev.onSendPlayerSync(data)
    sampAddChatMessage('leftRightKeys: '..tostring(data.leftRightKeys)..' upDownKeys: '..tostring(data.upDownKeys)..' keysData: '..tostring(data.keysData)..' posX: '..data.position.x,-1)
end

Он мне показал такую инфу когда я просто зажал кнопку вперед то есть W:
sa-mp-060.png


В ракботе я использовал этот код с учетом что ид пакета 1 байт и так далее:
Код:
function onRecvPacket(packetId, data, packetSize)
    if packetId == 207 then
        local bs = bitStreamInit(data, packetSize)
        packetID = bitStreamReadByte(bs)
        leftRightKeys = bitStreamReadWord(bs)
        upDownKeys = bitStreamReadWord(bs)
        keysData = bitStreamReadWord(bs)
        posX = bitStreamReadFloat(bs)
        printLog('packetID: '..packetID..' leftRightKeys: '..leftRightKeys..' upDownKeys: '..upDownKeys..' keysData: '..' posX: '..posX)
        bitStreamDelete(bs)
    end
end

Ракбот выдал вот такую хрень:
packetID: 207 leftRightKeys: 8 upDownKeys: 16224 keysData: 192 posX: -93761921024
Даже позицию не выдает
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,743
4,804
packetID: 207 leftRightKeys: 8 upDownKeys: 16224 keysData: 192 posX: -93761921024
Ответил недавно, там есть структура пакета onFootData. Можешь оттуда взять
Либо вот тебе из samp.events:
C++:
typedef struct PlayerSyncData {
    uint16_t          leftRightKeys;
    uint16_t          upDownKeys;
    union {
        uint16_t        keysData;
        struct SampKeys keys;
    };
    struct VectorXYZ  position;
    float             quaternion[4];
    uint8_t           health;
    uint8_t           armor;
    uint8_t           weapon;
    uint8_t           specialAction;
    struct VectorXYZ  moveSpeed;
    struct VectorXYZ  surfingOffsets;
    uint16_t          surfingVehicleId;
    uint16_t          animationId;
    uint16_t          animationFlags;
} PlayerSyncData;