Текст объекта

Tema05

Известный
Автор темы
1,442
401
Версия MoonLoader
.026-beta
Как можно получить текст с объекта по хендлу/id?
 

kyrtion

Известный
657
241
gtasa/moonloader/lib/samp/events/handlers.lua:
function handler.rpc_create_object_writer(bs, data)
    local objectId = data[1]
    local data = data[2]
    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
end
Не?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,773
11,216
В этом скрипте есть данная функа (получение данных с твблички транспорта на аб). Спасибо @ARMOR
 

Tema05

Известный
Автор темы
1,442
401
В этом скрипте есть данная функа (получение данных с твблички транспорта на аб). Спасибо @ARMOR
Большое спасибо. Но у меня остался 1 вопрос. В моей ситуации мне нужно будет получать текст всех объектов каждый кадр. Поэтому я подумал почему бы вместо того, чтобы делать вот так:
Lua:
local samp = getModuleHandle('samp.dll');
local CObjectPool = ffi.cast('int(__thiscall*)(void*)', samp + 0x2DF0);
local CObject = ffi.cast('CObject*(__thiscall*)(void*, int)', samp + 0x2DC0);

function gettext(objectId)
    local CNetGame = ffi.cast('uintptr_t*', samp + 0x26E8DC)
    local objectPool = CObjectPool(ffi.cast('void*', CNetGame[0]))
    local cobject = CObject(ffi.cast('void*', objectPool), objectId)
    print(ffi.string(cobject.m_material.m_szText[0]))
end
сделать вот так
Lua:
--добавляем структуру пула объектов
ffi.cdef  [[
    -- ........................
    typedef struct CObjectPool CObjectPool;
    #pragma pack(push, 1)
    struct CObjectPool {
        int m_nLargestId;
        BOOL m_bNotEmpty[1000];
        CObject* m_pObject[1000];
    };
    #pragma pack(pop)
]]

local pool = ffi.cast('CObjectPool*', sampGetObjectPoolPtr())
print(ffi.string(pool.m_pObject[objectId].m_material.m_szText[0]))
Конечно CNetGame и objectPool можно получать только 1 раз за кадр, но мне кажется проще сразу получить весь пул и дальше из него нужные значения, чем для каждого id объекта вызывать CObject.

Не лучше ли так делать?