Прикрепление объекта к авто

cherepash

Участник
Автор темы
37
32
Версия MoonLoader
.026-beta
Условно у меня есть серверный автомобиль с ID 433, я создаю объект, он успешно создается, но не прикрепляется к автомобилю. Может я что-то не так делаю..

lua:
    ...
    createObj(520, 18861, {0, 0, -1000}, {0, 0, 0}, 50, 1, true, 0, 433, {-0.630000, 1.985000, 0.296000}, {0.000000, -76.598999, 90.000000})
    setRotationObject(520, {0, 0, 0})
    ...
  
function createObj(id,model,pos,rot,draw,scale,colision,heading,attachedVehicle,attachOffset,attachRot)
    print("For car object", id,model,pos,rot,draw,scale,colision,heading,"Car ID", attachedVehicle,attachOffset,attachRot)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs,id)
    raknetBitStreamWriteInt32(bs,model)

    raknetBitStreamWriteFloat(bs,pos[1])
    raknetBitStreamWriteFloat(bs,pos[2])
    raknetBitStreamWriteFloat(bs,pos[3])

    raknetBitStreamWriteFloat(bs,rot[1])
    raknetBitStreamWriteFloat(bs,rot[2])
    raknetBitStreamWriteFloat(bs,rot[3])
    raknetBitStreamWriteFloat(bs,draw)

    raknetBitStreamWriteInt16(bs,attachedVehicle)

    raknetBitStreamWriteFloat(bs,attachOffset[1])
    raknetBitStreamWriteFloat(bs,attachOffset[2])
    raknetBitStreamWriteFloat(bs,attachOffset[3])

    raknetBitStreamWriteFloat(bs,attachRot[1])
    raknetBitStreamWriteFloat(bs,attachRot[2])
    raknetBitStreamWriteFloat(bs,attachRot[3])

    raknetEmulRpcReceiveBitStream(44,bs)
    raknetDeleteBitStream(bs)
    local obj = sampGetObjectHandleBySampId(id)

    setObjectRotation(obj, rot[1],rot[2],rot[3])
    setObjectScale(obj, scale)
    setObjectCollision(obj, colision)
    setObjectHeading(obj,heading)
end

function setRotationObject(id,rot)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs,id)
    raknetBitStreamWriteFloat(bs,rot[1])
    raknetBitStreamWriteFloat(bs,rot[2])
    raknetBitStreamWriteFloat(bs,rot[3])
    raknetEmulRpcReceiveBitStream(46,bs)
    raknetDeleteBitStream(bs)
end
 
Решение
1739544562202.png
1739544616031.png

Lua:
function emulCreateObject(id, model, pos, rot, dd, ncc, vehId, objId, attachOffset, attachRot, sr, tc);
    --[[
        bswrite.uint16(bs, objectId)
        bswrite.int32(bs, data.modelId)
        bswrite.vector3d(bs, data.position)
        bswrite.vector3d(bs, data.rotation)
        bswrite.float(bs, data.drawDistance)
        bswrite.bool8(bs, data.noCameraCol)
        bswrite.uint16(bs, data.attachToVehicleId)
        bswrite.uint16(bs, data.attachToObjectId)
        if data.attachToVehicleId ~= 0xFFFF or data.attachToObjectId ~= 0xFFFF then
            bswrite.vector3d(bs, data.attachOffsets)
            bswrite.vector3d(bs, data.attachRotation)
            bswrite.bool8(bs, data.syncRotation)...

zuxobu

Участник
12
5
Попробуй это, но я не уверен, что код правильный
lua:
function createObj(id, model, pos, rot, draw, scale, colision, heading, attachedVehicle, attachOffset, attachRot)
    -- Проверяем существование автомобиля
    if not sampIsCarValid(attachedVehicle) then
        print("Error: Vehicle", attachedVehicle, "does not exist")
        return false
    end

    -- Создаем объект
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetBitStreamWriteInt32(bs, model)
    
    -- Позиция и поворот
    raknetBitStreamWriteFloat(bs, pos[1])
    raknetBitStreamWriteFloat(bs, pos[2])
    raknetBitStreamWriteFloat(bs, pos[3])
    
    raknetBitStreamWriteFloat(bs, rot[1])
    raknetBitStreamWriteFloat(bs, rot[2])
    raknetBitStreamWriteFloat(bs, rot[3])
    
    raknetBitStreamWriteFloat(bs, draw)
    
    -- ID автомобиля
    raknetBitStreamWriteInt16(bs, attachedVehicle)
    
    -- Смещение относительно автомобиля
    raknetBitStreamWriteFloat(bs, attachOffset[1])
    raknetBitStreamWriteFloat(bs, attachOffset[2])
    raknetBitStreamWriteFloat(bs, attachOffset[3])
    
    -- Поворот относительно автомобиля
    raknetBitStreamWriteFloat(bs, attachRot[1])
    raknetBitStreamWriteFloat(bs, attachRot[2])
    raknetBitStreamWriteFloat(bs, attachRot[3])
    
    -- Отправляем RPC
    raknetEmulRpcReceiveBitStream(44, bs)
    raknetDeleteBitStream(bs)
    
    -- Получаем handle объекта
    local obj = sampGetObjectHandleBySampId(id)
    if not obj then
        print("Error: Failed to get object handle")
        return false
    end
    
    -- Устанавливаем дополнительные параметры
    setObjectRotation(obj, rot[1], rot[2], rot[3])
    setObjectScale(obj, scale)
    setObjectCollision(obj, colision)
    setObjectHeading(obj, heading)
    
    -- Проверяем прикрепление
    local carHandle = sampGetCarHandleBySampId(attachedVehicle)
    if carHandle then
        attachObjectToVehicle(obj, carHandle,
            attachOffset[1], attachOffset[2], attachOffset[3],
            attachRot[1], attachRot[2], attachRot[3])
    end
    
    return true
end

-- Пример использования:
createObj(520, 18861,
    {0, 0, -1000},           -- позиция
    {0, 0, 0},               -- поворот
    50,                      -- дистанция прорисовки
    1,                       -- масштаб
    true,                    -- коллизия
    0,                       -- heading
    433,                     -- ID автомобиля
    {-0.63, 1.985, 0.296},  -- смещение
    {0, -76.599, 90}        -- поворот относительно авто
)
 

cherepash

Участник
Автор темы
37
32
Попробуй это, но я не уверен, что код правильный
lua:
function createObj(id, model, pos, rot, draw, scale, colision, heading, attachedVehicle, attachOffset, attachRot)
    -- Проверяем существование автомобиля
    if not sampIsCarValid(attachedVehicle) then
        print("Error: Vehicle", attachedVehicle, "does not exist")
        return false
    end

    -- Создаем объект
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetBitStreamWriteInt32(bs, model)
 
    -- Позиция и поворот
    raknetBitStreamWriteFloat(bs, pos[1])
    raknetBitStreamWriteFloat(bs, pos[2])
    raknetBitStreamWriteFloat(bs, pos[3])
 
    raknetBitStreamWriteFloat(bs, rot[1])
    raknetBitStreamWriteFloat(bs, rot[2])
    raknetBitStreamWriteFloat(bs, rot[3])
 
    raknetBitStreamWriteFloat(bs, draw)
 
    -- ID автомобиля
    raknetBitStreamWriteInt16(bs, attachedVehicle)
 
    -- Смещение относительно автомобиля
    raknetBitStreamWriteFloat(bs, attachOffset[1])
    raknetBitStreamWriteFloat(bs, attachOffset[2])
    raknetBitStreamWriteFloat(bs, attachOffset[3])
 
    -- Поворот относительно автомобиля
    raknetBitStreamWriteFloat(bs, attachRot[1])
    raknetBitStreamWriteFloat(bs, attachRot[2])
    raknetBitStreamWriteFloat(bs, attachRot[3])
 
    -- Отправляем RPC
    raknetEmulRpcReceiveBitStream(44, bs)
    raknetDeleteBitStream(bs)
 
    -- Получаем handle объекта
    local obj = sampGetObjectHandleBySampId(id)
    if not obj then
        print("Error: Failed to get object handle")
        return false
    end
 
    -- Устанавливаем дополнительные параметры
    setObjectRotation(obj, rot[1], rot[2], rot[3])
    setObjectScale(obj, scale)
    setObjectCollision(obj, colision)
    setObjectHeading(obj, heading)
 
    -- Проверяем прикрепление
    local carHandle = sampGetCarHandleBySampId(attachedVehicle)
    if carHandle then
        attachObjectToVehicle(obj, carHandle,
            attachOffset[1], attachOffset[2], attachOffset[3],
            attachRot[1], attachRot[2], attachRot[3])
    end
 
    return true
end

-- Пример использования:
createObj(520, 18861,
    {0, 0, -1000},           -- позиция
    {0, 0, 0},               -- поворот
    50,                      -- дистанция прорисовки
    1,                       -- масштаб
    true,                    -- коллизия
    0,                       -- heading
    433,                     -- ID автомобиля
    {-0.63, 1.985, 0.296},  -- смещение
    {0, -76.599, 90}        -- поворот относительно авто
)
Так, ну по поводу ответа gpt то это бред, даже если его +- подогнать то не будет работать
lua:
    if not sampIsCarValid(attachedVehicle) then
        print("Error: Vehicle", attachedVehicle, "does not exist")
        return false
    end
--если заменить это, на это:
local handle = sampGetCarHandleBySampVehicleId(attachedVehicle)
    if not doesVehicleExist(handle) then
        print("Error: Vehicle", handle, "does not exist")
        return false
    end
--То будет выводить постоянно что авто существует (если на деле будет так), а дальше не произойдет ничего
Прикол в том, что я пробовал делать проверку на авто, +- так же, но безуспешно.

В листе RPC есть такая штука, в которой можно сразу же выбрата прикрепление объекта к авто
1739543396174.png

1739543511306.png


Как бы я не крутил - прикрепить не получается. Спасибо за попытку помочь, благодарен

Да... Есть функции
attachObjectToCar и createObject, которые будут выполнять то что нужно, но я мне в дальнейшем нужно выдать объектам материалы и материал текст, а как к ним это всё выдать - я не разобрался к сожалению
 

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,042
11,886
1739544562202.png
1739544616031.png

Lua:
function emulCreateObject(id, model, pos, rot, dd, ncc, vehId, objId, attachOffset, attachRot, sr, tc);
    --[[
        bswrite.uint16(bs, objectId)
        bswrite.int32(bs, data.modelId)
        bswrite.vector3d(bs, data.position)
        bswrite.vector3d(bs, data.rotation)
        bswrite.float(bs, data.drawDistance)
        bswrite.bool8(bs, data.noCameraCol)
        bswrite.uint16(bs, data.attachToVehicleId)
        bswrite.uint16(bs, data.attachToObjectId)
        if data.attachToVehicleId ~= 0xFFFF or data.attachToObjectId ~= 0xFFFF then
            bswrite.vector3d(bs, data.attachOffsets)
            bswrite.vector3d(bs, data.attachRotation)
            bswrite.bool8(bs, data.syncRotation)
        end
        bswrite.uint8(bs, data.texturesCount)
        for _, it in ipairs(data.materials) do
            write_object_material(bs, it)
        end
        for _, it in ipairs(data.materialText) do
            write_object_material_text(bs, it)
        end
    ]]
    local bs = raknetNewBitStream();
    raknetBitStreamWriteInt16(bs, id);
    raknetBitStreamWriteInt32(bs, model);
    raknetBitStreamWriteFloat(bs, pos[1]);
    raknetBitStreamWriteFloat(bs, pos[2]);
    raknetBitStreamWriteFloat(bs, pos[3]);
    raknetBitStreamWriteFloat(bs, rot[1]);
    raknetBitStreamWriteFloat(bs, rot[2]);
    raknetBitStreamWriteFloat(bs, rot[3]);
    raknetBitStreamWriteFloat(bs, dd);
    raknetBitStreamWriteInt8(bs, ncc and 1 or 0);
    raknetBitStreamWriteInt16(bs, vehId or 65535);
    raknetBitStreamWriteInt16(bs, objId or 65535);
    raknetBitStreamWriteFloat(bs, attachOffset[1]);
    raknetBitStreamWriteFloat(bs, attachOffset[2]);
    raknetBitStreamWriteFloat(bs, attachOffset[3]);
    raknetBitStreamWriteFloat(bs, attachRot[1]);
    raknetBitStreamWriteFloat(bs, attachRot[2]);
    raknetBitStreamWriteFloat(bs, attachRot[3]);
    raknetBitStreamWriteInt8(bs, sr and 1 or 0);
    raknetBitStreamWriteInt8(bs, tc);
    raknetEmulRpcReceiveBitStream(44, bs);
    raknetDeleteBitStream(bs);
end

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('aotv', function(arg)
        local id = tonumber(arg);
        assert(type(id) == 'number');
        emulCreateObject(999, 19999, {0, 0, 0}, {0, 0, 0}, 50, false, id, nil, {0, 0, 1}, {0, 0, 0}, true, 0);
    end);
    wait(-1);
end
 
  • Влюблен
Реакции: cherepash

zuxobu

Участник
12
5
Так, ну по поводу ответа gpt то это бред, даже если его +- подогнать то не будет работать
lua:
    if not sampIsCarValid(attachedVehicle) then
        print("Error: Vehicle", attachedVehicle, "does not exist")
        return false
    end
--если заменить это, на это:
local handle = sampGetCarHandleBySampVehicleId(attachedVehicle)
    if not doesVehicleExist(handle) then
        print("Error: Vehicle", handle, "does not exist")
        return false
    end
--То будет выводить постоянно что авто существует (если на деле будет так), а дальше не произойдет ничего
Прикол в том, что я пробовал делать проверку на авто, +- так же, но безуспешно.

В листе RPC есть такая штука, в которой можно сразу же выбрата прикрепление объекта к авто
Посмотреть вложение 263789
Посмотреть вложение 263790

Как бы я не крутил - прикрепить не получается. Спасибо за попытку помочь, благодарен

Да... Есть функции
attachObjectToCar и createObject, которые будут выполнять то что нужно, но я мне в дальнейшем нужно выдать объектам материалы и материал текст, а как к ним это всё выдать - я не разобрался к сожалению
ну я тогда ваще хз че делать
 

cherepash

Участник
Автор темы
37
32
Посмотреть вложение 263791Посмотреть вложение 263792
Lua:
function emulCreateObject(id, model, pos, rot, dd, ncc, vehId, objId, attachOffset, attachRot, sr, tc);
    --[[
        bswrite.uint16(bs, objectId)
        bswrite.int32(bs, data.modelId)
        bswrite.vector3d(bs, data.position)
        bswrite.vector3d(bs, data.rotation)
        bswrite.float(bs, data.drawDistance)
        bswrite.bool8(bs, data.noCameraCol)
        bswrite.uint16(bs, data.attachToVehicleId)
        bswrite.uint16(bs, data.attachToObjectId)
        if data.attachToVehicleId ~= 0xFFFF or data.attachToObjectId ~= 0xFFFF then
            bswrite.vector3d(bs, data.attachOffsets)
            bswrite.vector3d(bs, data.attachRotation)
            bswrite.bool8(bs, data.syncRotation)
        end
        bswrite.uint8(bs, data.texturesCount)
        for _, it in ipairs(data.materials) do
            write_object_material(bs, it)
        end
        for _, it in ipairs(data.materialText) do
            write_object_material_text(bs, it)
        end
    ]]
    local bs = raknetNewBitStream();
    raknetBitStreamWriteInt16(bs, id);
    raknetBitStreamWriteInt32(bs, model);
    raknetBitStreamWriteFloat(bs, pos[1]);
    raknetBitStreamWriteFloat(bs, pos[2]);
    raknetBitStreamWriteFloat(bs, pos[3]);
    raknetBitStreamWriteFloat(bs, rot[1]);
    raknetBitStreamWriteFloat(bs, rot[2]);
    raknetBitStreamWriteFloat(bs, rot[3]);
    raknetBitStreamWriteFloat(bs, dd);
    raknetBitStreamWriteInt8(bs, ncc and 1 or 0);
    raknetBitStreamWriteInt16(bs, vehId or 65535);
    raknetBitStreamWriteInt16(bs, objId or 65535);
    raknetBitStreamWriteFloat(bs, attachOffset[1]);
    raknetBitStreamWriteFloat(bs, attachOffset[2]);
    raknetBitStreamWriteFloat(bs, attachOffset[3]);
    raknetBitStreamWriteFloat(bs, attachRot[1]);
    raknetBitStreamWriteFloat(bs, attachRot[2]);
    raknetBitStreamWriteFloat(bs, attachRot[3]);
    raknetBitStreamWriteInt8(bs, sr and 1 or 0);
    raknetBitStreamWriteInt8(bs, tc);
    raknetEmulRpcReceiveBitStream(44, bs);
    raknetDeleteBitStream(bs);
end

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('aotv', function(arg)
        local id = tonumber(arg);
        assert(type(id) == 'number');
        emulCreateObject(999, 19999, {0, 0, 0}, {0, 0, 0}, 50, false, id, nil, {0, 0, 1}, {0, 0, 0}, true, 0);
    end);
    wait(-1);
end
Я тебя люблю. Лучший :3😍