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

BARRY BRADLEY

Известный
711
176
А как к ответу добавить дополнительный текст? Если что то напишу, ответ не отображается. Типо вот так надо
Текст "ответ" текст
Lua:
local database = {
     {questions="вопрос", answer="ответ"},
     {questions="вопрос", answer="ответ"},
     {questions="вопрос", answer="ответ"},
}
Могут ли два бесконечных цыкла работать параллельно через потоки?
Да.
Lua:
--main
lua_thread.create(potok1)
lua_thread.create(potok2)

-- функции потоков
function potok1()
     while true do
       wait(0)
        --code
     end
end
function potok2()
     while true do
        wait(0)
        --code 2
     end
end
 
Последнее редактирование:
  • Нравится
Реакции: Mamory

Oaeaa

Новичок
4
0
Lua:
local database = {
     {questions="вопрос", answer="ответ"},
     {questions="вопрос", answer="ответ"},
     {questions="вопрос", answer="ответ"},
}

Да.
Lua:
--main
lua_thread.create(function potok1)
lua_thread.create(function potok2)

-- функции потоков
function potok1()
     while true do
       wait(0)
        --code
     end
end
function potok2()
     while true do
        wait(0)
        --code 2
     end
end
Я имел ввиду в аддчатмеседж, если я добавляю какое то слово, то ответ не отображается
 

EndoHokage

Активный
136
55
Привет, мне нужно что бы поток работал только тогда, когда переменная = true, как это можно сделать, заранее спасибо
 

BARRY BRADLEY

Известный
711
176
Привет, мне нужно что бы поток работал только тогда, когда переменная = true, как это можно сделать, заранее спасибо
Lua:
--начало
local activ = false

--main
lua_thread.create(potok)

-- функции потока
function potok()
     while true do wait(0)
        if activ then
             --code
        end
     end
end
Используй activ = not activ или activ = true чтоб активировать работу потока. Так же есть вариант по другому создавать потоки, не запуская один раз, а каждый раз когда тебе надо, будет создавать поток.
Такой вопрос, как при открытом диалоге, открыть другой при этом первый можно как и закрыть так и скрыть. Нужно так что бы любой диалог закрывался или скрывался ибо есть такие диалоги что при закрытии одного возвращает назад. Есть возможно хук какой то?
 
Последнее редактирование:
  • Нравится
Реакции: EndoHokage

RiTwin

Новичок
20
12
Как здесь можно сделать поиск 3d Text'a?
Lua:
function sampev.onServerMessage(color, text)
    if text:find('текст1') and text:find('текст2') and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
    end
end
Скорее всего я сделал поиск текста в чате, а мне нужно немного другое.
Как я понял мне нужно подружить плагин с sampfuncs'ом и вроде даже что-то нашел ( 0B46: samp 3d_text 0@ defined ), но я не знаю как это сделать.
Не могли бы вы мне помочь с этим?
 

sadbones

Известный
374
174
Как здесь можно сделать поиск 3d Text'a?
Lua:
function sampev.onServerMessage(color, text)
    if text:find('текст1') and text:find('текст2') and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then
    end
end
Скорее всего я сделал поиск текста в чате, а мне нужно немного другое.
Как я понял мне нужно подружить плагин с sampfuncs'ом и вроде даже что-то нашел ( 0B46: samp 3d_text 0@ defined ), но я не знаю как это сделать.
Не могли бы вы мне помочь с этим?
Узнаешь ид 3d текста, а потом https://blast.hk/wiki/lua:sampget3dtextinfobyid
 
  • Нравится
Реакции: RiTwin

sadbones

Известный
374
174
Скиньте пожалуйста сайт где можно будет в любой момент изменить файл или код в нем нужно для автообновления такой сайт найти не могу
Вариантов масса: gitlab, github, jsonbin.io, бесплатный хостинг (нажми справа на воздушный шар и получишь х2 к месту для файлов). Регистрируемся, создаем gist/файл и получаем на него прямую raw ссылку, а сам файл обновляем по мере необходимости.
 

EndoHokage

Активный
136
55
Привет, помогите пожалуйста, не получается. Когда в /b [Жалоба] от. То работает.
Lua:
function sampev.onServerMessage(color, text)
    if string.find(text, '[Жалоба] от ', 1, true) and startwork == true then
        sampSendChat("/ot")
        print("Жалоба была словлена")
        startwork = false
        return false
    end
    return true
end
Цвет влияет на поиск?
 
  • Нравится
Реакции: Mamory

EndoHokage

Активный
136
55
Привет, помогите пожалуйста, не получается. Когда в /n [Жалоба] от. То работает.
Lua:
function sampev.onServerMessage(color, text)
    if string.find(text, '[Жалоба] от ', 1, true) and startwork == true then
        sampSendChat("/ot")
        print("Жалоба была словлена")
        startwork = false
        return false
    end
    return true
end
Цвет влияет на поиск?
 
  • Нравится
Реакции: Mamory

sadbones

Известный
374
174
Гитхаб - u8 сбивается, хз как скачать, гитлаб - я хз там сбивается нельзя скачать в формате .lua ставится на .txt само, jsonbio - для json, бесплатный хостинг - платный хостинг. Скинули норм только выше дроп бокс но на нем все платно хз как
Ты видимо не умеешь ничего делать, даже взять бесплатный хостинг и залить туда файл)
 

EndoHokage

Активный
136
55
все дроп бокс разобрался Lemonager помог уже не надо сяб)

Да, цвет может влиять, его нужно экранировать, вот ниже код ловит текст и добавляет втабилцу
Lua:
jab = {}
function sampev.onServerMessage(color, text)
    jb = text:match('[Жалоба] от (%w+_?%w+)[(%d+)]: (.*)')
    if jb then
        nick, id, other = text:match('[Жалоба] от (%w+_?%w+)[(%d+)]: (.*)')
        table.insert(jab, {nick, id, other})
    end
end

Я поймал записал, но не могу словить слово.
Lua:
function sampev.onServerMessage(color, text)
    if string.find(text, '{EA4444}[Жалоба] от', 1, true) and startwork == true then
        sampSendChat("/ot")
        print("Жалоба была словлена")
        startwork = false
        return false
    end
    return true
end
 
  • Нравится
Реакции: Mamory

BARRY BRADLEY

Известный
711
176
Я поймал записал, но не могу словить слово.
function sampev.onServerMessage(color, text)
if string.find(text, '{EA4444}[Жалоба] от', 1, true) and startwork == true then
sampSendChat("/ot")
print("Жалоба была словлена")
startwork = false
return false
end
return true
end
local nick, id, message = text:match('%[Жалоба%] от (.+)[(%d+)]: (.+)')

Lua:
jab = {}
function sampev.onServerMessage(color, text)
    jb = text:match('%[Жалоба%] от (%w+_?%w+)[(%d+)]: (.*)')
    if jb then
        nick, id, other = text:match('%[Жалоба%] от (%w+_?%w+)[(%d+)]: (.*)')
        table.insert(jab, {nick, id, other})
    end
end