LUA скрипт [NL] Чуток удобное UI

Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
Удобность заключается в том, что можно сразу при создании чит вара указывать зависимости для его отображения

Код:
local ui = {
    list = { },
}

ui.push = function( element, index, conditions ) --creates CheatVar
    ui.list[ index ] = { }

    ui.list[ index ].element = element

    ui.list[ index ].visible_state = function( )
        if not conditions then
            return true
        end

        for k, v in pairs( conditions ) do
            local cur = ui.list[ v[ 1 ] ].element:Get( ) == v[ 2 ]

            if not cur then
                return false
            end
        end

        return true
    end
end

ui.get = function( index ) --returns CheatVar by its index
    return ui.list[ index ] and ui.list[ index ].element
end

ui.delete = function( index ) --deletes CheatVar by its index
    Menu.DestroyItem( ui.get( index ) )

    ui.list[ index ] = nil
end

ui.visibility_handle = function( ) --handles visibility of all CheatVars, should be called in draw callback
    if not Cheat.IsMenuVisible( ) then --а нахуя нам при зкарытой менюшке)
        return
    end

    for k, v in pairs( ui.list ) do
        v.element:SetVisible( v.visible_state( ) )
    end
end

-------------------------------------------------example-------------------------------------------------

ui.push( Menu.Switch( "General", "Enable", false, "" ), "enable_switch" ) --если нет условий, то элемент всегда видимый, но сам элемент и его индекс - обязательные аргументы к функции

ui.push( Menu.SliderInt( "General", "Value", 2, 1, 4, "" ), "value_slider", {-- добавляемм условия в виде массива с массивами(да, я умный)
    { "enable_switch", true } -- первый элемент массива - индекс в юи системе, второй - истинное значение для этого элемента
} )

ui.push( Menu.Switch( "General", "Result", false, "" ), "result_switch", {
    { "enable_switch", true }, --первое условие
    { "value_slider", 3 }, -- второе условие
} )

local function on_draw( )
    ui.visibility_handle( ) --не забываем заколбечить

    local value_var = ui.get( "value_slider" ) --находим наш чит вар

    if value_var:Get( ) == 4 then --юзаем его как хотим уже как обычно
        print( 1 )
    end
end

Cheat.RegisterCallback( "draw", on_draw ) --херачим в колбек
 
Легенда форума
Статус
Оффлайн
Регистрация
16 Сен 2018
Сообщения
4,002
Реакции[?]
1,946
Поинты[?]
7K
Вот вам не кринжовая реализация


Меня в нанотехнологиях не переиграть.
Тут без таб системы, но делает практически тоже самое, прикрутить сюда табы дело 2ух минут.
Можете юзать/постить куда хотите, было написано за пару минут специально для этой темы
Код:
local ui_handler = {}

ui_handler.elements = {}
ui_handler.refs = {}

-- возможно можно как то оптимизировать указав более явные связи между элементами
ui_handler.run_update = function()
    for name, m_table in pairs(ui_handler.refs) do
        if m_table.condition ~= nil then
            m_table.ref:SetVisible(m_table.condition())
        end
    end
end

ui_handler.new = function(unique_name, reference, condition)

    -- опять же "защита" от дурачков которые не могут совладать с аргументами
    if type(unique_name) ~= "string" or type(reference) ~= "userdata" then
        error(unique_name .. " args error")
        return
    end

    -- same
    if condition ~= nil and type(condition) ~= "function" then
        error(unique_name .. " condition arg error")
        return
    end

    -- same
    if ui_handler.refs[unique_name] ~= nil then
        error(unique_name .. " already exists")
        return
    end

    ui_handler.refs[unique_name] = {
        ref = reference,
        name = unique_name,
        condition = condition
    }

    local on_touch_callback = function(new_value)
        ui_handler.elements[unique_name] = new_value

        ui_handler.run_update()
    end

    -- разок апдейтим при инициализации и дальше ставим все это дело на каллбек
    on_touch_callback(reference:Get())
    reference:RegisterCallback(on_touch_callback)

end

-- первый аргумент - уникальное название функции
-- второй аргумент - референс на уи элемент
-- третий аргумент - кондиция при которой он будет показан, если нужно что бы всегда показывался - оставьте аргумент пустым.

ui_handler.new("test1_1", Menu.Switch("Hello 1", "White person", false))
ui_handler.new("test1_2", Menu.SliderInt("Hello 1", "White person 2", 10, 0, 15), function()
    return ui_handler.elements["test1_1"]
end)

ui_handler.new("test1_3", Menu.ColorEdit("Hello 1", "White person 3", Color.new(1, 1, 1, 1)), function()
    return ui_handler.elements["test1_1"] and ui_handler.elements["test1_2"] == 15
end)

ui_handler.new("test2_1", Menu.Switch("Hello 2", "Black person", false))
ui_handler.new("test2_2", Menu.SliderInt("Hello 2", "Black person 2", 10, 0, 15), function()
    return ui_handler.elements["test2_1"]
end)

ui_handler.new("test2_3", Menu.ColorEdit("Hello 2", "Black person 3", Color.new(1, 1, 1, 1)), function()
    return ui_handler.elements["test2_1"] and ui_handler.elements["test2_2"] > 10
end)

-- можете удалить, это не нужная часть, тут просто выводятся вообще все значения из списка элементов
Cheat.RegisterCallback("draw", function()
    for k, v in pairs(ui_handler.elements) do
       print(k, ui_handler.elements[k])
    end
end)
 
Легенда форума
Статус
Оффлайн
Регистрация
16 Сен 2018
Сообщения
4,002
Реакции[?]
1,946
Поинты[?]
7K
А, чееее. Поч кринжовая?)
Ущербный нейминг, зачем то все вызывается в драв каллбеке (НАХУЯ??), все ущербно лежит в массиве, последовательность аргументов в функциях тоже шиза, зачем то сделали отдельную функцию для гета элементов

И ЭТО ТОЛЬКО НА 50 СТРОК ИЛИ СКОЛЬКО БЛЯТЬ ТАМ
 
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
Ущербный нейминг, зачем то все вызывается в драв каллбеке (НАХУЯ??), все ущербно лежит в массиве, последовательность аргументов в функциях тоже шиза, зачем то сделали отдельную функцию для гета элементов

И ЭТО ТОЛЬКО НА 50 СТРОК ИЛИ СКОЛЬКО БЛЯТЬ ТАМ
Чё))) а в какой колбек?)
И почему ущербно ахаха
Завтра сделаю на нл получше)

У тебя ведь почти то же самое)
 
Легенда форума
Статус
Оффлайн
Регистрация
16 Сен 2018
Сообщения
4,002
Реакции[?]
1,946
Поинты[?]
7K
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
Забаненный
Статус
Оффлайн
Регистрация
1 Мар 2022
Сообщения
34
Реакции[?]
33
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
alguém se converte em aimware ou legendware?
 
jmp ecx enjoyer
Пользователь
Статус
Оффлайн
Регистрация
19 Фев 2019
Сообщения
378
Реакции[?]
104
Поинты[?]
8K
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
20 Фев 2022
Сообщения
149
Реакции[?]
41
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
Так и запишем))))
Ну и твоя таб система
Это примордипл...
unknown.png
Вот так выглядит
 
Последнее редактирование:
jmp ecx enjoyer
Пользователь
Статус
Оффлайн
Регистрация
19 Фев 2019
Сообщения
378
Реакции[?]
104
Поинты[?]
8K
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
reinterpret_cast<bool*>
Пользователь
Статус
Оффлайн
Регистрация
21 Июл 2019
Сообщения
204
Реакции[?]
79
Поинты[?]
2K
Участник
Статус
Оффлайн
Регистрация
29 Дек 2019
Сообщения
381
Реакции[?]
168
Поинты[?]
3K
то есть драв коллбек для тебя удобнее, чем коллбек для юи элементов?
у электа на каждый юи элемента ставиться общий колбек) зачем его делать и ставить везде, если можно просто в драв запихнуть с чеком на открытое меню)
 
Сверху Снизу