Что такое ARZMHAX?

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

loading..
Загрузить последнюю стабильную сборку 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

Основные функции ARZMHAX API v1.2

Здесь предоставлены основные функции API ARZMHAX v1.2

writeLog(string: параметр)

Данная функция позволяет логировать действия в коде.
Все логи сохраняются по пути *папка с игрой*/SAMP/plugin.log

Наглядный пример: writeLog("Hello, world!")

chat_addMessage(string: параметр)

Данная функция позволяет отправлять сообщения в чат.

Наглядный пример: chat_addMessage("Hello, world!")

registerCommand(string: параметр)

Данная функция регистрирует пользовательскую команду в событии 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

loadNewScript(string: параметр)

Данная функция позволяет загрузить новый Lua-скрипт, данную функцию лучше всего использовать в файле samp.lua

Наглядный пример: loadNewScript("new_script.lua")

getCameraRotation()

Данная функция позволяет получить угол поворота игровой камеры в градусах.

Наглядный пример: camRot = getCameraRotation()
chat_addMessage("Debug: Camera rotation is "..camRot)

getCameraAim(integer: параметр)

Данная функция позволяет получить определённую координату из матрицы камеры.

Матрица камеры состоит из четырёх основных векторов:
front - точка куда смотрит камера по X-оси
source - текущая позиция камеры
sourceBeforeLookBehind - позиция камеры при оборачивании
up - точка куда смотрит камера по по Z-оси
loading..
Каждый вектор имеет три координаты (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)

getPlayerMatrix(integer: параметр)

Данная функция позволяет получить определённую координату из матрицы игрока.

Матрица игрока состоит из четырёх основных векторов:
pos - текущая позиция игрока
right - текущая позиция игрока по правой оси
up - текущая позиция игрока по верхней оси
at - текущая позиция игрока в оси
loading..
Каждый вектор имеет три координаты (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)

getVehicleMatrix(integer: параметр)

Данная функция позволяет получить определённую координату из матрицы транспорта.

Матрица транспорта состоит из четырёх основных векторов:
pos - текущая позиция транспорта
right - текущая позиция транспорта по правой оси
up - текущая позиция транспорта по верхней оси
at - текущая позиция транспорта в оси
loading..
Каждый вектор имеет три координаты (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)

setVehicleMatrix(float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр)

Данная функция позволяет изменять матрицу транспорта.

Матрица транспорта состоит из четырёх основных векторов:
pos - текущая позиция транспорта
right - текущая позиция транспорта по правой оси
up - текущая позиция транспорта по верхней оси
at - текущая позиция транспорта в оси
loading..
Каждый вектор имеет три координаты (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)

setPlayerMatrix(float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр, float: параметр)

Данная функция позволяет изменять матрицу игрока.

Матрица игрока состоит из четырёх основных векторов:
pos - текущая позиция игрока
right - текущая позиция игрока по правой оси
up - текущая позиция игрока по верхней оси
at - текущая позиция игрока в оси
loading..
Каждый вектор имеет три координаты (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)

teleportTo(float: параметр, float: параметр, float: параметр)

Данная функция позволяет изменять позицию игрока/транспорта (телепорт).

Наглядный пример: -- Изменим позицию игрока/транспорта на X: 0, Y: 0, Z: 20
teleportTo(0, 0, 20)

rotatePlayer(float: параметр)

Изменить поворот игрока в градусах.

Наглядный пример: -- Повернём игрока на 90 градусов
rotatePlayer(90)

rotateVehicle(float: параметр)

Изменить поворот транспорта игрока в градусах.

Наглядный пример: -- Повернём транспорт игрока на 90 градусов
rotateVehicle(90)

getTickCount()

Функция getTickCount() возвращает количество миллисекунд, прошедших с момента запуска системы.

Наглядный пример: lastTick = getTickCount() -- добавить глобальную переменную в любой инициализатор
-- условие нужно добавить в любой активный процесс:
if getTickCount() - lastTick > 1000 then
    -- если прошло 1000 мс. (1 секунда) с последнего тика
    -- обновим переменную, чтобы сбросить таймер до следующего вызова
    lastTick = getTickCount()
end

isInVehicle()

Функция возвращает 1 (true) или 0 (false) в зависимости от того, сидит ли игрок в транспорте.

Наглядный пример: if isInVehicle() then
    chat_addMessage("Вы в авто")
else
    chat_addMessage("Вы на ногах")
end

setCollisionChecking(integer: параметр)

Функция позволяет включить(параметр: 1) и отключить(параметр: 0) коллизию игроку.

Наглядный пример: setCollisionChecking(0)

readMem(integer: параметр, integer: параметр)

Функция позволяет читать из памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)

Наглядный пример: accel = readMem(1, 0x18DA83) -- from libsamp.so
if accel > 0 then
    -- если игрок нажал кнопку газ в транспорте
end

writeMem(integer: параметр, integer: параметр, integer: параметр, integer: параметр)

Функция позволяет сделать записи значения в память нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
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

setMemValue(integer: параметр, integer: параметр, integer: параметр)

Функция позволяет сделать записи значения переменной в память нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
0 - libGTASA.so
1 - libsamp.so
2 - libSCAnd.so
Второй параметр должен содержать адрес указателя (Можно закинуть нативную библиотеку в IDA Pro и узнать нужный адрес)
Третий параметр должен содержать значение

Наглядный пример: -- .text:005E504E MOVS R1, #0
setMemValue(0, 0x005E504E, 1) -- set MOVS R1, #1

setMemString(integer: параметр, integer: параметр, string: параметр)

Функция позволяет сделать записи значения переменной типа 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!"

memLock(integer: параметр, integer: параметр)

Функция позволяет завершить любой метод в памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
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

memNOP(integer: параметр, integer: параметр, integer: параметр)

Функция позволяет установить НОП в памяти нативной библиотеки.
Первый параметр должен содержат номер библиотеки:
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

saveVarInt(integer: параметр, integer: параметр)

Функция позволяет записать оффсет типа integer в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF), второй параметр - значение типа integer

Наглядный пример: saveVarInt(0x1488, 1337)

getVarInt(integer: параметр)

Функция возвращает оффсет типа integer по его адресу в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF)

Наглядный пример: result = getVarInt(0x1488)
writeLog("Result is "..result)

saveVarString(integer: параметр, string: параметр)

Функция позволяет записать оффсет типа string в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF), второй параметр - значение типа string

Наглядный пример: saveVarString(0x228, "hello, world!")

getVarString(string: параметр)

Функция возвращает оффсет типа string по его адресу в память клиента.
Первый параметр должен содержать адрес оффсета (от 0x0000 до 0xFFFF)

Наглядный пример: result = getVarString(0x228)
writeLog("Result is "..result)

findPedPtr(integer: параметр)

Функция возвращает ped pointer.
Первый параметр должен содержать ID ped в мире.

Наглядный пример: ptr = findPedPtr(0)
if ptr then
    -- founded!
end

findVehiclePtr(integer: параметр)

Функция возвращает vehicle pointer.
Первый параметр должен содержать ID vehicle в мире.

Наглядный пример: ptr = findVehiclePtr(0)
if ptr then
    -- founded!
end