Закрытие\открытие imgui интерфейса при выполнении функции в цикле

shvchuk

Участник
Автор темы
44
13
Я решил написать скрипт, облегчающий лидерство в гетто, но как-будто бы он только усложняет.
Идеей было автоматизировать некоторые функции через имгуи, но, например, при автореспавне машин банды, нельзя закрыть менюшку до тех пор, пока цикл не начнет повторятся, так же и с флудом в чат с определенной задержкой.
Так вот, мне нужно сделать так, что бы при запуске функций, которые выполняются в цикле, менюшка спокойно открывалась\закрывалась и скрипт не приостанавливал работу до тех пор, пока включён чекбокс. Для большей наглядности показал проблему в видео -
Ниже оставлю код, с выделенными строками цикла, чекбокса и флота соответственно, для удобства.


Lua:
script_name('Easy Ghetto')
script_author('Shvchuk')
script_description('EASYGHETTO 1.0')

require("lib.moonloader")
local memory = require 'memory'
local q = require 'samp.events'
local imgui = require("imgui")
local encoding = require("encoding")
encoding.default = "CP1251"
u8 = encoding.UTF8
local selecselect_imgui_window = 1
local tag = '[Easy Ghetto]: '
local label = 0
local main_color = 0x8B008B
local main_color_text = '{8B008B}'
local white_color = '{FFFFFF}'
local arr_str = {}
local mem = require "memory"
local sw, sh = getScreenResolution()
local imgExit = nil
local selected_item = imgui.ImInt(0)
local text_buffer = imgui.ImBuffer(256)
local main_window_state = imgui.ImBool(false)
local slider_floodline = imgui.ImInt(0)
local checkbox_floodline = imgui.ImBool(false)
local checkbox_autogrespawn = imgui.ImBool(false)

function main()
    while not isSampAvailable() do wait(0) end
    msg('Загружен.')
    msg('Активация - {8B008B}/eg')
    msg('Автор - {8B008B}Shvchuk.')
    sampRegisterChatCommand("eg", function()
        main_window_state.v = not main_window_state.v
    end)

    while true do
        wait(0)
        if checkbox_floodline.v then
            sampSendChat(u8:decode(text_buffer.v))
            wait(u8:decode(slider_floodline.v))
        else
        end
        if checkbox_autogrespawn.v then
            sampSendChat('/grespawn')
            wait(120000)
            sampSendChat('/f The car will be respawned in 5 second')
            wait(1000)
            sampSendChat('/f The car will be respawned in 4 second')
            wait(1000)
            sampSendChat('/f The car will be respawned in 3 second!')
            wait(1000)
            sampSendChat('/f The car will be respawned in 2 second!')
            wait(1000)
            sampSendChat('/f The car will be respawned in 1 second!')
            wait(1000)
            sampSendChat('/f The car will be respawned NOW')
            wait(1000)
            sampSendChat('/grespawn')
        else
        end
        imgui.Process = main_window_state.v
    end
end

function msg(text)
    sampAddChatMessage('[EasyGhetto]: {FFFFFF}'.. text,0x8B008B)
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowPos(imgui.ImVec2(sw /2, sh /2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(640, 480), imgui.Cond.FirstUseEver)
    imgui.Begin('EasyGhetto by Shvchuk', main_window_state,imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)

    if imgui.Button(u8'Diamond RP', imgui.ImVec2(195, 35)) then selecselect_imgui_window = 1 end imgui.SameLine() if imgui.Button(u8'Advance RP', imgui.ImVec2(195, 35)) then selecselect_imgui_window = 2 end  imgui.SameLine() if imgui.Button(u8'commands', imgui.ImVec2(195, 35)) then selecselect_imgui_window = 3 end
    imgui.Text(os.date())
    imgui.Separator()
    if selecselect_imgui_window == 1 then
        imgui.Text(u8 'Diamond RP')
        imgui.PushItemWidth(400)
        imgui.InputText(u8 'Line', text_buffer)
        if imgui.Checkbox(u8"Flood Line", checkbox_floodline) then
            if checkbox_floodline.v then
                msg("{fae7b5}Flood Line - {50c878}activated")
            else
                msg("{fae7b5}Flood Line - {ff2b2b}deactivated")
            end
        end
        imgui.SameLine()
        imgui.SliderInt('##floodline', slider_floodline, 1000, 5000)
        imgui.SameLine()
        imgui.TextQuestion(u8'Ползунок меняет задержку между отправкой сообщений из line при включенной функции "FloodLine". 1000 - 1 секунда. Выставить значение больше 5000 можно нажав tab, но делать это крайне не рекомендуется, из-за возможности закрыть/открыть меню скрипта только во время отправки сообщения.')
        imgui.Separator()
        imgui.Text(u8'Gang War')
        if imgui.Button(u8'Capture 1', imgui.ImVec2(120, 30)) then
            sampSendChat('/capture 1')
        end
        imgui.SameLine()
        if imgui.Button(u8'Capture 2', imgui.ImVec2(120, 30)) then
            sampSendChat('/capture 1')
        end
        imgui.SameLine()
        imgui.TextQuestion(u8'При нажатии кнопки, начнётся захват той территории, на которой Вы стоите.')
        imgui.Separator()
        imgui.Text(u8'afk capture (перед использованием обязательно читать FAQ к каждой функции.)')
        if imgui.Checkbox(u8"Auto Grespawn", checkbox_autogrespawn) then
            if checkbox_autogrespawn.v then
                msg("{fae7b5}Auto Grespawn - {50c878}activated")
            else
                msg("{fae7b5}Auto Grespawn - {ff2b2b}deactivated")
            end
        end
        imgui.SameLine()
        imgui.TextQuestion(u8'Внимание! использование функции позволит закрыть меню скрипта только при повторном спавне авто, рекомендуется использовать только при отходе из-за компьютера. При активации, каждые 2 минуты будет автоматически респавниться авто с обратным отсчетом в чат банды.')

    elseif selecselect_imgui_window == 2 then
        imgui.Text(u8'Advance RP')
        imgui.Text('soon...')

    elseif selecselect_imgui_window == 3 then
        imgui.Text('Commands')
        imgui.Text('soon...')
    end
    imgui.End()
end

function isKeyCheckAvailable()
    if not isSampLoaded() then
        return true
    end
    if not isSampfuncsLoaded() then
        return not sampIsChatInputActive() and not sampIsDialogActive()
    end
    return not sampIsChatInputActive() and not sampIsDialogActive() and not isSampfuncsConsoleActive()
end

function imgui.TextQuestion(text)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

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

    style.WindowPadding = ImVec2(15, 15)
    style.WindowRounding = 5.0
    style.FramePadding = ImVec2(5, 5)
    style.FrameRounding = 4.0
    style.ItemSpacing = ImVec2(12, 8)
    style.ItemInnerSpacing = ImVec2(8, 6)
    style.IndentSpacing = 25.0
    style.ScrollbarSize = 15.0
    style.ScrollbarRounding = 9.0
    style.GrabMinSize = 5.0
    style.GrabRounding = 3.0

    colors[clr.Text] = ImVec4(0.80, 0.80, 0.83, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.WindowBg] = ImVec4(0.06, 0.05, 0.07, 0.98)
    colors[clr.ChildWindowBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.PopupBg] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.Border] = ImVec4(0.80, 0.80, 0.83, 0.88)
    colors[clr.BorderShadow] = ImVec4(0.92, 0.91, 0.88, 0.00)
    colors[clr.FrameBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.FrameBgHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.FrameBgActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.TitleBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.TitleBgCollapsed] = ImVec4(1.00, 0.98, 0.95, 0.75)
    colors[clr.TitleBgActive] = ImVec4(0.07, 0.07, 0.09, 1.00)
    colors[clr.MenuBarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarBg] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ScrollbarGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ComboBg] = ImVec4(0.19, 0.18, 0.21, 1.00)
    colors[clr.CheckMark] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrab] = ImVec4(0.80, 0.80, 0.83, 0.31)
    colors[clr.SliderGrabActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.Button] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.ButtonHovered] = ImVec4(0.24, 0.23, 0.29, 1.00)
    colors[clr.ButtonActive] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.Header] = ImVec4(0.10, 0.09, 0.12, 1.00)
    colors[clr.HeaderHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.HeaderActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.ResizeGrip] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.ResizeGripHovered] = ImVec4(0.56, 0.56, 0.58, 1.00)
    colors[clr.ResizeGripActive] = ImVec4(0.06, 0.05, 0.07, 1.00)
    colors[clr.CloseButton] = ImVec4(0.40, 0.39, 0.38, 0.16)
    colors[clr.CloseButtonHovered] = ImVec4(0.40, 0.39, 0.38, 0.39)
    colors[clr.CloseButtonActive] = ImVec4(0.40, 0.39, 0.38, 1.00)
    colors[clr.PlotLines] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotLinesHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.40, 0.39, 0.38, 0.63)
    colors[clr.PlotHistogramHovered] = ImVec4(0.25, 1.00, 0.00, 1.00)
    colors[clr.TextSelectedBg] = ImVec4(0.25, 1.00, 0.00, 0.43)
    colors[clr.ModalWindowDarkening] = ImVec4(1.00, 0.98, 0.95, 0.73)
end
apply_custom_style()
 

cloused2

Известный
398
132
Извиняюсь за французский, но это пиздос

Костыль, но: в фунцию main следующий код

Костыль костылек костылечек:
if wasKeyPressed(id key) then
    main_window_state.v = false
end

Также лучше приучайся к mimgui интерфейсу, как минимум он хавает на 15% меньше фпс чем мимгуи.
 

shvchuk

Участник
Автор темы
44
13
imgui.Process = main_window_state.v в отедельный поток, либо ту лапшу из sampSendChat в отдельный поток
помогите с этим пожалуйста, я и так и сяк и в функцию отдельную, ничего не работает)