- 4,969
- 6,890
Описание: Получает указатели на текстуры игровых иконок оружия по ID оружия
Где это можно использовать? Например в кастомных имгуи худах вместо того чтобы подгружать из папки большое количество иконок для оружия просто получать игровые иконки и рендерить их.
Код:
Способ применения:
Скриншот:
Где это можно использовать? Например в кастомных имгуи худах вместо того чтобы подгружать из папки большое количество иконок для оружия просто получать игровые иконки и рендерить их.
Код:
Lua:
local ffi = require("ffi")
ffi.cdef[[
typedef unsigned char RwUInt8;
typedef int RwInt32;
typedef short RwInt16;
typedef struct RwRaster RwRaster;
struct RwRaster {
struct RwRaster* parent;
RwUInt8* cpPixels;
RwUInt8* palette;
RwInt32 width, height, depth;
RwInt32 stride;
RwInt16 nOffsetX, nOffsetY;
RwUInt8 cType;
RwUInt8 cFlags;
RwUInt8 privateFlags;
RwUInt8 cFormat;
RwUInt8* originalPixels;
RwInt32 originalWidth;
RwInt32 originalHeight;
RwInt32 originalStride;
void* texture_ptr;
};
typedef struct RwLLLink RwLLLink;
struct RwLLLink
{
void *next;
void *prev;
};
typedef struct RwLinkList RwLinkList;
struct RwLinkList
{
struct RwLLLink link;
};
typedef struct RwObject RwObject;
struct RwObject
{
char type;
char subType;
char flags;
char privateFlags;
struct RwFrame *parent;
};
typedef struct RwTexDictionary RwTexDictionary;
struct RwTexDictionary
{
RwObject object;
RwLinkList texturesInDict;
RwLLLink lInInstance;
};
typedef struct CBaseModelInfo_vtbl CBaseModelInfo_vtbl;
struct CBaseModelInfo_vtbl {
void* destructor;
void* AsAtomicModelInfoPtr;
void* AsDamageAtomicModelInfoPtr;
void* AsLodAtomicModelInfoPtr;
char(__thiscall* GetModelType)(struct CBaseModelInfo*);
};
typedef struct CBaseModelInfo CBaseModelInfo;
struct CBaseModelInfo {
CBaseModelInfo_vtbl* vtbl;
unsigned int m_dwKey;
short m_wUsageCount;
short m_wTxdIndex;
char m_nAlpha;
char m_n2dfxCount;
short m_w2dfxIndex;
short m_wObjectInfoIndex;
unsigned short m_nMdlFlags;
struct CColModel* m_pColModel;
float m_fDrawDistance;
struct RpClump* m_pRwObject;
};
typedef struct TxdDef TxdDef;
struct TxdDef {
RwTexDictionary *m_pRwDictionary;
unsigned short m_wRefsCount;
short m_wParentIndex;
unsigned int m_hash;
};
typedef struct CPool CPool;
struct CPool
{
TxdDef* m_pObjects;
uint8_t* m_byteMap;
int m_nSize;
int top;
char m_bOwnsAllocations;
char bLocked;
short _pad;
};
typedef struct RwTexture RwTexture;
struct RwTexture {
RwRaster* raster;
};
typedef struct CSprite2d CSprite2d;
struct CSprite2d {
RwTexture* m_pTexture;
};
typedef struct CWeaponInfo CWeaponInfo;
struct CWeaponInfo
{
int m_eFireType;
float targetRange;
float m_fWeaponRange;
int dwModelId1;
int dwModelId2;
int nSlot;
int m_nFlags;
int AssocGroupId;
short ammoClip;
short damage;
float* fireOffset;
int skillLevel;
int reqStatLevelToGetThisWeaponSkilLevel;
float m_fAccuracy;
float moveSpeed;
float animLoopStart;
float animLoopEnd;
int animLoopFire;
int animLoop2Start;
int animLoop2End;
int animLoop2Fire;
float breakoutTime;
float speed;
int radius;
float lifespan;
float spread;
char AssocGroupId2;
char field_6D;
char baseCombo;
char m_nNumCombos;
};
]]
local CWeaponInfo__GetWeaponInfo = ffi.cast("CWeaponInfo*(__cdecl*)(uint8_t, uint8_t)", 0x743C60)
local CKeyGen__AppendStringToKey = ffi.cast("unsigned int(__cdecl*)(unsigned int, char*)", 0x53CF70)
local RwTexDictionaryFindHashNamedTexture = ffi.cast("RwTexture*(__cdecl*)(RwTexDictionary*, unsigned int)", 0x734E50)
function getWeaponIconTexture(nWeaponModelId)
local pTexture = ffi.new("RwTexDictionary*");
local pModelInfo = ffi.new("CBaseModelInfo*");
local pWeaponInfo = CWeaponInfo__GetWeaponInfo(nWeaponModelId, 1);
if (pWeaponInfo.dwModelId1 > 0) then
pModelInfo = ffi.cast("CBaseModelInfo**", 0xA9B0C8)[pWeaponInfo.dwModelId1];
local nTxdIndex = pModelInfo.m_wTxdIndex;
local pTxdPool = ffi.cast("CPool**", 0xC8800C)[0];
if ffi.cast("uint8_t", pTxdPool.m_byteMap + nTxdIndex) >= 0 then
pTexture = pTxdPool.m_pObjects[nTxdIndex].m_pRwDictionary;
end
if pTexture ~= nil then
local nAppended = CKeyGen__AppendStringToKey(pModelInfo.m_dwKey, ffi.cast("char*", "ICON"));
local texture = RwTexDictionaryFindHashNamedTexture(pTexture, nAppended);
if texture ~= nil then
return texture.raster.texture_ptr
else
end
end
else
local fistSprite = ffi.cast("CSprite2d*", 0xBAB1FC)[0];
return fistSprite.m_pTexture.raster.texture_ptr
end
return nil;
end
Способ применения:
Lua:
-- В фрейме мимгуи:
local dl = imgui.GetBackgroundDrawList();
local texture = getWeaponIconTexture(getCurrentCharWeapon(PLAYER_PED))
if texture ~= nil then
dl:AddImage(texture, imgui.ImVec2(400, 400), imgui.ImVec2(600, 600))
end
Скриншот:
Последнее редактирование: