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

MrCreepTon

وНеизвестный
Всефорумный модератор
2,127
4,713
Думаю с транспорта эффективнее толкать цель по горизонтальной оси. Для расчета скорости можно прибегнуть к использованию синуса и косинуса. Например так:
Lua:
local x, y, z = 1, 2, 3 -- условная позиция цели
local mx, my, mz = getCharCoordinates(PLAYER_PED) -- наша позиция
local angle = getHeadingFromVector2d(x - mx, y - my) -- получаем угол в градусах
local xSpeed = math.sin(-math.rad(angle)) -- получаем скорость для оси X
local ySpeed = math.cos(-math.rad(angle)) -- получаем скорость для оси Y

Еще я бы форсил синхру, раз уж ты хук юзаешь. Только лучше это делать через pcall, иначе скрипт может наебнуться при частых вызовах
 
  • Нравится
Реакции: why ega

Tufar tufan

Потрачен
103
30
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хз. Обычно в разделе луа кидают темы по типу "как сделать чит для сампа?", решил поэтому сделать гайд на луа
Еще одно доказательство, что фип зря создал мунлоадер☹️
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,231
Еще я бы форсил синхру, раз уж ты хук юзаешь. Только лучше это делать через pcall, иначе скрипт может наебнуться при частых вызовах
Да, хотел это добавить, но чтобы люди не парились с айди кара не стал добавлять

Можно было еще добавить ноп изменения позиции сервера, чтобы тебя не тп-ало после того,как оффаешь рванку, но чет забыл
 
  • Эм
Реакции: MrCreepTon

MrCreepTon

وНеизвестный
Всефорумный модератор
2,127
4,713
Можно было еще добавить ноп изменения позиции сервера, чтобы тебя не тп-ало после того,как оффаешь рванку, но чет забыл
Это уже частный случай для конкретного сервера. Такое уже следует рассматривать индивидуально
 

Tufar tufan

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

why ega

РП игрок
Автор темы
Модератор
2,539
2,231
К чему это вообще. Если ты уж решил стать программистом, то думаю, ты сможешь преодолеть этот сложнейший этап
Я не про себя, а про тех, кто не хочет париться, а просто сделать какой-нибудь мини-скрипт за 5 минут и забыть про программирование
 

Fix_Name_Fix

Потрачен
470
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да ну нахуй ты гений, пойду сделаю рванку на Аризону, и продам её за 5к)
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,231
Да ну нахуй ты гений, пойду сделаю рванку на Аризону, и продам её за 5к)
Продал под ерп за 20 😐

Бля, я понимаю вы все невъебенные программисты у которых есть свой личный чит на Сбербанк, и когда вы столкнулись со словом рванка, уже через 30 секунд вы сделали кикер под абсолютно все проекты, но оказывается не все так умеют
 
Последнее редактирование:

F0RQU1N and

Известный
1,310
494

hinazuki

Потрачен
346
95
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.