Lua CLEO ASI SF Plugin Белые ID в никах [R1/R3]

Tema05

Известный
1,441
401
Что то иногда крашит
Код:
[ML] (error) LiteHelper: D:\GTA San Andreas\moonloader\LiteHelper.lua:2186: cannot convert 'table' to 'int (*)()'
stack traceback:
    [C]: in function 'cast'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:2186: in function 'NewHook'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:705: in function <D:\GTA San Andreas\moonloader\LiteHelper.lua:676>
    [C]: in function 'wait'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:952: in function <D:\GTA San Andreas\moonloader\LiteHelper.lua:676>
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,483
Что то иногда крашит
Код:
[ML] (error) LiteHelper: D:\GTA San Andreas\moonloader\LiteHelper.lua:2186: cannot convert 'table' to 'int (*)()'
stack traceback:
    [C]: in function 'cast'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:2186: in function 'NewHook'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:705: in function <D:\GTA San Andreas\moonloader\LiteHelper.lua:676>
    [C]: in function 'wait'
    D:\GTA San Andreas\moonloader\LiteHelper.lua:952: in function <D:\GTA San Andreas\moonloader\LiteHelper.lua:676>
версию на lua использовать не рекомендуется, там пиздец в хуке, она написана только ради чела, который несколько дней ноет на форуме с этими никами
с этим хуком на луа ломается луастейт
воспользуйся https://www.blast.hk/threads/70322/post-610286
 

Tema05

Известный
1,441
401
с этим хуком на луа ломается луастейт
воспользуйся https://www.blast.hk/threads/70322/post-610286
У меня изначально была другая цель. Просто SR_team скинул пример про перекрашивание id и как то начали обсуждать именно это.

Мне нужно чтобы ко всем никам которые есть в массиве в начале ника добавлялось {3399FF}[LH] и далее ник оставался оригинального цвета.
Я это реализовал вот так:
Lua:
function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle("samp.dll") + 0x12C848 then
        local buffer = false
        for _, v in ipairs(json.nicks) do
            if v == ffi.string(nick) then
                buffer = true
            end
        end
        if buffer then
            return sprintfHook(buf, ffi.cast("char*", ffi.string("{3399FF}[LH] {" .. string.format("%x", sampGetPlayerColor(ID)):sub(-6) .. "}%s (%03d)")), nick, ID)
        else
            return sprintfHook(buf, fmt, nick, ID)
        end
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end
Как это сделать с помощью предложенного тобою варианта я пока не знаю.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,483
У меня изначально была другая цель. Просто SR_team скинул пример про перекрашивание id и как то начали обсуждать именно это.

Мне нужно чтобы ко всем никам которые есть в массиве в начале ника добавлялось {3399FF}[LH] и далее ник оставался оригинального цвета.
Я это реализовал вот так:
Lua:
function sprintfHook(buf, fmt, nick, ID)
    if buf == getModuleHandle("samp.dll") + 0x12C848 then
        local buffer = false
        for _, v in ipairs(json.nicks) do
            if v == ffi.string(nick) then
                buffer = true
            end
        end
        if buffer then
            return sprintfHook(buf, ffi.cast("char*", ffi.string("{3399FF}[LH] {" .. string.format("%x", sampGetPlayerColor(ID)):sub(-6) .. "}%s (%03d)")), nick, ID)
        else
            return sprintfHook(buf, fmt, nick, ID)
        end
    else
        return sprintfHook(buf, fmt, nick, ID)
    end
end
Как это сделать с помощью предложенного тобою варианта я пока не знаю.
вот и минусы луа, начинай изучать плюсы)
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,483
А почему кстати, что то на плюсах можно сделать, а на луа это сделать нельзя
Потому что сборщик мусора, уровень абстракции, скриптовый яп, jit
А на плюсах ты свободен как орёл
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
@SR_team на луа, R1
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.new('const char[18]', '%s {FFFFFF}(%03d)')
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
        end
    end)
    wait(-1)
end
Lua:
local ffi = require 'ffi'
ffi.cdef[[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void *malloc(size_t size);
    void free(void *ptr);
]]
function main()
    local void_addr = ffi.cast('void*', getModuleHandle('samp.dll') + 0x70F45)
    local old_prot = ffi.new('unsigned long[1]')
    local chars = ffi.C.malloc(18)
    ffi.copy(chars, '%s {FFFFFF}(%03d)\0', 18)
    ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
    ffi.cast('uint32_t*', void_addr)[0] = tonumber(ffi.cast('intptr_t', chars))
    ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
    addEventHandler('onScriptTerminate', function(scr)
        if scr == script.this then
            ffi.C.VirtualProtect(void_addr, 4, 0x40, old_prot)
            ffi.cast('uint32_t*', void_addr)[0] = getModuleHandle('samp.dll') + 0xD835C
            ffi.C.VirtualProtect(void_addr, 4, old_prot[0], old_prot)
            ffi.C.free(chars)
        end
    end)
    wait(-1)
end
можно же выключить сборщик
Lua:
collectgarbage('stop')

local memory = require 'memory'

local samp        = getModuleHandle('samp.dll')
local nick_format = '%s {FFFFFF}(%03d)'

function main()
  if samp == 0 then return end
  memory.setuint32(samp + 0x70F45, memory.strptr(nick_format), true)
  wait(-1)
end

addEventHandler('onScriptTerminate', function(scr)
  if scr ~= script.this then return end
  memory.setuint32(samp + 0x70F45, samp + 0xD835C, true)
end)
 

Tema05

Известный
1,441
401
можно же выключить сборщик
Lua:
collectgarbage('stop')

local memory = require 'memory'

local samp        = getModuleHandle('samp.dll')
local nick_format = '%s {FFFFFF}(%03d)'

function main()
  if samp == 0 then return end
  memory.setuint32(samp + 0x70F45, memory.strptr(nick_format), true)
  wait(-1)
end

addEventHandler('onScriptTerminate', function(scr)
  if scr ~= script.this then return end
  memory.setuint32(samp + 0x70F45, samp + 0xD835C, true)
end)
А collectgarbage('stop') может негативно отразиться на работе скриптов?
 

RTD

Нестандартное звание
Модератор
391
414
можно же выключить сборщик
Lua:
collectgarbage('stop')

local memory = require 'memory'

local samp        = getModuleHandle('samp.dll')
local nick_format = '%s {FFFFFF}(%03d)'

function main()
  if samp == 0 then return end
  memory.setuint32(samp + 0x70F45, memory.strptr(nick_format), true)
  wait(-1)
end

addEventHandler('onScriptTerminate', function(scr)
  if scr ~= script.this then return end
  memory.setuint32(samp + 0x70F45, samp + 0xD835C, true)
end)
Согласен, в одном скрипте, который конкретно такую функцию будет делать - норм. Но можно быть уверенным что его стащат в другие скрипты и там без сборщика будет течь(на примере с человеком выше, это видно)
без хука не интересно
Сделал что-бы было интересно - https://www.blast.hk/threads/55743/post-610585
 
Последнее редактирование:
  • Нравится
  • Ха-ха
Реакции: SR_team и #Northn

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Согласен, в одном скрипте, который конкретно такую функцию будет делать - норм. Но можно быть уверенным что его стащат в другие скрипты и там без сборщика будет течь(на примере с человеком выше, это видно)
 
  • Ха-ха
  • Нравится
Реакции: #Northn и RTD

Tema05

Известный
1,441
401
Согласен, в одном скрипте, который конкретно такую функцию будет делать - норм. Но можно быть уверенным что его стащат в другие скрипты и там без сборщика будет течь(на примере с человеком выше, это видно)

Сделал что-бы было интересно - https://www.blast.hk/threads/55743/post-610585
'Но можно быть уверенным что его стащат в другие скрипты и там без сборщика будет течь(на примере с человеком выше, это видно)' Если ты про меня то ч сразу подумал об этом, поэтому и задал вопрос.

'Сделал что-бы было интересно' стабильно работает?
 

RTD

Нестандартное звание
Модератор
391
414
Если ты про меня то ч сразу подумал об этом, поэтому и задал вопрос.
Да, в примере тебя навел, в общем о других
'Сделал что-бы было интересно' стабильно работает?
Не знаю, 5 минут побегал вроде норм. Но скорее всего будет неопределенка(ваще хз из-за чего она) как и с жмп, можешь закостылить с проверкой на то что main второй раз вызвался и перезагружать скрипт.