Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Разобрать бы этот код для начала. У тебя разбросано всё...
Если проблема с иероглифами, то очевидно, что проблема в сохранении с неправильной кодировкой.
Сохраняй в JSON вот так: config.var = u8:decode((var) - Где 1 - переменная с конфига, 2 - переменная ImGui.
В чат выводи просто как есть без u8 или u8:decode и т.п. Я просто вижу у тебя на 175-й строке какой-то u8:encode.
В ImGui: u8(var)

На скриншоте у тебя в одном месте иероглифы, в другом - нормальный текст.

И совет ещё.
Не регистрируй команды биндеров вот так вот через sampRegisterChatCommand. Зачем мучиться, создавая и удаляя их? Сделай через SAMP Events.
Lua:
function sampev.onSendCommand(command)
    -- Заноси свои команды биндов куда-то в таблицу.
    -- Парси их тут через цикл for.
    -- Затем циклом for разбиваешь свой Multiline на строки и отправляешь в чат.
    -- После этого пишешь return false, чтобы команды биндов серверу не отправлялись. На некоторых серверах будут писать, что такая команда не найдена.
end
 

h0los

Активный
220
36
написал скрипт хз крашит хелп
[ML] (error) ktime.lua: D:\SAMP\moonloader\ktime.lua:6: attempt to index global 'ini' (a nil value)
stack traceback:
D:\SAMP\moonloader\ktime.lua:6: in main chunk
[ML] (error) ktime.lua: Script died due to an error. (195AB9DC)
Lua:
require("lib.moonloader")
local imgui = require("mimgui")
local new = imgui.new
local flags = imgui.WindowFlags
local window = new.bool()
local enabled = new.bool(ini.main.enabled)
local ffi = require("ffi")
local str = ffi.string
local inicfg = require "inicfg"
local directIni = "ktime.ini"
local ini = inicfg.load(inicfg.load({
    main = {
        enabled = false
    },
}, directIni))
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

imgui.OnFrame(function() return window[0] end, function(player)
    imgui.Begin("ktime", window, flags.NoResize + flags.AlwaysAutoResize + flags.NoCollapse)
    if imgui.Checkbox(u8"Включить время на экране", enabled) then
        ini.main.enabled = enabled[0]
        inicfg.save(ini, "ktime.ini")
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand("kt", function() window[0] = not window[0] end)
    wait(-1)
end
 

chromiusj

average yakuza perk user
Модератор
5,689
3,997
написал скрипт хз крашит хелп
[ML] (error) ktime.lua: D:\SAMP\moonloader\ktime.lua:6: attempt to index global 'ini' (a nil value)
stack traceback:
D:\SAMP\moonloader\ktime.lua:6: in main chunk
[ML] (error) ktime.lua: Script died due to an error. (195AB9DC)
Lua:
require("lib.moonloader")
local imgui = require("mimgui")
local new = imgui.new
local flags = imgui.WindowFlags
local window = new.bool()
local enabled = new.bool(ini.main.enabled)
local ffi = require("ffi")
local str = ffi.string
local inicfg = require "inicfg"
local directIni = "ktime.ini"
local ini = inicfg.load(inicfg.load({
    main = {
        enabled = false
    },
}, directIni))
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

imgui.OnFrame(function() return window[0] end, function(player)
    imgui.Begin("ktime", window, flags.NoResize + flags.AlwaysAutoResize + flags.NoCollapse)
    if imgui.Checkbox(u8"Включить время на экране", enabled) then
        ini.main.enabled = enabled[0]
        inicfg.save(ini, "ktime.ini")
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand("kt", function() window[0] = not window[0] end)
    wait(-1)
end
перемести
local enabled = new.bool(ini.main.enabled)
ниже кода с конфигом,он его не видит,поэтому крашит
 
  • Нравится
Реакции: h0los

Corrygan228

Участник
132
9
Разобрать бы этот код для начала. У тебя разбросано всё...
Если проблема с иероглифами, то очевидно, что проблема в сохранении с неправильной кодировкой.
Сохраняй в JSON вот так: config.var = u8:decode((var) - Где 1 - переменная с конфига, 2 - переменная ImGui.
В чат выводи просто как есть без u8 или u8:decode и т.п. Я просто вижу у тебя на 175-й строке какой-то u8:encode.
В ImGui: u8(var)

На скриншоте у тебя в одном месте иероглифы, в другом - нормальный текст.

И совет ещё.
Не регистрируй команды биндеров вот так вот через sampRegisterChatCommand. Зачем мучиться, создавая и удаляя их? Сделай через SAMP Events.
Lua:
function sampev.onSendCommand(command)
    -- Заноси свои команды биндов куда-то в таблицу.
    -- Парси их тут через цикл for.
    -- Затем циклом for разбиваешь свой Multiline на строки и отправляешь в чат.
    -- После этого пишешь return false, чтобы команды биндов серверу не отправлялись. На некоторых серверах будут писать, что такая команда не найдена.
end
да еще бы понять где здесь сохранение, мне этот код дал типочек, а я ващ нихера не пойму
мб есть какой-то другой варик биндер такой реализовать?
 

h0los

Активный
220
36
перемести
local enabled = new.bool(ini.main.enabled)
ниже кода с конфигом,он его не видит,поэтому крашит
<3

плз хелп (что то напартачил)
суть не работает отображение жму галочку не жму отображается все равно
Lua:
require("lib.moonloader")
local imgui = require("mimgui")
local new = imgui.new
local flags = imgui.WindowFlags
local window = new.bool()
local ffi = require("ffi")
local str = ffi.string
local inicfg = require "inicfg"
local directIni = "ktime.ini"
local ini = inicfg.load(inicfg.load({
    main = {
        enabled = false
    },
}, directIni))
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local font = renderCreateFont("Arial", 20, 15)

local enabled = new.bool(ini.main.enabled)

imgui.OnFrame(function() return window[0] end, function(player)
    imgui.Begin("ktime", window, flags.NoResize + flags.AlwaysAutoResize + flags.NoCollapse)
    if imgui.Checkbox(u8"Включить время на экране", enabled) then
        ini.main.enabled = enabled[0]
        inicfg.save(ini, "ktime.ini")
        time = not time
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand("kt", function() window[0] = not window[0] end)
    while true do wait(0)
        local time = renderFontDrawText(font, "" .. getTimeOfDay(), 1100, 50, -1)
    end
end
 
Последнее редактирование:
D

deleted-user-139653

Гость
<3

плз хелп (что то напартачил)
суть не работает отображение жму галочку не жму отображается все равно
Lua:
require("lib.moonloader")
local imgui = require("mimgui")
local new = imgui.new
local flags = imgui.WindowFlags
local window = new.bool()
local ffi = require("ffi")
local str = ffi.string
local inicfg = require "inicfg"
local directIni = "ktime.ini"
local ini = inicfg.load(inicfg.load({
    main = {
        enabled = false
    },
}, directIni))
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local font = renderCreateFont("Arial", 20, 15)

local enabled = new.bool(ini.main.enabled)

imgui.OnFrame(function() return window[0] end, function(player)
    imgui.Begin("ktime", window, flags.NoResize + flags.AlwaysAutoResize + flags.NoCollapse)
    if imgui.Checkbox(u8"Включить время на экране", enabled) then
        ini.main.enabled = enabled[0]
        inicfg.save(ini, "ktime.ini")
        time = not time
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand("kt", function() window[0] = not window[0] end)
    while true do wait(0)
        local time = renderFontDrawText(font, "" .. getTimeOfDay(), 1100, 50, -1)
    end
end
Lua:
require("lib.moonloader")
local imgui = require("mimgui")
local new = imgui.new
local flags = imgui.WindowFlags
local window = new.bool()
local ffi = require("ffi")
local str = ffi.string
local inicfg = require "inicfg"
local directIni = "ktime.ini"
local ini = inicfg.load(inicfg.load({
    main = {
        enabled = false
    },
}, directIni))
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local font = renderCreateFont("Arial", 20, 15)

local enabled = new.bool(ini.main.enabled)

imgui.OnFrame(function() return window[0] end, function(player)
    imgui.Begin("ktime", window, flags.NoResize + flags.AlwaysAutoResize + flags.NoCollapse)
    if imgui.Checkbox(u8"Включить время на экране", enabled) then
        ini.main.enabled = not ini.main.enabled
        inicfg.save(ini, "ktime.ini")
    end
    imgui.End()
end)

function main()
    sampRegisterChatCommand("kt", function() window[0] = not window[0] end)
    while true do wait(0)
        if ini.main.enabled then
            local time = renderFontDrawText(font, "" .. getTimeOfDay(), 1100, 50, -1)
        end
    end
end
 

Corrygan228

Участник
132
9
почему могут не появляться инпуты "команда" и "клавиша"? что бы я не выбирал в комбо, рядом пусто
Lua:
                                if imgui.Button(u8'Добавить') then
                                    imgui.OpenPopup('##add_bind')
                                end
                                if imgui.BeginPopupModal('##add_bind', _, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove) then
                                    imgui.SetNextWindowSize(imgui.ImVec2(350, 250))
                                    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
                                    imgui.CenterText(u8'Настройка нового бинда')
                                    imgui.Separator()
                                    imgui.NewLine()
                                    imgui.PushItemWidth(130)
                                    imgui.InputText(u8'Название', whatSave.name)
                                    imgui.PopItemWidth()
                                    imgui.PushItemWidth(130)
                                    imgui.Combo(u8'##Активация', whatSave.activation, {u8"На кнопку", u8"На команду"})
                                    imgui.PopItemWidth()
                                    imgui.SameLine()
                                    if whatSave.activation == 1 then            
                                        imgui.InputText(u8'Команда', whatSave.command)  
                                    elseif whatSave.activation == 0 then
                                        imgui.InputText(u8'Клавиша', whatSave.hotkey)
                                    end
                                    imgui.SetCursorPosX(35)
                                    if imgui.Button(u8'Принять', imgui.ImVec2(120, 30)) then
                                        imgui.CloseCurrentPopup()
                                    end
                                    imgui.SameLine()
                                    if imgui.Button(u8'Отмена', imgui.ImVec2(120, 30)) then
                                        imgui.CloseCurrentPopup()
                                    end
 
Последнее редактирование:

painw

Известный
119
66
почему могут не появляться инпуты "команда" и "клавиша"? что бы я не выбирал в комбо, рядом пусто
Lua:
                                if imgui.Button(u8'Добавить') then
                                    imgui.OpenPopup('##add_bind')
                                end
                                if imgui.BeginPopupModal('##add_bind', _, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove) then
                                    imgui.SetNextWindowSize(imgui.ImVec2(350, 250))
                                    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
                                    imgui.CenterText(u8'Настройка нового бинда')
                                    imgui.Separator()
                                    imgui.NewLine()
                                    imgui.PushItemWidth(130)
                                    imgui.InputText(u8'Название', whatSave.name)
                                    imgui.PopItemWidth()
                                    imgui.PushItemWidth(130)
                                    imgui.Combo(u8'##Активация', whatSave.activation, {u8"На кнопку", u8"На команду"})
                                    imgui.PopItemWidth()
                                    imgui.SameLine()
                                    if whatSave.activation == 1 then          
                                        imgui.InputText(u8'Команда', whatSave.command)
                                    elseif whatSave.activation == 0 then
                                        imgui.InputText(u8'Клавиша', whatSave.hotkey)
                                    end
                                    imgui.SetCursorPosX(35)
                                    if imgui.Button(u8'Принять', imgui.ImVec2(120, 30)) then
                                        imgui.CloseCurrentPopup()
                                    end
                                    imgui.SameLine()
                                    if imgui.Button(u8'Отмена', imgui.ImVec2(120, 30)) then
                                        imgui.CloseCurrentPopup()
                                    end
Lua:
if whatSave.activation.v == 1 then                                                       
   imgui.InputText(u8'Команда',whatSave.command)                               
elseif whatSave.activation.v == 0 then                                       
   imgui.InputText(u8'Клавиша',whatSave.hotkey)
end
 

legnd

Известный
1,574
682
Скриншот 16-12-2023 011606.jpg

русский язык не воспринимается
 

Дядя Энрик.

Активный
338
81
Посмотреть вложение 224811
русский язык не воспринимается
u8'Text'

Lua:
for k, v in ipairs(panel2) do
        imgui.SetCursorPosX(10)
        if imgui.Selectable(u8(v[1]), selectable == v[1], imgui.SelectableFlags.AllowDoubleClick) then
            imgui.Text(u8(v[1]))
            selectable = v[1]
            sampAddChatMessage('Выбран: '..v[1], -1)
        end
    end
выбираю строчку из диалога, после выбора строчки мне надо отправить sampSendDialogResponse(), но ничего не происходит. Нажать надо на "выбор"
1702697952084.png
1702697966550.png
 

DarkDTM

Участник
55
4
Как сделать так, что бы если скрипт не находил файл - он создавал его
 

Corrygan228

Участник
132
9
почему не получается обратиться к значению activation?
[11:54:27.185195] (error) Prison Helper.lua: ...HER\resources\projects\crmp\moonloader\Prison Helper.lua:597: attempt to index field 'activation' (a number value)
stack traceback:
...HER\resources\projects\crmp\moonloader\Prison Helper.lua:597: in function 'OnDrawFrame'
...AUNCHER\resources\projects\crmp\moonloader\lib\imgui.lua:1378: in function <...AUNCHER\resources\projects\crmp\moonloader\lib\imgui.lua:1367>
[11:54:27.185195] (error) Prison Helper.lua: Script died due to an error. (303E9454)
Lua:
                                for k, v in ipairs(testJSON) do
                                    if k == switch then
                                        if v.activation.v == 0 then -- здесь ошибка
                                            imgui.Text(u8'Активация: ' .. v.hotkey.v)
                                        else
                                            imgui.Text(u8'Активaция: ' .. v.command.v)
                                        end
                                        if imgui.InputTextMultiline('##multiline', v.multiline, imgui.ImVec2(300, 200)) then
                                            testJSON[k].multiline = v.multiline.v
                                            save()
                                        end
                                        if imgui.Button(u8'Удалить', imgui.ImVec2(120, 30)) then
                                            table.remove(testJSON, k)
                                            save()
                                        end
                                    end
                                end
1702716985795.png
 

Andrinall

Известный
701
518
почему не получается обратиться к значению activation?

Lua:
                                for k, v in ipairs(testJSON) do
                                    if k == switch then
                                        if v.activation.v == 0 then -- здесь ошибка
                                            imgui.Text(u8'Активация: ' .. v.hotkey.v)
                                        else
                                            imgui.Text(u8'Активaция: ' .. v.command.v)
                                        end
                                        if imgui.InputTextMultiline('##multiline', v.multiline, imgui.ImVec2(300, 200)) then
                                            testJSON[k].multiline = v.multiline.v
                                            save()
                                        end
                                        if imgui.Button(u8'Удалить', imgui.ImVec2(120, 30)) then
                                            table.remove(testJSON, k)
                                            save()
                                        end
                                    end
                                end
Посмотреть вложение 224823
Потому что ты пытаешься обратиться по индексу к числу, а не таблице или userdata. Оберни в ImBool значение из json'а, если тебе так хочется через v.activation.v, либо просто убери это .v в конце
 

Corrygan228

Участник
132
9
Потому что ты пытаешься обратиться по индексу к числу, а не таблице или userdata. Оберни в ImBool значение из json'а, если тебе так хочется через v.activation.v, либо просто убери это .v в конце
Немного не понял? Как мне обернуть это в ImBool, если оно изначально является ImInt?
Скинул чуть больше кода, мб понятнее будет
Lua:
                                if imgui.Button(u8'Добавить', imgui.ImVec2(80, 26)) then
                                    imgui.OpenPopup('##add_bind')
                                end
                                if imgui.BeginPopupModal('##add_bind', _, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove) then
                                    imgui.SetNextWindowSize(imgui.ImVec2(350, 250))
                                    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
                                    imgui.CenterText(u8'Настройка нового бинда')
                                    imgui.Separator()
                                    imgui.NewLine()
                                    imgui.PushItemWidth(130)
                                    imgui.InputText(u8'Название', whatSave.name)
                                    imgui.PopItemWidth()
                                    imgui.PushItemWidth(130)
                                    imgui.Combo(u8'##Активация', whatSave.activation, {u8"На кнопку", u8"На команду"})
                                    imgui.PopItemWidth()
                                    imgui.SameLine()
                                    if whatSave.activation.v == 1 then   
                                        imgui.PushItemWidth(130)         
                                        imgui.InputText(u8'##Команда', whatSave.command) 
                                        imgui.PopItemWidth() 
                                    elseif whatSave.activation.v == 0 then
                                        imgui.PushItemWidth(130)
                                        imgui.InputText(u8'##Клавиша', whatSave.hotkey)
                                        imgui.PopItemWidth()
                                    end
                                    imgui.NewLine()
                                    imgui.Separator()
                                    imgui.SetCursorPosX(18)
                                    if imgui.Button(u8'Принять', imgui.ImVec2(120, 30)) then
                                        if whatSave.name.v ~= '' then
                                            if whatSave.activation.v == 1 then
                                                if whatSave.command.v ~= '' then
                                                    table.insert(testJSON, {
                                                        name = u8:decode(whatSave.name.v),
                                                        multiline = u8:decode(whatSave.multiline.v),
                                                        command = u8:decode(whatSave.command.v),
                                                        hotkey = u8:decode(whatSave.hotkey.v),
                                                        activation = whatSave.activation.v,
                                                    }) save()
                                                    whatSave = {
                                                        name = imgui.ImBuffer(256),
                                                        multiline = imgui.ImBuffer(256),
                                                        command = imgui.ImBuffer(256),
                                                        hotkey = imgui.ImBuffer(256),
                                                        activation =  imgui.ImInt(0),
                                                    }
                                                    imgui.CloseCurrentPopup()
                                                else
                                                    sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Введите команду для активации бинда!', -1)
                                                    imgui.CloseCurrentPopup()
                                                end
                                            else
                                                if whatSave.hotkey.v ~= '' then
                                                    table.insert(testJSON, {
                                                        name = u8:decode(whatSave.name.v),
                                                        multiline = u8:decode(whatSave.multiline.v),
                                                        command = u8:decode(whatSave.command.v),
                                                        hotkey = u8:decode(whatSave.hotkey.v),
                                                        activation = whatSave.activation.v,
                                                    }) save()
                                                    whatSave = {
                                                        name = imgui.ImBuffer(256),
                                                        multiline = imgui.ImBuffer(256),
                                                        command = imgui.ImBuffer(256),
                                                        hotkey = imgui.ImBuffer(256),
                                                        activation =  imgui.ImInt(0),
                                                    }
                                                    imgui.CloseCurrentPopup()
                                                else
                                                    sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Укажите клавишу для активации бинда!', -1)
                                                    imgui.CloseCurrentPopup()
                                                end
                                            end
                                        else
                                            sampAddChatMessage('{0099FF}[Prison Helper]:' .. white_color .. ' Укажите название бинда!', -1)
                                            imgui.CloseCurrentPopup()
                                        end
                                    end
                                    imgui.SameLine()
                                    imgui.SetCursorPosX(178)
                                    if imgui.Button(u8'Отмена', imgui.ImVec2(120, 30)) then
                                        imgui.CloseCurrentPopup()
                                    end
                                    imgui.EndPopup()
                                end
                                
                                imgui.BeginChild("##2", imgui.ImVec2(342, 240), false)
                                        
                                for k, v in ipairs(testJSON) do
                                    if k == switch then
                                        if v.activation.v == 0 then -- вот оно
                                            imgui.Text(u8'Активация: ' .. v.hotkey.v)
                                        else
                                            imgui.Text(u8'Активaция: ' .. v.command.v)
                                        end
                                        if imgui.InputTextMultiline('##multiline', v.multiline, imgui.ImVec2(300, 200)) then
                                            testJSON[k].multiline = v.multiline.v
                                            save()
                                        end
                                        if imgui.Button(u8'Удалить', imgui.ImVec2(120, 30)) then
                                            table.remove(testJSON, k)
                                            save()
                                        end
                                    end
                                end

                            imgui.EndChild()