Исходник Гайд [LUA] Делаем рванку за 5 минут [1 часть]

Ку-ку алл, в этой статье я постараюсь обьяснить как сделать простенькую рванку с помощью либы SAMP.Event.
Для этого надо будет знать маленькие основы языка и иметь хотя бы чуть IQ.
Коэффициент IQ в пределах 70-79 считается пограничным, 80-89 — ниже среднего, 90-109 — средним, 110-119 — выше среднего, результат выше 130 демонстрируют одарённые люди.



Штэ такое рванка? - рванка это четик, который меняет или отправяет фейковую исходящую синхронизацию и тем самым разнося жопы чуваков.
Рванки обычно бывают:​

Я покажу пример легкой рванки по ID игрока с помощью машины, в которой мы сидим.

Для начала нам нужно создать команду в функции main(), которая будет отвечать за включение/выключения нашего чудо-скрипта.
Lua:
sampRegisterChatCommand("govnocode", function(id)
    -- что будет выполняться после ввода команды.
end)

Создали команду /govnocode с аргументом "id", который будет обозначать ID жертвы.
Теперь нам надо создать буллевую (переменная, которая может быть только true или же false) переменную, которая будет как таковым переключателем.
Lua:
local rvanka = false -- создаем вне функций переменную "rvanka" (мы можем назвать ее как укгодно, хоть abc1337), и задаем ей начальное значение false

sampRegisterChatCommand("govnocode", function(id)
    rvanka = not rvanka -- задаем нашей переменной противоположенное значение, то есть если было false, после ввода команды станет true и наоборот, если было true, то после ввода команды станет false
end)

Переключатель создан, теперь создаем функцию, которая будет перехватывать исходящую синхронизацию (пакеты и RPC про это можете почитать в интернете).
Нам нужно перехватить пакет "PACKET_VEHICLE_SYNC", который отправляется при управлении транспортом.
C++:
struct stInCarData
{
    uint16_t    sVehicleID;
    uint16_t    sLeftRightKeys;
    uint16_t    sUpDownKeys;
    union
    {
        uint16_t            sKeys;
        struct stSAMPKeys    stSampKeys;
    };
    float        fQuaternion[4];
    float        fPosition[3];
    float        fMoveSpeed[3];
    float        fVehicleHealth;
    uint8_t        bytePlayerHealth;
    uint8_t        byteArmor;
    uint8_t        byteCurrentWeapon;
    uint8_t        byteSiren;
    uint8_t        byteLandingGearState;
    uint16_t    sTrailerID;
    union
    {
        uint16_t    HydraThrustAngle[2];    //nearly same value
        float        fTrainSpeed;
    };
};

То, что находится в спойлере выше - структура InCar синхры, которую нам надо хукнуть. После main создаем слудующую функцию:​
Lua:
local ev = require ("lib.samp.events") -- вне функций, желательно в самом начале кода перед main()

-- после main()

function ev.onSendVehicleSync(data)
    -- здесь мы будем хукать исходящую синхру
end

Эта функция вызывается тогда, когда мы отправляем серверу PACKET_VEHICLE_SYNC. Для того, чтобы синхронизация изменялось только тогда, когда мы включили рванку через команду, делаем проверку на наш переключатель, который изменяет значение при вводе команды.
Lua:
function ev.onSendVehicleSync(data)
    if rvanka then -- если rvanka == true, тогда мы выполняем действие
        -- тут мы будем перезаписывать данные
    end
end


Теперь перейдем к самому интересному, хуку исходящего пакета. Наша рванка будет работать так: телепорт под жертву и рывок вверх (обычный слаппер).
Lua:
sampRegisterChatCommand("govnocode", function(id)
    local result, ped = sampGetCharHandleBySampPlayerId(id) -- получаем указатель на игрока (хэндл) по ID.
    if result then
        if doesCharExist(ped) then -- проверяем, существует такой игрок или нет
            local px, py, pz = getCharCoordinates(ped) -- получаем координаты жертвы
            local ax, ay, az = getCharCoordinates(PLAYER_PED) -- получаем наши координаты
            local dist = getDistanceBetweenCoords3d(px, py, pz, ax, ay, az) -- узнаем дистанцию между нами и жертвой
      
            if dist <= 29 then -- если дистанция до игрока меньше 29, то записываем в глобальную переменную хэндл жертвы и ID.
               rvanka = not rvanka
                _, pid = sampGetPlayerIdByCharHandle(ped) -
                victimPed = ped
            else -- если игрок дальше 29, то ничего не делаем
                sampAddChatMessage("Игрок находится слишком далеко.", -1)
            end
        end
    end
end)


Переходим назад к хуку пакетов.

Lua:
function ev.onSendVehicleSync(data)
    if rvanka then
        local px, py, pz = getCharCoordinates(victimPed) -- получаем координаты по хэндлу.
        local ax, ay, az = getCharCoordinates(PLAYER_PED) -- получаем наши коорды
        local dist = getDistanceBetweenCoords3d(px, py, pz, ax, ay, az) -- получаем дистанцию между нами и жертвой
    
        if dist <= 29 then -- если игрок ближе, чем 29
            if sampIsPlayerConnected(pid) and sampGetCharHandleBySampPlayerId(pid) then -- если игрок законнекчен к серверу и мы смогли получить эндл по ID.
                data.position = {px,py,pz - 0.7} -- обращаемся к структуре data и телепортируем себя под жертву
                data.moveSpeed = {0,0,1} -- опять обращаемся к data, но теперь нам нужен moveSpeed и устанавливаем скорость по Z - 1, чтобы получился рывок вверх.
            end
        else
            rvanka = false
            sampAddChatMessage("Игрок сместился слишком далеко.", -1)
        end
    end
end

Чуть подковыряв и доделав рванку, мы получаем это:
Lua:
----------------directives----------------

script_author('Ega')
script_name('Test Rvnaka')

----------------lib----------------

require ("lib.moonloader")
local ev = require ("lib.samp.events")

----------------variables----------------

local tag = '{0000FF} [Rvanka by Ega] {000000}- '
local rvanka = false

----------------main----------------

function main()
    if not isSampAvailable() then return false end

    sampAddChatMessage(tag .. '{3333ff}Rvanka {ffffff}успешно загружена.', -1)

    sampRegisterChatCommand('rv', function(id)
        if not id or not tonumber(id) then
            rvanka = false
            sampAddChatMessage(tag .. '{ffffff}Не верный ид', -1)
        end
        if not isCharInAnyCar(PLAYER_PED) then
            sampAddChatMessage(tag .. '{ffffff}Вы не в авто', -1)
            rvanka = false
        end

        local result,ped = sampGetCharHandleBySampPlayerId(id)
        if result then
            if doesCharExist(ped) then
                local px, py, pz = getCharCoordinates(ped)
                local ax, ay, az = getCharCoordinates(PLAYER_PED)
                local dist = getDistanceBetweenCoords3d(px, py, pz, ax, ay, az)
                if dist <= 29 then
                    _, pid = sampGetPlayerIdByCharHandle(ped)
                    victimPed = ped
                    rvanka = not rvanka
                    printStringNow(rvanka and 'Rvanka - ~g~ON' or 'Rvanka - ~r~OFF',1000)
                end
            end
        end
    end)

    wait(-1)
end

----------------function----------------

function ev.onSendVehicleSync(data)
    if rvanka then
        local px, py, pz = getCharCoordinates(victimPed) 
        local ax, ay, az = getCharCoordinates(PLAYER_PED)
        local dist = getDistanceBetweenCoords3d(px, py, pz, ax, ay, az)

        if dist <= 29 then
            if sampIsPlayerConnected(pid) and sampGetCharHandleBySampPlayerId(pid) then
                data.position = {px,py,pz - 0.7}
                data.moveSpeed = {0,0,1}
            end
        else
            rvanka = false
            sampAddChatMessage("Игрок сместился слишком далеко.", -1)
        end
    end
end
 
Последнее редактирование:

why ega

РП игрок
Автор темы
Модератор
2,539
2,231
знаешь, что означает это слово?
Дословно нет, но в моем понимании это перехват чего-либо (вроде ловушка или как-то так)

Есть ли такие рванки с открытом кодом?

знаешь, что означает это слово?


на что гайд то делать? на использование функций апи, или что? тем более гайды уже есть на это
Точнее не хук там, а перезапись данных
 

hinazuki

Потрачен
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дословно нет, но в моем понимании это перехват чего-либо (вроде ловушка или как-то так)




Точнее не хук там, а перезапись данных
Рванка хуйня, есть нормольные?
 

Mr.Decript

Потрачен
179
65
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А нахуй?
 
  • Нравится
  • Эм
Реакции: Corenale и shibaTaidjy