Исходник Гайд [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
 
Последнее редактирование:

whyega52

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

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

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


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

hinazuki

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




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

Tectrex

Известный
136
157
Стоит добавить, что весь смысл рванки в том что на объект который ты рванишь, прикладывается векторная сила.
1735648548972.png

Независимо от того куда направлена машина, ты рванишь именно массой умноженной на ускорение.
1735649363695.png

Дальше, для чего нужны кватернионы, т.е зачем мы меняем углы машины.
Есть термин как угловая скорость, она незначительно но влияет на рванку:
1735648933061.png

Вращаясь мы вызываем центробежную силу:
1735649033136.png


Когда игрок рванит и транспорт поворачивается на высокой скорости внутри другого объекта, возникает эффект, СХОЖИЙ с центробежной силой. Это может привести к тому, что объект который мы рваним будет "выбрасываться" из нас.


И того, у нас есть целых 2 силы, с помощью этих сил мы и рваним.
 
  • Нравится
Реакции: whyega52