Исходник Гайд [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,230
Для смешариков в луа,сойдёт
я ебнулся с луны, я лунтик

Мб потом допилю статью под онфут и унок рванки
Ку-ку алл, в этой статье я постараюсь обьяснить как сделать простенькую рванку с помощью либы 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 -- если игрок сместился далеко
            rvanka = false
            sampAddChatMessage("Игрок сместился слишком далеко.", -1)
        end
        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
    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
            rvanka = false
            sampAddChatMessage(tag .. " {ffffff}Игрок сместился слишком далеко, рванка автоматически выключена.", -1)
            if sampIsPlayerConnected(pid) and sampGetCharHandleBySampPlayerId(pid) then
                printStringNow('Rvnim ~r~' .. sampGetPlayerNickname(pid) .. ' [' .. pid .. ']', 1000)

                data.position = {px,py,pz - 1}
                data.moveSpeed = {0,0,1}
            end
        end
    end
end
 
  • Нравится
Реакции: Vespan

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,192
рванка в хуке - успех
 

GrishaMazzlov

https://t.me/RealCashFlow101
Проверенный
1,781
938
Товарищи программисты, совершенно не понимаю одного, нахуй вы хуесосите человека за то, что он решил сделать гайд? Да, тут всё расписано как для яслей до каждого символа, но и не для вас написано. Это очень полезно новичкам и сухарям гуманитарного склада ума по типу меня, ведь до меня только такие гайды и доходят.
Автору же желаю продолжать в том же духе и как можно скорее делать гайды на другие темы. 🤗
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,866
1,865
в след гайде нас научат, как можно нопить синхру и создавать свою.
и кстати, проверка в синхре проебывается, типо если чел далеко от 25 метров, то вырубается рванка, но при этом в след проверке она дальше проходит, не порядок, а из-за такого неверного пакета и будет кик
 
  • Вау
  • Нравится
Реакции: why ega и GrishaMazzlov

why ega

РП игрок
Автор темы
Модератор
2,539
2,230
в след гайде нас научат, как можно нопить синхру и создавать свою.
Некст гайд по тому, как создать .lua файл и закинуть в игру
но при этом в след проверке она дальше проходит, не порядок, а из-за такого неверного пакета и будет кик
Всм, не понял
 

Foxy1e3t

Известный
45
61
1665086074339.png
 
  • Ха-ха
Реакции: Arz rpg, ARMOR и chapo

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,768
11,210
у тебя сама смена позиции вне условия, так что даже если игрок отойдет далеко то скрипт кинет еще 1 пакет, так как условие на 2 строке уже было пройдено
1665086073891.png
 
  • Нравится
Реакции: why ega

why ega

РП игрок
Автор темы
Модератор
2,539
2,230
Некст гайд по тому, как создать .lua файл и закинуть в игру

Всм, не понял
Lua:
if dist <= 29 then -- если игрок сместился далеко
    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
тип так?

А, все, понял, затупил чет
 

Tufar tufan

Потрачен
103
30
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Лучше бы для сф апи этот гайд сделал. Пользы было бы больше
 
  • Вау
Реакции: why ega

Tufar tufan

Потрачен
103
30
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно чуть позже сделаю исходник рванки на сф
Самый адекватный политик. А нахуя это луа говно нужно, если плагин на сф апи напишет даже ребенок, максимум знание самих основ с++
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,230
Самый адекватный политик. А нахуя это луа говно нужно, если плагин на сф апи напишет даже ребенок, максимум знание самих основ с++
Хз. Обычно в разделе луа кидают темы по типу "как сделать чит для сампа?", решил поэтому сделать гайд на луа