SA:MP как получать материал объекта?

constersuonsis

Известный
Автор темы
211
126
Подскажите как получить материал объекта.
Я хочу парсить материалы с объектов лаунчера, она туда не от сервера приходят, а храняться в файлах(в .bin точно есть, через блокнот смотрел, но там скомпилированная часть ещё мешает)...

Пробовал через это https://www.blast.hk/threads/204683/ , но там через раз материалы показывает, либо ошибку выдает на получение с пула ...

указывает на ошибку в строке
local textureName = ffi.string(sprite.m_pTexture.name)

Lua:
local samp = sampGetBase()
ffi.cdef([[
    typedef unsigned long D3DCOLOR;
    typedef int BOOL;
    typedef unsigned short ID;
    struct RwLLLink {
        struct RwLLLink *next;
        struct RwLLLink *prev;
    };
    typedef struct RwTexture RwTexture;
    struct RwTexture {
        void *raster;
        void *dict;
        struct RwLLLink lInDictionary;
        char name[32];
        char mask[32];
        unsigned filterAddressing;
        int refCount;
    };
    struct CSprite2d {
        RwTexture *m_pTexture;
    };
    typedef struct CVector {
        float x, y, z;
    } CVector;
    typedef struct CMatrix {
        CVector right, up, at, pos;
    } CMatrix;
    typedef struct ObjectMaterialText {
        char     m_nMaterialIndex;
        char     pad_0[137];
        char     m_nMaterialSize;
        char     m_szFont[65];
        char     m_nFontSize;
        BOOL     m_bBold;
        D3DCOLOR m_fontColor;
        D3DCOLOR m_backgroundColor;
        char     m_align;
    } ObjectMaterialText;
    typedef struct ObjectMaterial {
        union {
            struct CSprite2d* m_pSprite[16];
            struct RwTexture* m_pTextBackground[16];
        };
        D3DCOLOR m_color[16];
        char     pad_6[68];
        int      m_nType[16];
        BOOL     m_bTextureWasCreated[16];
        ObjectMaterialText m_textInfo[16];
        char*              m_szText[16];
        void*              m_pBackgroundTexture[16]; // IDirect3DTexture9*
        void*              m_pTexture[16];          // IDirect3DTexture9*
    } ObjectMaterial;
    typedef struct CObject CObject;
    struct CObject {
        char    pad_0[6];
        int     m_nModel;
        char    pad_1;
        BOOL    m_bDontCollideWithCamera;
        float   m_fDrawDistance;
        float   field_0;
        CVector m_position;
        float   m_fDistanceToCamera;
        BOOL    m_bDrawLast;
        char    pad_2[64];
        CVector m_rotation;
        char    pad_3[5];
        ID      m_nAttachedToVehicle;
        ID      m_nAttachedToObject;
        CVector m_attachOffset;
        CVector m_attachRotation;
        BOOL    m_bSyncRotation;
        CMatrix m_targetMatrix;
        char    pad_4[148];
        char    m_bMoving;
        float   m_fSpeed;
        char    pad_5[99];
        ObjectMaterial m_material;
        BOOL m_bHasCustomMaterial;
        char pad_9[13];
    };
]])

local CObjectPool = ffi.cast('int(__thiscall*)(void*)', samp + 0x2DF0)
local CObject = ffi.cast('CObject*(__thiscall*)(void*, int)', samp + 0x2DC0)
function getObjectMaterialTexture(objectId)
    local CNetGame = ffi.cast('uintptr_t*', samp + 0x26E8DC)
    local objectPool = CObjectPool(ffi.cast('void*', CNetGame[0]))
    local cobject = CObject(ffi.cast('void*', objectPool), tonumber(objectId))
    if cobject ~= nil and cobject.m_material.m_pSprite ~= nil then
        for i = 0, 15 do
            local sprite = cobject.m_material.m_pSprite[i]
            if sprite ~= nil and sprite.m_pTexture ~= nil and sprite.m_pTexture.name ~= nil then
                local textureName = ffi.string(sprite.m_pTexture.name)
                print("Texture name " .. objectId .. ": " .. textureName)
                return textureName
            end
        end
    end
    return nil
end
 
Последнее редактирование:
  • Грустно
Реакции: ChаtGPT

constersuonsis

Известный
Автор темы
211
126
А если без этого ?
Если парс для переноса маппинга на сборку, то какая разница какая текстурка будет у объектов, главное чтобы они были.
гиганская, там стоят объекты которые могут быть, например решёткой, скрин приложу