Скрыть текстдрав через память

ChаtGPT

Активный
Автор темы
393
96
Версия MoonLoader
.026-beta
имеется структура
Lua:
local ffi = require "ffi"

ffi.cdef[[
    struct CTextDrawData {
        float          m_fLetterWidth;
        float          m_fLetterHeight;
        unsigned long  m_letterColor;
        unsigned char  unknown;
        unsigned char  m_bCenter;
        unsigned char  m_bBox;
        float          m_fBoxSizeX;
        float          m_fBoxSizeY;
        unsigned long  m_boxColor;
        unsigned char  m_nProportional;
        unsigned long  m_backgroundColor;
        unsigned char  m_nShadow;
        unsigned char  m_nOutline;
        unsigned char  m_bLeft;
        unsigned char  m_bRight;
        int            m_nStyle;
        float          m_fX;
        float          m_fY;
        unsigned char  pad_[8];
        unsigned long  field_99B;
        unsigned long  field_99F;
        unsigned long  m_nIndex;
        unsigned char  field_9A7;
        unsigned short m_nModel;
        float          m_rotation[3];
        float          m_fZoom;
        unsigned short m_aColor[2];
        unsigned char  field_9BE;
        unsigned char  field_9BF;
        unsigned char  field_9C0;
        unsigned long  field_9C1;
        unsigned long  field_9C5;
        unsigned long  field_9C9;
        unsigned long  field_9CD;
        unsigned char  field_9D1;
        unsigned long  field_9D2;
    }__attribute__ ((packed));

    struct CTextDraw {
        char m_szText[801];
        char m_szString[1602];
        struct CTextDrawData m_data;
    }__attribute__ ((packed));

    struct CTextDrawPool {
        int       m_bNotEmpty[2048 + 256];
        struct CTextDraw* m_pObject[2048 + 256];
    }__attribute__ ((packed));
]]


удаляю текстдравы таким способом
Lua:
DAPI.TextdrawBlocking = function(t)
    local textdraw_pool = ffi.cast("struct CTextDrawPool*", sampGetTextdrawPoolPtr())

    for _, id in pairs(t) do
        if textdraw_pool.m_bNotEmpty[id] ~= 0 then
            textdraw_pool.m_bNotEmpty[id] = 0
            --textdraw_pool.m_pObject[id] = nil
            print(string.format("Текстдрав с ID %s удален.", id))
        else
            print(string.format("Текстдрав с ID %s уже существует или уже удален.", id))
        end
    end
end

TextdrawBlocking({id}) в беск. цикле. Текстдравы обновляются через какое-то время, и получается эффект мигания, где текстдрав появляется на пару мс и пропадает. Пытался разными способами визуально скрыть тексдрав(удалял, устанавливал прозрачность, менял позицию), но текстдравы, они обновляются, и всё такой-же эффект мигания.


Я НЕ использую samp.lua и не хотел бы использовать(хотя там и проще, return false поставить и всё)
 
Последнее редактирование:

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
имеется структура
Lua:
local ffi = require "ffi"

ffi.cdef[[
    struct CTextDrawData {
        float          m_fLetterWidth;
        float          m_fLetterHeight;
        unsigned long  m_letterColor;
        unsigned char  unknown;
        unsigned char  m_bCenter;
        unsigned char  m_bBox;
        float          m_fBoxSizeX;
        float          m_fBoxSizeY;
        unsigned long  m_boxColor;
        unsigned char  m_nProportional;
        unsigned long  m_backgroundColor;
        unsigned char  m_nShadow;
        unsigned char  m_nOutline;
        unsigned char  m_bLeft;
        unsigned char  m_bRight;
        int            m_nStyle;
        float          m_fX;
        float          m_fY;
        unsigned char  pad_[8];
        unsigned long  field_99B;
        unsigned long  field_99F;
        unsigned long  m_nIndex;
        unsigned char  field_9A7;
        unsigned short m_nModel;
        float          m_rotation[3];
        float          m_fZoom;
        unsigned short m_aColor[2];
        unsigned char  field_9BE;
        unsigned char  field_9BF;
        unsigned char  field_9C0;
        unsigned long  field_9C1;
        unsigned long  field_9C5;
        unsigned long  field_9C9;
        unsigned long  field_9CD;
        unsigned char  field_9D1;
        unsigned long  field_9D2;
    }__attribute__ ((packed));

    struct CTextDraw {
        char m_szText[801];
        char m_szString[1602];
        struct CTextDrawData m_data;
    }__attribute__ ((packed));

    struct CTextDrawPool {
        int       m_bNotEmpty[2048 + 256];
        struct CTextDraw* m_pObject[2048 + 256];
    }__attribute__ ((packed));
]]


удаляю текстдравы таким способом
Lua:
DAPI.TextdrawBlocking = function(t)
    local textdraw_pool = ffi.cast("struct CTextDrawPool*", sampGetTextdrawPoolPtr())

    for _, id in pairs(t) do
        if textdraw_pool.m_bNotEmpty[id] ~= 0 then
            textdraw_pool.m_bNotEmpty[id] = 0
            --textdraw_pool.m_pObject[id] = nil
            print(string.format("Текстдрав с ID %s удален.", id))
        else
            print(string.format("Текстдрав с ID %s уже существует или уже удален.", id))
        end
    end
end

TextdrawBlocking({id}) в беск. цикле. Текстдравы обновляются через какое-то время, и получается эффект мигания текстдрава, где он появляется на пару мс и пропадает.
я НЕ использую samp.lua и не хотел бы использовать(хотя там и проще, return false поставить и всё)
в данный момент ты его не удаляешь, а просто делаешь невидимым, можешь его и вправду удалять через метод^
 

ChаtGPT

Активный
Автор темы
393
96
в данный момент ты его не удаляешь, а просто делаешь невидимым, можешь его и вправду удалять через метод^
я читаю длину текстдрава, если его тупо удалить, прочитать я его больше не смогу :c

Код:
while true do
    sampTextdrawDelete(2056) -- что так
    dapi.TextdrawBlocking({2056}) -- что так, эффект тот же
    wait(0)
end

Может это никак и не сделать, ведь сначала текстдрав рисуется и только потом на него можно получить указатель и скрыть.
В случае с хуком, он срабатывает перед появлением текстдрава.
Верно?

@ARMOR твоя стихия 😏
 
Последнее редактирование: