Помогите с конфигом

bruskin

Участник
Автор темы
148
12
Версия MoonLoader
Другое
Мне нужно чтоб когда я прописывал 1 значения и сохранял их, после пекезашел в игру и изменил ТОЛЬКО 1 значение - то только оно и изменилось, а остальные остались теже (в скрипте ниже остальные значения меняются на пустоту)
Lua:
    if settings_window_state.v then
        local scrX, scrY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
        imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Меню настроек', settings_window_state)
        imgui.Text(u8'Цен на мед. карты')
        if imgui.InputText(u8'7 дней', med7_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.InputText(u8'14 дней', med14_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.InputText(u8'30 дней', med30_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.InputText(u8'60 дней', med60_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.Button(u8'Сохранить') then
            mainIni.config.med7 = med7_text_buffer.v
            mainIni.config.med14 = med14_text_buffer.v
            mainIni.config.med30 = med30_text_buffer.v
            mainIni.config.med60 = med60_text_buffer.v
            if inicfg.save(mainIni, directIni) then
                sampAddChatMessage('Успешно', 0xFFFF00)
            end
        end
        imgui.End()
    end
 
  • Bug
Реакции: Vespan

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Видимо, не загружаешь данные из конфига в объявлении переменных, раз на пустоту каждый раз меняется.
Lua:
-- Там, где ты объявил переменные, замени на это.
local med7_text_buffer = imgui.ImBuffer(mainIni.config.med7, 56)
local med14_text_buffer = imgui.ImBuffer(mainIni.config.med14, 56)
local med30_text_buffer = imgui.ImBuffer(mainIni.config.med30, 56)
local med60_text_buffer = imgui.ImBuffer(mainIni.config.med60, 56)

-- OnDrawFrame
if settings_window_state.v then
    local scrX, scrY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
    imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню настроек', settings_window_state)
    imgui.Text(u8'Цен на мед. карты')
    imgui.InputText(u8'7 дней', med7_text_buffer)
    imgui.InputText(u8'14 дней', med14_text_buffer)
    imgui.InputText(u8'30 дней', med30_text_buffer)
    imgui.InputText(u8'60 дней', med60_text_buffer)
    if imgui.Button(u8'Сохранить') then
        mainIni.config.med7 = med7_text_buffer.v
        mainIni.config.med14 = med14_text_buffer.v
        mainIni.config.med30 = med30_text_buffer.v
        mainIni.config.med60 = med60_text_buffer.v
        if inicfg.save(mainIni, directIni) then
            sampAddChatMessage('Успешно', 0xFFFF00)
        end
    end
    imgui.End()
end
Для InputText'а необязательно делать условие if, если ты никакое действие в нём не делаешь.
 

bruskin

Участник
Автор темы
148
12
local med7_text_buffer = imgui.ImBuffer(mainIni.config.med7, 56)
не работает, жалуется на эту строку
[ML] (error) Hospital Tools by Bruskin: ...Games Launcher\bin\arizona\moonloader\Hospital Tools.lua:24: sol: no matching function call takes this number of arguments and the specified types
stack traceback:
[C]: in function 'ImBuffer'
...Games Launcher\bin\arizona\moonloader\Hospital Tools.lua:24: in main chunk
[ML] (error) Hospital Tools by Bruskin: Script died due to an error. (7E7C03DC)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
🤔
Lua:
local directIni = 'moonloader\\config\\hospitaltools.ini'
-- Свою подобную строку на эту замени только.
local mainIni = inicfg.load({
    config = {
        med7 = "",
        med14 = "",
        med30 = "",
        med60 = "",
    },
}, directIni)
inicfg.save(mainIni, directIni)

-- Там, где ты объявил переменные, замени на это.
local med7_text_buffer = imgui.ImBuffer(mainIni.config.med7, 56)
local med14_text_buffer = imgui.ImBuffer(mainIni.config.med14, 56)
local med30_text_buffer = imgui.ImBuffer(mainIni.config.med30, 56)
local med60_text_buffer = imgui.ImBuffer(mainIni.config.med60, 56)

-- OnDrawFrame
if settings_window_state.v then
    local scrX, scrY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
    imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню настроек', settings_window_state)
    imgui.Text(u8'Цен на мед. карты')
    imgui.InputText(u8'7 дней', med7_text_buffer)
    imgui.InputText(u8'14 дней', med14_text_buffer)
    imgui.InputText(u8'30 дней', med30_text_buffer)
    imgui.InputText(u8'60 дней', med60_text_buffer)
    if imgui.Button(u8'Сохранить') then
        mainIni.config.med7 = med7_text_buffer.v
        mainIni.config.med14 = med14_text_buffer.v
        mainIni.config.med30 = med30_text_buffer.v
        mainIni.config.med60 = med60_text_buffer.v
        inicfg.save(mainIni, directIni)
        sampAddChatMessage('Успешно', 0xFFFF00)
        
    end
    imgui.End()
end
 

bruskin

Участник
Автор темы
148
12
🤔
Lua:
local directIni = 'moonloader\\config\\hospitaltools.ini'
-- Свою подобную строку на эту замени только.
local mainIni = inicfg.load({
    config = {
        med7 = "",
        med14 = "",
        med30 = "",
        med60 = "",
    },
}, directIni)
inicfg.save(mainIni, directIni)

-- Там, где ты объявил переменные, замени на это.
local med7_text_buffer = imgui.ImBuffer(mainIni.config.med7, 56)
local med14_text_buffer = imgui.ImBuffer(mainIni.config.med14, 56)
local med30_text_buffer = imgui.ImBuffer(mainIni.config.med30, 56)
local med60_text_buffer = imgui.ImBuffer(mainIni.config.med60, 56)

-- OnDrawFrame
if settings_window_state.v then
    local scrX, scrY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
    imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню настроек', settings_window_state)
    imgui.Text(u8'Цен на мед. карты')
    imgui.InputText(u8'7 дней', med7_text_buffer)
    imgui.InputText(u8'14 дней', med14_text_buffer)
    imgui.InputText(u8'30 дней', med30_text_buffer)
    imgui.InputText(u8'60 дней', med60_text_buffer)
    if imgui.Button(u8'Сохранить') then
        mainIni.config.med7 = med7_text_buffer.v
        mainIni.config.med14 = med14_text_buffer.v
        mainIni.config.med30 = med30_text_buffer.v
        mainIni.config.med60 = med60_text_buffer.v
        inicfg.save(mainIni, directIni)
        sampAddChatMessage('Успешно', 0xFFFF00)
       
    end
    imgui.End()
end
работало до перезахода в игру, и то, только так же как и было написано в самой проблеме (значения обнулялись)

upd: работает, если в конфиге нулевые значения, к сожалению

может стоит лучше чтоб всегда значения из конфига переносились в эти строки? (т.е. я установил в этих настройках одни значения, перезашел в игру и эти значения остались в конфиге и в этих самых строках)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
работало до перезахода в игру, и то, только так же как и было написано в самой проблеме (значения обнулялись)

upd: работает, если в конфиге нулевые значения, к сожалению

может стоит лучше чтоб всегда значения из конфига переносились в эти строки? (т.е. я установил в этих настройках одни значения, перезашел в игру и эти значения остались в конфиге и в этих самых строках)
Они и так должны остаться у тебя и в конфиге и в InputText.
imgui.ImBuffer(mainIni.config.med7, 56)
Тут первым аргументом указывается значение InputText'а по умолчанию. То есть, при каждом запуске скрипта берётся информация из конфига и вставляется в InputText.

Ты уверен, что ты сохраняешь данные? Ты после каждого изменения текста в InputText'е, нажимаешь кнопку "Сохранить"?
 

bruskin

Участник
Автор темы
148
12
Они и так должны остаться у тебя и в конфиге и в InputText.

Тут первым аргументом указывается значение InputText'а по умолчанию. То есть, при каждом запуске скрипта берётся информация из конфига и вставляется в InputText.

Ты уверен, что ты сохраняешь данные? Ты после каждого изменения текста в InputText'е, нажимаешь кнопку "Сохранить"?
Ну происходит все так: я сохраняю настройки, перезахожу в игру, а скрипт не запускается, запускается только тогда, когда в конфиге нет настроек
 

bruskin

Участник
Автор темы
148
12
Можешь полный код дать? А то я что-то запутался мальца.
И если есть ошибка какая-то, то желательно и её тоже показать.
Lua:
script_name("Hospital Tools by Bruskin")
script_author("Mark Bruskin")
script_description("Hospital Tools for Arizona RP")

require "lib.moonloader"

local imgui = require 'imgui'
local encoding = require 'encoding'
local themes = import 'resource/imgui_themes.lua'
local keys = require 'vkeys'
local inicfg = require 'inicfg'
local directIni = 'hospitaltools.ini'
local mainIni = inicfg.load({
    config = {
        med7 = "",
        med14 = "",
        med30 = "",
        med60 = "",
    },
}, directIni)
inicfg.save(mainIni, directIni)
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local mskip_window_state = imgui.ImBool(false)
local id_text_buffer = imgui.ImBuffer(13)
local healcure_window_state = imgui.ImBool(false)
local heal_text_buffer = imgui.ImBuffer(13)
local medcard_window_state = imgui.ImBool(false)
local settings_window_state = imgui.ImBool(false)
local med7_text_buffer = imgui.ImBuffer(mainIni.config.med7, 56)
local med14_text_buffer = imgui.ImBuffer(mainIni.config.med14, 56)
local med30_text_buffer = imgui.ImBuffer(mainIni.config.med30, 56)
local med60_text_buffer = imgui.ImBuffer(mainIni.config.med60, 56)

function imgui.OnDrawFrame()
    if main_window_state.v then
        local scrX, scrY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
        imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Команды скрипта', main_window_state)
        imgui.Text(u8'/svc - объявить о пропуске скорой помощи на сервере ВС')
        imgui.Text(u8'/sjf - объявить о пропуске скорой помощи JFMC')
        imgui.Text(u8'/sls - объявить о пропуске скорой помощи LSMC')
        imgui.Text(u8'/ssf - объявить о пропуске скорой помощи SFMC')
        imgui.Text(u8'/slv - объявить о пропуске скорой помощи LVMC')
        imgui.Text(u8'/mskip - объявить о пропуске скорой помощи')
        imgui.Text(u8'/hheal - меню где можно поднять или вылечить')
        imgui.Text(u8'/hil - вылечить (РАБОТАЕТ ТОЛЬКО НА VICE CITY')
        imgui.Text(u8'/cur - поднять на ноги')
        imgui.End()
    end
    if mskip_window_state.v then
         local scrX, scrY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
        imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Меню пропуска', mskip_window_state)
        imgui.Text(u8'Выберите организацию, чтоб объявить о пропуске скорой помощи при помощи мегафона (/m)')
        if imgui.Button('Vice City') then
            sampSendChat('/m Медицинский Центр Vice City! Немедленно пропустите карету скорой помощи!')
        end
        if imgui.Button('Los Santos') then
            sampSendChat('/m Медицинский Центр Los Santos! Немедленно пропустите машину скорой помощи!')
        end
        if imgui.Button('Jefferson') then
            sampSendChat('/m Медицинский Центр Jefferson! Немедленно пропустите машину скорой помощи!')
        end
        if imgui.Button('San Fierro') then
            sampSendChat('/m Медицинский Центр San Fierro! Немедленно пропустите машину скорой помощи!')
        end
        if imgui.Button('Las Venturas') then
            sampSendChat('/m Медицинский Центр Las Venturas! Немедленно пропустите машину скорой помощи!')
        end
        imgui.End()
    end
    if healcure_window_state.v then
        local scrX, scrY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
        imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Вылечить & поднять на ноги', healcure_window_state)
        if imgui.InputText(u8'id', id_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.InputText(u8'Цена', heal_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        imgui.Text(u8'Примечание: Для сервера VC цена должна быть в районе от 50 до 200')
        imgui.Text(u8'Для основных серверов цена должна быть в районе от 5000 до 5000')
        if imgui.Button(u8'Вылечить') then
            lua_thread.create(function()
                sampSendChat('/do Таблетка в мед сумке')
                wait(1500)
                sampSendChat("/me достал таблетку и передал их человеку напротив")
                wait(1500)
                sampSendChat('/heal '..id_text_buffer.v.. ' '..heal_text_buffer.v)
            end)
        end
        if imgui.Button(u8'Поднять') then
            lua_thread.create(function()
                sampSendChat('/do Укол адреналина в сумке.')
                wait(1500)
                sampSendChat('/me открыл сумку, после чего достал укол адреналина')
                wait(1500)
                sampSendChat('/do Укол в руке.')
                wait(1500)
                sampSendChat('/me сделал укол пострадавшему')
                wait(1500)
                sampSendChat('/cure '..id_text_buffer.v)
            end)
        end
        imgui.End()
    end
    if medcard_window_state.v then
        local scrX, scrY = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
        imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Выдать мед. карту', medcard_window_state)
        if imgui.InputText(u8'id', id_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        if imgui.InputText(u8'Цена', heal_text_buffer) and isKeyJustPressed(VK_RETURN) then
        end
        imgui.Text(u8'ВАЖНО: Если не хотите получить выговор / наказание от администрации - узнайте сначала паспорт, после выдайте мед. карту')
        if imgui.Button(u8'Узнать паспорт') then
            lua_thread.create(function()
                sampSendChat('Здравствуйте, покажите свой паспорт.')
                wait(1500)
                sampSendChat('/b /showpass id')
                sampAddChatMessage('Чтобы продолжить нажмите ENTER', 0xFFFF00)
            end)
        end
        imgui.Text(u8'Так же рекомендуем узнать срок мед. карты')
        if imgui.Button(u8'Узнать срок мед. карты') then
            sampSendChat('Такс.. На какой срок планируете брать мед. карту?')
        end
        imgui.Text(u8'Сроки мед. карты:')
        if imgui.Button(u8'7 дней') then
            lua_thread.create(function()
                sampSendChat('/do Бланк в кармане.')
                wait(1500)
                sampSendChat('/me достал бланк, после чего начал его заполнять')
                wait(1500)
                sampSendChat('/do Бланк заполнен.')
                wait(1500)
                sampSendChat('/me передал бланк человеку')
                wait(1500)
                sampSendChat('/medcard '..id_text_buffer.v..' 3 0 '..heal_text_buffer.v)
            end)
        end
        if imgui.Button(u8'14 дней') then
            lua_thread.create(function()
                sampSendChat('/do Бланк в кармане.')
                wait(1500)
                sampSendChat('/me достал бланк, после чего начал его заполнять')
                wait(1500)
                sampSendChat('/do Бланк заполнен.')
                wait(1500)
                sampSendChat('/me передал бланк человеку')
                wait(1500)
                sampSendChat('/medcard '..id_text_buffer.v..' 3 1 '..heal_text_buffer.v)
            end)
        end
        if imgui.Button(u8'30 дней') then
            lua_thread.create(function()
                sampSendChat('/do Бланк в кармане.')
                wait(1500)
                sampSendChat('/me достал бланк, после чего начал его заполнять')
                wait(1500)
                sampSendChat('/do Бланк заполнен.')
                wait(1500)
                sampSendChat('/me передал бланк человеку')
                wait(1500)
                sampSendChat('/medcard '..id_text_buffer.v..' 3 2 '..heal_text_buffer.v)
            end)
        end
        if imgui.Button(u8'60 дней') then
            lua_thread.create(function()
                sampSendChat('/do Бланк в кармане.')
                wait(1500)
                sampSendChat('/me достал бланк, после чего начал его заполнять')
                wait(1500)
                sampSendChat('/do Бланк заполнен.')
                wait(1500)
                sampSendChat('/me передал бланк человеку')
                wait(1500)
                sampSendChat('/medcard '..id_text_buffer.v..' 3 3 '..heal_text_buffer.v)
            end)
        end
        imgui.End()
    end
    if settings_window_state.v then
    local scrX, scrY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(scrX / 2, scrY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5));
    imgui.SetNextWindowSize(imgui.ImVec2(600,400), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню настроек', settings_window_state)
    imgui.Text(u8'Цен на мед. карты')
    imgui.InputText(u8'7 дней', med7_text_buffer)
    imgui.InputText(u8'14 дней', med14_text_buffer)
    imgui.InputText(u8'30 дней', med30_text_buffer)
    imgui.InputText(u8'60 дней', med60_text_buffer)
    if imgui.Button(u8'Сохранить') then
        mainIni.config.med7 = med7_text_buffer.v
        mainIni.config.med14 = med14_text_buffer.v
        mainIni.config.med30 = med30_text_buffer.v
        mainIni.config.med60 = med60_text_buffer.v
        inicfg.save(mainIni, directIni)
        sampAddChatMessage('Успешно', 0xFFFF00)
    end
    imgui.End()
end
end

function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage("[Hospital Tools] Скрипт успешно загружен.", 0x00FF00)
    sampAddChatMessage("[Hospital Tools] Автор: Mark Bruskin", 0xFFFF00)
    sampAddChatMessage("[Hospital Tools] Версия: v. 1.0.0", 0xFFFF00)
    sampRegisterChatCommand("svc", svccb)
    sampRegisterChatCommand("sls", slscb)
    sampRegisterChatCommand("ssf", ssfcb)
    sampRegisterChatCommand("slv", slvcb)
    sampRegisterChatCommand("hilvc", hilvccb)
    sampRegisterChatCommand("cur", curcb)
    sampRegisterChatCommand("mhelp", function() main_window_state.v = not main_window_state.v end)
    sampRegisterChatCommand('mskip', function() mskip_window_state.v = not main_window_state.v end)
    sampRegisterChatCommand('sjf', sjfcb)
    sampRegisterChatCommand('hheal', function() healcure_window_state.v = not healcure_window_state.v  end)
    sampRegisterChatCommand('givemc', function() medcard_window_state.v = not medcard_window_state.v end)
    sampRegisterChatCommand('msettings', function() settings_window_state.v = not settings_window_state.v end)
    while true do wait(0)
        imgui.Process = main_window_state.v or mskip_window_state.v or healcure_window_state.v or medcard_window_state.v or settings_window_state.v
        imgui.SwitchContext()
        themes.SwitchColorTheme(2)
    end
end

function svccb()
    sampSendChat("/m Медицинский Центр Vice City! Немедленно пропустите карету скорой помощи!")
end

function slscb()
    sampSendChat("/m Медицинский Центр Los Santos! Немедленно пропустите машину скорой помощи!")
end

function ssfcb()
    sampSendChat("/m Медицинский Центр San Fierro! Немедленно пропустите машину скорой помощи!")
end

function slvcb()
    sampSendChat("/m Медицинский Центр Las Venturas! Немедленно пропустите машину скорой помощи!")
end

function hilvccb(arg)
    if tonumber(arg) then
        lua_thread.create(function()
        sampSendChat("/do Мед. сумка на поясе.")
        wait(1500)
        sampSendChat("/me открыл мед. сумку, после достал необходимые таблетки")
        wait(1500)
        sampSendChat("/do Таблетки в руках.")
        wait(1500)
        sampSendChat("/me передал таблетки человеку")
        wait(1500)
        sampSendChat("/heal "..arg.." 50")
        end)
    end
end

function curcb(arg)
    if tonumber(arg) then
        lua_thread.create(function()
        sampSendChat("/do Мед. сумка на поясе.")
        wait(1500)
        sampSendChat("/me открыл мед. сумку, после чего достал от туда укол адреналина")
        wait(1500)
        sampSendChat("/do Укол адреналина в руках.")
        wait(1500)
        sampSendChat("/me сделал укол в проблемное место")
        wait(1500)
        sampSendChat("/cure "..arg)
        end)
    end
end

function sjfcb()
    sampSendChat('/m Медицинский Центр Jefferson! Немедленно пропустите машину скорой помощи!')
end