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

$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

$Mr.R1ch$

Активный
Автор темы
284
40
Последнее редактирование:

$Mr.R1ch$

Активный
Автор темы
284
40
в 13 строке моего когда оборачивай v в u8
помогло. Как ещё можно парсить по порядку инпуты, а не чтобы в разнобой были? (пробовал ipairs - нихуя)


помогло. Как ещё можно парсить по порядку инпуты, а не чтобы в разнобой были? (пробовал ipairs - нихуя)
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,932
11,698
блять ну ты логику включи и подумай. В разнобой оно идет потому что в твоей таблице в качестве ключей используются строки, следовательно нужно заменить их на числа, в данном случае можно использовать иды оружий, а названия получай через lib\game\weapons.lua
Lua:
local weapons = require('game.weapons');
local inicfg = require('inicfg');
local directIni = '.ini';
local ini = inicfg.load({
    main = {
        [24] = 'это дигL',
        [31] = 'а это м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(weapons.id_to_name(k) .. '##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
 

$Mr.R1ch$

Активный
Автор темы
284
40
блять ну ты логику включи и подумай. В разнобой оно идет потому что в твоей таблице в качестве ключей используются строки, следовательно нужно заменить их на числа, в данном случае можно использовать иды оружий, а названия получай через lib\game\weapons.lua
Lua:
local weapons = require('game.weapons');
local inicfg = require('inicfg');
local directIni = '.ini';
local ini = inicfg.load({
    main = {
        [24] = 'это дигL',
        [31] = 'а это м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(weapons.id_to_name(k) .. '##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
так в этом и прикол, что я не могу использовать числа а конкретно строки, по скольку мне нужно взаимодействовать с ними (редактировать), поэтому получать название оружия по функции я не могу
 

chapo

чопа сребдс // @moujeek
Модератор
8,932
11,698
так в этом и прикол, что я не могу использовать числа а конкретно строки, по скольку мне нужно взаимодействовать с ними (редактировать), поэтому получать название оружия по функции я не могу
я так понял что ты хочешь сделать авто отыгровку оружий, так нахуя тебе редактировать названия полей?
Тут один хуй будет проще юзать систему конфигов которую я кидал ранее. Выглядеть будет примерно так
Lua:
local cfg = {
    weapons = {
        { label = imgui.new.char[64]('m4'), text = imgui.new.char[64]('Достал из очка эмочку') }
    }
}
cjc.load('cfg/pizda.json', cfg)

for index, weapon in ipairs(cfg) do
    local inputLabel = imgui.InputText(('%d. %s##weaponLabel'):format(index, weapon.label), weapon.label, ffi.sizeof(weapon.label));
    imgui.SameLine();
    local inputText = imgui.InputText(('##weaponLabelText-%d'):format(index), weapon.text, ffi.sizeof(weapon.text));
    if (inputLabel or inputText) then
        cfg(); -- save cfg
    end
end