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

why ega

РП игрок
Модератор
2,537
2,217
Пишу функцию бега на синхре, пока накидал вот такой код, но один вопрос: как правильно расчитывать moveSpeed по осям?
Lua:
function botRunToPosition(x, y, z, bot)     
    lua_thread.create(function()   
        local bx, by, bz = bot.position.x, bot.position.y, bot.position.z   
        local angle = getHeadingFromVector2d(x - bx, y - by)                       
        while getDistanceBetweenCoords3d(bx, by, bz, x, y, z) > 0.8 do
            local data = mb.getPlayerData()           
            local qz, qw = angleToQuaternion(angle) 
            data.upDownKeys = 65408   
            data.keysData = 8
            data.position.x, data.position.y, data.position.z = bx, by, bz
            -- сюда бы мувспидика бахнуть
            data.quaternion.z, data.quaternion.w = qz, qw           
            bot:sendPlayerData(data)
            
            bx, by, bz = bot.position.x, bot.position.y, bot.position.z             
            wait(0)         
        end
    end)
end
 

sosnov

Известный
331
115
делаю скрипт,какой в этом вопросе не имеет значение,вообщем вот код вывода текста в чат(только строка сампаадчатмессаге):
Lua:
sampAddChatMessage(string.format(u8'Подключаем %s (Номер: %d)', bot.name, bot.index), -1)

кодировка виндовс 1251 стоит,екодинг подключил,но текст выводится так:
FDHOUSFHFSDF (имя бота) HJAHDS: (ИНДЕКС БОТА)

помогите проблему решить плизе

делаю скрипт,какой в этом вопросе не имеет значение,вообщем вот код вывода текста в чат(только строка сампаадчатмессаге):
Lua:
sampAddChatMessage(string.format(u8'Подключаем %s (Номер: %d)', bot.name, bot.index), -1)

кодировка виндовс 1251 стоит,екодинг подключил,но текст выводится так:


помогите проблему решить плизе
проблема в том что просто текст в чат нормально не выводится
 
Последнее редактирование:
  • Эм
Реакции: YarikVL

why ega

РП игрок
Модератор
2,537
2,217
делаю скрипт,какой в этом вопросе не имеет значение,вообщем вот код вывода текста в чат(только строка сампаадчатмессаге):
Lua:
sampAddChatMessage(string.format(u8'Подключаем %s (Номер: %d)', bot.name, bot.index), -1)

кодировка виндовс 1251 стоит,екодинг подключил,но текст выводится так:


помогите проблему решить плизе


проблема в том что просто текст в чат нормально не выводится
убери u8 при выводе в чат, самп поддерживает кодировку windows1251
 
  • Нравится
Реакции: sosnov

sosnov

Известный
331
115
как сделать так чтоб в мимгуи окне в бегине был и текст и крестик,не создавай два окна?
 

sosnov

Известный
331
115
Lua:
imgui.BeginChild("child")
    if imgui.Button("тут подгружаешь иконку крестика") then
        tvoeOkno = false
    end
    imgui.Text("Крутой текст")
imgui.EndChild()
баля,это не совсем то,смотри,вот про какие я бегины:
Lua:
imgui.Begin('##shit', renderWindow, imgui.WindowFlags.NoResize)
        imgui.Begin(u8'Меню Бота-Пса', menu, imgui.WindowFlags.NoResize)

и вот, я хочу шоб там и крестик и надпись была(на вот этой шторке где крестик)

баля,это не совсем то,смотри,вот про какие я бегины:
Lua:
imgui.Begin('##shit', renderWindow, imgui.WindowFlags.NoResize)
        imgui.Begin(u8'Меню Бота-Пса', menu, imgui.WindowFlags.NoResize)

и вот, я хочу шоб там и крестик и надпись была(на вот этой шторке где крестик)
исправил во 2 строке menu на рендер виндов(так мое окно называется) крестик появился,но второе окно тоже осталось
 

Smeruxa

Известный
1,294
680
баля,это не совсем то,смотри,вот про какие я бегины:
Lua:
imgui.Begin('##shit', renderWindow, imgui.WindowFlags.NoResize)
        imgui.Begin(u8'Меню Бота-Пса', menu, imgui.WindowFlags.NoResize)

и вот, я хочу шоб там и крестик и надпись была(на вот этой шторке где крестик)


исправил во 2 строке menu на рендер виндов(так мое окно называется) крестик появился,но второе окно тоже осталось
Переменные должны быть imgui
menu = imgui.ImBool(false)
renderWindow = imgui.ImBool(false)
 

sosnov

Известный
331
115
Переменные должны быть imgui
menu = imgui.ImBool(false)
renderWindow = imgui.ImBool(false)
это у меня есть,я кстати нашел решение,там легко было...

новая проблема,и опять с темой мимгуи,вообщем хочу изменить цвет темы в окне,но ничего не получается.... вот цвет в конце кода:
Lua:
function imgui.Theme()
    imgui.SwitchContext()
    imgui.GetStyle().FramePadding = imgui.ImVec2(3.5, 3.5)
    imgui.GetStyle().FrameRounding = 3
    imgui.GetStyle().ChildRounding = 2
    imgui.GetStyle().WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
    imgui.GetStyle().WindowRounding = 2
    imgui.GetStyle().ItemSpacing = imgui.ImVec2(5.0, 4.0)
    imgui.GetStyle().ScrollbarSize = 13.0
    imgui.GetStyle().ScrollbarRounding = 0
    imgui.GetStyle().GrabMinSize = 8.0
    imgui.GetStyle().GrabRounding = 1.0
    imgui.GetStyle().WindowPadding = imgui.ImVec2(4.0, 4.0)
    imgui.GetStyle().ButtonTextAlign = imgui.ImVec2(0.0, 0.5)

    imgui.GetStyle().Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.14, 0.12, 0.16, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ChildBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.00)
    imgui.GetStyle().Colors[imgui.Col.PopupBg] = imgui.ImVec4(0.05, 0.05, 0.10, 0.90)
    imgui.GetStyle().Colors[imgui.Col.Border] = imgui.ImVec4(0.89, 0.85, 0.92, 0.30)
    imgui.GetStyle().Colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBg] = imgui.ImVec4(0.30, 0.20, 0.39, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.68)
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBg] = imgui.ImVec4(0.41, 0.19, 0.63, 0.45)
    imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed] = imgui.ImVec4(0.41, 0.19, 0.63, 0.35)
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.MenuBarBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.57)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarBg] = imgui.ImVec4(0.30, 0.20, 0.39, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab] = imgui.ImVec4(0.41, 0.19, 0.63, 0.31)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.CheckMark] = imgui.ImVec4(0.56, 0.61, 1.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.SliderGrab] = imgui.ImVec4(0.41, 0.19, 0.63, 0.24)
    imgui.GetStyle().Colors[imgui.Col.SliderGrabActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Button] = imgui.ImVec4(0.41, 0.19, 0.63, 0.44)
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.86)
    imgui.GetStyle().Colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.64, 0.33, 0.94, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Header] = imgui.ImVec4(0.41, 0.19, 0.63, 0.76)
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.86)
    imgui.GetStyle().Colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ResizeGrip] = imgui.ImVec4(0.41, 0.19, 0.63, 0.20)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotLines] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
    imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogram] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.41, 0.19, 0.63, 0.43)
end

вот онитиализ в начале(после подключение либов):

Lua:
imgui.OnInitialize(function()
    theme()
end)

вот ошибка в логе мунлоадера при попытке открытия окна:
[16:05:15.379777] (error) botpes.lua: F:\Clear GTA SAMP low PC\moonloader\botpes.lua:14: attempt to call global 'theme' (a nil value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\botpes.lua:14: in function 'cb'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:86: in function 'InitializeRenderer'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:94: in function <F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:91>
[16:05:15.381779] (error) botpes.lua: Script died due to an error. (09A9C224)
 
Последнее редактирование:

Sadow

Известный
1,437
585
это у меня есть,я кстати нашел решение,там легко было...

новая проблема,и опять с темой мимгуи,вообщем хочу изменить цвет темы в окне,но ничего не получается.... вот цвет в конце кода:
Lua:
function imgui.Theme()
    imgui.SwitchContext()
    imgui.GetStyle().FramePadding = imgui.ImVec2(3.5, 3.5)
    imgui.GetStyle().FrameRounding = 3
    imgui.GetStyle().ChildRounding = 2
    imgui.GetStyle().WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
    imgui.GetStyle().WindowRounding = 2
    imgui.GetStyle().ItemSpacing = imgui.ImVec2(5.0, 4.0)
    imgui.GetStyle().ScrollbarSize = 13.0
    imgui.GetStyle().ScrollbarRounding = 0
    imgui.GetStyle().GrabMinSize = 8.0
    imgui.GetStyle().GrabRounding = 1.0
    imgui.GetStyle().WindowPadding = imgui.ImVec2(4.0, 4.0)
    imgui.GetStyle().ButtonTextAlign = imgui.ImVec2(0.0, 0.5)

    imgui.GetStyle().Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.14, 0.12, 0.16, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ChildBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.00)
    imgui.GetStyle().Colors[imgui.Col.PopupBg] = imgui.ImVec4(0.05, 0.05, 0.10, 0.90)
    imgui.GetStyle().Colors[imgui.Col.Border] = imgui.ImVec4(0.89, 0.85, 0.92, 0.30)
    imgui.GetStyle().Colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBg] = imgui.ImVec4(0.30, 0.20, 0.39, 1.00)
    imgui.GetStyle().Colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.68)
    imgui.GetStyle().Colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TitleBg] = imgui.ImVec4(0.41, 0.19, 0.63, 0.45)
    imgui.GetStyle().Colors[imgui.Col.TitleBgCollapsed] = imgui.ImVec4(0.41, 0.19, 0.63, 0.35)
    imgui.GetStyle().Colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.MenuBarBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.57)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarBg] = imgui.ImVec4(0.30, 0.20, 0.39, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrab] = imgui.ImVec4(0.41, 0.19, 0.63, 0.31)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.ScrollbarGrabActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.CheckMark] = imgui.ImVec4(0.56, 0.61, 1.00, 1.00)
    imgui.GetStyle().Colors[imgui.Col.SliderGrab] = imgui.ImVec4(0.41, 0.19, 0.63, 0.24)
    imgui.GetStyle().Colors[imgui.Col.SliderGrabActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Button] = imgui.ImVec4(0.41, 0.19, 0.63, 0.44)
    imgui.GetStyle().Colors[imgui.Col.ButtonHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.86)
    imgui.GetStyle().Colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.64, 0.33, 0.94, 1.00)
    imgui.GetStyle().Colors[imgui.Col.Header] = imgui.ImVec4(0.41, 0.19, 0.63, 0.76)
    imgui.GetStyle().Colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.86)
    imgui.GetStyle().Colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.ResizeGrip] = imgui.ImVec4(0.41, 0.19, 0.63, 0.20)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 0.78)
    imgui.GetStyle().Colors[imgui.Col.ResizeGripActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotLines] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
    imgui.GetStyle().Colors[imgui.Col.PlotLinesHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogram] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
    imgui.GetStyle().Colors[imgui.Col.PlotHistogramHovered] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
    imgui.GetStyle().Colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.41, 0.19, 0.63, 0.43)
end

вот онитиализ в начале(после подключение либов):

Lua:
imgui.OnInitialize(function()
    theme()
end)

вот ошибка в логе мунлоадера при попытке открытия окна:
[16:05:15.379777] (error) botpes.lua: F:\Clear GTA SAMP low PC\moonloader\botpes.lua:14: attempt to call global 'theme' (a nil value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\botpes.lua:14: in function 'cb'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:86: in function 'InitializeRenderer'
F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:94: in function <F:\Clear GTA SAMP low PC\moonloader\lib\mimgui\init.lua:91>
[16:05:15.381779] (error) botpes.lua: Script died due to an error. (09A9C224)
Lua:
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    imgui.Theme()
end)
Ты в онициализации пытаешься использовать функцию которой нет. Она у тебя называется imgui.Theme()
 
  • Нравится
Реакции: sosnov

MLycoris

Режим чтения
Проверенный
1,795
1,826
новая проблема,и опять с темой мимгуи,вообщем хочу изменить цвет темы в окне,но ничего не получается.... вот цвет в конце кода:
Lua:
function imgui.Theme()
    imgui.SwitchContext()
    imgui.GetStyle().FramePadding = imgui.ImVec2(3.5, 3.5)
    imgui.GetStyle().FrameRounding = 3
поменяй function imgui.Theme() на просто function theme()
 

sosnov

Известный
331
115
помогите,тут проблема,я не могу сделать инпут текст в окне мимгуи и пытаюсь с этим разбираться,вроде нашел решение,но это решение вызывает новую ошибку... вот сам лог муна:
[18:09:40.165172] (error) botpes.lua: F:\Clear GTA SAMP low PC\moonloader\botpes.lua:32: attempt to call field 'ImBuffer' (a nil value)
stack traceback:
F:\Clear GTA SAMP low PC\moonloader\botpes.lua:32: in main chunk

вот сами ImBuffer'ы на которые жалуется ошибка:
Lua:
local botName = imgui.ImBuffer(32)
local inputPreset = imgui.ImBuffer(256)