Wallhack, lua.

joncina11

Новичок
Автор темы
1
0
Версия MoonLoader
.027.0-preview
Как писать валлхак с помощью renderDrawBox? Нужно находить оффсеты? Как сделать простой валлхак в квадрате и как сделать валлхак с отображением костей?
 

e11evated

Участник
84
32
Никаких оффсетов искать не нужно всё делается стандартными функциями.

Простой ESP Box (квадрат вокруг игрока)
Квадрат рисуется не через renderDrawBox, а через 4 линии renderDrawLine. Размер рассчитывается по разнице между головой и ногами на экране:


Lua:
function renderESPBox()
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            local result, handle = sampGetCharHandleBySampPlayerId(i)
            if result and doesCharExist(handle) and isCharOnScreen(handle) and handle ~= PLAYER_PED then
                -- Получаем координаты головы (кость 8) и ног
                local headX, headY, headZ = getBodyPartCoordinates(8, handle)
                headZ = headZ + 0.35
                local footX, footY, footZ = getCharCoordinates(handle)
                footZ = footZ - 1.0

                -- Конвертируем в экранные координаты
                local sHeadX, sHeadY = convert3DCoordsToScreen(headX, headY, headZ)
                local sFootX, sFootY = convert3DCoordsToScreen(footX, footY, footZ)

                if sHeadX and sFootX then
                    local height = math.abs(sHeadY - sFootY)
                    local width = height / 1.8  -- пропорция тела
                    local color = 0xFFFFFFFF    -- белый (ARGB)

                    -- 4 линии = прямоугольник
                    renderDrawLine(sHeadX - width/2, sHeadY, sHeadX + width/2, sHeadY, 2, color) -- верх
                    renderDrawLine(sHeadX - width/2, sFootY, sHeadX + width/2, sFootY, 2, color) -- низ
                    renderDrawLine(sHeadX - width/2, sHeadY, sHeadX - width/2, sFootY, 2, color) -- лево
                    renderDrawLine(sHeadX + width/2, sHeadY, sHeadX + width/2, sFootY, 2, color) -- право
                end
            end
        end
    end
end

Скелет (кости):
Для костей используется FFI-функция по адресу 0x5E4280 — это стандартная функция GTA CPed::GetBonePosition:

Lua:
local getBonePos = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)

function getBodyPartCoordinates(id, handle)
    local ped_ptr = getCharPointer(handle)
    local vec = ffi.new("float[3]")
    getBonePos(ffi.cast("void*", ped_ptr), vec, id, true)
    return vec[0], vec[1], vec[2]
end


Сам рендер скелета - просто линии между костями по цепочке:

Lua:
function renderBones()
    for i = 0, sampGetMaxPlayerId() do
        if sampIsPlayerConnected(i) then
            local result, handle = sampGetCharHandleBySampPlayerId(i)
            if result and doesCharExist(handle) and isCharOnScreen(handle) and handle ~= PLAYER_PED then
                -- Цепочка ID костей: голова - шея - позвоночник - таз - ноги/руки
                local spine = {3, 4, 5, 51, 52, 41, 42, 31, 32, 33, 21, 22, 23, 2}
                for j = 1, #spine - 1 do
                    local x1, y1, z1 = getBodyPartCoordinates(spine[j], handle)
                    local x2, y2, z2 = getBodyPartCoordinates(spine[j+1], handle)
                    local sx1, sy1 = convert3DCoordsToScreen(x1, y1, z1)
                    local sx2, sy2 = convert3DCoordsToScreen(x2, y2, z2)
                    if sx1 and sx2 then
                        renderDrawLine(sx1, sy1, sx2, sy2, 1, 0xFFFFFFFF)
                    end
                end
            end
        end
    end
end
ID костей - стандартные для GTA SA: 2 - таз, 3-5 - позвоночник, 21-23 и 31-33 - ноги, 41-42 и 51-52 - руки, 8 - голова.

Всё это вызывается из колбэка onD3DPresent():

Lua:
function onD3DPresent()
    renderBones()
    renderESPBox()
end


Именно onD3DPresent позволяет рисовать сквозь стены - потому что renderDrawLine рисует поверх всего кадра, без проверки depth buffer.
 
  • Нравится
Реакции: YodBones