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

Lok1

Участник
45
1
Скиньте кто-нибудь пример работы с чекбоксами, вкл выкл какого скрипта, пожалуйста
 

Kolbasa241

Известный
213
57
Ребят, подскажите как сделать, чтобы скрипт искал определённое слово в последней строке чата сампа.
Щас поясню:
Вот смотрите допустим вот только пришла строка -
[A] Ник Админа[111]: /ban 132 30 чит
Если найдена эта строка, мне и мне нужно из этой строки получить информацию и ввести это в три переменные - Ник Админа, Айди админа, И само сообщение которое он написал, т.е. - /ban 132 30 чит
И чтобы строка которую отписал админ отправилась в чат.

Вот код, который я написал.
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
local text, sender, number = text:match('[A] (.+)[(.+)]: (.+)', 1)
if text then
sampAddChatMessage(text, -1)
sampAddChatMessage(sender, -1)
sampAddChatMessage(number, -1)
else
sampAddChatMessage("не то", color)
end
end

Но это совсем не то.. Помогите пожалуйста, прост нет уроков нигде с string.match..
 

Angr

Известный
291
99
Как сделать проверку на то, что тебя убили?
Lua:
if isPlayerDead(PLAYER_HANDLE) then
    --code
end
Ребят, подскажите как сделать, чтобы скрипт искал определённое слово в последней строке чата сампа.
Щас поясню:
Вот смотрите допустим вот только пришла строка -
[A] Ник Админа[111]: /ban 132 30 чит
Если найдена эта строка, мне и мне нужно из этой строки получить информацию и ввести это в три переменные - Ник Админа, Айди админа, И само сообщение которое он написал, т.е. - /ban 132 30 чит
И чтобы строка которую отписал админ отправилась в чат.

Вот код, который я написал.
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
local text, sender, number = text:match('[A] (.+)[(.+)]: (.+)', 1)
if text then
sampAddChatMessage(text, -1)
sampAddChatMessage(sender, -1)
sampAddChatMessage(number, -1)
else
sampAddChatMessage("не то", color)
end
end

Но это совсем не то.. Помогите пожалуйста, прост нет уроков нигде с string.match..
Как пример
Lua:
local str = "[A] Nick[228]: /ban 1 30 cheat"
local color = "0"
if color == "0" and str:match("%[A%]%s(%w+_?%w+)%[(%d+)]") then -- Проверка цвета чата и ника
    local AdmNick, Admid = str:match("%[A%]%s(%w+_?%w+)%[(%d+)]") -- Ник администратор, ид
    local extradition = str:match("%: (.*)") -- Команда адм /ban 1 30 cheat
    if extradition:match("^/ban") or extradition:match("^/kick") or extradition:match("^/mute") or extradition:match("^/warn") or extradition:match("^/jail") then -- итак далее
        print(("Администратор %s[%d] хочет выдачать наказание: %s"):format(AdmNick, Admid,extradition))
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Kolbasa241

alexanderyyyeeee

Новичок
23
2
Можно ли как то оптимизировать мой недо код?
Lua:
script_name("cartimafia")
script_description("RolePlay Helper for Diamond RP")
script_version_number(1)
script_version("1.00")
script_author("Enrique Carti")

local sampev = require 'lib.samp.events'

function main()
    while not isSampfuncsLoaded() do
        wait(1000)
    end
    sampAddChatMessage("[RolePlay Helper] {FFFFFF}Скрипт был успешно запущен. {FF5000}/dialog {FFFFFF}для информации.", 0xFF5000)
    sampRegisterChatCommand("dialog", openmenu)
    while true do
        wait(0)
        local resultMain, buttonMain, listMain = sampHasDialogRespond(109)
        if resultMain == true then
            if buttonMain == 1 then
                if listMain == 0 and button == 1 then
                    sampShowDialog(1000, "RolePlay Helper", string.format("МГ в /n\nДМ в /n\nДБ в /n\nСК в /n\nТК в /n\nРП в /n\nПГ в /n\nРК в /n\nБХ в /n\nЗЗ в /n"), "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал термины в /n", 0x2ac335)
                    repeat
                  wait(0)
                  result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if list == 0 and button == 1 then
                  sampSendChat("/n МГ - Информация OOC в IC чат")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat('/n ДМ - Убийство без причины')
                    end
                    if list == 2 and button == 1 then
                    sampSendChat('/n ДБ - Убийство с машины')
                    end
                    if list == 3 and button == 1 then
                    sampSendChat('/n СК - Убийство на спавне')
                    end
                    if list == 4 and button == 1 then
                    sampSendChat('/n ТК - Убийство союзников')
                    end
                    if list == 5 and button == 1 then
                    sampSendChat('/n РП - Игра по ролям')
                    end
                    if list == 6 and button == 1 then
                    sampSendChat('/n ПГ - Воображать себя героем, пример: 1 в 5')
                    end
                    if list == 7 and button == 1 then
                    sampSendChat('/n РК - Повторное возвращение на место, где тебя убили')
                    end
                    if list == 8 and button == 1 then
                    sampSendChat('/n БХ - Баннихоп')
                    end
                    if list == 9 and button == 1 then
                    sampSendChat('/n ЗЗ - Зелёная Зона')
                    end
                end
                if listMain == 1 then
                    sampShowDialog(1000, "RolePlay Helper", string.format("МГ\nДМ\nДБ\nСК\nТК\nРП\nПГ\nРК\nБХ\nЗЗ"), "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал термины в РП чат", 0x863ebe)
                    repeat
                    wait(0)
                    result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if list == 0 and button == 1 then
                    sampSendChat("Мама Галя")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat("Дядя Миша")
                    end
                    if list == 2 and button == 1 then
                    sampSendChat("Дед Боря")
                    end
                    if list == 3 and button == 1 then
                    sampSendChat("Синий кит")
                    end
                    if list == 4 and button == 1 then
                    sampSendChat("Тимофей Карпатов")
                    end
                    if list == 5 and button == 1 then
                    sampSendChat("Ровная поверхность")
                    end
                    if list == 6 and button == 1 then
                    sampSendChat("Пожарный гидрант")
                    end
                    if list == 7 and button == 1 then
                    sampSendChat("Руль кривой")
                    end
                    if list == 8 and button == 1 then
                    sampSendChat("Большой хворост")
                    end
                    if list == 9 and button == 1 then
                    sampSendChat("Зелёный зонт")
                    end
                end
                if listMain == 2 then
                    sampShowDialog(1000, "RolePlay Helper", "/pass id - показать паспорт\n/lic id - показать лицензии\n/med id - показать мед карту\n/healme - использовать аптечку\n\n/givevkey id - выдать ключи от своего автомобиля\n/dropvkey - выкинуть ключи от чужого автомобиля\n/makegun - сделать оружие\n/sellgun - продать оружие", "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал полезные команды", 0x2f77d6)
                    repeat
                        wait(0)
                    result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if result then
          if button == 2 then
              sampCloseCurrentDialogWithButton()
                    end
                    if list == 0 and button == 1 then
                    sampSendChat("/pass")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat("/lic")
                    end
                    if list == 2 and button == 1 then
                    sampSendChat("/med")
                    end
                    if list == 4 and button == 1 then
                    sampSendChat("/givevkey")
                    end
                    if list == 3 and button == 1 then
                    sampSendChat("/healme")
                    end
                    if list == 5 and button == 1 then
                    sampSendChat("/dropvkey")
                    end
                    if list == 6 and button == 1 then
                        sampSendChat("/makegun")
                        end
                    if list == 7 and button == 1 then
                        sampSendChat("/sellgun")
                        end
                end
            end
        end
    end
end
end

function openmenu()
    sampShowDialog(109, "RolePlay Helper by Enrique Carti", string.format("Термины в /n \nТермины в РП чат\nПолезные команды"), "Выбрать", "Закрыть", 2)
end
 

Angr

Известный
291
99
Можно ли как то оптимизировать мой недо код?
Lua:
script_name("cartimafia")
script_description("RolePlay Helper for Diamond RP")
script_version_number(1)
script_version("1.00")
script_author("Enrique Carti")

local sampev = require 'lib.samp.events'

function main()
    while not isSampfuncsLoaded() do
        wait(1000)
    end
    sampAddChatMessage("[RolePlay Helper] {FFFFFF}Скрипт был успешно запущен. {FF5000}/dialog {FFFFFF}для информации.", 0xFF5000)
    sampRegisterChatCommand("dialog", openmenu)
    while true do
        wait(0)
        local resultMain, buttonMain, listMain = sampHasDialogRespond(109)
        if resultMain == true then
            if buttonMain == 1 then
                if listMain == 0 and button == 1 then
                    sampShowDialog(1000, "RolePlay Helper", string.format("МГ в /n\nДМ в /n\nДБ в /n\nСК в /n\nТК в /n\nРП в /n\nПГ в /n\nРК в /n\nБХ в /n\nЗЗ в /n"), "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал термины в /n", 0x2ac335)
                    repeat
                  wait(0)
                  result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if list == 0 and button == 1 then
                  sampSendChat("/n МГ - Информация OOC в IC чат")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat('/n ДМ - Убийство без причины')
                    end
                    if list == 2 and button == 1 then
                    sampSendChat('/n ДБ - Убийство с машины')
                    end
                    if list == 3 and button == 1 then
                    sampSendChat('/n СК - Убийство на спавне')
                    end
                    if list == 4 and button == 1 then
                    sampSendChat('/n ТК - Убийство союзников')
                    end
                    if list == 5 and button == 1 then
                    sampSendChat('/n РП - Игра по ролям')
                    end
                    if list == 6 and button == 1 then
                    sampSendChat('/n ПГ - Воображать себя героем, пример: 1 в 5')
                    end
                    if list == 7 and button == 1 then
                    sampSendChat('/n РК - Повторное возвращение на место, где тебя убили')
                    end
                    if list == 8 and button == 1 then
                    sampSendChat('/n БХ - Баннихоп')
                    end
                    if list == 9 and button == 1 then
                    sampSendChat('/n ЗЗ - Зелёная Зона')
                    end
                end
                if listMain == 1 then
                    sampShowDialog(1000, "RolePlay Helper", string.format("МГ\nДМ\nДБ\nСК\nТК\nРП\nПГ\nРК\nБХ\nЗЗ"), "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал термины в РП чат", 0x863ebe)
                    repeat
                    wait(0)
                    result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if list == 0 and button == 1 then
                    sampSendChat("Мама Галя")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat("Дядя Миша")
                    end
                    if list == 2 and button == 1 then
                    sampSendChat("Дед Боря")
                    end
                    if list == 3 and button == 1 then
                    sampSendChat("Синий кит")
                    end
                    if list == 4 and button == 1 then
                    sampSendChat("Тимофей Карпатов")
                    end
                    if list == 5 and button == 1 then
                    sampSendChat("Ровная поверхность")
                    end
                    if list == 6 and button == 1 then
                    sampSendChat("Пожарный гидрант")
                    end
                    if list == 7 and button == 1 then
                    sampSendChat("Руль кривой")
                    end
                    if list == 8 and button == 1 then
                    sampSendChat("Большой хворост")
                    end
                    if list == 9 and button == 1 then
                    sampSendChat("Зелёный зонт")
                    end
                end
                if listMain == 2 then
                    sampShowDialog(1000, "RolePlay Helper", "/pass id - показать паспорт\n/lic id - показать лицензии\n/med id - показать мед карту\n/healme - использовать аптечку\n\n/givevkey id - выдать ключи от своего автомобиля\n/dropvkey - выкинуть ключи от чужого автомобиля\n/makegun - сделать оружие\n/sellgun - продать оружие", "Выбрать", "Закрыть", 2)
                    sampAddChatMessage("Ты выбрал полезные команды", 0x2f77d6)
                    repeat
                        wait(0)
                    result, button, list, input = sampHasDialogRespond(1000)
                    until result
                    if result then
          if button == 2 then
              sampCloseCurrentDialogWithButton()
                    end
                    if list == 0 and button == 1 then
                    sampSendChat("/pass")
                    end
                    if list == 1 and button == 1 then
                    sampSendChat("/lic")
                    end
                    if list == 2 and button == 1 then
                    sampSendChat("/med")
                    end
                    if list == 4 and button == 1 then
                    sampSendChat("/givevkey")
                    end
                    if list == 3 and button == 1 then
                    sampSendChat("/healme")
                    end
                    if list == 5 and button == 1 then
                    sampSendChat("/dropvkey")
                    end
                    if list == 6 and button == 1 then
                        sampSendChat("/makegun")
                        end
                    if list == 7 and button == 1 then
                        sampSendChat("/sellgun")
                        end
                end
            end
        end
    end
end
end

function openmenu()
    sampShowDialog(109, "RolePlay Helper by Enrique Carti", string.format("Термины в /n \nТермины в РП чат\nПолезные команды"), "Выбрать", "Закрыть", 2)
end
Используй таблицы.

Весь код я не буду переписывать тебе, покажу как делал у себя
Lua:
local TestTablo = {
[0] = "/r 10-4",
[1] = "/r 10-34",
[2] = "/r 10-36",
[3] = "/r 10-37",
[4] = "/r 10-37",
[5] = "/r 10-37",
[6] = "/r 10-37",
[7] = "/r 10-37",

}
local fracs = [[
10-4 - Cообщение принял
10-34 - Требуется подкрепление в указанное место;
10-36 - Фура взорвана, требуется эвакуация в сектор;
10-37 - Требуется эвакуация в указанное место;
{FF0000}10-43 - Нападение на полную фуру;
10-44 - Нападение на пустую фуру;
10-45 - Фура взорвана, ранен;
10-46 - Фура в таком-то квадрате, неизвестно полная или нет, заберите;
10-100 - поставил рацию на зарядку ( АФК );
]] 
function TenCode()
    sampShowDialog(6416, "text", fracs , "ОК", "Отмена", 2)
    while sampIsDialogActive(6416) do wait(100) end
    local result, button, list, _ = sampHasDialogRespond(6416)
    if result and button == 1 and list then
      sampSendChat(TestTablo[list])
    end
end
 

alexanderyyyeeee

Новичок
23
2
Используй таблицы.

Весь код я не буду переписывать тебе, покажу как делал у себя
Lua:
local TestTablo = {
[0] = "/r 10-4",
[1] = "/r 10-34",
[2] = "/r 10-36",
[3] = "/r 10-37",
[4] = "/r 10-37",
[5] = "/r 10-37",
[6] = "/r 10-37",
[7] = "/r 10-37",

}
local fracs = [[
10-4 - Cообщение принял
10-34 - Требуется подкрепление в указанное место;
10-36 - Фура взорвана, требуется эвакуация в сектор;
10-37 - Требуется эвакуация в указанное место;
{FF0000}10-43 - Нападение на полную фуру;
10-44 - Нападение на пустую фуру;
10-45 - Фура взорвана, ранен;
10-46 - Фура в таком-то квадрате, неизвестно полная или нет, заберите;
10-100 - поставил рацию на зарядку ( АФК );
]]
function TenCode()
    sampShowDialog(6416, "text", fracs , "ОК", "Отмена", 2)
    while sampIsDialogActive(6416) do wait(100) end
    local result, button, list, _ = sampHasDialogRespond(6416)
    if result and button == 1 and list then
      sampSendChat(TestTablo[list])
    end
end
Покажи на моём скрипте, я немного не понял, соре, что тупой xd
upd: понял, спасибо
 
Последнее редактирование:

Lok1

Участник
45
1
Lua:
if isPlayerDead(PLAYER_HANDLE) then
    --code
end

Как пример
Lua:
local str = "[A] Nick[228]: /ban 1 30 cheat"
local color = "0"
if color == "0" and str:match("%[A%]%s(%w+_?%w+)%[(%d+)]") then -- Проверка цвета чата и ника
    local AdmNick, Admid = str:match("%[A%]%s(%w+_?%w+)%[(%d+)]") -- Ник администратор, ид
    local extradition = str:match("%: (.*)") -- Команда адм /ban 1 30 cheat
    if extradition:match("^/ban") or extradition:match("^/kick") or extradition:match("^/mute") or extradition:match("^/warn") or extradition:match("^/jail") then -- итак далее
        print(("Администратор %s[%d] хочет выдачать наказание: %s"):format(AdmNick, Admid,extradition))
    end
end
А можешь показать пример, с простым текстом. Например: Привет. (Nick_Name)[123]. Вот как тут узнать ник и ид
 

.Makarov.

Известный
188
36
Здравствуйте. Вот на Азазонке есть отдел коммерции в телефоне. И мне нужно чтоб при открытии диалога с списком слетевших домов, все номера домов писались в чат.
Я тут накидал "быдло-код", который естественно не работает (Знаю что и не сработало бы, только не кидайтесь тапками). Помогите плез чтоб пахало. Заранее спасибо =)

Lua:
function samp.onShowDialog(dialogId,style,title,button1,button2,text)
    if dialogId == 0 and style == 0 and string.find(text,"ID: *{.+}%d+%{.+}") then
        for _, v in pairs(math.modf(tonumber(text:match("ID: *{.+}(%d+)%{.+}")))) do
            sampAddChatMessage('Слетел дом под номером: '..v, -1)
        end
        return false
    end
end
 

eenz

Известный
203
102
Здравствуйте. Вот на Азазонке есть отдел коммерции в телефоне. И мне нужно чтоб при открытии диалога с списком слетевших домов, все номера домов писались в чат.
Я тут накидал "быдло-код", который естественно не работает (Знаю что и не сработало бы, только не кидайтесь тапками). Помогите плез чтоб пахало. Заранее спасибо =)

Lua:
function samp.onShowDialog(dialogId,style,title,button1,button2,text)
    if dialogId == 0 and style == 0 and string.find(text,"ID: *{.+}%d+%{.+}") then
        for _, v in pairs(math.modf(tonumber(text:match("ID: *{.+}(%d+)%{.+}")))) do
            sampAddChatMessage('Слетел дом под номером: '..v, -1)
        end
        return false
    end
end
math.modf(x) -- Возвращает два числа: целую часть x и дробную часть x.
зачем тебе там дробь
 
  • Нравится
Реакции: .Makarov.

Angr

Известный
291
99
А можешь показать пример, с простым текстом. Например: Привет. (Nick_Name)[123]. Вот как тут узнать ник и ид
Почитай про регулярные выражения в Lua
Lua:
local str = "Привет. (Nick_Name)[123]"

local text, nick, id = str:match("(.*)%((%w+_?%w+)%)%[(%d+)%]") -- "(.*)" - Любой текст | (%w+_?%w+) - ник рп формата или нет
print(text, nick, id)