loadSprite IDirect3DTexture9

juki

Участник
Автор темы
62
12
Версия MoonLoader
.026-beta
Lua:
local result = loadTextureDictionary("LD_BEAT")
local id = loadSprite("DOWN")
как можно получить указатель на RwTexture->RwRaster->IDirect3DTexture9 имея только айди спрайта?
 

Shezo

Новичок
4
1
братишка, в мунлоадере функция loadSprite() возвращает не просто абстрактный айди, а скрытый указатель на обтьект класса CSprite2d игры. Внутри этого класса (прямо же по первому смещению) лежит указатель на структуру RenderWare RwTexture и уже из нее мы можем дойти до растра и самого директх.

сама цепочка памяти такова
идентификатор loadSprite ->> RwTexture ->> RwRaster ->> IDirect3DTexture9 tobish DirectX

вот мой пример
primer:
local ffi = require 'ffi'

-- смотри обьявляем структуры рендервейра и d3d9
ffi.cdef[[
    typedef struct {} IDirect3DTexture9;

    typedef struct {
        void*              parent;
        IDirect3DTexture9* d3dTexture; // тут нативный д3д указатель, смещение 0х8 в рврастере
    } RwRaster;

    typedef struct {
        RwRaster* raster;
        void*     dict;
    } RwTexture;

    // тут игровой класс csprite2d занимает 4 байта, содержит указатель на рвтектстур
    typedef struct {
        RwTexture* m_pTexture;
    } CSprite2d;
]]

-- тут чистая функция конвертации принимает айди (указатель) из loadsprite
local function getD3D9TextureFromSprite(spriteId)
    if not spriteId or spriteId == 0 then return nil end
    
    -- кастим возвращенный из loadsprite айди напрямую в указатель на структуру класса csprite2d
    local sprite = ffi.cast("CSprite2d*", spriteId)
    
    -- а тут уже безопасно проверяем всю цепочку до директх проверка на нулл через ffi
    if sprite == nil or sprite.m_pTexture == nil then return nil end
    
    local rwTexture = sprite.m_pTexture
    if rwTexture.raster == nil then return nil end
    
    -- тут возвращаем чистый указатель на IDirect3DTexture9
    return rwTexture.raster.d3dTexture
end
 
  • Bug
Реакции: juki

вайега52

cache miss
Модератор
3,062
3,299
а скрытый указатель на обтьект класса CSprite2d игры.
1784113760454.png


1784113801822.png

1784113822506.png
 
  • Нравится
Реакции: juki и iroxacu666

вайега52

cache miss
Модератор
3,062
3,299
Я так понял, мун как-то по своему записывает спрайты, ибо по идее подобный вариант должен быть рабочим, но текстурка почему-то всегда 0
Lua:
local ffi = require("ffi")

ffi.cdef [[
#pragma pack(push, 8)
typedef struct
{
  uintptr_t raster;
} RwTexture;
#pragma pack(pop)


#pragma pack(push, 8)
typedef struct
{
  RwTexture *m_pTexture;
} CSprite2d;
#pragma pack(pop)
]]

local function rwTextureGetNativeTexture(texture)
    local rasterExtOffset = ffi.cast("uintptr_t*", 0xB4E9E0)[0]
    return ffi.cast("void*", texture.raster + rasterExtOffset)
end


function main()
    local result = loadTextureDictionary("hud")
    local id = loadSprite("radardisc")
    sampAddChatMessage('Sprite loaded successfully! ' .. tostring(id), -1)

    local scriptSprites = ffi.cast("CSprite2d*", 0xA94B68)
    print(scriptSprites[id - 1].m_pTexture) -- NULL ???!!?!?!
end

1784114221301.png
 

juki

Участник
Автор темы
62
12
local ffi = require("ffi") ffi.cdef [[ #pragma pack(push, 8) typedef struct { uintptr_t raster; } RwTexture; #pragma pack(pop) #pragma pack(push, 8) typedef struct { RwTexture *m_pTexture; } CSprite2d; #pragma pack(pop) ]] local function rwTextureGetNativeTexture(texture) local rasterExtOffset = ffi.cast("uintptr_t*", 0xB4E9E0)[0] return ffi.cast("void*", texture.raster + rasterExtOffset) end function main() local result = loadTextureDictionary("hud") local id = loadSprite("radardisc") sampAddChatMessage('Sprite loaded successfully! ' .. tostring(id), -1) local scriptSprites = ffi.cast("CSprite2d*", 0xA94B68) print(scriptSprites[id - 1].m_pTexture) -- NULL ???!!?!?! end
проверил, у меня вернуло 1

Screenshot_18.png
 

вайега52

cache miss
Модератор
3,062
3,299
Lua:
local result = loadTextureDictionary("LD_BEAT")
local id = loadSprite("DOWN")
как можно получить указатель на RwTexture->RwRaster->IDirect3DTexture9 имея только айди спрайта?
Фип сказал, что там кастомные айдишники, не относящиеся к игре и поэтому тебе проще сделать все через MoonAdditions: https://github.com/THE-FYP/MoonAddi...1ead797a2175d314337/examples/draw_texture.lua