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

Сheesecake

Участник
60
2
Как сделать включение/отключение команды?
Например я пишу /test 1 1 1 и началась работа команды, но если я пропишу еще раз - действие остановится. Делал как-то с active = not active, но оно продолжало работу.


Lua:
function cmd_md(pam)
  lua_thread.create(function()
    local car, clr1, clr2 = pam:match('(%d+)%s(%d+)%s(%d+)')
    if car and clr1 and clr2 then
    setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
    setCharHeading(PLAYER_PED, 270)
    vec2 = getHeadingFromVector2d(x1, y1)
    shit = math.rad(vec2)
    shit = shit + 4.8
    setCameraPositionUnfixed(-0, shit)
    wait(500)
    sampSendChat("/test "..car.." "..clr1.." "..clr2)
    wait(1000)
        setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
    setCharHeading(PLAYER_PED, 270)
    vec2 = getHeadingFromVector2d(x1, y1)
    shit = math.rad(vec2)
    shit = shit + 4.8
    setCameraPositionUnfixed(-0, shit)
    wait(500)
    sampSendChat("/test "..car.." "..clr1.." "..clr2)
    wait(1000)
      else
    sampAddChatMessage(u8'Не ввел параметры, другалек', -1)
    end
    end)
end
 

Curtis

Участник
282
10
В imgui.Combo есть список, в этом списке есть инпут тексты. Сейчас когда я переключаюсь, текст одинаковый, т.е ничего не изменяется. Как сделать, чтобы при выборе комбо все было индывидуально ?
 

HpP

Известный
368
119
Такой вопрос, у меня есть такой цикл:

Lua:
-- массив
local Window_Menu_Vibor = {
    u8'Windows 7',
    u8'Windows 8',
    u8'Windows 8.1',
    u8'Windows 10'
}
-- цикл
                        for k,v in ipairs(Window_Menu_Vibor) do
                            if mimgui.CollapsingHeader(u8''..v) then
                                mimgui.Text(u8'Название: '..v)
                                    if mimgui.Button(u8'Купить ['..Vibor_Price_Window[k]..']', mimgui.ImVec2(-1, 25)) then
                                    end
                            end
                        end

Как сделать так, чтобы по кнопке проходило сохранение в конфиг для разных элементов?
mainIni.Windows.элемент
 

Vintik

Через тернии к звёздам
Проверенный
1,562
1,033
почему крашит игру?
Lua:
function sampev.onSendChat(message)
    if radio_button.v ~= 1 then
        sampSendChat(hueputala..' '..message)
        return false
    end
end
Есть еще один более грамотный метод
@Choppie Blaw, согласись, так красивее
Lua:
function sampev.onSendChat(message)
    if radio_button.v ~= 1 then
        return { hueputala .. ' ' .. message }
    end
end
Ну и, естественно, данный метод более оптимизированнее, потому что обрабатывается отправка одного сообщения в чат, а не двух.
 
Последнее редактирование:
  • Нравится
Реакции: chapo

BlackSnow

Новичок
15
1
Отбой тревоги, разобрался.
Добавил смещение по координате Y, зависящее от итерации
Lua:
renderFontDrawText(OBRInStream, "{"..clist.."}"..sampGetPlayerNickname(id).." {FFFFFF}[" .. id .. "{fafafa}] Дистанция: {79d1d9}"..string.format("%.2f", distance).. " м.", pis_pos_x / 10 - 118, pis_pos_y * 1 - 380 + k*13, - 1)
На самом деле не совсем разобрался. Итерации ж идут 1,2,3,4,5. А нужными из них могут быть 1 и 5, к примеру. Как сделать так, чтобы смещение шло с шагом равным единице?
 

danywa

Активный
358
50
Как сделать включение/отключение команды?
Например я пишу /test 1 1 1 и началась работа команды, но если я пропишу еще раз - действие остановится. Делал как-то с active = not active, но оно продолжало работу.


Lua:
function cmd_md(pam)
  lua_thread.create(function()
    local car, clr1, clr2 = pam:match('(%d+)%s(%d+)%s(%d+)')
    if car and clr1 and clr2 then
    setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
    setCharHeading(PLAYER_PED, 270)
    vec2 = getHeadingFromVector2d(x1, y1)
    shit = math.rad(vec2)
    shit = shit + 4.8
    setCameraPositionUnfixed(-0, shit)
    wait(500)
    sampSendChat("/test "..car.." "..clr1.." "..clr2)
    wait(1000)
        setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
    setCharHeading(PLAYER_PED, 270)
    vec2 = getHeadingFromVector2d(x1, y1)
    shit = math.rad(vec2)
    shit = shit + 4.8
    setCameraPositionUnfixed(-0, shit)
    wait(500)
    sampSendChat("/test "..car.." "..clr1.." "..clr2)
    wait(1000)
      else
    sampAddChatMessage(u8'Не ввел параметры, другалек', -1)
    end
    end)
end
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("cmd", function() st = not st if st then printStringNow("activated", 1000) else printStringNow('deactivated', 1000) end end)
    while true do wait(0) end
end

function cmd_md(pam)
  lua_thread.create(function()
    local car, clr1, clr2 = pam:match('(%d+)%s(%d+)%s(%d+)')
    if st then
        if car and clr1 and clr2 then
        setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
        setCharHeading(PLAYER_PED, 270)
            vec2 = getHeadingFromVector2d(x1, y1)
           shit = math.rad(vec2)
        shit = shit + 4.8
        setCameraPositionUnfixed(-0, shit)
        wait(500)
        sampSendChat("/test "..car.." "..clr1.." "..clr2)
            wait(1000)
        setCharCoordinates(PLAYER_PED, -1476.2, 1249.8, 1028.5)
        setCharHeading(PLAYER_PED, 270)
        vec2 = getHeadingFromVector2d(x1, y1)
        shit = math.rad(vec2)
        shit = shit + 4.8
        setCameraPositionUnfixed(-0, shit)
        wait(500)
        sampSendChat("/test "..car.." "..clr1.." "..clr2)
        wait(1000)
          else
        sampAddChatMessage(u8'Не ввел параметры, другалек', -1)
        end
        end)
    end
end
Попробуй
 

Adrian G.

Известный
Проверенный
519
459
Как заставить окно находиться в одном и том же положении на экране при любом разрешении? При 1366x768 как надо, а меньше уже смещается.
Lua:
function imgui.OnDrawFrame()
    X, Y = getScreenResolution()
    if window.v then
    imgui.SetNextWindowPos(imgui.ImVec2(X/1.25, Y/3.3), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowSize(imgui.ImVec2(260, 290), imgui.Cond.FirstUseEver)
    imgui.Begin('', window, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse)
    imgui.SetCursorPos(imgui.ImVec2(10, 50))
    imgui.Text("1/7")
    imgui.Separator()
    imgui.End()
    end
end
sa-mp-135.png
sa-mp-136.png
 

Вложения

  • sa-mp-136.png
    sa-mp-136.png
    421.3 KB · Просмотры: 37
  • sa-mp-135.png
    sa-mp-135.png
    846.2 KB · Просмотры: 38

Next..

Известный
343
136
Как заставить окно находиться в одном и том же положении на экране при любом разрешении? При 1366x768 как надо, а меньше уже смещается.
Lua:
function imgui.OnDrawFrame()
    X, Y = getScreenResolution()
    if window.v then
    imgui.SetNextWindowPos(imgui.ImVec2(X/1.25, Y/3.3), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowSize(imgui.ImVec2(260, 290), imgui.Cond.FirstUseEver)
    imgui.Begin('', window, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse)
    imgui.SetCursorPos(imgui.ImVec2(10, 50))
    imgui.Text("1/7")
    imgui.Separator()
    imgui.End()
    end
end
x-размер окна по x
 

CaJlaT

07.11.2024 14:55
Модератор
2,840
2,671
Как пользоваться imgui.PushStyleColor() ? Подробно пожайлуста!
C++:
IMGUI_API void          PushStyleColor(ImGuiCol idx, ImU32 col);

Lua:
imgui.PushStyleColor(imgui.Col.Button, imgui.ImVec4(1.0, 0.0, 0.0, 1.0)) -- Установить цвет кнопки на красный
imgui.Button()
imgui.PopStyleColor() -- обязательная функция снятия установки цвета (без неё будет крашить игру)
Список цветов есть в библиотеке imgui
Lua:
imgui.Col = {
    Text                    = 0 + 1,
    TextDisabled            = 1 + 1,
    WindowBg                = 2 + 1,
    ChildWindowBg           = 3 + 1,
    PopupBg                 = 4 + 1,
    Border                  = 5 + 1,
    BorderShadow            = 6 + 1,
    FrameBg                 = 7 + 1,
    FrameBgHovered          = 8 + 1,
    FrameBgActive           = 9 + 1,
    TitleBg                 = 10 + 1,
    TitleBgActive           = 11 + 1,
    TitleBgCollapsed        = 12 + 1,
    MenuBarBg               = 13 + 1,
    ScrollbarBg             = 14 + 1,
    ScrollbarGrab           = 15 + 1,
    ScrollbarGrabHovered    = 16 + 1,
    ScrollbarGrabActive     = 17 + 1,
    ComboBg                 = 18 + 1,
    CheckMark               = 19 + 1,
    SliderGrab              = 20 + 1,
    SliderGrabActive        = 21 + 1,
    Button                  = 22 + 1,
    ButtonHovered           = 23 + 1,
    ButtonActive            = 24 + 1,
    Header                  = 25 + 1,
    HeaderHovered           = 26 + 1,
    HeaderActive            = 27 + 1,
    Separator               = 28 + 1,
    SeparatorHovered        = 29 + 1,
    SeparatorActive         = 30 + 1,
    ResizeGrip              = 31 + 1,
    ResizeGripHovered       = 32 + 1,
    ResizeGripActive        = 33 + 1,
    CloseButton             = 34 + 1,
    CloseButtonHovered      = 35 + 1,
    CloseButtonActive       = 36 + 1,
    PlotLines               = 37 + 1,
    PlotLinesHovered        = 38 + 1,
    PlotHistogram           = 39 + 1,
    PlotHistogramHovered    = 40 + 1,
    TextSelectedBg          = 41 + 1,
    ModalWindowDarkening    = 42 + 1,
}
 

EclipsedFlow

Известный
Проверенный
1,047
477
Крашит из-за
Lua:
imgui.PushStyleColor()

Lua:
if rofl.menu.menu_SilentCar.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(300, 120), imgui.Cond.FirstUseEver)
        imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(1.0, 0.0, 0.0, 1.0))
        imgui.Begin(u8"Silent Car", rofl.menu.menu_SilentCar, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
            imgui.BeginChild("##silentCarChild", imgui.ImVec2(280, 80), true)

                imgui.PushFont(font18)
                imgui.SetCursorPosY(12)
                imgui.Text(u8"Speed: ")
                imgui.SameLine()
                imgui.PushItemWidth(196)
                imgui.SliderFloat(u8"##speedSilentCar", rofl.silent_car.silentCar_speed, 1, 100)
                imgui.PopItemWidth()
                imgui.SetCursorPosY(42)
                if rofl.silent_car.silentCar.v then
                    if imgui.Button(u8"Disable", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                else
                    if imgui.Button(u8"Activate", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                end
                imgui.PopFont()

            imgui.EndChild()
        imgui.PopStyleColor(1)
        imgui.End()
    end
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,547
Крашит из-за
Lua:
imgui.PushStyleColor()

Lua:
if rofl.menu.menu_SilentCar.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(300, 120), imgui.Cond.FirstUseEver)
        imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(1.0, 0.0, 0.0, 1.0))
        imgui.Begin(u8"Silent Car", rofl.menu.menu_SilentCar, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
            imgui.BeginChild("##silentCarChild", imgui.ImVec2(280, 80), true)

                imgui.PushFont(font18)
                imgui.SetCursorPosY(12)
                imgui.Text(u8"Speed: ")
                imgui.SameLine()
                imgui.PushItemWidth(196)
                imgui.SliderFloat(u8"##speedSilentCar", rofl.silent_car.silentCar_speed, 1, 100)
                imgui.PopItemWidth()
                imgui.SetCursorPosY(42)
                if rofl.silent_car.silentCar.v then
                    if imgui.Button(u8"Disable", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                else
                    if imgui.Button(u8"Activate", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                end
                imgui.PopFont()

            imgui.EndChild()
        imgui.PopStyleColor(1)
        imgui.End()
    end
Нужно пушить и попать правильно. Запушил фон окна — попай фон после рендера окна
 

Vintik

Через тернии к звёздам
Проверенный
1,562
1,033
Крашит из-за
Lua:
imgui.PushStyleColor()

Lua:
if rofl.menu.menu_SilentCar.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(300, 120), imgui.Cond.FirstUseEver)
        imgui.PushStyleColor(imgui.Col.WindowBg, imgui.ImVec4(1.0, 0.0, 0.0, 1.0))
        imgui.Begin(u8"Silent Car", rofl.menu.menu_SilentCar, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
            imgui.BeginChild("##silentCarChild", imgui.ImVec2(280, 80), true)

                imgui.PushFont(font18)
                imgui.SetCursorPosY(12)
                imgui.Text(u8"Speed: ")
                imgui.SameLine()
                imgui.PushItemWidth(196)
                imgui.SliderFloat(u8"##speedSilentCar", rofl.silent_car.silentCar_speed, 1, 100)
                imgui.PopItemWidth()
                imgui.SetCursorPosY(42)
                if rofl.silent_car.silentCar.v then
                    if imgui.Button(u8"Disable", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                else
                    if imgui.Button(u8"Activate", imgui.ImVec2(262, 30)) then
                        rofl.silent_car.silentCar.v = not rofl.silent_car.silentCar.v
                    end
                end
                imgui.PopFont()

            imgui.EndChild()
        imgui.PopStyleColor(1)
        imgui.End()
    end
imgui.PopStyleColor(1) и imgui.End() поменяй местами
 

thebestsupreme

Участник
170
13
ERROR:
[ML] (error) GhettoHelper: C:\GTA SHINOBI by JOHNYSTAR\moonloader\Ghetto Helper.lua:29: attempt to index local 'mainIni' (a nil value)
stack traceback:
    C:\GTA SHINOBI by JOHNYSTAR\moonloader\Ghetto Helper.lua:29: in main chunk
[ML] (error) GhettoHelper: Script died due to an error. (08C45EC4)


CODE:
local mainIni = inicfg.load(nil, directIni)

if mainIni.hotkey == nil then -- если отсутствует секция hotkey в ини файле
    mainIni.hotkey = {
        bindud = "[82]", -- r
        bindcapture = "[83]" -- s
    }
end


В Чём ошибка???
 

EclipsedFlow

Известный
Проверенный
1,047
477
Как изменить размер
Lua:
imgui.PlotLines()

Как пользоваться вообщем-то?