хук диалога

Lance_Sterling

Известный
Автор темы
801
280
Версия MoonLoader
.026-beta
решил заменить диалоги, однако хук через samp.lua иногда перекрывает другие скрипты, и return false блокирует код в других скриптах(он не выполняется, например автологин) есть решения данной проблемы?
я честно хз
Lua:
function samp.onShowDialog(dialogId, style, title, button1, button2, text)
    if mainIni.settings.dialog then
        local list = 0
        for line in text:gmatch('[^\n]+') do
            list = list + 1
        end

        dialog = {
            id = dialogId,
            title = title,
            style = style,
            text = text,
            maxList = list,
            button1 = button1,
            button2 = button2,
            buttonID = new.int(1),
            input = new.char[256](),
            listItem = new.int(0)
        }

        dialogs[dialog.id] = os.clock() + 0.05
        return false
    end
end
 

why ega

РП игрок
Модератор
2,547
2,238
решил заменить диалоги, однако хук через samp.lua иногда перекрывает другие скрипты, и return false блокирует код в других скриптах(он не выполняется, например автологин) есть решения данной проблемы?
я честно хз
Lua:
function samp.onShowDialog(dialogId, style, title, button1, button2, text)
    if mainIni.settings.dialog then
        local list = 0
        for line in text:gmatch('[^\n]+') do
            list = list + 1
        end

        dialog = {
            id = dialogId,
            title = title,
            style = style,
            text = text,
            maxList = list,
            button1 = button1,
            button2 = button2,
            buttonID = new.int(1),
            input = new.char[256](),
            listItem = new.int(0)
        }

        dialogs[dialog.id] = os.clock() + 0.05
        return false
    end
end
Как варик хукать не ракнет, а саму функцию отрисовки диалога, правда я хз, будут с таким способом те же проблемы или нет
 

why ega

РП игрок
Модератор
2,547
2,238
Катка в валоранте, как закончу, отредачу сообщение (чтобы не набивать)
Катку проебал :(
Lua:
local ffi = require("ffi")
local hooks = require("hooks") -- либа от  RTD


local samp = getModuleHandle("samp.dll")
local str = ffi.string
local originalCDialog_Show


local offstes = {
    CDialog_Show = {
        ["DLR1"] = 0x6FA50, 
        ["R1"] = 0x6B9C0,
        ["R2"] = 0x6BA70,
        ["R3"] = 0x6F8C0,
        ["R4"] = 0x6FFE0.
        ["R5"] = 0x6FFB0
    }
}


function CDialog_Show(this, nId, nType, szCaption, szText, szLeftButton, szRightButton, bServerside)
    -- this это что-то типа self, но в C++, он тебе скорее всего не нужен

    -- переводим const char* в string
    local caption = str(szCaption)  
    local text = str(szText)  
    local leftButton = str(szLeftButton)  
    local rightButton = str(szRightButton)  
    print("show dialog: ", nId, nType, caption, text, leftButton, rightButton, bServerside)
   
    return originalCDialog_Show(this, nId, nType, szCaption, szText, szLeftButton, szRightButton, bServerside) -- чтобы нопнуть - заменить на ретурн фолс
end


originalCDialog_Show = hooks.jmp.new(
    "void(__thiscall*)(void*, int, int, const char*, const char*, const char*, const char*, bool)",
    CDialog_Show, (samp + offstes.CDialog_Show["R1"])
) -- заменяем оригинальную функцию на нашу и нам возвращается указатель на оригинальную функцию
функцию определения версий можешь взять тут
 
Последнее редактирование:

Lance_Sterling

Известный
Автор темы
801
280
Катка в валоранте, как закончу, отредачу сообщение (чтобы не набивать)
Катку проебал :(
Lua:
local ffi = require("ffi")
local hooks = require("hooks") -- либа от  RTD


local samp = getModuleHandle("samp.dll")
local str = ffi.string
local originalCDialog_Show


local offstes = {
    CDialog_Show = {
        ["DLR1"] = 0x6FA50,
        ["R1"] = 0x6B9C0,
        ["R2"] = 0x6BA70,
        ["R3"] = 0x6F8C0,
        ["R4"] = 0x6FFE0.
        ["R5"] = 0x6FFB0
    }
}


function CDialog_Show(this, nId, nType, szCaption, szText, szLeftButton, szRightButton, bServerside)
    -- this это что-то типа self, но в C++, он тебе скорее всего не нужен

    -- переводим const char* в string
    local caption = str(szCaption) 
    local text = str(szText) 
    local leftButton = str(szLeftButton) 
    local rightButton = str(szRightButton) 
    print("show dialog: ", nId, nType, caption, text, leftButton, rightButton, bServerside)
  
    return originalCDialog_Show(this, nId, nType, szCaption, szText, szLeftButton, szRightButton, bServerside) -- чтобы нопнуть - заменить на ретурн фолс
end


originalCDialog_Show = hooks.jmp.new(
    "void(__thiscall*)(void*, int, int, const char*, const char*, const char*, const char*, bool)",
    CDialog_Show, (samp + offstes.CDialog_Show["R1"])
) -- заменяем оригинальную функцию на нашу и нам возвращается указатель на оригинальную функцию
функцию определения версий можешь взять тут
а можно как то без либки hooks ?
 

why ega

РП игрок
Модератор
2,547
2,238
а можно как то без либки hooks ?
Можешь использовать так скажем обрывок из либы хуков, только теперь вместо hooks.jmp.new, пиши просто hooks.new