[json | mimgui] Загрузка команды из json при перезагрузке скрипта

Howau

Участник
Автор темы
45
8
Версия MoonLoader
.026-beta
Пишу биндер, сделал окошко, сохранение в json, но 2 проблемы.
1) При перезагрузке естественно команда уже не работаете.
2) Регистрировать команды я умею через жопу.

Lua:
-- начало
local binders = {}
local new_binder = { text = '', command = '', delay = 1000 }
local texter = new.char[256](u8(new_binder.text))
local commander = new.char[256](u8(new_binder.command))


function saveBinders()
    local json_data = json.encode(binders)
    local file, err = io.open('moonloader/LawHelper/binders.json', 'w')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при сохранении биндеров: " .. err, -1)
        return
    end
    file:write(json_data)
    file:close()  
    sampAddChatMessage(tag .. "Биндеры успешно сохранены!", -1)
end
function loadBinders()
    local file, err = io.open('moonloader/LawHelper/binders.json', 'r')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при загрузке биндеров: " .. err, -1)
        return
    end
    local json_data = file:read('*a')
    if json_data then
        binderData = json.decode(json_data)
        -- Проверка на существование данных
        if binderData then
            binders = binderData
        else
            binders = {}
        end
    end
    file:close()
end

-- окно биндера
local window_new_binder = new.bool(false)
imgui.OnFrame(function() return window_new_binder[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowSize(imgui.ImVec2(600, 400), imgui.Cond.Always)
    imgui.Begin(u8"Добавить Бинд", window_new_binder)
    imgui.InputTextMultiline(u8'Текст', texter, 256)
    imgui.InputText(u8'Команда', commander, 256)
    imgui.PushItemWidth(200)
    imgui.SliderInt(u8'Задержка (мс)', new.int(new_binder.delay), 1000, 5000)
    imgui.PopItemWidth()
    if imgui.Button(u8'Сохранить') then
        -- Сохраняем новый бинд в массив
        table.insert(binders, {
            text = u8:decode(ffi.string(texter)),
            command = ffi.string(commander),
            delay = new_binder.delay
        })
        saveBinders()  -- Сохранение биндеров
        window_new_binder[0] = false  -- Закрытие окна
        update_command(ffi.string(commander))
    end
    if imgui.Button(u8'Отмена') then
        window_new_binder[0] = false  -- Закрытие окна
    end
    imgui.End()
end)

--меню биндера в главном окне
elseif tab == 4 then
        imgui.SetCursorPos(imgui.ImVec2(190, 43))
        if imgui.BeginChild('Binder', imgui.ImVec2(990, 700), true) then
            if imgui.Button(u8'Добавить бинд') then
                new_binder.text = ''
                new_binder.command = ''
                new_binder.delay = 1000
                window_new_binder[0] = true
            end
            imgui.Separator()
            imgui.Text(u8'Существующие биндера:')
            for i, binder in ipairs(binders) do
                imgui.Separator()
                imgui.Text(u8('Бинд ' .. i .. '| Команда: ' .. binder.command))
                imgui.SameLine()
                if imgui.Button(fa.TRASH) then
                    table.remove(binders, i)
                    saveBinders()
                    sampAddChatMessage(tag .. "Бинд " .. i .. " успешно удалён!", -1)
                end
            end
            imgui.EndChild()
        end
 
Решение
Загрузка биндеров в каждом запуске:
-- начало
local binders = {}
local new_binder = { text = '', command = '', delay = 1000 }
local texter = new.char[256](u8(new_binder.text))
local commander = new.char[256](u8(new_binder.command))


function saveBinders()
    local json_data = json.encode(binders)
    local file, err = io.open('moonloader/LawHelper/binders.json', 'w')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при сохранении биндеров: " .. err, -1)
        return
    end
    file:write(json_data)
    file:close() 
    sampAddChatMessage(tag .. "Биндеры успешно сохранены!", -1)
end
function loadBinders()
    local file, err = io.open('moonloader/LawHelper/binders.json', 'r')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при загрузке...

Fedya Ogrizok

Участник
45
11
Загрузка биндеров в каждом запуске:
-- начало
local binders = {}
local new_binder = { text = '', command = '', delay = 1000 }
local texter = new.char[256](u8(new_binder.text))
local commander = new.char[256](u8(new_binder.command))


function saveBinders()
    local json_data = json.encode(binders)
    local file, err = io.open('moonloader/LawHelper/binders.json', 'w')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при сохранении биндеров: " .. err, -1)
        return
    end
    file:write(json_data)
    file:close() 
    sampAddChatMessage(tag .. "Биндеры успешно сохранены!", -1)
end
function loadBinders()
    local file, err = io.open('moonloader/LawHelper/binders.json', 'r')
    if not file then
        sampAddChatMessage(tag .. "Ошибка при загрузке биндеров: " .. err, -1)
        return
    end
    local json_data = file:read('*a')
    if json_data then
        binderData = json.decode(json_data)
        -- Проверка на существование данных
        if binderData then
            binders = binderData
        else
            binders = {}
        end
    end
    file:close()
end

loadBinders()

-- окно биндера
local window_new_binder = new.bool(false)
imgui.OnFrame(function() return window_new_binder[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(600, 600), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowSize(imgui.ImVec2(600, 400), imgui.Cond.Always)
    imgui.Begin(u8"Добавить Бинд", window_new_binder)
    imgui.InputTextMultiline(u8'Текст', texter, 256)
    imgui.InputText(u8'Команда', commander, 256)
    imgui.PushItemWidth(200)
    imgui.SliderInt(u8'Задержка (мс)', new.int(new_binder.delay), 1000, 5000)
    imgui.PopItemWidth()
    if imgui.Button(u8'Сохранить') then
        -- Сохраняем новый бинд в массив
        table.insert(binders, {
            text = u8:decode(ffi.string(texter)),
            command = ffi.string(commander),
            delay = new_binder.delay
        })
        saveBinders()  -- Сохранение биндеров
        window_new_binder[0] = false  -- Закрытие окна
        update_command(ffi.string(commander))
    end
    if imgui.Button(u8'Отмена') then
        window_new_binder[0] = false  -- Закрытие окна
    end
    imgui.End()
end)

--меню биндера в главном окне
elseif tab == 4 then
        imgui.SetCursorPos(imgui.ImVec2(190, 43))
        if imgui.BeginChild('Binder', imgui.ImVec2(990, 700), true) then
            if imgui.Button(u8'Добавить бинд') then
                new_binder.text = ''
                new_binder.command = ''
                new_binder.delay = 1000
                window_new_binder[0] = true
            end
            imgui.Separator()
            imgui.Text(u8'Существующие биндера:')
            for i, binder in ipairs(binders) do
                imgui.Separator()
                imgui.Text(u8('Бинд ' .. i .. '| Команда: ' .. binder.command))
                imgui.SameLine()
                if imgui.Button(fa.TRASH) then
                    table.remove(binders, i)
                    saveBinders()
                    sampAddChatMessage(tag .. "Бинд " .. i .. " успешно удалён!", -1)
                end
            end
            imgui.EndChild()
        end