ARZMHAX это дополнение для игрового клиента Arizona Mobile, предоставляющее возможность создания пользовательских Lua-скриптов для взаимодействие с игрой и её мультиплеерной частью.
С работой Lua можно ознакомиться на следующих интернет-ресурсах:
- https://www.lua.org/manual/5.4/
- https://ru.wikipedia.org/wiki/Lua
- https://tylerneylon.com/a/learn-lua/
Загрузить архив с libGTASA.idb:
- libGTASA.zip
Загрузить IDA Pro 7.0:
- https://disk.yandex.ru/d/9JtgRnb79ktvIw
Загрузить последнюю стабильную сборку ARZMHAX (v1.2) с поддержкой скриптинга можно по этой ссылке:
- https://drive.google.com/file/d/1m8rQIxKqGuPNIHj-cFXRNBsS34WwaV9C/view?usp=sharing
Данное нововведение будет доступно в ARZMHAX API версии 1.3
Пока лишь доступны встроенные библиотеки -> https://antirek.github.io/luabook/standardLibraries.htm
Здесь вы можете ознакомиться с основными событиями, которые вызываются при определённых условиях в клиенте.
-- Данное событие вызывается когда стартует самп
function onSAMPStart()
-- todo
end
-- Данное событие вызывается при старте клиента
function onClientStart()
-- todo
end
-- Данное событие вызывается при старте игры
function onGameStart()
-- todo
end
-- Данное событие вызывается при нажатии в любую точку экрана
-- Типы нажатий (третий параметр): TOUCH_POP = 1, TOUCH_PUSH = 2, TOUCH_MOVE = 3
function onTouch(x, y, type)
-- todo
end
-- Данный процесс работает постоянно
function onProcess()
-- todo
end
-- Рендер
function onRender()
-- todo
end
-- Данное событие срабатывает, когда введена зарегистрированная команда
function onCommand(command)
-- todo
end
Здесь предоставлены основные функции API ARZMHAX v1.2
Данная функция позволяет логировать действия в коде.
Все логи сохраняются по пути *папка с игрой*/SAMP/plugin.log
Наглядный пример:
writeLog("Hello, world!")
Данная функция позволяет отправлять сообщения в чат.
Наглядный пример:
chat_addMessage("Hello, world!")
Данная функция регистрирует пользовательскую команду в событии onCommand (Кликабельно).
Наглядный пример:
function onSAMPStart()
registerCommand("/testcmd") -- регистрируем команду
end
function onCommand(command)
if command == "/testcmd" then
-- если зарегистрированная команда была отправлена в чат
writeLog("Log: Test command executed!")
chat_addMessage("Chat: Test command executed!")
end
end
Данная функция позволяет загрузить новый Lua-скрипт, данную функцию лучше всего использовать в файле samp.lua
Наглядный пример:
loadNewScript("new_script.lua")
Данная функция позволяет получить угол поворота игровой камеры в градусах.
Наглядный пример:
camRot = getCameraRotation()
chat_addMessage("Debug: Camera rotation is "..camRot)
Данная функция позволяет получить определённую координату из матрицы камеры.
Матрица камеры состоит из четырёх основных векторов:
front - точка куда смотрит камера по X-оси
source - текущая позиция камеры
sourceBeforeLookBehind - позиция камеры при оборачивании
up - точка куда смотрит камера по по Z-оси
Каждый вектор имеет три координаты (X, Y, Z)
Стоит отметить, что в GTA за высоту отвечает Z-ось, а не Y.
Наглядный пример:
frontX = getCameraAim(0)
frontY = getCameraAim(1)
frontZ = getCameraAim(2)
srcX = getCameraAim(3)
srcY = getCameraAim(4)
srcZ = getCameraAim(5)
srcBehindX = getCameraAim(6)
srcBehindY = getCameraAim(7)
srcBehindZ = getCameraAim(8)
upX = getCameraAim(9)
upY = getCameraAim(10)
upZ = getCameraAim(11)
chat_addMessage("Debug: Camera source Z is "..srcZ)
Данная функция позволяет получить определённую координату из матрицы игрока.
Матрица игрока состоит из четырёх основных векторов:
pos - текущая позиция игрока
right - текущая позиция игрока по правой оси
up - текущая позиция игрока по верхней оси
at - текущая позиция игрока в оси
Каждый вектор имеет три координаты (X, Y, Z)
Стоит отметить, что в GTA за высоту отвечает Z-ось, а не Y.
Наглядный пример:
posX = getPlayerMatrix(0)
posY = getPlayerMatrix(1)
posZ = getPlayerMatrix(2)
rightX = getPlayerMatrix(3)
rightY = getPlayerMatrix(4)
rightZ = getPlayerMatrix(5)
upX = getPlayerMatrix(6)
upY = getPlayerMatrix(7)
upZ = getPlayerMatrix(8)
atX = getPlayerMatrix(9)
atY = getPlayerMatrix(10)
atZ = getPlayerMatrix(11)
chat_addMessage("Player Z-pos is: "..posZ.." X-pos: "..posX)
Данная функция позволяет получить определённую координату из матрицы транспорта.
Матрица транспорта состоит из четырёх основных векторов:
pos - текущая позиция транспорта
right - текущая позиция транспорта по правой оси
up - текущая позиция транспорта по верхней оси
at - текущая позиция транспорта в оси
Каждый вектор имеет три координаты (X, Y, Z)
Стоит отметить, что в GTA за высоту отвечает Z-ось, а не Y.
Наглядный пример:
posX = getVehicleMatrix(0)
posY = getVehicleMatrix(1)
posZ = getVehicleMatrix(2)
rightX = getVehicleMatrix(3)
rightY = getVehicleMatrix(4)
rightZ = getVehicleMatrix(5)
upX = getVehicleMatrix(6)
upY = getVehicleMatrix(7)
upZ = getVehicleMatrix(8)
atX = getVehicleMatrix(9)
atY = getVehicleMatrix(10)
atZ = getVehicleMatrix(11)
chat_addMessage("Vehicle Z-pos is: "..posZ.." X-pos: "..posX)
Данная функция позволяет изменять матрицу транспорта.
Матрица транспорта состоит из четырёх основных векторов:
pos - текущая позиция транспорта
right - текущая позиция транспорта по правой оси
up - текущая позиция транспорта по верхней оси
at - текущая позиция транспорта в оси
Каждый вектор имеет три координаты (X, Y, Z)
Стоит отметить, что в GTA за высоту отвечает Z-ось, а не Y.
Чтобы параметр не использовался, вместо него можно вписать число большее или равное 20000
Наглядный пример:
-- Изменим позицию транспорта в матрице на X: 0, Y: 0, Z: 20
setVehicleMatrix(0, 0, 20, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000)
Данная функция позволяет изменять матрицу игрока.
Матрица игрока состоит из четырёх основных векторов:
pos - текущая позиция игрока
right - текущая позиция игрока по правой оси
up - текущая позиция игрока по верхней оси
at - текущая позиция игрока в оси
Каждый вектор имеет три координаты (X, Y, Z)
Стоит отметить, что в GTA за высоту отвечает Z-ось, а не Y.
Чтобы параметр не использовался, вместо него можно вписать число большее или равное 20000
Наглядный пример:
-- Изменим позицию игрока в матрице на X: 0, Y: 0, Z: 20
setPlayerMatrix(0, 0, 20, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000)
Данная функция позволяет изменять позицию игрока/транспорта (телепорт).
Наглядный пример:
-- Изменим позицию игрока/транспорта на X: 0, Y: 0, Z: 20
teleportTo(0, 0, 20)
Изменить поворот игрока в градусах.
Наглядный пример:
-- Повернём игрока на 90 градусов
rotatePlayer(90)
Изменить поворот транспорта игрока в градусах.
Наглядный пример:
-- Повернём транспорт игрока на 90 градусов
rotateVehicle(90)
Функция getTickCount() возвращает количество миллисекунд, прошедших с момента запуска системы.
Наглядный пример:
lastTick = getTickCount() -- добавить глобальную переменную в любой инициализатор
-- условие нужно добавить в любой активный процесс:
if getTickCount() - lastTick > 1000 then
-- если прошло 1000 мс. (1 секунда) с последнего тика
-- обновим переменную, чтобы сбросить таймер до следующего вызова
lastTick = getTickCount()
end
Функция возвращает 1 (true) или 0 (false) в зависимости от того, сидит ли игрок в транспорте.
Наглядный пример:
if isInVehicle() then
chat_addMessage("Вы в авто")
else
chat_addMessage("Вы на ногах")
end
Функция позволяет включить(параметр: 1) и отключить(параметр: 0) коллизию игроку.
Наглядный пример:
setCollisionChecking(0)
Функция позволяет читать из памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Наглядный пример:
accel = readMem(1, 0x18DA83) -- from libsamp.so
if accel > 0 then
-- если игрок нажал кнопку газ в транспорте
end
Функция позволяет сделать записи значения в память нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Третий параметр должен содержать значение
Четвертый размер значения
Наглядный пример:
-- test(void) .text 005E6488 00000050 00000020 FFFFFFF8 R . . . . T .
writeMem(0, 0x005E6488, 0x46F72000, 4) -- RET libGTASA.so test function
Функция позволяет сделать записи значения переменной в память нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Третий параметр должен содержать значение
Наглядный пример:
-- .text:005E504E MOVS R1, #0
setMemValue(0, 0x005E504E, 1) -- set MOVS R1, #1
Функция позволяет сделать записи значения переменной типа string в память нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Третий параметр должен содержать значение типа string
Наглядный пример:
-- .rodata:0061FE60 aThisIsATest DCB "This is a test",0
setMemString(0, 0x0061FE60, "Hello, world!") -- set aThisIsATest DCB "Hello, world!"
Функция позволяет завершить любой метод в памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Наглядный пример:
-- test(void) .text 005E6488 00000050 00000020 FFFFFFF8 R . . . . T .
memLock(0, 0x005E6488) -- RET libGTASA.so test function
Функция позволяет установить НОП в памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Третий параметр содержит размер НОПА
Наглядный пример:
-- .text:004A59BC BLX j__ZN7CEntity13UpdateRpHAnimEv ; CEntity::UpdateRpHAnim(void)
memNOP(0, 0x004A59BC, 4) -- NOP calling CEntity::UpdateRpHAnim in CPed::PreRenderAfterTest function
Функция позволяет записать оффсет типа integer в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF), второй параметр - значение типа integer
Наглядный пример:
saveVarInt(0x1488, 1337)
Функция возвращает оффсет типа integer по его адресу в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF)
Наглядный пример:
result = getVarInt(0x1488)
writeLog("Result is "..result)
Функция позволяет записать оффсет типа string в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF), второй параметр - значение типа string
Наглядный пример:
saveVarString(0x228, "hello, world!")
Функция возвращает оффсет типа string по его адресу в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF)
Наглядный пример:
result = getVarString(0x228)
writeLog("Result is "..result)
Функция возвращает ped pointer.
Первый параметр должен содержать ID ped в мире.
Наглядный пример:
ptr = findPedPtr(0)
if ptr then
-- founded!
end
Функция возвращает vehicle pointer.
Первый параметр должен содержать ID vehicle в мире.
Наглядный пример:
ptr = findVehiclePtr(0)
if ptr then
-- founded!
end