- Версия MoonLoader
- .026-beta
Крч, недавно делал скрипт, в котором таблицы выступали "недо-классами". Сегодня наткнулся на интересную статью, как можно реализовать классы в LUA, но т.к. я немного ебланчик, я хз как лучше это перенести. Накидайте советов, как это "правильно" реализовать в формате классов. Ниже оставлю часть кода из скрипта.
Lua:
local config = {
window = {
main = new.bool()
},
input = {
send = new.char[1000000](),
search = new.char[256](),
},
message = {
system = new.bool(mainIni.message.system),
script = new.bool(mainIni.message.script)
},
settings = {
clean = new.bool(mainIni.settings.clean),
multiline = new.bool(mainIni.settings.multiline),
notification = new.bool(mainIni.settings.notification)
},
style = {
twist = new.int(mainIni.style.twist),
theme = new.int(mainIni.style.theme),
},
style_combo = imgui.new["const char*"][#style_list](style_list),
twist_combo = imgui.new["const char*"][#twist_list](twist_list)
}
local imguiElementSettings = {
toggle = {
clean = {
name = "Очистка поля после отправки",
actived = new.bool(mainIni.settings.clean)
},
notification = {
name = "Уведомления",
actived = new.bool(mainIni.settings.notification)
},
multiline = {
name = "Режим мега тру щит программера",
actived = new.bool(mainIni.settings.multiline)
}
},
checkbox = {
system = {
name = "Системные сообщения",
actived = new.bool(mainIni.message.system)
},
script = {
name = "Сообщения от скриптов",
actived = new.bool(mainIni.message.script)
}
}
}
local imguiElementRender = {
header = {
logs = {
name = u8"LOGS", -- что-то типа свойств
actived = new.bool(true),
render = function() -- что-то типа метода
imgui.Text(u8"Поиск:")
imgui.SameLine()
imgui.PushItemWidth(config.settings.multiline[0] and 715 or 515)
imgui.InputText("##Search", config.input.search, sizeof(config.input.search))
imgui.PopItemWidth()
imgui.BeginChild("log", imgui.ImVec2(-1, 330), true)
if #str(config.input.search) > 0 then
for _, msg in ipairs(message) do
if msg:lower():find(str(config.input.search):lower()) then
imgui.Text(u8(msg))
end
end
else
for _, msg in ipairs(message) do
imgui.Text(u8(msg))
end
end
imgui.EndChild()
imgui.PushItemWidth(500)
imgui[("InputText%s"):format(config.settings.multiline[0] and "Multiline" or "")]("##", config.input.send, sizeof(config.input.send))
imgui.SameLine()
imgui.BeginGroup()
if imgui.Button("Send", config.settings.multiline[0] and imgui.ImVec2(250, 24) or imgui.ImVec2(55, 24)) then
if #u8:decode(str(config.input.send)) > 0 then
playCode(u8:decode(str(config.input.send)))
if config.settings.clean[0] then
imgui.StrCopy(config.input.send, "")
end
Notification("Play code", 5, colorNotification())
end
end
if config.settings.multiline[0] then
if imgui.Button("Clean", imgui.ImVec2(250, 24)) then
imgui.StrCopy(config.input.send, "")
end
end
imgui.EndGroup()
end
},
settings = {
name = "SETTINGS",
actived = new.bool(),
render = function()
--[[
for _, data in pairs(imguiElementRender.combo) do
if imgui.Combo(u8(data.name), data.twist, data.combo, #data.list) then
Style()
end
end
]]
if imgui.Combo(u8"Выбор темы", config.style.theme, config.style_combo, #style_list) then
mainIni.style.theme = style.theme[0]
inicfg.save(mainIni, "moonlog.ini")
Style()
end
if imgui.Combo(u8"Стиль элементов", config.style.twist, config.twist_combo, #twist_list) then
mainIni.style.twist = style.twist[0]
inicfg.save(mainIni, "moonlog.ini")
Style()
end
for key, data in pairs(imguiElementSettings.toggle) do
if imgui.ToggleButton(u8(data.name), data.actived) then
mainIni.settings[key] = data.actived[0]
inicfg.save(mainIni, "moonlog.ini")
Notification(u8(("%s - %s"):format(data.name, (data.actived[0] and "ON" or "OFF"))), 5, colorNotification())
end
end
for key, data in pairs(imguiElementSettings.checkbox) do
if imgui.Checkbox(u8(data.name), data.actived) then
mainIni.message[key] = data.actived[0]
inicfg.save(mainIni, "moonlog.ini")
Notification(u8(("%s - %s"):format(data.name, (data.actived[0] and "ON" or "OFF"))), 5, colorNotification())
end
end
end
}
}
}
local mainFrame = imgui.OnFrame(
function() return config.window.main[0] end,
function(self)
local sizeX, sizeY = getScreenResolution()
local header = imguiElementRender.header
imgui.SetNextWindowPos(imgui.ImVec2(sizeX - 400, sizeY - 400), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(config.settings.multiline[0] and imgui.ImVec2(800, 550) or imgui.ImVec2(600, 450), imgui.Cond.FirstUseEver)
imgui.Begin(u8"##main", nil, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.AlwaysUseWindowPadding + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoTitleBar)
imgui.SetCursorPosX((imgui.GetWindowWidth() - imgui.CalcTextSize(u8"LOGS").x - imgui.CalcTextSize(u8"SETTGINS").x) / 2)
imgui.BeginGroup()
for index, data in ipairs(header) do
if imgui.HeaderButton(data.actived[0], data.name) then
for i, header in ipairs(header) do
header.actived[0] = i == index
end
end
if index ~= #header then
imgui.SameLine()
end
end
imgui.EndGroup()
imgui.SetCursorPosY(40)
imgui.BeginGroup()
for _, data in ipairs(header) do
if data.actived[0] then
data.render()
end
end
imgui.EndGroup()
imgui.End()
end
)