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

Terratomorf

Известный
315
58
В чём проблема? при появлении текста в чате У вас нет наживы" он должен прописать /rdkk
Код:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'

function main()

    while true do
        wait(0)
        if GoNajivka then
           sampSendChat('/rdkk')
           GoNajivka = false
        end
    end
end

function sampev.onServerMessage(color, text)
    if text:find('У вас нет наживы') then
        GoNajivka = true
    end
 

Acerdragons

Известный
22
0
Lua:
require "lib.moonloader" -- В этой библиотеки находятся коды клавиш.

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait (0)
            sampRegisterChatCommand("activebaseball", funca)
            requestAnimation("BASEBALL") -- Загружаем анимацию
            result = hasAnimationLoaded("BASEBALL") -- Проверка на то что пак анимации "BASEBALL" загружен
            function funca(funca)
                if #funca == 0 then
                    taskPlayAnim(playerPed, "BAT_PART", "BASEBALL", 4.0, false, false, false, false, 10000) -- Воспроизводим анимацию.
                end
            end
        end
    end
Команда не работает. Причем, открываю консоль, а там бесконечный флуд:
"RegisterCommand Error: Command "activebaseball" already exists."

Потом, когда флуд закончился:
"[ML] (error) anim3.lua: attempt to call a nil value
stack traceback:
[ML] (error) anim3.lua: Script died due to an error. (0B4B753C)"

Что тут не так?
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Lua:
require "lib.moonloader" -- В этой библиотеки находятся коды клавиш.

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait (0)
            sampRegisterChatCommand("activebaseball", funca)
            requestAnimation("BASEBALL") -- Загружаем анимацию
            result = hasAnimationLoaded("BASEBALL") -- Проверка на то что пак анимации "BASEBALL" загружен
            function funca(funca)
                if #funca == 0 then
                    taskPlayAnim(playerPed, "BAT_PART", "BASEBALL", 4.0, false, false, false, false, 10000) -- Воспроизводим анимацию.
                end
            end
        end
    end
Команда не работает. Причем, открываю консоль, а там бесконечный флуд:
"RegisterCommand Error: Command "activebaseball" already exists."

Потом, когда флуд закончился:
"[ML] (error) anim3.lua: attempt to call a nil value
stack traceback:
[ML] (error) anim3.lua: Script died due to an error. (0B4B753C)"

Что тут не так?
Потому что у тебя функция внутри функции.
 

LinkelnAweil

Участник
122
7
Как с помощью inicfg сделать чтобы информация загружалась из settings.ini и например выводилось в чат через sampAddChatMessage. Если не трудно, дайте код)
 

tlwsn

Известный
537
85
как сделать проверку находится ли мой персонаж в полицейском транспорте(и фбр ранчер и полицейский maverikи полицейский мотик)
 
Последнее редактирование:

StarFresko1227

Известный
46
1
Код:
local sampev = require 'lib.samp.events'

function main()
    while true do
        wait(0)
        if bGO == 1 then
            if bid ~= nil then
                sampSendChat(string.format("/b привет %d", bid))
                bGO = 0
            end
        end
    end
end

function sampev.onServerMessage(color, text)
    bnick, bid, btext = string.match(text, "(.*)%[(%d+)%]%s+%(%(%s+%{FFE6E6%}(.*)%{FFFFFF%}%s+%)%)")
    if btext ~= nil and bnick ~= nil and bid ~= nil then
        if string.find(btext, "тест скрипта") then
            bGO = 1
        end
    end
end

Вот, почему не работает?
 
1,417
1,032
Код:
local sampev = require 'lib.samp.events'

function main()
    while true do
        wait(0)
        if bGO == 1 then
            if bid ~= nil then
                sampSendChat(string.format("/b привет %d", bid))
                bGO = 0
            end
        end
    end
end

function sampev.onServerMessage(color, text)
    bnick, bid, btext = string.match(text, "(.*)%[(%d+)%]%s+%(%(%s+%{FFE6E6%}(.*)%{FFFFFF%}%s+%)%)")
    if btext ~= nil and bnick ~= nil and bid ~= nil then
        if string.find(btext, "тест скрипта") then
            bGO = 1
        end
    end
end

Вот, почему не работает?
строку скинь, которую он должен обработать
 

Aniki

🐰
Администратор
1,228
1,558
Как с помощью inicfg сделать чтобы информация загружалась из settings.ini и например выводилось в чат через sampAddChatMessage. Если не трудно, дайте код)
Например у тебя такой инишник
Код:
[main]
foo=bar
Тогда чтобы вывести это одно значение
Lua:
local inicfg = require 'inicfg'

local ini = inicfg.load({}, path) -- path - адрес по которому лежит твой ini
sampAddChatMessage(ini.main.foo, -1) -- выведет 'bar' в чат
 

Acerdragons

Известный
22
0
Что делать если в консоли флудит:
"
RegisterCommand Error: Command "batpunch 4" already exists.
RegisterCommand Error: Command "batpunch 5" already exists.
RegisterCommand Error: Command "batready" already exists.
RegisterCommand Error: Command "leftopendoor" already exists.
"
А потом скрипт умирает, при этом, команды не работают.
Lua:
require "lib.moonloader" -- В этой библиотеки находятся коды клавиш.

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait (0)

      requestAnimation("AIRPORT")
            result = hasAnimationLoaded("AIRPORT")
     
            requestAnimation("ATTRACTORS")
            result1 = hasAnimationLoaded("ATTRACTORS")

            requestAnimation("BAR")
            result2 = hasAnimationLoaded("BAR")

            requestAnimation("BASEBALL")
            result3 = hasAnimationLoaded("BASEBALL")

            sampRegisterChatCommand("leftopendoor", a1)

            sampRegisterChatCommand("sit 1", a2)

            sampRegisterChatCommand("bottletook", a3)

            sampRegisterChatCommand("stayontable", a4)

            sampRegisterChatCommand("bottlefromunder", a5)

            sampRegisterChatCommand("givebottle", a6)

            sampRegisterChatCommand("seaweed", a7)

            sampRegisterChatCommand("stayontable 2", a8)

            sampRegisterChatCommand("callwithbar", a9)

            sampRegisterChatCommand("drink 1", a10)

            sampRegisterChatCommand("drink 2", a11)

            sampRegisterChatCommand("batpunch 1", a12)

            sampRegisterChatCommand("batpunch 2", a13)

            sampRegisterChatCommand("batpunch 3", a14)

            sampRegisterChatCommand("batpunch 4", a15)

            sampRegisterChatCommand("batpunch 5", a16)

            sampRegisterChatCommand("batready", a17)
        end
    end

    function a1(a1)
        if #a1 == 0 then
            if result then
            taskPlayAnim(playerPed, "THRW_BARL_THRW", "AIRPORT", 4.0, false, false, false, false, 2000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a2(a2)
        if #a2 == 0 then
            if result1 then
            taskPlayAnim(playerPed, "ATTRACTORS", "STEPSIT_IN", 4.0, false, false, false, false, 1670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a3(a3)
        if #a3 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARCUSTOM_GET", "BAR", 4.0, false, false, false, false, 3000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a4(a4)
        if #a4 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARMAN_IDLE", "BAR", 4.0, false, false, false, false, 8330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a5(a5)
        if #a5 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_BOTTLE", "BAR", 4.0, false, false, false, false, 3000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a6(a6)
        if #a6 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_GIVE", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a7(a7)
        if #a7 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_GLASS", "BAR", 4.0, false, false, false, false, 3670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a8(a8)
        if #a8 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a9(a9)
        if #a9 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_ORDER", "BAR", 4.0, false, false, false, false, 3670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a10(a10)
        if #a10 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "DNK_STNDF_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a11(a11)
        if #a11 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "DNK_STNDM_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a12(a12)
        if #a12 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_1", "BASEBALL", 4.0, false, false, false, false, 900) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a13(a13)
        if #a13 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_2", "BASEBALL", 4.0, false, false, false, false, 1130) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a14(a14)
        if #a14 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_3", "BASEBALL", 4.0, false, false, false, false, 1200) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a15(a15)
        if #a15 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_4", "BASEBALL", 4.0, false, false, false, false, 1000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a16(a17)
        if #a17 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_IDLE", "BAT", 4.0, true, false, false, false, 930) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Что делать если в консоли флудит:
"
RegisterCommand Error: Command "batpunch 4" already exists.
RegisterCommand Error: Command "batpunch 5" already exists.
RegisterCommand Error: Command "batready" already exists.
RegisterCommand Error: Command "leftopendoor" already exists.
"
А потом скрипт умирает, при этом, команды не работают.
Lua:
require "lib.moonloader" -- В этой библиотеки находятся коды клавиш.

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait (0)

      requestAnimation("AIRPORT")
            result = hasAnimationLoaded("AIRPORT")
   
            requestAnimation("ATTRACTORS")
            result1 = hasAnimationLoaded("ATTRACTORS")

            requestAnimation("BAR")
            result2 = hasAnimationLoaded("BAR")

            requestAnimation("BASEBALL")
            result3 = hasAnimationLoaded("BASEBALL")

            sampRegisterChatCommand("leftopendoor", a1)

            sampRegisterChatCommand("sit 1", a2)

            sampRegisterChatCommand("bottletook", a3)

            sampRegisterChatCommand("stayontable", a4)

            sampRegisterChatCommand("bottlefromunder", a5)

            sampRegisterChatCommand("givebottle", a6)

            sampRegisterChatCommand("seaweed", a7)

            sampRegisterChatCommand("stayontable 2", a8)

            sampRegisterChatCommand("callwithbar", a9)

            sampRegisterChatCommand("drink 1", a10)

            sampRegisterChatCommand("drink 2", a11)

            sampRegisterChatCommand("batpunch 1", a12)

            sampRegisterChatCommand("batpunch 2", a13)

            sampRegisterChatCommand("batpunch 3", a14)

            sampRegisterChatCommand("batpunch 4", a15)

            sampRegisterChatCommand("batpunch 5", a16)

            sampRegisterChatCommand("batready", a17)
        end
    end

    function a1(a1)
        if #a1 == 0 then
            if result then
            taskPlayAnim(playerPed, "THRW_BARL_THRW", "AIRPORT", 4.0, false, false, false, false, 2000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a2(a2)
        if #a2 == 0 then
            if result1 then
            taskPlayAnim(playerPed, "ATTRACTORS", "STEPSIT_IN", 4.0, false, false, false, false, 1670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a3(a3)
        if #a3 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARCUSTOM_GET", "BAR", 4.0, false, false, false, false, 3000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a4(a4)
        if #a4 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARMAN_IDLE", "BAR", 4.0, false, false, false, false, 8330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a5(a5)
        if #a5 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_BOTTLE", "BAR", 4.0, false, false, false, false, 3000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a6(a6)
        if #a6 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_GIVE", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a7(a7)
        if #a7 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_GLASS", "BAR", 4.0, false, false, false, false, 3670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a8(a8)
        if #a8 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a9(a9)
        if #a9 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "BARSERVE_ORDER", "BAR", 4.0, false, false, false, false, 3670) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a10(a10)
        if #a10 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "DNK_STNDF_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a11(a11)
        if #a11 == 0 then
            if result2 then
            taskPlayAnim(playerPed, "DNK_STNDM_LOOP", "BAR", 4.0, false, false, false, false, 2330) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a12(a12)
        if #a12 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_1", "BASEBALL", 4.0, false, false, false, false, 900) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a13(a13)
        if #a13 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_2", "BASEBALL", 4.0, false, false, false, false, 1130) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a14(a14)
        if #a14 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_3", "BASEBALL", 4.0, false, false, false, false, 1200) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a15(a15)
        if #a15 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_4", "BASEBALL", 4.0, false, false, false, false, 1000) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end

    function a16(a17)
        if #a17 == 0 then
            if result3 then
            taskPlayAnim(playerPed, "BAT_IDLE", "BAT", 4.0, true, false, false, false, 930) -- Воспроизводим анимацию.
            wait (-1)
        end
    end
    end
Может потому что ты регистрируешь команды в цикле? Они регистрируются один раз при загрузке скрипта.
Цикл это отдельная субстанция, не надо туда совать всё подряд.

И это, попробуй почитать теорию по Lua.
 

Acerdragons

Известный
22
0
Может потому что ты регистрируешь команды в цикле? Они регистрируются один раз при загрузке скрипта.
Цикл это отдельная субстанция, не надо туда совать всё подряд.

И это, попробуй почитать теорию по Lua.
Увидел, спасибо.
 
1,417
1,032
Nick_Name[227] (( {FFE6E6}тест{FFFFFF} ))
Lua:
local sampev = require 'lib.samp.events'

function main()
    repeat wait(0) until isSampAvailable()
    wait(-1)
end

function sampev.onServerMessage(color, text)
    if text:find('(.*)%[(%d+)%] %(%(%s+{%x+}(.*){%x+}%s+%)%)') then
        local bnick, bid, btext = text:match('(.*)%[(%d+)%] %(%(%s+{%x+}(.*){%x+}%s+%)%)')
        if btext:find('тест скрипта') then
            lua_thread.create(function(id)
                sampSendChat('/b привет '..id)
            end, bid)
        end
    end
end