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

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Команды не работают, можете помочь? (Мой первый код) Выдаёт ошибку в логах Helper: Script terminated. (10C89B94)
Сообщения при загрузке сампа появляются.
Lua:
script_name ("Helper")
script_author ("Harly Cloud")
script_description ("helpermenu")


require "lib.moonloader"

local tag = "[Helper]:"
local main_color = 0x009EFF
local main_color_text = "{FFFFFF}"
local white_color = "{FFFFFF}"

function main()
   if not isSampLoaded() or not isSampfuncsLoaded() then return end
   while not isSampAvailable() do wait(100) end
        sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Успешно загружен!", 0x01A0E9)
         sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Активация {009EFF}/mhelper{FFFFFF} by Harly Cloud", 0x01A0E9)

    sampRegisterChatCommand("mhelper", menu)
    sampRegisterChatCommand("fh", findh)
   end


function menu()
    sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Меню открыто.", 0x01A0E9)
end

function findh(arg)
    if #arg == 0 then
        sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Вы не ввели ID дома", 0x01A0E9)
    else
        sampSendChat('/findihouse ' ..arg)
    end
end
 

Juasmeo

Новичок
1
1
Команды не работают, можете помочь? (Мой первый код) Выдаёт ошибку в логах Helper: Script terminated. (10C89B94)
Сообщения при загрузке сампа появляются.
Lua:
script_name ("Helper")
script_author ("Harly Cloud")
script_description ("helpermenu")


require "lib.moonloader"

local tag = "[Helper]:"
local main_color = 0x009EFF
local main_color_text = "{FFFFFF}"
local white_color = "{FFFFFF}"

function main()
   if not isSampLoaded() or not isSampfuncsLoaded() then return end
   while not isSampAvailable() do wait(100) end
        sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Успешно загружен!", 0x01A0E9)
         sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Активация {009EFF}/mhelper{FFFFFF} by Harly Cloud", 0x01A0E9)

    sampRegisterChatCommand("mhelper", menu)
    sampRegisterChatCommand("fh", findh)
   end


function menu()
    sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Меню открыто.", 0x01A0E9)
end

function findh(arg)
    if #arg == 0 then
        sampAddChatMessage("{009EFF}[Helper]:{FFFFFF} Вы не ввели ID дома", 0x01A0E9)
    else
        sampSendChat('/findihouse ' ..arg)
    end
end
Проблема в том, что у тебя нет бесконечной паузы или бесконечного цикла, из-за чего скрипт после выполнения main() просто останавливается. Добавь wait(-1) в самый конец function main(), это не даст скрипту остановиться.
 
  • Нравится
Реакции: HarlyCloud

Next..

Известный
343
136
Как сделать чтоб ответ шел при нажатии на клавишу?

Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')

local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                lua_thread.create(function()
                    wait(1000)
                    sampSendChat(string.format('/ans %s %s', id, v))
                end)
            end
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    wait(-1)
end
 

Lucifer Melton

Активный
164
57
Как сделать чтоб ответ шел при нажатии на клавишу?

Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')

local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                lua_thread.create(function()
                    wait(1000)
                    sampSendChat(string.format('/ans %s %s', id, v))
                end)
            end
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    wait(-1)
end
Кажется так))
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')

local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                lua_thread.create(function()
                    while not isKeyJustPressed(int key) do wait(0) end -- в место int key ставишь виртуальный код клавиш 
                    wait(1000)
                    sampSendChat(string.format('/ans %s %s', id, v))
                end)
            end
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    wait(-1)
end
 
Последнее редактирование:

Lucifer Melton

Активный
164
57
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
   if text:match('Жалоба/вопрос от (.*)[(%d+)]: (.*)') then
           nick, id, other = text:match('Жалоба/вопрос от (.*)[(%d+)]: (.*)')
        if other == 'Как открыть меню?' then
            lua_thread.create(function()
                sampSendChat('/ans '..id..' Введите /mm')
            end)
        end
        if other == 'Как войти в дверь?' then
            lua_thread.create(function()
                sampSendChat('/ans '..id..' Нажмите ALT')
            end)
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    while true do
        wait(0)
    end
end
Лучше так не делай
 

Cod

Участник
117
15
Привет, как тут выводить GameText на экране?
(эти такие игровые сообщения справа внизу типа где в ванильке пишет название регионов)
 

sᴀxᴏɴ

саксофон
Всефорумный модератор
791
853
Привет, как тут выводить GameText на экране?
(эти такие игровые сообщения справа внизу типа где в ванильке пишет название регионов)
printStyledString('Sample text', 100, 2)
 
Последнее редактирование:
  • Нравится
Реакции: Cod

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я нигде не нашёл такой информации, а как сделать так если нажать на "пусто" начался флуд в чат через sampAddChatMessage. Или же начался какой то цикличный процесс с задержкой. Или же открылся новый диалог.
Lua:
function menu()
sampShowDialog(1337, "{ffffff}Общая информация по хелперу.", "Пусто", "Закрыть", "Далее", 2)
end
 
Последнее редактирование:
  • Нравится
Реакции: Cod

Cod

Участник
117
15
Я нигде не нашёл такой информации, а как сделать так если нажать на "пусто" начался флуд в чат через sampAddChatMessage. Или же начался какой то цикличный процесс с задержкой.
Lua:
function menu()
sampShowDialog(1337, "{ffffff}Общая информация по хелперу.", "Пусто", "Закрыть", "Далее", 2)
end
 
  • Нравится
Реакции: HarlyCloud

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Я нигде не нашёл такой информации, а как сделать так если нажать на "пусто" начался флуд в чат через sampAddChatMessage. Или же начался какой то цикличный процесс с задержкой.
Lua:
function menu()
sampShowDialog(1337, "{ffffff}Общая информация по хелперу.", "Пусто", "Закрыть", "Далее", 2)
end
Lua:
-- В бесконечный цикл
local result, button, list, input = sampHasDialogRespond(1337) -- 1337 - ID диалогового окна
    if result then
        if button == 1 and list == 0 then -- button 1 - Левая кнопка. button 0 - Правая. list 0 - Первая строка в окне.(Если имеется)
            lua_thread.create(function()
            sampAddChatMessage("Text", -1)
            wait(1000)
            sampAddChatMessage("Text 2", -1)
            end)
        end
    end
 
  • Нравится
Реакции: HarlyCloud

yeahbitch

Потрачен
28
5
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ребят, как сделать авто маркер на метку(gps)?
 

HarlyCloud

Потрачен
238
67
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не подскажите как сделать так чтобы через диалоговое окно можно вкл/выкл. авто акцент. Или же другие функции.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Не подскажите как сделать так чтобы через диалоговое окно можно вкл/выкл. авто акцент. Или же другие функции.
Как-то так..
Lua:
require "lib.moonloader"
local status = false -- Сам статус. Изначально OFF

function main ()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("dialog", dialog) -- Создаем диалоговое окно на команду /dialog
    while true do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(1337)
            if result then
                if button == 1 and list == 0 then -- Если нажать на левую кнопку и 1 строку
                state = not state -- То статус будет включаться и выключаться
                dialog() -- И диалог будет снова появляться, чтобы заново его не открывать
                if state then printStringNow("~g~ON", 500) else printStringNow("~r~OFF", 500) end -- Если акцент включен, то на экране снизу появится ON, иначе OFF. Но это можешь убрать, это я для примера
                end
            end
    end
end


function dialog() -- Сам диалог.
    sampShowDialog(1337, "Заголовок", "Акцент\tСтатус\nРусский\t"..(state and '{00AA00}ON' or '{AA0000}OFF'), "Включить", "Закрыть", 5)
end
 
  • Нравится
Реакции: HarlyCloud