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

Double Tap Inside

Известный
Проверенный
1,921
1,275
Как удалить папку?
os.remove() чет не удаляет. Включил отображение скрытых и системных файлов - папка пуста.

РЕШЕНИЕ
Lua:
lfs.rmdir("D:\\name")
 
Последнее редактирование:

roman_vodola

Известный
170
20
LUA пишет ошибку "cannot resume non-suspended coroutin".Помогите решить.Ошибку пишет в строчке с local text, color, posX, posY = sampGet3dTextInfoById(id)
часть из кода:
    for id = 0, 2048 do
                local result = sampIs3dTextDefined(id)
                if result then
                local text, color, posX, posY = sampGet3dTextInfoById(id)
            end
    end
также я юзал if pcall(function() local text, color, posX, posY = sampGet3dTextInfoById(id) end) then ,но тут странно,что он выдает тоже ошибку.Ведь pcall это штука для отлова ошибок,но почему-то он сам её выдает.Вот ошибка с pcall:
(error) routes recorder: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'pcall'
 
Последнее редактирование:

BANINI

Участник
63
3
Люди помогите, хочу написать Фаст скуп/продажа(ARZ) луа скрипт, но как написать не знаю, подскажите какие функций можно использовать и тп)
 
  • Вау
Реакции: Double Tap Inside

PanSeek

t.me/dailypanseek
Всефорумный модератор
912
1,801
Люди помогите, хочу написать Фаст скуп/продажа(ARZ) луа скрипт, но как написать не знаю, подскажите какие функций можно использовать и тп)
Начать с азов, но если тебе просто такой скрипт нужен, то можно перейти сюда и не разбираться (если тебе в дальнейшем не хочется в этом разбираться).
 

BANINI

Участник
63
3
Начать с азов, но если тебе просто такой скрипт нужен, то можно перейти сюда и не разбираться (если тебе в дальнейшем не хочется в этом разбираться).
Азы немного знаю, ток не знаю как реализовать это, типа скуп то знаю как можно легко сделать, а вот продажу не знаю. Хотел попробовать сделать как тут КЛИК, потом подумал решил это ток с чатом будет работать,а не с диалогом(Ну еще не понял как это работает(). Сейчас хочу сделать этим КЛИК, но как сделать без понятия(
 

Sanchez.

Известный
704
190
Lua:
script_name('Imgui Test')
script_author('Sanchez.')
script_description('Test Imgui')

local encoding = require 'encoding'
local inicfg = require 'inicfg'
local imgui = require 'imgui'
local sampev = require 'lib.samp.events'
local imgui_style = imgui.ImInt(mainIni.config.imgui_style)
encoding.default = 'CP1251'
u8 = encoding.UTF8

local mainIni = inicfg.load({
    config = {
    checkbox = false,
    messages = 0,
    nickname = 0,
    imgui_style = 0,
 }
 }, "imguiscript")

local main_window_state = imgui.ImBool(false)
local sw, sh = getScreenResolution()

function imgui.CenterButton(text) -- закрытие попупа
    local width = imgui.GetWindowWidth()
    local calc = imgui.CalcTextSize(text)
    imgui.SetCursorPosX( width / 2 - calc.x / 2 )
    if text == 'OK' then
        if imgui.Button(text) then imgui.CloseCurrentPopup() end
    elseif text == u8'Понял' then
        if imgui.Button(text) then oldVersion = false imgui.CloseCurrentPopup() end
    else
        imgui.Button(text)
    end
end

local checkbox = imgui.ImBool(mainIni.config.checkbox)

if not doesFileExist('moonloader/config/imguiscript.ini') then inicfg.save(mainIni, 'imguiscript.ini') end

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    sampRegisterChatCommand("setnickname", function(arg)
    if #arg == 0 then
        sampAddChatMessage("Введите ваш ник.",-1)
    else
        mainIni.config.nickname = arg
        inicfg.save(mainIni, 'imguiscript.ini')
    end

    end)

    sampRegisterChatCommand("imguitest", function()
        main_window_state.v = not main_window_state.v

        imgui.Process = main_window_state.v

    end)

    sampAddChatMessage("Тестовый скрипт успешно запущен!",-1)

    imgui.Process = false

    while true do
        wait(0)

        if main_window_state.v == false then

            imgui.Process = false

        end

    end

end

function imgui.OnDrawFrame()
    GetTheme()
    imgui.SetNextWindowSize(imgui.ImVec2(700, 300), imgui.Cond.FirstUseEver)

    imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

    imgui.Begin(u8"Imgui", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8"Привет, это окно ImGui")
    if imgui.Checkbox(u8"Я чекбокс, кликай на меня", checkbox) then
        SaveIni()
    end
    imgui.Text(u8"Отправлено сообщений в чат: " .. mainIni.config.messages)
    --inicfg.save(mainIni, 'imguiscript.ini')
    imgui.Text(u8"Ваше прозвище: " .. u8(mainIni.config.nickname))
    if imgui.Button(u8"Открыть попуп") then
        imgui.OpenPopup(u8"Настройка команд для спавна машин")
    end
    if (imgui.BeginPopupModal(u8'Настройка команд для спавна машин', true, imgui.WindowFlags.NoMove + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)) then
        imgui.SetWindowSize(imgui.ImVec2(300, 300))

        imgui.Button(u8'ДМ')
        imgui.Button(u8'Килл без причины')
        imgui.Button(u8'ТК')
        imgui.Button(u8'Оскорбление родных')
        imgui.Button(u8'ПоверГеймниг')
        imgui.CenterButton(u8'Понял')
        imgui.EndPopup()
    end
    if imgui.Combo(u8'Стили', imgui_style, {u8'Синяя тема', u8'Красная тема'}, 2) then
        if imgui_style.v == 0 then
            blue()
            mainIni.config.imgui_style = 0
            SaveIni()
        end
        if imgui_style.v == 1 then
            red()
            mainIni.config.imgui_style = 1
            SaveIni()
        end
    end
    imgui.End()
end

function SaveIni()
    mainIni.config.checkbox = checkbox.v
    mainIni.config.imgui_style = imgui_style.v
    inicfg.save(mainIni, 'imguiscript.ini')
end

function blue()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.16, 0.29, 0.48, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.16, 0.29, 0.48, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.24, 0.52, 0.88, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
    colors[clr.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 0.35)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
blue()

function red()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.48, 0.16, 0.16, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.98, 0.26, 0.26, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.98, 0.26, 0.26, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.48, 0.16, 0.16, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.88, 0.26, 0.24, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.Button]                 = ImVec4(0.98, 0.26, 0.26, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.98, 0.06, 0.06, 1.00)
    colors[clr.Header]                 = ImVec4(0.98, 0.26, 0.26, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.98, 0.26, 0.26, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.75, 0.10, 0.10, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.75, 0.10, 0.10, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.98, 0.26, 0.26, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.98, 0.26, 0.26, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.98, 0.26, 0.26, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.98, 0.26, 0.26, 0.35)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
red()

function sampev.onServerMessage(color, text)
    if text:find(nick) then
        mainIni.config.messages = mainIni.config.messages + 1
        inicfg.save(mainIni, 'imguiscript.ini')
    end
end

function GetTheme()
    if mainIni.config.imgui_style == 0 then blue()
    elseif mainIni.config.imgui_style == 1 then red() end
  end
GetTheme()
Выдает ошибку:
[ML] (error) Imgui Test: D:\GTA San Andreas\moonloader\imguiscript.lua:9: attempt to index global 'mainIni' (a nil value)
stack traceback:
D:\GTA San Andreas\moonloader\imguiscript.lua:9: in main chunk
[ML] (error) Imgui Test: D:\GTA San Andreas\moonloader\imguiscript.lua:9: attempt to index global 'mainIni' (a nil value)
stack traceback:
Я не могу понять, что не так?
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,235
12,650
Lua:
script_name('Imgui Test')
script_author('Sanchez.')
script_description('Test Imgui')

local encoding = require 'encoding'
local inicfg = require 'inicfg'
local imgui = require 'imgui'
local sampev = require 'lib.samp.events'
local imgui_style = imgui.ImInt(mainIni.config.imgui_style)
encoding.default = 'CP1251'
u8 = encoding.UTF8

local mainIni = inicfg.load({
    config = {
    checkbox = false,
    messages = 0,
    nickname = 0,
    imgui_style = 0,
}
}, "imguiscript")

local main_window_state = imgui.ImBool(false)
local sw, sh = getScreenResolution()

function imgui.CenterButton(text) -- закрытие попупа
    local width = imgui.GetWindowWidth()
    local calc = imgui.CalcTextSize(text)
    imgui.SetCursorPosX( width / 2 - calc.x / 2 )
    if text == 'OK' then
        if imgui.Button(text) then imgui.CloseCurrentPopup() end
    elseif text == u8'Понял' then
        if imgui.Button(text) then oldVersion = false imgui.CloseCurrentPopup() end
    else
        imgui.Button(text)
    end
end

local checkbox = imgui.ImBool(mainIni.config.checkbox)

if not doesFileExist('moonloader/config/imguiscript.ini') then inicfg.save(mainIni, 'imguiscript.ini') end

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    sampRegisterChatCommand("setnickname", function(arg)
    if #arg == 0 then
        sampAddChatMessage("Введите ваш ник.",-1)
    else
        mainIni.config.nickname = arg
        inicfg.save(mainIni, 'imguiscript.ini')
    end

    end)

    sampRegisterChatCommand("imguitest", function()
        main_window_state.v = not main_window_state.v

        imgui.Process = main_window_state.v

    end)

    sampAddChatMessage("Тестовый скрипт успешно запущен!",-1)

    imgui.Process = false

    while true do
        wait(0)

        if main_window_state.v == false then

            imgui.Process = false

        end

    end

end

function imgui.OnDrawFrame()
    GetTheme()
    imgui.SetNextWindowSize(imgui.ImVec2(700, 300), imgui.Cond.FirstUseEver)

    imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

    imgui.Begin(u8"Imgui", main_window_state, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8"Привет, это окно ImGui")
    if imgui.Checkbox(u8"Я чекбокс, кликай на меня", checkbox) then
        SaveIni()
    end
    imgui.Text(u8"Отправлено сообщений в чат: " .. mainIni.config.messages)
    --inicfg.save(mainIni, 'imguiscript.ini')
    imgui.Text(u8"Ваше прозвище: " .. u8(mainIni.config.nickname))
    if imgui.Button(u8"Открыть попуп") then
        imgui.OpenPopup(u8"Настройка команд для спавна машин")
    end
    if (imgui.BeginPopupModal(u8'Настройка команд для спавна машин', true, imgui.WindowFlags.NoMove + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)) then
        imgui.SetWindowSize(imgui.ImVec2(300, 300))

        imgui.Button(u8'ДМ')
        imgui.Button(u8'Килл без причины')
        imgui.Button(u8'ТК')
        imgui.Button(u8'Оскорбление родных')
        imgui.Button(u8'ПоверГеймниг')
        imgui.CenterButton(u8'Понял')
        imgui.EndPopup()
    end
    if imgui.Combo(u8'Стили', imgui_style, {u8'Синяя тема', u8'Красная тема'}, 2) then
        if imgui_style.v == 0 then
            blue()
            mainIni.config.imgui_style = 0
            SaveIni()
        end
        if imgui_style.v == 1 then
            red()
            mainIni.config.imgui_style = 1
            SaveIni()
        end
    end
    imgui.End()
end

function SaveIni()
    mainIni.config.checkbox = checkbox.v
    mainIni.config.imgui_style = imgui_style.v
    inicfg.save(mainIni, 'imguiscript.ini')
end

function blue()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.16, 0.29, 0.48, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.16, 0.29, 0.48, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.24, 0.52, 0.88, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Button]                 = ImVec4(0.26, 0.59, 0.98, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.06, 0.53, 0.98, 1.00)
    colors[clr.Header]                 = ImVec4(0.26, 0.59, 0.98, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.26, 0.59, 0.98, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.26, 0.59, 0.98, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.26, 0.59, 0.98, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.26, 0.59, 0.98, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.26, 0.59, 0.98, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.26, 0.59, 0.98, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.26, 0.59, 0.98, 0.35)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
blue()

function red()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4

    style.WindowRounding = 2.0
    style.WindowTitleAlign = imgui.ImVec2(0.5, 0.84)
    style.ChildWindowRounding = 2.0
    style.FrameRounding = 2.0
    style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
    style.ScrollbarSize = 13.0
    style.ScrollbarRounding = 0
    style.GrabMinSize = 8.0
    style.GrabRounding = 1.0

    colors[clr.FrameBg]                = ImVec4(0.48, 0.16, 0.16, 0.54)
    colors[clr.FrameBgHovered]         = ImVec4(0.98, 0.26, 0.26, 0.40)
    colors[clr.FrameBgActive]          = ImVec4(0.98, 0.26, 0.26, 0.67)
    colors[clr.TitleBg]                = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.48, 0.16, 0.16, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.00, 0.00, 0.00, 0.51)
    colors[clr.CheckMark]              = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.SliderGrab]             = ImVec4(0.88, 0.26, 0.24, 1.00)
    colors[clr.SliderGrabActive]       = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.Button]                 = ImVec4(0.98, 0.26, 0.26, 0.40)
    colors[clr.ButtonHovered]          = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.98, 0.06, 0.06, 1.00)
    colors[clr.Header]                 = ImVec4(0.98, 0.26, 0.26, 0.31)
    colors[clr.HeaderHovered]          = ImVec4(0.98, 0.26, 0.26, 0.80)
    colors[clr.HeaderActive]           = ImVec4(0.98, 0.26, 0.26, 1.00)
    colors[clr.Separator]              = colors[clr.Border]
    colors[clr.SeparatorHovered]       = ImVec4(0.75, 0.10, 0.10, 0.78)
    colors[clr.SeparatorActive]        = ImVec4(0.75, 0.10, 0.10, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.98, 0.26, 0.26, 0.25)
    colors[clr.ResizeGripHovered]      = ImVec4(0.98, 0.26, 0.26, 0.67)
    colors[clr.ResizeGripActive]       = ImVec4(0.98, 0.26, 0.26, 0.95)
    colors[clr.TextSelectedBg]         = ImVec4(0.98, 0.26, 0.26, 0.35)
    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildWindowBg]          = ImVec4(1.00, 1.00, 1.00, 0.00)
    colors[clr.PopupBg]                = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.ComboBg]                = colors[clr.PopupBg]
    colors[clr.Border]                 = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.MenuBarBg]              = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab]          = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.41, 0.41, 0.50)
    colors[clr.CloseButtonHovered]     = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.98, 0.39, 0.36, 1.00)
    colors[clr.PlotLines]              = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.80, 0.80, 0.80, 0.35)
end
red()

function sampev.onServerMessage(color, text)
    if text:find(nick) then
        mainIni.config.messages = mainIni.config.messages + 1
        inicfg.save(mainIni, 'imguiscript.ini')
    end
end

function GetTheme()
    if mainIni.config.imgui_style == 0 then blue()
    elseif mainIni.config.imgui_style == 1 then red() end
  end
GetTheme()
Выдает ошибку:
[ML] (error) Imgui Test: D:\GTA San Andreas\moonloader\imguiscript.lua:9: attempt to index global 'mainIni' (a nil value)
stack traceback:
D:\GTA San Andreas\moonloader\imguiscript.lua:9: in main chunk
[ML] (error) Imgui Test: D:\GTA San Andreas\moonloader\imguiscript.lua:9: attempt to index global 'mainIni' (a nil value)
stack traceback:
Я не могу понять, что не так?
9 строку запихни после "инициализации" ини
 

|| NN - NoName ||

Известный
1,046
643
Как можно проверить, скачана ли та или инная библиотека и если нет, то скачать?
 

Smeruxa

smeruxa.ru
Проверенный
1,431
798
Как можно проверить, скачана ли та или инная библиотека и если нет, то скачать?
Библиотека? Пожалуйста
Lua:
if doesDirectoryExist(getWorkingDirectory().."\\lib\\library.lua") then
    print("exist")
else
    local CODE_LIBRARY = [[
    code
    ]]
    local f = io.open(getWorkingDirectory()..'\\lib\\library.lua', 'w')
    if f then
        f:write(CODE_LIBRARY)
        f:close()
    else
        return
    end
end
 

|| NN - NoName ||

Известный
1,046
643
Библиотека? Пожалуйста
Lua:
if doesDirectoryExist(getWorkingDirectory().."\\lib\\library.lua") then
    print("exist")
else
    local CODE_LIBRARY = [[
    code
    ]]
    local f = io.open(getWorkingDirectory()..'\\lib\\library.lua', 'w')
    if f then
        f:write(CODE_LIBRARY)
        f:close()
    else
        return
    end
end
как мне сделать так, чтобы он скачал библиотеку, если её нет.
 

Smeruxa

smeruxa.ru
Проверенный
1,431
798
как мне сделать так, чтобы он скачал библиотеку, если её нет.
я тебе еще лучше вариант просто предложил, я тебе дал пример. просто открой файл скопируй код и вставь
Если хочешь прям скачать используй функцию
int index = downloadUrlToFile(string url, string file, function statusCallback)