проблема с мета таблицой

$Mr.R1ch$

Активный
Автор темы
284
40
Версия MoonLoader
Другое
приветствую. Пытаюсь реализовать настройку команд в скрипте, и захотел сделать функцию включения и отключения каждой командой, поэтому мне нужно добавить много чекбоксов воспользовавшись мета-таблицой, но почему то все прошло крахом.

Lua:
local defaultcmd = inicfg.load({
   cmd = {
      cmd_id_1 = true,
      cmd_id_2 = true,
      cmd_id_3 = true,
      cmd_id_4 = true,
      cmd_id_5 = true,
      cmd_id_6 = true,
      cmd_id_7 = true,
      cmd_id_8 = true,
      cmd_id_9 = true,
      cmd_id_10 = true,
      cmd_id_11 = true,
      cmd_id_12 = true,
      cmd_id_13 = true,
      cmd_id_14 = true,
      cmd_id_15 = true,
      cmd_id_16 = true,
      cmd_id_17 = true,
      cmd_id_18 = true,
      cmd_id_19 = true,
      cmd_id_20 = true,
      cmd_id_21 = true,
      cmd_id_22 = true,
      cmd_id_23 = true,
      cmd_id_24 = true,
      cmd_id_25 = true
   }
}, "Example/stand_comand_setting")
inicfg.save(defaultcmd, "Example/stand_comand_setting.ini")


--мета-таблица, в которой прописаны значения из ini

local active_cmd = setmetatable({'cmd_id_1', 'cmd_id_2', 'cmd_id_3', 'cmd_id_4', 'cmd_id_5', 'cmd_id_6', 'cmd_id_7', 'cmd_id_8', 'cmd_id_9', 'cmd_id_10', 'cmd_id_11', 'cmd_id_12', 'cmd_id_13', 'cmd_id_14', 'cmd_id_15', 'cmd_id_16', 'cmd_id_17', 'cmd_id_18', 'cmd_id_19', 'cmd_id_20', 'cmd_id_21', 'cmd_id_22', 'cmd_id_23', 'cmd_id_24', 'cmd_id_25'},
{
  __index = function(self, key)
     if not defaultcmd.cmd[key] then
        defaultcmd.cmd[key] = true
     end
     self = imgui.new.bool(defaultcmd.cmd[key])
     return self[key]
  end
})

--тут же идёт рендер всех чекбоксов
           for index, value in ipairs(active_cmd) do
              if imgui.Checkbox("##list_cmd" .. index, active_cmd[value]) then
                 defaultcmd.cmd[value] = active_cmd[value]
                 inicfg.save(defaultcmd, "Example/stand_comand_setting.ini")
              end
           end
но после попытки использования вылазит ошибка (cannot convert 'string' to 'bool [1]' stack traceback: [C]: in function 'bool')
Раньше так делал и все было нормально, но вот не понимаю что щас не так, уже проверял все что можно и не нашел ошибку(...
(p.s не пишите про json и ТД, у меня реализация через ини)
 
  • Эм
Реакции: Corenale

ChаtGPT

Активный
388
95
зачем вообще метатаблица?
Я бы так сделал, но с использованием https://www.blast.hk/threads/221121/, потому что удобнее)

Код:
local imgui = require 'mimgui'
local encoding = require 'encoding'
local cjc = require 'carbJsonConfig'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local renderWindow = imgui.new.bool(true)
local settings = {}

-- Добавляем булевые значения для каждого элемента
for i = 1, 20 do
    settings[i] = imgui.new.bool(false)
end

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

local newFrame = imgui.OnFrame(function() return renderWindow[0] end, function(player)
    local resX, resY = getScreenResolution()
    local sizeX, sizeY = 300, 300
    imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
    imgui.Begin('Main Window', renderWindow)
        for i = 1, 20 do
            if imgui.Checkbox('check ' .. i, settings[i]) then settings() end
            if i % 3 ~= 0 then imgui.SameLine() end
        end
    imgui.End()
end)

function main()
    while not isSampAvailable() do wait(0) end
    cjc.load(getWorkingDirectory().."\\config\\settings.json", settings)
    settings()
    sampRegisterChatCommand('mimgui', function()
        renderWindow[0] = not renderWindow[0]
    end)
    wait(-1)
end

1729850973654.png


P.S: я бы сделал так, потому что за метатаблицы не шарю 😢
 
  • Нравится
Реакции: qdIbp

ChаtGPT

Активный
388
95
потому что мне нужно парсить не только чекбоксы, но и значения к ним, иначе эта хуйня бесполезна
Так через ключ получи значение, в чем проблема?
Мне кажется с метатаблицей будет больше танцев с бубном
 

$Mr.R1ch$

Активный
Автор темы
284
40
Так через ключ получи значение, в чем проблема?
Мне кажется с метатаблицей будет больше танцев с бубном
как теперь мне это использовать, если я хочу рендерить imgui.InputText? делал по точно такому же способу что и вверху, но ошибка такая же
 

chapo

чопа сребдс // @moujeek
Модератор
8,932
11,698
как теперь мне это использовать, если я хочу рендерить imgui.InputText? делал по точно такому же способу что и вверху, но ошибка такая же
конкретно опиши все что тебе нужно. Я тоже не очень вдупляю нахуя тут метатаблица
 

$Mr.R1ch$

Активный
Автор темы
284
40
конкретно опиши все что тебе нужно. Я тоже не очень вдупляю нахуя тут метатаблица
метатаблица нужна чтобы я мог парсить и выводить imgui.InputText с значениями ini (по скольку там дохуя инпутов, то я юзаю эту метатаблицу), но из за какой то магии у меня нихуя не пашет, хотя раньше все было хорошо.

Lua:
--в переменную записана таблица со значениями из ини
local config_weapons = setmetatable({"brassknuckle", "golfclub", "nitestick"},
{
   __index = function(self, key)
      if not guncfg.weapon[key] then
         guncfg.weapon[key] = ""
      end
-- тут как раз будет InputText, где key в guncfg.weapon - значения из таблицы сверху
      self = imgui.new.char[256](u8(guncfg.weapon[key]))
      return self[key]
   end
})

for i, v in ipairs(config_weapons) do
  if imgui.InputText("##gun" .. i, config_weapons[v], 255) then
        guncfg.weapon[v] = u8:decode(ffi.string(config_weapon[v]))
        inicfg.save(ini, "Example.ini")
    end
end
 

chapo

чопа сребдс // @moujeek
Модератор
8,932
11,698
Все ровно не понял в чем проблема, можно же сделать например так
Lua:
local inicfg = require('inicfg');
local directIni = '.ini';
local ini = inicfg.load({
    main = {
        deagle = 'это дигL',
        m4 = 'а это м4'
    },
}, directIni);
inicfg.save(ini, directIni);

local inputs = {};
for k, v in pairs(ini.main) do
    table.insert(inputs, { label = k, value = imgui.new.char[128](v) });
end

for k, v in pairs(inputs) do
    if (imgui.InputText('##gun' .. k, v.value, ffi.sizeof(v.value))) then
        save();
    end
end

function save() --
    for k, v in pairs(inputs) do
        ini.main[v.label] = u8:decode(ffi.string(v.value));
    end
end
Не проще ли в таком случае использовать это?
 
  • Нравится
Реакции: ChаtGPT

$Mr.R1ch$

Активный
Автор темы
284
40
Все ровно не понял в чем проблема, можно же сделать например так
Lua:
local inicfg = require('inicfg');
local directIni = '.ini';
local ini = inicfg.load({
    main = {
        deagle = 'это дигL',
        m4 = 'а это м4'
    },
}, directIni);
inicfg.save(ini, directIni);

local inputs = {};
for k, v in pairs(ini.main) do
    table.insert(inputs, { label = k, value = imgui.new.char[128](v) });
end

for k, v in pairs(inputs) do
    if (imgui.InputText('##gun' .. k, v.value, ffi.sizeof(v.value))) then
        save();
    end
end

function save() --
    for k, v in pairs(inputs) do
        ini.main[v.label] = u8:decode(ffi.string(v.value));
    end
end
Не проще ли в таком случае использовать это?
сделал все точно также, но у меня проблемы с кодировкой, в инпутах русские символы заменились на "????"