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

TSIDEX

Известный
83
8
Столкнулся с проблемой. Создавал информационное окно имгуи и по среди текста появился "?", после чего остальной текст не отображался. Это лимит что-ли такой. Как это решить?
 

DeMoN3D

Известный
366
77
да, это я понял, мне нужно чтобы, например у меня стояла метка на 1 месте, я поставил ее на другое место и об этом мне сразу же написало в чат и xyz ее, автоматом, без команд и нажатий
кидай в бесконечный цикл и проверяй, совпадают ли текущие координаты с предыдущими
 

TSIDEX

Известный
83
8
Lua:
function imgui.OnDrawFrame()
if one_win.v then
local sw, sh = getScreenResolution()
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(800, 500), imgui.Cond.FirstUseEver)
imgui.Begin(u8'FBI HELPER', one_win, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove)
imgui.Columns(2)
imgui.SetColumnWidth(-1, 250)
imgui.Text(u8[[/gg
/casesvet
/svet
/lecac
/lecns
/leckso
/lecgnk
/rn
/fn
/so [место]
/mayak
/ud[1-10]
/ama
/ton
/nar
/pt
/mo
/глушилка
/mon [id]
/moff [id]
/sos [свой id]
/testu
/testt
/ot
/cs [свой id]
/css [id]
/report
/fo
/foff
/ja
/givedrugs
/bomba
/bt
/bf1
/bf2
/bf3
/incar
/inmoto
/pp
/hh [отклоняемый номер]
/cam
/alp
/alpt
/alpf
/alps
/palec
/otvet
/жертва
/prov
/rasp
/meg
/megsp
/krik
/rhelp [свой id]
/fhelp [свой id]
/soz
/case
/caseact
/unc [свой id]
/epk[1-3]
/dor
/pr
/pk]])
imgui.NextColumn()
imgui.Text(u8[[- Cообщить человеку что он арестован.
- Подложить светошумовую гранату в кейс.
- Активироват светошумовую гранату в кейсе.
- Зачитать лекцию о наборе в Академию ФБР.
- Зачитать лекцию Управления Национальной Безопасности.
- Зачитать лекцию Криминально-следственного отдела.
- Зачитать лекцию Государственного нарколического контроля.
- NonRP чат ФБР.
- NonRP чат МВД.
- Сообщить об угрозе похищения.
- Активировать маяки у всех в зоне видимости.
- Предъявить удостоверение агента.
- Отыгровка экипировки агента.
- Отыгровка тонировки и устройств транспортного средства.
- Изъять наркотики по РП.
- Изъять патроны по РП.
- Проверка патронов в базе данных Министерства Обороны.
- Заглушить маяки у всех ближающих сотрудников.
- Активировать маячок.
- Деактивировать маячок.
- Тревожная кнопка на случай похищения.
- Письменный тест на тему Устава ФБР.
- Письменный тест на тему Терактов и похищений.
- Отнять отмычку у заключённого
- Поменять себе костюм.
- Поменять костюм сотруднику.
- Быстрое открытие окна репорта.
- Начать прослушку.
- Окончить прослушку.
- Открыть/закрыть клетку в тюрьме.
- Подкинуть человеку наркотики.
- Разминирование бомбы.
- Успешное разминирование бомбы.
- Первая неудача при разминировании.
- Вторая неудача при разминировании.
- Третья неудача при разминировании.
- Вытащить водителя из автомобиля.
- Скинуть водителя с мотоцикла.
- Принять входящий звонок.
- Отклонить входящий звонок с последующим отлючением телефона.
- Отыгровка РП камеры.
- Достать альпинистское снаряжение и произвести выстрел.
- При удачном выстреле взобраться на крышу.
- При неудачном выстреле произвести повторный.
- Сложить альпинистское снаряжение.
- Включить полиграф и установить датчики на тело допрашиваемого.
- Проверить работоспособность полиграфа.
- Снять показания с полиграфа.
- Разрезать верёвки, тем самым освободить заложника.
- Уведомить человека о предстоящей проверке ГНК/КСО.
- Расписание проверок ГНК/КСО.
- Потребоваться автомобилиста остановиться.
- Потребоваться автомобилиста остановиться на немаркированной машине.
- Предупредить человека перед стрельбой.
- Запрос о помощи на волну ФБР.
- Запрос о помощи на волну МВД.
- Созвать сотрудников ПД в офис ФБР.
- Подложить в кейс с настоящими деньгами жучок.
- Активировать жучок в кейсе при передаче.
- Снять с себя наручники пользуясь отмычкой.
- Единый Процессуальный Кодекс.
- Требование уступить дорогу.
- Требование прекратить преследование.
- Требование нарушителя выйти из автомобиля.]])
imgui.End()
end
end
kfpDbED6Dnw.jpg

В чём ошибочка?
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,890
1,903
кидай в бесконечный цикл и проверяй, совпадают ли текущие координаты с предыдущими
а вот как это сделать? я типо подобного написал
скажите, как сделать правильно,чтобы когда я поставлю маркер, мне в чат писалось автоматом xy маркера
через for у меня не работает наверное потому что у меня руки из жопы
мой гавно код

Lua:
function ()
    for i = 1, 999999 do
        result, x, y, z = getTargetBlipCoordinates()
        if result then
            if x >= x1 then --[x1 это из другой функи getTargetBlipCoordinates]
               ...
            end
        end
    end
end
прошу заметить, я даун от природыroflanebalo
 

TSIDEX

Известный
83
8
Lua:
function imgui.OnDrawFrame()
if one_win.v then
local sw, sh = getScreenResolution()
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(800, 500), imgui.Cond.FirstUseEver)
imgui.Begin(u8'FBI HELPER', one_win, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove)
imgui.Columns(2)
imgui.SetColumnWidth(-1, 250)
imgui.Text(u8[[/gg
/casesvet
/svet
/lecac
/lecns
/leckso
/lecgnk
/rn
/fn
/so [место]
/mayak
/ud[1-10]
/ama
/ton
/nar
/pt
/mo
/глушилка
/mon [id]
/moff [id]
/sos [свой id]
/testu
/testt
/ot
/cs [свой id]
/css [id]
/report
/fo
/foff
/ja
/givedrugs
/bomba
/bt
/bf1
/bf2
/bf3
/incar
/inmoto
/pp
/hh [отклоняемый номер]
/cam
/alp
/alpt
/alpf
/alps
/palec
/otvet
/жертва
/prov
/rasp
/meg
/megsp
/krik
/rhelp [свой id]
/fhelp [свой id]
/soz
/case
/caseact
/unc [свой id]
/epk[1-3]
/dor
/pr
/pk]])
imgui.NextColumn()
imgui.Text(u8[[- Cообщить человеку что он арестован.
- Подложить светошумовую гранату в кейс.
- Активироват светошумовую гранату в кейсе.
- Зачитать лекцию о наборе в Академию ФБР.
- Зачитать лекцию Управления Национальной Безопасности.
- Зачитать лекцию Криминально-следственного отдела.
- Зачитать лекцию Государственного нарколического контроля.
- NonRP чат ФБР.
- NonRP чат МВД.
- Сообщить об угрозе похищения.
- Активировать маяки у всех в зоне видимости.
- Предъявить удостоверение агента.
- Отыгровка экипировки агента.
- Отыгровка тонировки и устройств транспортного средства.
- Изъять наркотики по РП.
- Изъять патроны по РП.
- Проверка патронов в базе данных Министерства Обороны.
- Заглушить маяки у всех ближающих сотрудников.
- Активировать маячок.
- Деактивировать маячок.
- Тревожная кнопка на случай похищения.
- Письменный тест на тему Устава ФБР.
- Письменный тест на тему Терактов и похищений.
- Отнять отмычку у заключённого
- Поменять себе костюм.
- Поменять костюм сотруднику.
- Быстрое открытие окна репорта.
- Начать прослушку.
- Окончить прослушку.
- Открыть/закрыть клетку в тюрьме.
- Подкинуть человеку наркотики.
- Разминирование бомбы.
- Успешное разминирование бомбы.
- Первая неудача при разминировании.
- Вторая неудача при разминировании.
- Третья неудача при разминировании.
- Вытащить водителя из автомобиля.
- Скинуть водителя с мотоцикла.
- Принять входящий звонок.
- Отклонить входящий звонок с последующим отлючением телефона.
- Отыгровка РП камеры.
- Достать альпинистское снаряжение и произвести выстрел.
- При удачном выстреле взобраться на крышу.
- При неудачном выстреле произвести повторный.
- Сложить альпинистское снаряжение.
- Включить полиграф и установить датчики на тело допрашиваемого.
- Проверить работоспособность полиграфа.
- Снять показания с полиграфа.
- Разрезать верёвки, тем самым освободить заложника.
- Уведомить человека о предстоящей проверке ГНК/КСО.
- Расписание проверок ГНК/КСО.
- Потребоваться автомобилиста остановиться.
- Потребоваться автомобилиста остановиться на немаркированной машине.
- Предупредить человека перед стрельбой.
- Запрос о помощи на волну ФБР.
- Запрос о помощи на волну МВД.
- Созвать сотрудников ПД в офис ФБР.
- Подложить в кейс с настоящими деньгами жучок.
- Активировать жучок в кейсе при передаче.
- Снять с себя наручники пользуясь отмычкой.
- Единый Процессуальный Кодекс.
- Требование уступить дорогу.
- Требование прекратить преследование.
- Требование нарушителя выйти из автомобиля.]])
imgui.End()
end
end
kfpDbED6Dnw.jpg

В чём ошибочка?
 

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
306
Lua:
local sampev = require 'samp.events'
local sf = require 'sampfuncs'

function main()
    while not isSampAvailable() do wait(100) end
    wait(-1)
end

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 0 and title:find('Статистика персонажа') and style == sf.DIALOG_STYLE_MSGBOX then
        name, lvl, exp, money, phone, law, arrest, reg, dep, org, rang, job, gender = text:gmatch('Имя: (.+)\n\nУровень: (%d+) \nExp: (%d+%/%d+) \n\nРейтинг: (%d+.%d+) \nДеньги: (%d+) \nТелефон: (%d+) \nЗаконопослушность: (%d+) \nАрестов: (%d+) \nСмертей в розыске: (%d+) \nУровень розыска: (%d+) \nДата регистрации: (%d+%-%d+%-%d+ %d+:%d+:%d+) \nЗависимость: (%d+) \nНаркотики: (%d+) \nМатериалы: (%d+) \nРыб поймано: (%d%.%d) кг \nОрганизация: (.+)\nРанг: (.+)\nРабота: (.+)\nСтатус: (.+)\nЖена/Муж: (.+)\nПол: (.+)')
        print(name)
    end
end
Попробуй записать %s - пробелы.
 
  • Нравится
Реакции: ninjaWRD

clrn1w

Известный
316
146
Как можно сделать чтобы вначале выводился текст и после при нажатии "1" скрипт продолжал отправлять сообщения, а при нажатии "2" прекращал отправлять сообщения?
 

FBenz

Активный
328
40
Насколько жизненно необходим луа поток для асинхронной функции? Можно ли оттуда убрать и просто запускать всю функцию, где юзается асинхрон, в потоке?