открытие двух имгуи окон на разные команды

w99zzl1

Участник
Автор темы
80
7
Версия MoonLoader
.026-beta
Всем привет! Нужна помощь спецов)

Вот мой код:
Lua:
local imgui = require 'mimgui'
local ffi = require 'ffi'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
function json(filePath)
    local class = {}
    function class.save(tbl)
        if tbl then local F = io.open(filePath, 'w'); F:write(encodeJson(tbl) or {}); F:close(); return true, 'ok' end
        return false, 'table = nil'
    end
    function class.load(defaultTable)
        if not doesFileExist(filePath) then; class.save(defaultTable or {}); end
        local F = io.open(filePath, 'r+'); local TABLE = decodeJson(F:read() or {}); F:close()
        for def_k, def_v in pairs(defaultTable) do; if TABLE[def_k] == nil then; TABLE[def_k] = def_v; end; end
        return TABLE
    end; return class
end
createDirectory(getWorkingDirectory()..'/config/')
jPath = getWorkingDirectory() .. '/config/cfg.json'
j = json(jPath).load({
    flajok = false,
    flajok2 = false,
})
local window = imgui.new.bool()
local window2 = imgui.new.char()
local flajok = imgui.new.bool(j.flajok)
local flajok2 = imgui.new.bool(j.flajok2)
local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'
local directini = "moonloader\\parol.ini"
local mainini = inicfg.load({config = {dialogid = 1}}, directini)
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)
imgui.OnFrame(function() return window[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Настройки', window)
    -- Рп-отыгровки
    if imgui.CollapsingHeader(u8'Рп-отыгровки') then
        if imgui.Checkbox(u8'Отыгровка команды /ap', flajok) then
            j.flajok = flajok[0]
            json(jPath).save(j)
        end
        if imgui.Checkbox(u8'Отыгровка команды /ap2', flajok2) then
            j.flajok2 = flajok2[0]
            json(jPath).save(j)
        end
    end
end)
 
    imgui.OnFrame(function() return window2[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Команда /yk', window)
    imgui.Text(u8'Это окно, открывающееся при вводе /yk')
    imgui.End()
end)

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('settings', function()
        window[0] = not window[0]
    end)
    sampRegisterChatCommand('ap', function()
        if flajok[0] then
            sampAddChatMessage('Флажок включён. Можно отыгрывать /ap', -1)
        end
    end)
    sampRegisterChatCommand('ap2', function()
        if flajok2[0] then
            sampAddChatMessage('Привет', -1)
        end
    end)
    sampRegisterChatCommand('yk', function()
        window2[0] = not window2[0]
    end)
    while true do
        wait(0)
    end
end
получается так, что во первых, когда скрипт запускается, сразу открывается окно, которое должно открываться на /yk (на /yk это обычное окно с текстом, а /settings - там рп отыгровки) и не закрывается, а при попытке закрыть окно /yk при открытых двух окнах (на /yk и /settings)нажимаю на крестик окна yk - закрывается окно settings.... Я видимо запутался в коде, помогите пожалуйста, добрые хакеры) Думаю вы меня поняли)
 
  • Эм
Реакции: qdIbp

w99zzl1

Участник
Автор темы
80
7
на 26 строке local window2 = imgui.new.char() замени на local window2 = imgui.new.bool() и на 58 строке window замени на window2
🤣 Ох и тяжело мне будет в программировании с такой то внимательностью) Большое спасибо
Раз уж такое дело, чтобы тему другую не создавать, может кто то знает, как ещё решить мою ещё одну проблему:

Код1:

Код:
local imgui = require 'mimgui'
local ffi = require 'ffi'

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function json(filePath)
    local class = {}
    function class.save(tbl)
        if tbl then local F = io.open(filePath, 'w'); F:write(encodeJson(tbl) or {}); F:close(); return true, 'ok' end
        return false, 'table = nil'
    end
    function class.load(defaultTable)
        if not doesFileExist(filePath) then; class.save(defaultTable or {}); end
        local F = io.open(filePath, 'r+'); local TABLE = decodeJson(F:read() or {}); F:close()
        for def_k, def_v in pairs(defaultTable) do; if TABLE[def_k] == nil then; TABLE[def_k] = def_v; end; end
        return TABLE
    end; return class
end

createDirectory(getWorkingDirectory()..'/config/')
jPath = getWorkingDirectory() .. '/config/cfg.json'
j = json(jPath).load({
    flajok = false,
    flajok2 = false,
})

local window = imgui.new.bool()
local window2 = imgui.new.bool()
local flajok = imgui.new.bool(j.flajok)
local flajok2 = imgui.new.bool(j.flajok2)

local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'
local directini = "moonloader\\parol.ini"
local mainini = inicfg.load({config = {dialogid = 1}}, directini)

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return window[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Настройки', window)

    -- Рп-отыгровки
    if imgui.CollapsingHeader(u8'Рп-отыгровки') then
        if imgui.Checkbox(u8'Отыгровка команды /ap', flajok) then
            j.flajok = flajok[0]
            json(jPath).save(j)
        end
        if imgui.Checkbox(u8'Отыгровка команды /ap2', flajok2) then
            j.flajok2 = flajok2[0]
            json(jPath).save(j)
        end
    end
end)
 
 
imgui.OnFrame(function() return window2[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Команда /yk', window2)
    imgui.Text(u8'Это окно, открывающееся при вводе /yk')
    imgui.End()
end)


function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('settings', function()
        window[0] = not window[0]
    end)
    sampRegisterChatCommand('ap', function()
        if flajok[0] then
            sampAddChatMessage('Флажок включён. Можно отыгрывать /ap', -1)
        end
    end)
    sampRegisterChatCommand('ap2', function()
        if flajok2[0] then
            sampAddChatMessage('Привет', -1)
        end
    end)
    sampRegisterChatCommand('yk', function()
        window2[0] = not window2[0]
    end)
    while true do
        wait(0)
    end
end
(Работает на ура, Благодаря человеку выше)

и Код2:

Код:
local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'
local directini = "moonloader\\parol.ini"
local mainini = inicfg.load({config = {parol = "", dialogid = 1}}, directini)
require 'lib.moonloader'
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local password_buffer = imgui.ImBuffer(256)
local show_password_window = false
local should_save_password = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("alogin", function()
        show_password_window = not show_password_window
    end)
    while true do
        wait(0)
        imgui.Process = show_password_window
    end
end

function sp.onShowDialog(id, style, title, button1, button2, text)
    if id == mainini.config.dialogid then
        sampSendDialogResponse(id, 1, _, mainini.config.parol)
        return false
    end
end

function imgui.OnDrawFrame()
    if show_password_window then
        imgui.SetNextWindowSize(imgui.ImVec2(300, 70), imgui.Cond.FirstUseEver) -- меняем размер
        imgui.Begin(u8"Введите пароль")
        if imgui.InputText(u8"Пароль", password_buffer) then
            should_save_password = true

        end
        
        if should_save_password and imgui.Button(u8"Сохранить") then
            mainini.config = {
                parol = password_buffer.v,
                dialogid = mainini.config.dialogid
            }
            inicfg.save(mainini, directini)
            should_save_password = false
            show_password_window = false
        end
        
        imgui.End()
    end
end
(Тоже работает)
Так вот я бы хотел объединить Код1 и Код2 в один Код, но у меня не получилось, то ошибки выдает, то окна не открываются, то Автоввод пароля не работает (Код 2 это авто логин, т.к. вводу пароль в окно и он потом сам вводит пароль, ну вы знаете :) ). И ещё, в Код2 У меня окно (/alogin) не закрывается, точнее чтобы закрыть, нужно прописать снова команду /alogin, esc не работает, я бы хотел добавить в окно крестик, как в код1.
Заранее большое спасибо всем. Буду ждать ответов!)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
🤣 Ох и тяжело мне будет в программировании с такой то внимательностью) Большое спасибо
Раз уж такое дело, чтобы тему другую не создавать, может кто то знает, как ещё решить мою ещё одну проблему:

Код1:

Код:
local imgui = require 'mimgui'
local ffi = require 'ffi'

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

function json(filePath)
    local class = {}
    function class.save(tbl)
        if tbl then local F = io.open(filePath, 'w'); F:write(encodeJson(tbl) or {}); F:close(); return true, 'ok' end
        return false, 'table = nil'
    end
    function class.load(defaultTable)
        if not doesFileExist(filePath) then; class.save(defaultTable or {}); end
        local F = io.open(filePath, 'r+'); local TABLE = decodeJson(F:read() or {}); F:close()
        for def_k, def_v in pairs(defaultTable) do; if TABLE[def_k] == nil then; TABLE[def_k] = def_v; end; end
        return TABLE
    end; return class
end

createDirectory(getWorkingDirectory()..'/config/')
jPath = getWorkingDirectory() .. '/config/cfg.json'
j = json(jPath).load({
    flajok = false,
    flajok2 = false,
})

local window = imgui.new.bool()
local window2 = imgui.new.bool()
local flajok = imgui.new.bool(j.flajok)
local flajok2 = imgui.new.bool(j.flajok2)

local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'
local directini = "moonloader\\parol.ini"
local mainini = inicfg.load({config = {dialogid = 1}}, directini)

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return window[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Настройки', window)

    -- Рп-отыгровки
    if imgui.CollapsingHeader(u8'Рп-отыгровки') then
        if imgui.Checkbox(u8'Отыгровка команды /ap', flajok) then
            j.flajok = flajok[0]
            json(jPath).save(j)
        end
        if imgui.Checkbox(u8'Отыгровка команды /ap2', flajok2) then
            j.flajok2 = flajok2[0]
            json(jPath).save(j)
        end
    end
end)
 
 
imgui.OnFrame(function() return window2[0] end, function(player)
    local X, Y = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 279), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(X / 2, Y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8'Команда /yk', window2)
    imgui.Text(u8'Это окно, открывающееся при вводе /yk')
    imgui.End()
end)


function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('settings', function()
        window[0] = not window[0]
    end)
    sampRegisterChatCommand('ap', function()
        if flajok[0] then
            sampAddChatMessage('Флажок включён. Можно отыгрывать /ap', -1)
        end
    end)
    sampRegisterChatCommand('ap2', function()
        if flajok2[0] then
            sampAddChatMessage('Привет', -1)
        end
    end)
    sampRegisterChatCommand('yk', function()
        window2[0] = not window2[0]
    end)
    while true do
        wait(0)
    end
end
(Работает на ура, Благодаря человеку выше)

и Код2:

Код:
local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'
local directini = "moonloader\\parol.ini"
local mainini = inicfg.load({config = {parol = "", dialogid = 1}}, directini)
require 'lib.moonloader'
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local password_buffer = imgui.ImBuffer(256)
local show_password_window = false
local should_save_password = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("alogin", function()
        show_password_window = not show_password_window
    end)
    while true do
        wait(0)
        imgui.Process = show_password_window
    end
end

function sp.onShowDialog(id, style, title, button1, button2, text)
    if id == mainini.config.dialogid then
        sampSendDialogResponse(id, 1, _, mainini.config.parol)
        return false
    end
end

function imgui.OnDrawFrame()
    if show_password_window then
        imgui.SetNextWindowSize(imgui.ImVec2(300, 70), imgui.Cond.FirstUseEver) -- меняем размер
        imgui.Begin(u8"Введите пароль")
        if imgui.InputText(u8"Пароль", password_buffer) then
            should_save_password = true

        end
      
        if should_save_password and imgui.Button(u8"Сохранить") then
            mainini.config = {
                parol = password_buffer.v,
                dialogid = mainini.config.dialogid
            }
            inicfg.save(mainini, directini)
            should_save_password = false
            show_password_window = false
        end
      
        imgui.End()
    end
end
(Тоже работает)
Так вот я бы хотел объединить Код1 и Код2 в один Код, но у меня не получилось, то ошибки выдает, то окна не открываются, то Автоввод пароля не работает (Код 2 это авто логин, т.к. вводу пароль в окно и он потом сам вводит пароль, ну вы знаете :) ). И ещё, в Код2 У меня окно (/alogin) не закрывается, точнее чтобы закрыть, нужно прописать снова команду /alogin, esc не работает, я бы хотел добавить в окно крестик, как в код1.
Заранее большое спасибо всем. Буду ждать ответов!)
Lua:
local sampev    = require "samp.events"
local inicfg    = require "inicfg"
local imgui     = require "mimgui"
local ffi       = require "ffi"
local encoding  = require "encoding"

encoding.default = "CP1251"
u8 = encoding.UTF8

local directIni = getWorkingDirectory().."/config/cfg.ini"

local mainIni = inicfg.load({
    config = {
        password    = "",
        ap1         = false,
        ap2         = false,
    },
}, directIni)
inicfg.save(mainIni, directIni)

local window    = imgui.new.bool(false)
local window2   = imgui.new.bool(false)

local show_password_window = imgui.new.bool(false)

local ap1 = imgui.new.bool(mainIni.config.ap1)
local ap2 = imgui.new.bool(mainIni.config.ap2)
local password_buffer = imgui.new.char[96](u8(mainIni.config.password))

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("settings", function()
        window[0] = not window[0]
    end)
    sampRegisterChatCommand("ap", function()
        if ap1[0] then
            sampAddChatMessage("Флажок включён. Можно отыгрывать /ap", -1)
        end
    end)
    sampRegisterChatCommand("ap2", function()
        if ap2[0] then
            sampAddChatMessage("Привет", -1)
        end
    end)
    sampRegisterChatCommand("yk", function()
        window2[0] = not window2[0]
    end)
    sampRegisterChatCommand("alogin", function()
        show_password_window[0] = not show_password_window[0]
    end)
    wait(-1)
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return window[0] end, function(self)
    local sX, sY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 280), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sX / 2, sY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Настройки", window)

    -- Рп-отыгровки
    if imgui.CollapsingHeader(u8"Рп-отыгровки") then
        if imgui.Checkbox(u8"Отыгровка команды /ap", ap1) then
            mainIni.config.ap1 = ap1[0]
            inicfg.save(mainIni, directIni)
        end
        if imgui.Checkbox(u8"Отыгровка команды /ap2", ap2) then
            mainIni.config.ap2 = ap2[0]
            inicfg.save(mainIni, directIni)
        end
    end
end)

imgui.OnFrame(function() return window2[0] end, function(self)
    local sX, sY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 280), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sX / 2, sY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Команда /yk", window2)
    imgui.Text(u8"Это окно, открывающееся при вводе /yk")
    imgui.End()
end)

imgui.OnFrame(function() return show_password_window[0] end, function(self)
    local sX, sY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(415, 280), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sX / 2, sY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Введите пароль", show_password_window)
    if imgui.InputText(u8"Пароль", password_buffer, ffi.sizeof(password_buffer)) then
        mainIni.config.password = u8:decode(ffi.string(password_buffer))
        inicfg.save(mainIni, directIni)
    end
    imgui.End()
end)

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 1 then
        sampSendDialogResponse(dialogId, 1, nil, mainIni.config.password)
        return false
    end
end
 
  • Эм
Реакции: qdIbp