Как сделать задержку wait IMGUI | LUA

ManstikosUA

Участник
Автор темы
66
15
Привет, помогите сделать пожалуйста задержку в imgui похожую на ту как в мвд хелпере:


строка multiline:
привет
wait_1000
привет
задержка в милисекундах, и при этом оно должно сохраняться, даже после перезапуска
 
Решение
не подскажешь как подключить библиотеку JSON?
и как сделать сохранения, похожие на те, что в inicfg, краткий пример?)
Ты меня спасаешь просто)
Это не библиотека, просто файл с расширением .json через стандартные функции создаётся, читается и записывается.

Разбирай.
1704980027849.png

1704980033891.png

Lua:
local imgui     = require 'imgui'
local encoding   = require "encoding"

local u8         = encoding.UTF8
encoding.default = "CP1251"
local window    = imgui.ImBool(true)
local path      = getGameDirectory()..'\\moonloader\\test.json' -- Наш конфиг-файл.

local...

ManstikosUA

Участник
Автор темы
66
15
Никакие, кроме тех, что ты уже подключил.
так?

Lua:
 if imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine) then
                    mainIni.sobes.sobes_dokiMultiLine = u8:decode(sobes_dokiMultiLine.v)
                    inicfg.save(mainIni, "pdhelperManstikosUA")
                end
                -----------------------------------------------------------------------вот тут нужна задержка
                if imgui.Button(u8"Вывести в чат") then
                    lua_thread.create(function()
                        for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                            if line:find('^{wait:%d+}$') then
                                wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                            else
                                sampAddChatMessage(u8:decode(line), -1)
                            end
                        end
                    end)
                end
если да, то оно не работает, жму на кнопку "Вывести в чат" - ничего не происходит. Мб какие-то переменные надо добавить, или ещё там библиотеки какие-то?

так?

Lua:
 if imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine) then
                    mainIni.sobes.sobes_dokiMultiLine = u8:decode(sobes_dokiMultiLine.v)
                    inicfg.save(mainIni, "pdhelperManstikosUA")
                end
                -----------------------------------------------------------------------вот тут нужна задержка
                if imgui.Button(u8"Вывести в чат") then
                    lua_thread.create(function()
                        for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                            if line:find('^{wait:%d+}$') then
                                wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                            else
                                sampAddChatMessage(u8:decode(line), -1)
                            end
                        end
                    end)
                end
если да, то оно не работает, жму на кнопку "Вывести в чат" - ничего не происходит. Мб какие-то переменные надо добавить, или ещё там библиотеки какие-то?
а ещё оно плохо сохраняется в ini
1704209639049.png
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
так?

Lua:
 if imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine) then
                    mainIni.sobes.sobes_dokiMultiLine = u8:decode(sobes_dokiMultiLine.v)
                    inicfg.save(mainIni, "pdhelperManstikosUA")
                end
                -----------------------------------------------------------------------вот тут нужна задержка
                if imgui.Button(u8"Вывести в чат") then
                    lua_thread.create(function()
                        for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                            if line:find('^{wait:%d+}$') then
                                wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                            else
                                sampAddChatMessage(u8:decode(line), -1)
                            end
                        end
                    end)
                end
если да, то оно не работает, жму на кнопку "Вывести в чат" - ничего не происходит. Мб какие-то переменные надо добавить, или ещё там библиотеки какие-то?


а ещё оно плохо сохраняется в ini
Посмотреть вложение 226964
Ну, может потому, что это inicfg? У меня, например, с JSON'ом всё работает хорошо.
Screenshot_2.png

Screenshot_3.png

Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local path = getGameDirectory()..'\\moonloader\\test.json'
local config = {
    sobes_dokiMultiLine = ""
}

if not doesFileExist(path) then
    local f = io.open(path, 'w+')
    f:write(encodeJson(config)):close()
else
    local f = io.open(path, "r")
    a = f:read("*a")
    config = decodeJson(a)
    f:close()
end

local sobes_dokiMultiLine = imgui.ImBuffer(u8(config.sobes_dokiMultiLine), 1024)
local main_window_state = imgui.ImBool(false)

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("imgui", function() main_window_state.v = not main_window_state.v end)
    while true do
        wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Test script", main_window_state)
        if imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine) then
            config.sobes_dokiMultiLine = u8:decode(sobes_dokiMultiLine.v)
            local f = io.open(path, 'w')
            f:write(encodeJson(config)):close()
        end
        -----------------------------------------------------------------------вот тут нужна задержка
        if imgui.Button(u8"Вывести в чат") then
            lua_thread.create(function()
                for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                    if line:find('^{wait:%d+}$') then
                        wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                    else
                        sampAddChatMessage(u8:decode(line), -1)
                    end
                end
            end)
        end
        imgui.End()
    end
end

Я не думаю, что с inicfg такое получится сделать (хотя может есть люди, которые знают). Давно уже JSON'ом пользуюсь и проблем не испытываю пока что. Можете и тебе стоит перейти.

P.S Точно такой же код, только с inicfg, у меня тоже не работает. После перезапуска слетают все строки, кроме первой.
 

ManstikosUA

Участник
Автор темы
66
15
Ну, может потому, что это inicfg? У меня, например, с JSON'ом всё работает хорошо.
Посмотреть вложение 226971
Посмотреть вложение 226972
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local path = getGameDirectory()..'\\moonloader\\test.json'
local config = {
    sobes_dokiMultiLine = ""
}

if not doesFileExist(path) then
    local f = io.open(path, 'w+')
    f:write(encodeJson(config)):close()
else
    local f = io.open(path, "r")
    a = f:read("*a")
    config = decodeJson(a)
    f:close()
end

local sobes_dokiMultiLine = imgui.ImBuffer(u8(config.sobes_dokiMultiLine), 1024)
local main_window_state = imgui.ImBool(false)

function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("imgui", function() main_window_state.v = not main_window_state.v end)
    while true do
        wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"Test script", main_window_state)
        if imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine) then
            config.sobes_dokiMultiLine = u8:decode(sobes_dokiMultiLine.v)
            local f = io.open(path, 'w')
            f:write(encodeJson(config)):close()
        end
        -----------------------------------------------------------------------вот тут нужна задержка
        if imgui.Button(u8"Вывести в чат") then
            lua_thread.create(function()
                for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                    if line:find('^{wait:%d+}$') then
                        wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                    else
                        sampAddChatMessage(u8:decode(line), -1)
                    end
                end
            end)
        end
        imgui.End()
    end
end

Я не думаю, что с inicfg такое получится сделать (хотя может есть люди, которые знают). Давно уже JSON'ом пользуюсь и проблем не испытываю пока что. Можете и тебе стоит перейти.

P.S Точно такой же код, только с inicfg, у меня тоже не работает. После перезапуска слетают все строки, кроме первой.
тоетсь нужно убрать ини в этих строчках и всё должно работать?
если да, то всё-равно не работает. Жму на кнопку "вывести" - ничего
код:

Lua:
 imgui.InputTextMultiline('#sobes_dokitext', sobes_dokiMultiLine)
                    
                
                -----------------------------------------------------------------------вот тут нужна задержка
                if imgui.Button(u8"Вывести в чат") then
                    lua_thread.create(function()
                        for line in sobes_dokiMultiLine.v:gmatch('[^\n]+') do
                            if line:find('^{wait:%d+}$') then
                                wait(tonumber(line:match('^{wait:(%d+)}$')) * 1000)
                            else
                                sampAddChatMessage(u8:decode(line), -1)
                            end
                        end
                    end)
                end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Недостаточно будет просто в одном месте inicfg заменить. Тебе нужно везде то, что связано связано с inicfg заменять на JSON вариант, так как тебе придётся вместо incfg использовать его. Полный переход с inicfg на JSON, если коротко.
 

ManstikosUA

Участник
Автор темы
66
15
Недостаточно будет просто в одном месте inicfg заменить. Тебе нужно везде то, что связано связано с inicfg заменять на JSON вариант, так как тебе придётся вместо incfg использовать его. Полный переход с inicfg на JSON, если коротко.
не подскажешь как подключить библиотеку JSON?
и как сделать сохранения, похожие на те, что в inicfg, краткий пример?)
Ты меня спасаешь просто)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
не подскажешь как подключить библиотеку JSON?
и как сделать сохранения, похожие на те, что в inicfg, краткий пример?)
Ты меня спасаешь просто)
Это не библиотека, просто файл с расширением .json через стандартные функции создаётся, читается и записывается.

Разбирай.
1704980027849.png

1704980033891.png

Lua:
local imgui     = require 'imgui'
local encoding   = require "encoding"

local u8         = encoding.UTF8
encoding.default = "CP1251"
local window    = imgui.ImBool(true)
local path      = getGameDirectory()..'\\moonloader\\test.json' -- Наш конфиг-файл.

local config = { -- Сам конфиг.
    text    = "Text",
    enable  = true,
    count   = 0,
}

-- Создание конфиг-файла, если его нет и чтение, если он есть.
if not doesFileExist(path) then
    local f = io.open(path, 'w+')
    f:write(encodeJson(config)):close() -- Где "config" - название твоего массива. Как в 9-й строке
else
    local f = io.open(path, "r")
    a = f:read("*a")
    config = decodeJson(a)
    f:close()
end

-- Массив с переменными ImGUI. Тут берутся данные из конфига.
local settings = {
    text    = imgui.ImBuffer(u8(config.text), 30), -- Чтобы текст на русском отображался, добавляешь u8.
    enable  = imgui.ImBool(config.enable),
    count   = imgui.ImInt(config.count),
}

function imgui.OnDrawFrame()
    if window.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(430, 250), imgui.Cond.FirstUseEver)
        imgui.Begin("Test script", window)
        if imgui.InputText("Input", settings.text) then
            config.text = u8:decode(settings.text.v) -- Чтобы в JSON-файле текст на русском отображался, добавляешь u8:decode(переменная.v)
            JSONSave()
        end
        imgui.Text(u8"Текст в чате "..settings.text.v)
        if imgui.Checkbox("Enable", settings.enable) then
            config.enable = settings.enable.v
            JSONSave()
        end
        if imgui.InputInt("Int", settings.count) then
            config.count = settings.count.v
            JSONSave()
        end
        if imgui.Button(u8"Вывести текст в чат") then
            sampAddChatMessage(u8:decode(settings.text.v), -1) -- При выводе текста на русском в чат, добавляешь u8:decode(переменная.v)
        end
        imgui.End()
    end
end

-- Функция для сохранения. Как inicfg.save.
function JSONSave()
    if doesFileExist(path) then
        local f = io.open(path, 'w')
        if f then
            f:write(encodeJson(config)):close() -- Тут также.
        end
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    while true do wait(0)
        imgui.Process = window.v
    end
end
И эти ещё можешь посмотреть:
 

ManstikosUA

Участник
Автор темы
66
15
Это не библиотека, просто файл с расширением .json через стандартные функции создаётся, читается и записывается.

Разбирай.
Посмотреть вложение 228302
Посмотреть вложение 228303
Lua:
local imgui     = require 'imgui'
local encoding   = require "encoding"

local u8         = encoding.UTF8
encoding.default = "CP1251"
local window    = imgui.ImBool(true)
local path      = getGameDirectory()..'\\moonloader\\test.json' -- Наш конфиг-файл.

local config = { -- Сам конфиг.
    text    = "Text",
    enable  = true,
    count   = 0,
}

-- Создание конфиг-файла, если его нет и чтение, если он есть.
if not doesFileExist(path) then
    local f = io.open(path, 'w+')
    f:write(encodeJson(config)):close() -- Где "config" - название твоего массива. Как в 9-й строке
else
    local f = io.open(path, "r")
    a = f:read("*a")
    config = decodeJson(a)
    f:close()
end

-- Массив с переменными ImGUI. Тут берутся данные из конфига.
local settings = {
    text    = imgui.ImBuffer(u8(config.text), 30), -- Чтобы текст на русском отображался, добавляешь u8.
    enable  = imgui.ImBool(config.enable),
    count   = imgui.ImInt(config.count),
}

function imgui.OnDrawFrame()
    if window.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(430, 250), imgui.Cond.FirstUseEver)
        imgui.Begin("Test script", window)
        if imgui.InputText("Input", settings.text) then
            config.text = u8:decode(settings.text.v) -- Чтобы в JSON-файле текст на русском отображался, добавляешь u8:decode(переменная.v)
            JSONSave()
        end
        imgui.Text(u8"Текст в чате "..settings.text.v)
        if imgui.Checkbox("Enable", settings.enable) then
            config.enable = settings.enable.v
            JSONSave()
        end
        if imgui.InputInt("Int", settings.count) then
            config.count = settings.count.v
            JSONSave()
        end
        if imgui.Button(u8"Вывести текст в чат") then
            sampAddChatMessage(u8:decode(settings.text.v), -1) -- При выводе текста на русском в чат, добавляешь u8:decode(переменная.v)
        end
        imgui.End()
    end
end

-- Функция для сохранения. Как inicfg.save.
function JSONSave()
    if doesFileExist(path) then
        local f = io.open(path, 'w')
        if f then
            f:write(encodeJson(config)):close() -- Тут также.
        end
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    while true do wait(0)
        imgui.Process = window.v
    end
end
И эти ещё можешь посмотреть:
можешь свой тг дать?