помогите с сохранением настроек скрипта (ini or json)

w99zzl1

Участник
Автор темы
108
10
Версия MoonLoader
.026-beta
Снова всем привет... Ну никак не могу разобраться как решить мою проблему: (УЖЕ 3 ТЕМУ СОЗДАЛ, вроде всё просто, ребятки помогают, вот же оно решение, но нет! я не догоняю)
С помощью команды я открываю окно где есть разные фичи, галочки (флажки вкл/выкл) и т.д., но при перезагрузки скрипта, ясное дело настройки спадают, так вот я бы хотел чтобы они сохранялись. Вот код:


Код:
-- ИМПОРТ БИБЛЕОТЕК, ПЕРЕМЕННЫЕ
local sampfuncs = require 'sampfuncs'
local sampev = require('lib.samp.events')
local imgui = require 'mimgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local WinState = imgui.new.bool()
local autoAcceptFamily = imgui.new.bool(false)
local autoAcceptFamilyTooltip = u8"Автоматически принимать приглашения в семью"
local rpInviteFamily = imgui.new.bool(false)
local rpInviteFamilyTooltip = u8"Автоматически отправлять ролевую реплику при приглашении в семью"
local inputDelay = imgui.new.int(2000)
local inputDelayTooltip = u8"Задержка перед отправкой приглашения в семью (в мс)"
local lastInviteTime = 0
local showSettings = imgui.new.bool()
local showAuthorInfo = imgui.new.bool()
local showCommands = imgui.new.bool()
local imhandle = nil

local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

local json = require 'dkjson'

local cjc = require ('carbJsonConfig')
local settings = {
    autoAcceptFamily = imgui.new.bool();
    rpInviteFamily = imgui.new.bool();
    inputDelay = imgui.new.int();
}

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

    cjc.load(getWorkingDirectory().."\\config\\Family-Helper.json",settings) -- загружаем конфиг, и создаем, если нет
        settings() -- сохраняем конфиг 
    
    if not doesFileExist(file) then json(file):write({}) end -- это для другой функции с джон
    list = json(file):read()

    loadConfig()

    sampRegisterChatCommand('fhelp', function() WinState[0] = not WinState[0] end) -- то самое окно  фичами


    while true do
        wait(0)
        if autoAcceptFamily[0] then
            autoInviteToFamily()
        end
    end
end

-- и вот она, проблема
function loadConfig()
    local configFile = 'config\\Family-Helper.json'
    local file = io.open(configFile, 'r')
    if file then
        local configData = file:read('*a')
        file:close()
        if configData then
            local loadedConfig = decodeJson(configData)
            if loadedConfig then
                autoAcceptFamily[0] = loadedConfig.autoAcceptFamily
                rpInviteFamily[0] = loadedConfig.rpInviteFamily
                inputDelay[0] = loadedConfig.inputDelay
            end
        end
    end
end


function saveConfig()
    local configFile = 'Family-Helper.json'

    local config = inicfg.save(settings, configFile)
    if config then
        print('Config saved successfully.')
    else
        print('Error saving config.') -- это всегда выбивает при попытке сохраниться
    end
end



imgui.OnFrame(function() return WinState[0] and not isPauseMenuActive() end, function(player)
-- ...
            imgui.Spacing()
            if imgui.Button(u8"Сохранить настройки") then -- вот при нажатии на кнопочку выбивает еррор
                saveConfig()
            end
        end
-- ...
    imgui.EndChild()

    imgui.End()
end)

-- навсякий добавлю, у меня есть ещё функция, обычное диалоговое окно, в которое я могу добавить/удалить текст с помощью другой команды, и при перезааходе оно сохранится, а вот дсон для неё:

function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")

        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end
Уже чуть ли не весь код скинул... Помогите мне пожалуйста, добавить сохранение (желательно, пожалуйста, если не сложно кинуть полный код с изменениями :) )
 
  • Эм
Реакции: Corenale
Решение
Снова всем привет... Ну никак не могу разобраться как решить мою проблему: (УЖЕ 3 ТЕМУ СОЗДАЛ, вроде всё просто, ребятки помогают, вот же оно решение, но нет! я не догоняю)
С помощью команды я открываю окно где есть разные фичи, галочки (флажки вкл/выкл) и т.д., но при перезагрузки скрипта, ясное дело настройки спадают, так вот я бы хотел чтобы они сохранялись. Вот код:


Код:
-- ИМПОРТ БИБЛЕОТЕК, ПЕРЕМЕННЫЕ
local sampfuncs = require 'sampfuncs'
local sampev = require('lib.samp.events')
local imgui = require 'mimgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local WinState = imgui.new.bool()
local autoAcceptFamily = imgui.new.bool(false)
local...

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,992
2,187
для обычных настроек сойдет конфиг, когда тебе списки надо сохранять, тогда уже на жсон перепрыгивай

а так яб на твоём месте переписал, потому что ты кучу всего понапихал в свой код не разобравшись, как я понял. Ну ещё то как скоро тебе помогут не зависит от количества созданных тем

если тебе прям готовое нужно, то добро пожаловать в раздел работ и услуг
 
  • Нравится
Реакции: $Mr.R1ch$ и w99zzl1

$Mr.R1ch$

Активный
285
40
Снова всем привет... Ну никак не могу разобраться как решить мою проблему: (УЖЕ 3 ТЕМУ СОЗДАЛ, вроде всё просто, ребятки помогают, вот же оно решение, но нет! я не догоняю)
С помощью команды я открываю окно где есть разные фичи, галочки (флажки вкл/выкл) и т.д., но при перезагрузки скрипта, ясное дело настройки спадают, так вот я бы хотел чтобы они сохранялись. Вот код:


Код:
-- ИМПОРТ БИБЛЕОТЕК, ПЕРЕМЕННЫЕ
local sampfuncs = require 'sampfuncs'
local sampev = require('lib.samp.events')
local imgui = require 'mimgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local WinState = imgui.new.bool()
local autoAcceptFamily = imgui.new.bool(false)
local autoAcceptFamilyTooltip = u8"Автоматически принимать приглашения в семью"
local rpInviteFamily = imgui.new.bool(false)
local rpInviteFamilyTooltip = u8"Автоматически отправлять ролевую реплику при приглашении в семью"
local inputDelay = imgui.new.int(2000)
local inputDelayTooltip = u8"Задержка перед отправкой приглашения в семью (в мс)"
local lastInviteTime = 0
local showSettings = imgui.new.bool()
local showAuthorInfo = imgui.new.bool()
local showCommands = imgui.new.bool()
local imhandle = nil

local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

local json = require 'dkjson'

local cjc = require ('carbJsonConfig')
local settings = {
    autoAcceptFamily = imgui.new.bool();
    rpInviteFamily = imgui.new.bool();
    inputDelay = imgui.new.int();
}

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

    cjc.load(getWorkingDirectory().."\\config\\Family-Helper.json",settings) -- загружаем конфиг, и создаем, если нет
        settings() -- сохраняем конфиг
 
    if not doesFileExist(file) then json(file):write({}) end -- это для другой функции с джон
    list = json(file):read()

    loadConfig()

    sampRegisterChatCommand('fhelp', function() WinState[0] = not WinState[0] end) -- то самое окно  фичами


    while true do
        wait(0)
        if autoAcceptFamily[0] then
            autoInviteToFamily()
        end
    end
end

-- и вот она, проблема
function loadConfig()
    local configFile = 'config\\Family-Helper.json'
    local file = io.open(configFile, 'r')
    if file then
        local configData = file:read('*a')
        file:close()
        if configData then
            local loadedConfig = decodeJson(configData)
            if loadedConfig then
                autoAcceptFamily[0] = loadedConfig.autoAcceptFamily
                rpInviteFamily[0] = loadedConfig.rpInviteFamily
                inputDelay[0] = loadedConfig.inputDelay
            end
        end
    end
end


function saveConfig()
    local configFile = 'Family-Helper.json'

    local config = inicfg.save(settings, configFile)
    if config then
        print('Config saved successfully.')
    else
        print('Error saving config.') -- это всегда выбивает при попытке сохраниться
    end
end



imgui.OnFrame(function() return WinState[0] and not isPauseMenuActive() end, function(player)
-- ...
            imgui.Spacing()
            if imgui.Button(u8"Сохранить настройки") then -- вот при нажатии на кнопочку выбивает еррор
                saveConfig()
            end
        end
-- ...
    imgui.EndChild()

    imgui.End()
end)

-- навсякий добавлю, у меня есть ещё функция, обычное диалоговое окно, в которое я могу добавить/удалить текст с помощью другой команды, и при перезааходе оно сохранится, а вот дсон для неё:

function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")

        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end
Уже чуть ли не весь код скинул... Помогите мне пожалуйста, добавить сохранение (желательно, пожалуйста, если не сложно кинуть полный код с изменениями :) )
вот простой пример на ини, если нужно

Код:
local твоя переменная = inicfg.load({
   твой ключ = {
   твои значения = false или true,
   твои значения = 0/1/2/3/4 и ТД,
   твои значения = "текст",
   твои значения = 1200
  },
}, "Название файла сохранения")

Lua:
-- это список твоих значений, ну и так скажем дефолтный конфиг
local ini = inicfg.load({
    setting = {
    enable_checkbox = true,
    nickname = "David_Martinez",
    slider = 1200
   }
}, "Example.ini")

-- сохранение чекбокса
local checkboxone = imgui.new.bool(ini.setting.enable_checkbox) -- так должна выглядеть твоя переменная, в которой хранится значение из твоей таблицы
if imgui.Checkbox(u8'Чекбокс №1', chexkboxone) then -- привычное использование чекбокса
   ini.setting.enable_checkbox = checkboxone[0] -- тут вписываем значение
   inicfg.save(ini, "Example.ini") -- сохраняем конфиг 
end -- конец функции, и так по кругу с остальными элементами mimgui

-- сохранение imgui InputText
local buffer = imgui.new.char[64](u8(ini.setting.nickname)) -- переменная
if imgui.InputText(u8'Ник нейм', buffer, 64) then
   ini.setting.nickname = u8:deocde(ffi.string(buffer)) -- здесь декодируешь текст, дабы у тебя не было каракуль, обязательно должна быть привязана библиотека FFI
   inicfg.save(ini, "Example.ini")
end

-- сохранение slider
local slider = imgui.new.int(ini.setting.slider)
if imgui.SliderInt(u8'Задержка', slider, 1000, 5000) then
   ini.settinf.slider = slider[0]
   inicfg.save(ini, "Example.ini")
 end
 
Последнее редактирование:
  • Влюблен
Реакции: w99zzl1

Joce

Участник
31
7
вроде так
Lua:
script_properties('work-in-pause')

local sampfuncs = require 'sampfuncs'
local sampev = require('lib.samp.events')
local imgui = require 'mimgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local WinState = imgui.new.bool()
local autoAcceptFamily = imgui.new.bool(false)
local autoAcceptFamilyTooltip = u8"Автоматически принимать приглашения в семью"
local rpInviteFamily = imgui.new.bool(false)
local rpInviteFamilyTooltip = u8"Автоматически отправлять ролевую реплику при приглашении в семью"
local inputDelay = imgui.new.int(2000)
local inputDelayTooltip = u8"Задержка перед отправкой приглашения в семью (в мс)"
local lastInviteTime = 0
local showSettings = imgui.new.bool()
local showAuthorInfo = imgui.new.bool()
local showCommands = imgui.new.bool()
local imhandle = nil

local json = require 'dkjson'

local configFile = getGameDirectory() .. "//moonloader//config//Family-Helper.json"
local settings = {
    autoAcceptFamily = false,
    rpInviteFamily = false,
    inputDelay = 2000
}

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

    loadConfig()

    sampRegisterChatCommand('fhelp', function() WinState[0] = not WinState[0] end) -- окно с фичами

    while true do
        wait(0)
        if autoAcceptFamily[0] then
            autoInviteToFamily()
        end
    end
end

-- функция для загрузки кфг
function loadConfig()
    local file = io.open(configFile, 'r')
    if file then
        local configData = file:read('*a')
        file:close()
        if configData then
            local loadedConfig = json.decode(configData)
            if loadedConfig then
                autoAcceptFamily[0] = loadedConfig.autoAcceptFamily
                rpInviteFamily[0] = loadedConfig.rpInviteFamily
                inputDelay[0] = loadedConfig.inputDelay
            end
        end
    end
end

-- функция для сохранения кфг
function saveConfig()
    local config = {
        autoAcceptFamily = autoAcceptFamily[0],
        rpInviteFamily = rpInviteFamily[0],
        inputDelay = inputDelay[0]
    }

    local configData = json.encode(config, { indent = true })
    local file = io.open(configFile, 'w')
    if file then
        file:write(configData)
        file:close()
        sampAddChatMassage('Конфиг успешно сохранен!', 0x008000)
    else
        sampAddChatMassage('Ошибка в создании конфига!', 0xFF0000)
    end
end

imgui.OnFrame(function() return WinState[0] and not isPauseMenuActive() end, function(player)
    -- ...
    imgui.Spacing()
    if imgui.Button(u8"Сохранить настройки") then
        saveConfig()
    end
    -- ...
    imgui.EndChild()
    imgui.End()
end)