Оффсеты фар

БеzликиЙ

Автор темы
Автор темы
Проверенный
1,357
860
Версия MoonLoader
.026-beta
Вопрос всё тот же. Задача - получить в Lua координаты (смещения) фар машины относительно её центра.
Примерно вот так это делается с помощью plugin-sdk, но вот незадача - в SAMemory нет нужных struct, а вручную считать все эти оффсеты - ну его нахер. Может, есть способ попроще?

А впрочем.

Немного поломав голову, пришёл к такому решению:
Lua:
function get_light_pos(car, light, invert_x)
    local m_nModelIndex = getCarModel(car) -- vehicle -> m_nModelIndex
    local ms_ModelInfoPtrs = 0xA9B0C8
    local CBaseModelInfo_size = 0x20
    local ptr = ms_ModelInfoPtrs + (0x4 * m_nModelIndex) -- ms_ModelInfoPtrs[vehicle -> m_nModelIndex] (pointer)
    ptr = mem.getuint32(ptr) -- cModelInfo
    ptr = ptr + 0x5c -- cModelInfo -> m_pVehicleStruct
    ptr = mem.getuint32(ptr) -- VehicleStruct
    ptr = ptr + 0x0 + 12*light
    local x = mem.getfloat(ptr)
    local y = mem.getfloat(ptr + 4)
    local z = mem.getfloat(ptr + 8)
    --print(x, y, z)
    if invert_x then return -pos_model_cache[m_nModelIndex][light].x, pos_model_cache[m_nModelIndex][light].y, pos_model_cache[m_nModelIndex][light].z else return pos_model_cache[m_nModelIndex][light].x,pos_model_cache[m_nModelIndex][light].y,pos_model_cache[m_nModelIndex][light].z end
end
 
Последнее редактирование:

wojciech?

Известный
Проверенный
438
399
но вот незадача - в SAMemory нет нужных struct, а вручную считать все эти оффсеты - ну его нахер. Может, есть способ попроще?
лучше определить структуры (ffi.cdef), которые нужны и использовать их, чем руками оффсеты прописывать
 

БеzликиЙ

Автор темы
Автор темы
Проверенный
1,357
860

Tema05

Известный
1,561
511
я ебал, там половину игры надо cdefать
Ну а как ты хотел) Херачить в lua пору тысяч строк cdef ради 1 вызова наше всё. С другой стороны ты можешь прописать только те структуры к значениям которых обращаешься, а остальные заменить заглушками или пустыми указателями. В штук 10 уложишься.
 

ARMOR

Waitin' on another black summer to end
Модератор
5,061
7,300
Lua:
local ffi = require("ffi")

ffi.cdef[[
    #pragma pack(push, 8)
    typedef struct RwV3d
    {
        float x, y, z;
    } RwV3d;
    #pragma pack(pop)

    #pragma pack(push, 8)
    typedef struct RtQuat
    {
        RwV3d imag;
        float real;
    } RtQuat;
    #pragma pack(pop)

    #pragma pack(push, 8)
    typedef struct UpgradePosnDesc
    {
        RwV3d m_vPosition;
        RtQuat m_qRotation;
        int m_iParentId;
    } UpgradePosnDesc;
    #pragma pack(pop)

    #pragma pack(push, 8)
    typedef struct CVehicleStruct
    {
        RwV3d m_vDummyPos[15];
        UpgradePosnDesc m_sUpgrade[18];
        struct RpAtomic *m_pExtra[6];
        char m_cNumExtras;
        char _pad[3];
        int m_iMaskComponentsDamagable;
    } CVehicleStruct;
    #pragma pack(pop)
]]
-- Муновская drawCorona не подходит (рисует хуево при движении)
local registerCorona = ffi.cast("void(__cdecl*)(int, uintptr_t, uint8_t, uint8_t, uint8_t, uint8_t, RwV3d*, float, float, int, char, bool, bool, int, float, bool, float, bool, float, bool, bool)", 0x6FC580)

function getVehicleLightsPos(handle, dummyId)
    local vehicleId = getCarModel(handle)

    local CModelInfo__ms_modelInfoPtrs = ffi.cast("uintptr_t*", 0x00A9B0C8)
    local vehicleStruct = ffi.cast("CVehicleStruct**", CModelInfo__ms_modelInfoPtrs[vehicleId] + 0x5C)[0]

    local pos = vehicleStruct.m_vDummyPos[dummyId]
    -- pos это оффсет позиции от самого ТС, registerCorona сама подставляет этот оффсет под сущность которую мы указываем вторым параметром ( vehiclePtr )
    registerCorona(888, vehiclePtr, 255, 128, 0, 255, pos, 0.3, 150, 0, 0, false, false, 0, 0.0, false, 0.5, 0, 50.0, false, true)
end

function main()

    while true do
        wait(0)
        if isCharInAnyCar(playerPed) then
            local handle = storeCarCharIsInNoSave(playerPed)
            getVehicleLightsPos(handle, 1)
        end
    end
end

Вот что получилось ( на правую фару смотрите )
1753870906456.png
 
Последнее редактирование: