Вопросы по 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
 
Последнее редактирование:

Milukation

Участник
41
9
Привет, пишу флудер но мне нужно чтоб текст из imgui.InputText при нажатии на imgui.Checkbox выводил в чат сам текст и флудил им я хз как это сделать помогите
Флудер:
local imgui = require 'mimgui'

local WinState = imgui.new.bool()
local sizeX, sizeY = getScreenResolution()
local enable = imgui.new.bool(false)
local inputField = imgui.new.char[256]()

--<стиль взят из этого скрипта https://t.me/monetloader/65>--
function imgui.Theme()
  imgui.SwitchContext()
  style = imgui.GetStyle()
  style.WindowPadding = imgui.ImVec2(5, 5)
  style.FramePadding = imgui.ImVec2(10, 10)
  style.ItemSpacing = imgui.ImVec2(10, 10)
  style.ItemInnerSpacing = imgui.ImVec2(5, 5)
  style.TouchExtraPadding = imgui.ImVec2(5 * MONET_DPI_SCALE, 5 * MONET_DPI_SCALE)
  style.IndentSpacing = 0
  style.ScrollbarSize = 20 * MONET_DPI_SCALE
  style.GrabMinSize = 20 * MONET_DPI_SCALE
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.Theme()
end)

imgui.OnFrame(
function() return WinState[0] end, function()
      imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
      imgui.SetNextWindowSize(imgui.ImVec2(1150, 170), imgui.Cond.FirstUseEver)
      if imgui.Begin('Fluder by Milukation', WinState, imgui.WindowFlags.NoResize) then
      imgui.Checkbox('Запустить флудер', enable)
      imgui.InputText('Текст которым будете флудить', inputField, 256)
      imgui.End()
      end
end)

function main()
    sampRegisterChatCommand('fl', function() WinState[0] = not WinState[0] end)
    wait(-1)
end
 

Дядя Энрик.

Активный
319
75
Всем ку, как вызвать функцию через клавишу (см.код)?
Код:
require('lib.moonloader')


function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('docgive', binderdocgive)
    sampRegisterChatCommand('gmyd', GiveMeYourDoc)
    sampRegisterChatCommand('bpg', pogonya)
    sampRegisterChatCommand('obySk', obysk)
    sampRegisterChatCommand('bwanted', wanted)
    sampRegisterChatCommand('rozySk', rozysk)
    sampRegisterChatCommand('bhelp', help)
    sampRegisterChatCommand('bticket', ticket)
    sampRegisterChatCommand('br', autotag)
    sampRegisterChatCommand('bcuff', bcuff)
    sampRegisterChatCommand('kpz', bkpz)
    sampRegisterChatCommand('avto', avto)
    sampRegisterChatCommand('avtod', avtod)
    sampRegisterChatCommand('clearchat', clear)

    while true do
        wait(0)
    if isKeyJustPressed(VK_NUMPAD4) then
        sampSendChat('/n Откат!')
    end
end

    while true do
        wait(0)
    if isKeyJustPressed(VK_NUMPAD1) then
        lua_thread.create(megafon) --здесь надо бы вызвать функцию
    end
end

    while true do
        wait(0)
    if isKeyJustPressed(VK_NUMPAD2) then
        sampSendChat('Работает ОМОН! Всем ни с места!')
    end
end

    while true do
        wait(0)
    if isKeyJustPressed(VK_NUMPAD3) then
        lua_thread.create(isgivehedoc) --здесь надо бы вызвать функцию
    end
end
    wait(-1)
end

function isgivehedoc()
    lua_thread.create(function ()
        sampSendChat('Здравия желаю, Капитан Антон Печкин отдела "ОМОН"...')
        wait(1000)
        sampSendChat(' ...ГУВД по Нижегородской области')
        wait(1000)
        sampSendChat('Моё удостоверение требуется?')
    end)
end

function binderdocgive(binderdocgive)
    lua_thread.create(function()
        sampSendChat('/do Удостоверение в кармане.')
        wait(1000)
        sampSendChat('/me засунул руку, затем резким движением достал удостоверение')
        wait(1000)
        sampSendChat('/do Документы в руке.')
        wait(1000)
        sampSendChat('/me передал документы человеку напротив')
        wait(1000)
        sampSendChat('/doc '..binderdocgive)
        wait(1000)
    end)
end

function GiveMeYourDoc()
    lua_thread.create(function ()
        sampSendChat('Предъявите, пожалуйста документы')
        wait(1000)
        sampSendChat('А то есть: ПТС и паспорт!')
        wait(1000)
        sampSendChat('/n /carpass /pass')
        wait(1000)
        sampSendChat('Уход от проверки/ареста - открытие огня')
        wait(1000)
        sampSendChat('Согласно статье 8, части 1 УК РФ в таком случае мы имеем Вас арестовать')
    end)
end

function pogonya(pogonyaarg)
    lua_thread.create(function ()
        sampSendChat('/me взял рацию в руки')
        wait(1000)
        sampSendChat('/do Рация в руках.')
        wait(1000)
        sampSendChat('/me сообщил диспетчеру, о погоне за нарушителем')
        wait(1000)
        sampSendChat('Всем постам! Докладывает Прапорщик Печкин, начинаем погоню за жетоном  '..pogonyaarg)
        wait(1000)
        sampSendChat('/pg '..pogonyaarg)
    end)
end

function megafon()
    lua_thread.create(function ()
        sampSendChat('/m [МВД] Водитель, прижмитесь к обочине, остановитесь и заглушите двигатель!')
        wait(1000)
        sampSendChat('/m [МВД] В противном случае мы объявим вас в розыск и откроем огонь!')
        wait(1000)
        sampSendChat('/m [МВД] Только Вы несете ответственность за свою жизнь!')
        wait(1000)
        sampSendChat('/me отпустил кнопку мегафона и зафиксировал его на держателе')
        wait(1000)
        sampSendChat('/do Мегафон на держателе.')
    end)
end

function obysk(obysk)
    lua_thread.create(function ()
        sampSendChat('/do Значок сотрудника МВД на груди.')
        wait(1000)
        sampSendChat('/me достал ордер на обыск из переднего кармана спецодежды')
        wait(1000)
        sampSendChat('/do Ордер в руке.')
        wait(1000)
        sampSendChat('/do На бумаге написано: Ордер на обыск...')
        wait(1000)
        sampSendChat('/do На бумаге написано: ...гражданина.')
        wait(1000)
        sampSendChat('/do На бумаге написано: Причина: Плановая проверка граждан.')
        wait(1000)
        sampSendChat('/me показал его человеку напротив')
        wait(1000)
        sampSendChat('/me провел руками по всем частям тела')
        wait(1000)
        sampSendChat('/me изъял запрещенные предметы у человека напротив')
        wait(1000)
        sampSendChat('/do Запрещенные предметы изъяты. ')
        wait(1000)
        sampSendChat('/search '..obysk)
    end)
end

function wanted(wanted)
    lua_thread.create(function ()
        sampSendChat('/do Темно-матовый КПК "МВД:профи" в правом кармане.')
        wait(1000)
        sampSendChat('/me достал планшет из правого кармана')
        wait(1000)
        sampSendChat('/do Планшет в руках.')
        wait(1000)
        sampSendChat('/me зашел в раздел "База | Записи | РОСбаза: ФЭЙСидентифи" ')
        wait(1000)
        sampSendChat('/do Раздел найден.')
        wait(1000)
        sampSendChat('/me ввел жетон: '..wanted)
        wait(1000)
        sampSendChat('/do Процесс проверки личности...')
        wait(1000)
        sampSendChat('/do Лицо подозреваемого совпадает с лицом на записи.')
    end)
end

function rozysk(rozysknick)
    lua_thread.create(function()
        sampSendChat('/do Черный планшет "МВД:профи" в правом кармане.')
        wait(1000)
        sampSendChat('/me достал планшет из правого кармана')
        wait(1000)
        sampSendChat('/do Планшет в руках.')
        wait(1000)
        sampSendChat('/me зашел в раздел "База | Розыск"')
        wait(1000)
        sampSendChat('/do Раздел открыт.')
        wait(1000)
        sampSendChat('/me ввел: '..rozysknick)
        wait(1000)
        sampSendChat('/do Человек в розыске.')
    end)
end

function autotag(tag)
    lua_thread.create(function()
    sampSendChat('/r [K] '..tag)
    end)
end

function help()
    lua_thread.create(function ()
    sampAddChatMessage('{0000ff}[INFO] {ffffff}Привет! Сейчас тут напишутся все рабочие функции', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/rozysk - Выдача розыска', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/bwanted - Фоторобот', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}NumPad 1 - Мегафон', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/obySk - Выдача ордера и соответственно обыск', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/bpg - ПГ', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/gmyd - Просьба предъявить документы', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}NumPad 3 - Нужно ли показать документы гражданину', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/docgive - Показать документы', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/br - РП рация с автотегом', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/ticket - Выдача штрафов', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/avto - Просьба выйти из авто', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/avtod - Взлом двери', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}/clearchat - Чистка чата', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}NumPad 3 - Пред', -1)
    sampAddChatMessage('{0000ff}[INFO] {ffffff}NumPad 4 - Откат', -1)
    end)
end

function ticket (ticketnum)
    lua_thread.create(function ()
        sampSendChat('Сидите в машине, сейчас я выпишу штраф')
        wait(1000)
        sampSendChat('При уезде мы имеем право открыть огонь!')
        wait(1000)
        sampSendChat('/do Готовый лист с надписью "Протокол" и ручка лежат в рюкзаке.')
        wait(1000)
        sampSendChat('/me достал лист и ручку')
        wait(1000)
        sampSendChat('/do Лист и ручка в руке.')
        wait(1000)
        sampSendChat('/me начал записывать протокол: нарушение коАП.')
        wait(1000)
        sampSendChat('/do На листе: Нарушитель носит жетон '..ticketnum..'.')
    end)
end

function bcuff(cuff)
    lua_thread.create(function ()
        sampSendChat('/do Наручники висят на поясе.')
        wait(1000)
        sampSendChat('/me снял наручники с пояса')
        wait(1000)
        sampSendChat('/do Наручники в руках.')
        wait(1000)
        sampSendChat('/me заковал преступника в наручники')
        wait(1000)
        sampSendChat('/cuff '..cuff)
        wait(1000)
        sampSendChat('/do Руки закованы.')
        wait(1000)
        sampSendChat('/me начал вести человека за собой')
        wait(1000)
        sampSendChat('/escort '..cuff)
        wait(1000)
        sampSendChat('/do Подозреваемый идет вслед за сотрудником.')
    end)
end

function bkpz(kpz)
    lua_thread.create(function ()
        sampSendChat('/do Человек в авто')
            wait(1000)
            sampSendChat('/me достал преступника из авто')
            wait(1000)
            sampSendChat('/do Преступник вышел из салона.')
            wait(1000)
            sampSendChat('/me открыл в дверь с табличкой "КПЗ"')
            wait(1000)
            sampSendChat('/do Дверь открыта.')
            wait(1000)
            sampSendChat('/me открыв решетку, затащил преступника')
            wait(1000)
            sampSendChat('/do Преступник в КПЗ.')
            wait(1000)
            sampSendChat('/me закрыл дверь и решетку')
            wait(1000)
            sampSendChat('/do Ограждения закрыты.')
            wait(1000)
            sampSendChat('/arrest '..kpz)
    end)
end
    function avto()
        lua_thread.create(function ()
            sampSendChat('Живо вышел из машины!')
            wait(1000)
            sampSendChat('Согласно поставленным мне правилам...')
            wait(1000)
            sampSendChat(' ..я могу Вас вытащить из авто или применить силу!')
            wait(1000)
            sampSendChat('Если не будете подчиняться, я объявлю Вас... ')
            wait(1000)
            sampSendChat(' ...в розыск согласно статье 8.1 УК РФ!')
        end)
    end
 
    function avtod()
        lua_thread.create(function ()
            sampSendChat('/do Лом в багажнике.')
            wait(1000)
            sampSendChat('/me вытащил лом')
            wait(1000)
            sampSendChat('/do Лом в руках.')
            wait(1000)
            sampSendChat('/me просунул лом к проему')
            wait(1000)
            sampSendChat('/do Процесс...')
            wait(1000)
            sampSendChat('/do Дверь выломана.')
            wait(1000)
            sampSendChat('Работает ОМОН!')
        end)
    end

    function clear()
        lua_thread.create(function ()
            sampAddChatMessage('[CLEAR] Очистка чата...', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
            sampAddChatMessage(' ', -1)
        end)
    end
Lua:
function main()
repeat wait(0) until isSampAvailable()
while true do
    wait(0)
        if isKeyJustPressed(VK_NUMPAD1) then
            obysk() --функция
        end
    end
end

как отчистить текст в фрейме? оно скидывает счётчик, но не чистить таблицу.

Lua:
local test2 = {}
local max = 2
local ky = 0

--frame
if ky <= max then
imgui.Text(test2)
else
ky = 0
end

if text:find('привет') then
    ky = ky + 1
    table.insert(test2, text)
end

пробовал через table.remove(), но чёт ничего не вышло либо я что-то не так сделал.
 
Последнее редактирование:
  • Нравится
Реакции: ariad

kyrtion

Известный
659
242
Lua:
function main()
repeat wait(0) until isSampAvailable()
while true do
    wait(0)
        if isKeyJustPressed(VK_NUMPAD1) then
            obysk() --функция
        end
    end
end

как отчистить текст в фрейме? оно скидывает счётчик, но не чистить таблицу.

Lua:
local test2 = {}
local max = 2
local ky = 0

--frame
if ky <= max then
imgui.Text(test2)
else
ky = 0
end

if text:find('привет') then
    ky = ky + 1
    table.insert(test2, text)
end

пробовал через table.remove(), но чёт ничего не вышло либо я что-то не так сделал.
table.remove(тут_таблица, номер массив)

допустим
table.remove(listPlayers, 51)
- тогда удалит объект таблицы если ключ стоит 51, если точнее [51]

- перевернул цикл чтобы удалял без лишних добавление ключей
Lua:
for i=#listPlayers, 1, -1 do
    if listPlayers[i].nickname:find('kyrtion') then
        table.remove(listPlayers, i)
        break -- остановить если не нужно удалять других
    end
end

как отчистить текст в фрейме
может ты про этот?
imgui.StrCopy(ImBuffer, 'строка')
 
Последнее редактирование:
  • Эм
Реакции: Дядя Энрик.

Дядя Энрик.

Активный
319
75
table.remove(тут_таблица, номер массив)

допустим
table.remove(listPlayers, 51)
- тогда удалит объект таблицы если ключ стоит 51, если точнее [51]

- перевернул цикл чтобы удалял без лишних добавление ключей
Lua:
for i=#listPlayers, 1, -1 do
    if listPlayers[i].nickname:find('kyrtion') then
        table.remove(listPlayers, i)
        break -- остановить если не нужно удалять других
    end
end


может ты про этот?
imgui.StrCopy(ImBuffer, 'строка')
не, не про это, у меня в фрейм идёт вывод сообщений, и мне надо эти сообщения чистить как только приходит "аля огран", 2/2 и фрейм с "логом" что бы отчищался. imgui.StrCopy() вряд-ли подойдёт.
На счёт table.remove() , у меня теперь вообще в фрейм не выводит сообщения, но счётчик капает)

Lua:
for k, v in ipairs(listchat) do
    if text:gsub("%{......%}", ""):match(v.ic1) then
        table.insert(ic, text)
    end
    if text:gsub("%{......%}", ""):match(v.ic1) then
        table.remove(ic, 3)
    end
end
wtf ?

не, не про это, у меня в фрейм идёт вывод сообщений, и мне надо эти сообщения чистить как только приходит "аля огран", 2/2 и фрейм с "логом" что бы отчищался. imgui.StrCopy() вряд-ли подойдёт.
На счёт table.remove() , у меня теперь вообще в фрейм не выводит сообщения, но счётчик капает)

Lua:
for k, v in ipairs(listchat) do
    if text:gsub("%{......%}", ""):match(v.ic1) then
        table.insert(ic, text)
    end
    if text:gsub("%{......%}", ""):match(v.ic1) then
        table.remove(ic, 3)
    end
end
wtf ?
а, не так указал таблицу, теперь заработало, но не чистится фрейм
 
Последнее редактирование:

AntonAnton123

Активный
149
67
К сожалению с регулярными выражениями пока не подружился, нужно в функцию :
for S in string.gmatch(text, "Деньги нал/банк: %d+") do
прописать это:
Деньги нал/банк: 71126532(183469609)
первое число не проблема как видно прописал , а как прописать второе число в скобках не знаю, помогите
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,221
К сожалению с регулярными выражениями пока не подружился, нужно в функцию :
for S in string.gmatch(text, "Деньги нал/банк: %d+") do
прописать это:
Деньги нал/банк: 71126532(183469609)
первое число не проблема , а как прописать второе число в скобках не знаю, помогите
local cash, bank = text:match('Деньги нал/банк: (%d+)/(%d+)')
 

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
1. Как сделать вот эти кнопки что бы типо было как затухание(градиент)
2. Иконки типо летают тоже вот интересно, как было это сделано.
Screenshot_2024-02-19-11-13-18-71_f9ee0578fe1cc94de7482bd41accb329.jpg
Screenshot_2024-02-19-11-12-52-23_f9ee0578fe1cc94de7482bd41accb329.jpg
 

percheklii

Известный
731
268
может кто помочь найти адрес цвета этого свечения? Чтобы уже изменить через скрипт?))
1708376530025.png
 

Дядя Энрик.

Активный
319
75
1. Как сделать вот эти кнопки что бы типо было как затухание(градиент)
2. Иконки типо летают тоже вот интересно, как было это сделано.
дравлистом это делается, градиент тоже через драв лист в функции с кнопками.
 

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
дравлистом это делается, градиент тоже через драв лист в функции с кнопками.
Да, это я +- и сам понимал.
Мне бы понять как делается вот эта анимация летающих иконок.
У чапо полезный гайд, но не показаны все функции и как их где юзать
 
  • Грустно
Реакции: Дядя Энрик.

tsunamiqq

Участник
429
16
Есть гайд по подключению бота тг к скрипту?
Ну и в общем создание бота с помощью которого можно будет работать со скриптом
 

Дядя Энрик.

Активный
319
75
Есть гайд по подключению бота тг к скрипту?
Ну и в общем создание бота с помощью которого можно будет работать со скриптом
 
  • Нравится
Реакции: tsunamiqq