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

Frapsy

Известный
Проверенный
393
227
Можно пример кода, который будет в через определенное время выводить разные подсказки в чат? хД
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Можно пример кода, который будет в через определенное время выводить разные подсказки в чат? хД
Lua:
    lua_thread.create(function()
        while true do
            math.randomseed(os.time())
            local helpd = math.random(1, 10)
            if helpd == 1 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Если вы хотите узнать, кто в вас выстрелил последний раз - нажмите кнопку {0088ff}X.", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: Однако, учтите, с киллерами такое не получится.", 0x0088ff)
            elseif helpd == 2 then
                sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует свой отдельный чат, в котором могут общаться кто угодно!", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: Для взаимодействия с данным чатом включите его. [{0088ff} /pinfo » Модификации {ffffff}]", 0x0088ff)
            elseif helpd == 3 then
                sampAddChatMessage("[ PHELP ]{ffffff}: У нас существует отдельная модификация, именуемая как \'Стробоскопы\'", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: Данная модификация срабатывает при включённых мигалках в транспортном средстве.", 0x0088ff)
            elseif helpd == 4 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Данный скрипт обновляется часто, по этому если у вас есть идея по улучшению или обнаружили недоработку.", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: Вы можете обратиться к основателю скрипта через соц.сеть VK. [ {0088ff}vk.com/thenortonpclife{ffffff} ]", 0x0088ff)
            elseif helpd == 5 then
                sampAddChatMessage("[ PHELP ]{ffffff}: У нас действует система горячих клавиш, подробнее в [ /pinfo » Основная информация » Горячие клавиши ]", 0x0088ff)
            elseif helpd == 6 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Не работают горячие клавиши? Проверьте включённость NUMLOCK, она должна быть включена.", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: А так-же, если у вас установлен биндер - выключите его.", 0x0088ff)
            elseif helpd == 7 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Обращайте внимание на версию Police Helper, вполне возможно, что скрипт обновился и были добавлены новые функции.", 0x0088ff)
            elseif helpd == 8 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Если у вас Police Helper иногда показывает в SMS одну версию, а в другой раз показывает другую, то будьте внимательны.", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: Вполне возможно, что в первом - версия установщика, а во втором - версия самого скрипта.", 0x0088ff)
            elseif helpd == 9 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Быстрое меню 1.0 и 2.0 срабатывают только при появлении зелёного треугольника над головой персонажа.", 0x0088ff)
            elseif helpd == 10 then
                sampAddChatMessage("[ PHELP ]{ffffff}: Пожалуйста, будьте адекватны в чате Police Helper, не оскорбляйте, не пишите включенным CAPSLOCK-ом.", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: В чате запрещена торговля, если вы хотите обсудить цену с другом - используйте [{0088ff} /kw или /ksms Ник Текст{ffffff} ]", 0x0088ff)
                sampAddChatMessage("[ PHELP ]{ffffff}: В противном случае вы можете получить блокировку чата от 5 минут до бесконечности.", 0x0088ff)
            end
            wait(2700000)
        end
    end)
45 минут
 
  • Нравится
Реакции: Patrickkk
D

deleted-user-164854

Гость
Ребята, помогите, что я не так делаю:

function main()
while not isSampAvailable() do
wait(1000)
end
while true do
wait(0)
text, prefix, color, pcolor = sampGetChatString(99)
id = string.match(text, "Жалоба:.+[%d+]: .+")
if string.find(text, "Как показать паспорт") then
sampSendChat(string.format("/ans %d /pass [id]", id))
end
end
end

Нужно что бы если в чате появлялось сообщение "Жалоба: Bomj_Sampovski[228]: Как показать паспорт?" ему автоматом отвечало "/ans 228 /pass [id]"
 

tlwsn

Известный
537
85
Как создать диалог такого типа
XSONOsU.png
и вывести в чат то что я написал в нем?
 

Aniki

🐰
Администратор
1,228
1,558
Ребята, помогите, что я не так делаю:

function main()
while not isSampAvailable() do
wait(1000)
end
while true do
wait(0)
text, prefix, color, pcolor = sampGetChatString(99)
id = string.match(text, "Жалоба:.+[%d+]: .+")
if string.find(text, "Как показать паспорт") then
sampSendChat(string.format("/ans %d /pass [id]", id))
end
end
end

Нужно что бы если в чате появлялось сообщение "Жалоба: Bomj_Sampovski[228]: Как показать паспорт?" ему автоматом отвечало "/ans 228 /pass [id]"
Для таких целей намного удобнее и практичнее использовать библиотеку samp.lua SAMP.Lua(https://blast.hk/threads/14624/)
С ней твой код будет выглядеть как-то так:

Lua:
function main()
  while not isSampAvailable() do
    wait(1000)
  end
  wait(-1)
end

local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
  if text:match('^Жалоба: .*%[%d+%]: Как показать паспорт') then
    local id = text:match('^Жалоба: .*%[(%d+)%]: .*')
    sampSendChat('/ans ' .. id .. ' /pass [id]')
  end
end
+ в теме есть достаточно примеров
 
  • Нравится
Реакции: deleted-user-164854

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Ребята, помогите, что я не так делаю:

function main()
while not isSampAvailable() do
wait(1000)
end
while true do
wait(0)
text, prefix, color, pcolor = sampGetChatString(99)
id = string.match(text, "Жалоба:.+[%d+]: .+")
if string.find(text, "Как показать паспорт") then
sampSendChat(string.format("/ans %d /pass [id]", id))
end
end
end

Нужно что бы если в чате появлялось сообщение "Жалоба: Bomj_Sampovski[228]: Как показать паспорт?" ему автоматом отвечало "/ans 228 /pass [id]"
Lua:
local sampev = require 'lib.samp.events'

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

function sampev.onServerMessage(color, text)
    if text:find('Жалоба: %a+_%a+[%d+]: .+') then
        local id, ques = text:match('Жалоба: %a+_%a+%[(%d+)%]: (.+)')
        if ques:find('Как показать паспорт?') then
            sampSendChat('/ans '..id..' /pass [ID]')
        end
    end
end

-----------------------------------------
Как создать диалог такого типа
XSONOsU.png
и вывести в чат то что я написал в нем?
Lua:
function main()
    while not isSampAvailable() do wait(50) end
    sampShowDialog(572, "Второй диалог", "А ниже поле для вывода", "Уря", "Закрыть", 1)
    while true do wait(0)
        local re, bu, li, inp = sampHasDialogRespond(572)
            if re == true and bu == 1 and inp ~= nil then
                sampSendChat(inp)
            end
        end
    end
end
 
Последнее редактирование:

tlwsn

Известный
537
85
Lua:
function gr(pam)
  local dep, reason = string.match(pam, '(%d+)%s*(%s*)')
  if dep ~= nil then
    if dep == "" or dep < "1" or dep > "3" then
      sampAddChatMessage("{9966CC}FBI TOOLS {EAEAEA}| Enter /gr [1-3] REASON", -1)
      sampAddChatMessage("{9966CC}FBI TOOLS {EAEAEA}| 1 - LSPD | 2 - SFPD | 3 - LVPD", -1)
    elseif dep == "1" then
      sampSendChat("LSPD, пересекаю вашу юрисдикцию. "..reason)
    elseif dep == "2" then
      sampSendChat("SFPD, пересекаю вашу юрисдикцию. "..reason)
    elseif dep == "3" then
      sampSendChat("LVPD, пересекаю вашу юрисдикцию. "..reason)
    end
  end
end
Чего оно не считывает reason?
 

tlwsn

Известный
537
85
как сделать диалог STYLE_LIST который активируется на команду /ms и что бы при выборе пункта открывался диалог STYLE_INPUT в котором я вписываю текст и он отправляется в чат
wWSgiZh.png
 
Последнее редактирование:
D

deleted-user-164854

Гость
Все же есть проблемы с этим:
function main()
while not isSampAvailable() do
wait(1000)
end
wait(-1)
end

local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
if text:match('[/arep]: .*%[%d+%]: Как показать паспорт?') then
local id = text:match('[/arep]: .*%[(%d+)%]: .*')
sampSendChat('/ans ' .. id .. ' /pass [id]')
end
if text:match('[/arep]: .*%[%d+%]: Как показать лицензии?') then
local id = text:match('[/arep]: .*%[(%d+)%]: .*')
sampSendChat('/ans ' .. id .. ' /lic [id]')
end
end

Вроде всё правильно сделал, но всё равно в итоге не срабатывает. Формат строки [/arep] Bomj_Bomj[228]: Как показать паспорт?, но всё же кажется что что то не так с регулярными выражениями.
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Все же есть проблемы с этим:


Вроде всё правильно сделал, но всё равно в итоге не срабатывает. Формат строки [/arep] Bomj_Bomj[228]: Как показать паспорт?, но всё же кажется что что то не так с регулярными выражениями.
LUA чувствителен к регистру, может быть пишут "как ПОКазать паспорт" или тому подобное? В таком случае работать не будет.
А если же нет.
Lua:
local sampev = require 'lib.samp.events'

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

function sampev.onServerMessage(color, text)
    if text:find('Жалоба: %a+_%a+[%d+]: .+') then
        local id, ques = text:match('Жалоба: %a+_%a+%[(%d+)%]: (.+)')
        if ques:find('Как показать паспорт?') then
            sampSendChat('/ans '..id..' /pass [ID]')
        end
    end
end
end
end[/code]
А так же нужно скачать SAMP.Lua(https://blast.hk/threads/14624/)
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
LUA чувствителен к регистру, может быть пишут "как ПОКазать паспорт" или тому подобное? В таком случае работать не будет.
А если же нет.
Описание: В Lua есть встроенная библиотека String, которая позволяет работать со строками. Среди прочих функций, есть string.lower и string.upper - перевод строки в верхний и нижний регистр соответственно. Русские буквы стандартная библиотека пропускает. Это неприятно. Чтобы переводить русские буквы, можно воспользоваться следующими функциями:
Lua:
local russian_characters = {
    [168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я',
}
function string.rlower(s)
    s = s:lower()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:lower()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 192 and ch <= 223 then -- upper russian characters
            output = output .. russian_characters[ch + 32]
        elseif ch == 168 then -- Ё
            output = output .. russian_characters[184]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
function string.rupper(s)
    s = s:upper()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:upper()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 224 and ch <= 255 then -- lower russian characters
            output = output .. russian_characters[ch - 32]
        elseif ch == 184 then -- ё
            output = output .. russian_characters[168]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
Пример использования:
Lua:
print(string.rupper("Привет, Petya."))
> ПРИВЕТ, PETYA.
print(string.rlower("Привет, Petya."))
> привет, petya.
Автор: legend2360
 
  • Нравится
Реакции: AnWu
D

deleted-user-164854

Гость
Есть два вопроса:
1) Можно ли хоть как то в sampev.onServerMessage(color, text) использовать wait(1000)?
2) Можно ли, что бы текст, который был отловлен sampev.onServerMessage(color, text) был виден.?
 

Musaigen

abobusnik
Проверенный
1,607
1,365
Как можно изменить галочку в чекбоксе, например чтоб она была квадратом или кругом?(imGui)