- 314
- 49
- Версия MoonLoader
- Другое
Приветствую, недавно решил попробовать создать простенький биндер на mimgui, но столкнулся с проблемой. При создании биндера, нужно указать любой текст в InputTextMultiline, но много строчный текст в ini не не может быть записан (это и понятно). Пытался исправить но вылазит ошибка. (строка 82)
Видел что такое реализовывали в других скриптах, но я чуток не понял как оно работает.
Видел что такое реализовывали в других скриптах, но я чуток не понял как оно работает.
Lua:
local imgui = require ('mimgui')
local new = imgui.new
local encoding = require ('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local ffi = require ('ffi')
local sampev = require ('samp.events')
local inicfg = require ('inicfg')
local ini = inicfg.load({
}, "test_binder.ini")
local MainWindow = new.bool(false)
local sizeX, sizeY = getScreenResolution()
local name_bind = new.char[256]()
local text_bind = new.char[256]()
local delay_bind = new.float[10]()
imgui.OnFrame(function() return MainWindow[0] and not isGamePaused() end, function(window)
imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(1300, 900), imgui.Cond.FirstUseEver)
imgui.Begin(u8'Биндер', MainWindow)
if imgui.Button(u8'Добавить биндер', imgui.ImVec2(1290, 40)) then
imgui.OpenPopup(u8'Создание биндера')
end
imgui.Text(u8'Строки:')
for i, v in ipairs(ini) do
if v[1] and v[2] then
imgui.BeginChild("##Test", imgui.ImVec2(-1, -1), true)
imgui.Text(u8'Команда:')
imgui.Text(u8(v[1]))
imgui.Spacing()
imgui.Text(u8'Текст:')
imgui.Text(v[2])
imgui.SameLine()
if imgui.Button('X') then
table.remove(ini, i)
inicfg.save(ini, "test_binder.ini")
end
imgui.EndChild()
end
end
if imgui.BeginPopupModal(u8'Создание биндера', _, imgui.WindowFlags.AlwaysAutoResize) then
imgui.BeginChild('##name', imgui.ImVec2(1300, 800), true)
imgui.Text(u8'Название команды:')
imgui.Spacing()
imgui.Text('/')
imgui.SameLine()
imgui.PushItemWidth(400)
imgui.InputText("##name123", name_bind, 256)
imgui.PopItemWidth()
imgui.Spacing()
imgui.Text(u8'Задержка от 0.1 до 5 сек:')
imgui.PushItemWidth(400)
imgui.InputFloat("##name333", delay_bind, 5)
imgui.PopItemWidth()
imgui.Spacing()
imgui.Text(u8'Текст биндера:')
imgui.Spacing()
if imgui.InputTextMultiline("##name321", text_bind, 256, imgui.ImVec2(-1, -1)) then
-- почему то не работает
-- text_bind[0] = string.gsub(ffi.string(text_bind), "\n", "&")
end
imgui.NewLine()
if imgui.Button(u8'Создать', imgui.ImVec2(1290, 40)) then
local name = ffi.string(name_bind)
local text = ffi.string(text_bind)
if name and text and delay_bind[0] ~= "" then
local newBind = {
[1] = name,
[2] = text,
[3] = delay_bind[0]
}
table.insert(ini, newBind)
inicfg.save(ini, "test_binder.ini")
imgui.CloseCurrentPopup()
end
end
imgui.Spacing()
if imgui.Button(u8'Закрыть', imgui.ImVec2(1290, 40)) then
imgui.CloseCurrentPopup()
end
imgui.EndChild()
end
imgui.End()
end)
function sampev.onSendCommand(cmd)
for i, v in ipairs(ini) do
if v[1] ~= "" and cmd == "/"..v[1] then
for str in string.gmatch(v[2], "[^\r\n]+") do
lua_thread.create(function()
sampSendChat(u8:decode(ffi.string(str)))
wait(v[3]*1000)
end)
end
return false
end
end
end
imgui.OnInitialize(function()
theme()
end)
function theme()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
local ImVec2 = imgui.ImVec2
style.WindowPadding = ImVec2(15, 15) -- отступы окон
style.WindowTitleAlign = ImVec2(0.5, 0.5) -- заголовок окна
style.FramePadding = ImVec2(5, 5)
style.ItemSpacing = ImVec2(5, 4)
style.ItemInnerSpacing = ImVec2(2, 2)
style.TouchExtraPadding = ImVec2(0, 0)
style.IndentSpacing = 0
style.ScrollbarSize = 23 -- размер скролла (ползунка)
style.GrabMinSize = 15
--==[ BORDER ]==--
style.WindowBorderSize = 0
style.ChildBorderSize = 2
style.PopupBorderSize = 0
style.FrameBorderSize = 0 --обводка кнопок, импутов, чекбоксов и тп
style.TabBorderSize = 0
--==[ ROUNDING ]==--
style.WindowRounding = 4 -- края окон
style.ChildRounding = 4 -- края begin child
style.FrameRounding = 4 -- края кнопок
style.PopupRounding = 0
style.ScrollbarRounding = 1 -- края ползунка
style.GrabRounding = 1
style.TabRounding = 8
imgui.GetIO().IniFilename = nil
end
function main()
while not isSampAvailable() do wait(100) end
wait(500)
sampRegisterChatCommand('bind', function()
MainWindow[0] = not MainWindow[0]
end)
while true do wait(0)
end
end