Ку-ку алл, в этой статье я постараюсь обьяснить как сделать простенькую рванку с помощью либы SAMP.Event.
Для этого надо будет знать маленькие основы языка и иметь хотя бы чуть IQ.
Для этого надо будет знать маленькие основы языка и иметь хотя бы чуть IQ.
Коэффициент IQ в пределах 70-79 считается пограничным, 80-89 — ниже среднего, 90-109 — средним, 110-119 — выше среднего, результат выше 130 демонстрируют одарённые люди.
Штэ такое рванка? - рванка это четик, который меняет или отправяет фейковую исходящую синхронизацию и тем самым разнося жопы чуваков.
Рванки обычно бывают:
Рванки обычно бывают:
- Пустым транспортом (разносим транспортом, в котором нет водителя и пассажиров)
Я покажу пример легкой рванки по ID игрока с помощью машины, в которой мы сидим.
Для начала нам нужно создать команду в функции main(), которая будет отвечать за включение/выключения нашего чудо-скрипта.
Lua:
sampRegisterChatCommand("govnocode", function(id)
-- что будет выполняться после ввода команды.
end)
Создали команду /govnocode с аргументом "id", который будет обозначать ID жертвы.
Теперь нам надо создать буллевую (переменная, которая может быть только true или же false) переменную, которая будет как таковым переключателем.
Теперь нам надо создать буллевую (переменная, которая может быть только 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", который отправляется при управлении транспортом.
То, что находится в спойлере выше - структура InCar синхры, которую нам надо хукнуть. После main создаем слудующую функцию:
Нам нужно перехватить пакет "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
Последнее редактирование: