Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

checkdasound

Известный
Проверенный
963
406
Как из этой строчки:
[A] [AP] Kosmos_Holmagorov(37) возможно использует Car Hack (5).
вытащить ид?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Как из этой строчки:
[A] [AP] Kosmos_Holmagorov(37) возможно использует Car Hack (5).
вытащить ид?
Lua:
local string = "[A] [AP] Kosmos_Holmagorov(37) возможно использует Car Hack (5)."
local id = string:match("%[A%]%s%[AP%]%s.+%((%d+)%)%sвозможно%sиспользует%s.+")
Вроде бы так, pattern не проверял - возможно неверный.
UPD: работает вроде
 
  • Нравится
Реакции: checkdasound

checkdasound

Известный
Проверенный
963
406
Lua:
local string = "[A] [AP] Kosmos_Holmagorov(37) возможно использует Car Hack (5)."
local id = string:match("%[A%]%s%[AP%]%s.+%((%d+)%)%sвозможно%sиспользует%s.+")
Вроде бы так, pattern не проверял - возможно неверный.
UPD: работает вроде
Да, работает.
А вот как отсюда ид взять:
Жалоба от Kevin_Down[9]: {ffffff} test
И как вообще научится составлять регулярные выражения?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
  • Нравится
Реакции: checkdasound

Ke4yp

Новичок
34
0
Lua:
function start()
        task=openSequenceTask()
        while true do
        taskGoStraightToCoord(-1,x1, y1, z1, 7, -1)
        taskGoStraightToCoord(-1,x2, y2, z2, 7, -1)
        taskGoStraightToCoord(-1,x3, y3, z3, 7, -1)
        end
        closeSequenceTask(task)
        performSequenceTask(playerPed, task)
        clearSequenceTask(task)
        end
Как можно реализовать бесконечный(в коде бесконечный цикл while true крашит игру) поочерёдный бег по координатам чтобы другие игроки тоже видели что ты бегаешь, а тут для других я просто скользю.
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Lua:
function start()
        task=openSequenceTask()
        while true do
        taskGoStraightToCoord(-1,x1, y1, z1, 7, -1)
        taskGoStraightToCoord(-1,x2, y2, z2, 7, -1)
        taskGoStraightToCoord(-1,x3, y3, z3, 7, -1)
        end
        closeSequenceTask(task)
        performSequenceTask(playerPed, task)
        clearSequenceTask(task)
        end
Как можно реализовать бесконечный(в коде бесконечный цикл while true крашит игру) поочерёдный бег по координатам чтобы другие игроки тоже видели что ты бегаешь, а тут для других я просто скользю.
Нужно задержку в цикле делать.
 

Ke4yp

Новичок
34
0
Какой опкод есть для того чтобы камера поварачивалась(прям смотрели в их сторону) на известные нам координаты. Знаю, что есть опкод
setCameraPositionUnfixed(float xAngle, float zAngle)
[TBODY] [/TBODY]
, но я хер знаю откуда получить углы этих координат, может кто-то поможет
 

Aniki

🐰
Администратор
1,225
1,506
Какой опкод есть для того чтобы камера поварачивалась(прям смотрели в их сторону) на известные нам координаты. Знаю, что есть опкод
setCameraPositionUnfixed(float xAngle, float zAngle)
[TBODY] [/TBODY]
, но я хер знаю откуда получить углы этих координат, может кто-то поможет
Решил тут в качестве практики работы с чит энжином поискать адреса нужные, оказалось что они статичные. Вот функция которая получает значения углов поворота камеры (в радианах)
Lua:
local mem = require 'memory'

function getCameraPositionUnfixed()
    return mem.getfloat(0xB6F248), mem.getfloat(0xB6F258)
end
Ну а твоя задача решается так:
Lua:
local xAngle, zAngle = getCameraPositionUnfixed()
setCameraPositionUnfixed(xAngle, zAngle + math.pi/2) -- если нужно в другую сторону, то очевидно -pi/2
 
  • Нравится
Реакции: tlwsn

Ke4yp

Новичок
34
0
Нет, ты не понял. Допустим мы записали в какой-то точке координаты, убежали от неё и отвернулись, а скрипт потом поварачивает обратно камеру на эту точку
 

Aniki

🐰
Администратор
1,225
1,506
Нет, ты не понял. Допустим мы записали в какой-то точке координаты, убежали от неё и отвернулись, а скрипт потом поварачивает обратно камеру на эту точку
Например так
Lua:
local x, y = getCharCoordinates(PLAYER_PED)
local angle = getHeadingFromVector2d(tox - x, toy - y) -- tox, toy - координаты нужной тебе точки
setCameraPositionUnfixed(0, math.rad(angle - 90))
 
  • Нравится
Реакции: Ke4yp

Ke4yp

Новичок
34
0
Например так
Lua:
local x, y = getCharCoordinates(PLAYER_PED)
local angle = getHeadingFromVector2d(tox - x, toy - y) -- tox, toy - координаты нужной тебе точки
setCameraPositionUnfixed(0, math.rad(angle - 90))
АХИРЕТЬ СПАСИБО ОГРОМНОЕ ПИЗДЕЦ Я РАД. Теперь можешь обьяснить для чего мы минусуем от нужных кордов, корды педа ( короче обьясни понятным языком плес )
 

Ke4yp

Новичок
34
0
Таким образом мы получаем координаты вектора, направленного из точки где находится пед в нужную тебе точку, затем по вектору получаем угол направления и используем его в функции поворота камеры, предварительно отняв 90 градусов и переведя в радианы
Спасибо тебе огромное, надеюсь у тебя всё и всегда будет хорошо.