[IGS] У тебя нет купленных моделей

Как мне сделать менюшку чтобы можно было переключать купленные скины. Допустим прописал в чат /models и он открывал менюшку с купленными скинами где ты мог их переключать

Я попробовал сделать, то руки лио из одно место растут то или сам igs не интегрируется с менюшкой

garrysmod/lua/autorun/server

util.AddNetworkString("IGS_OpenModelMenu")
util.AddNetworkString("IGS_SetModel")

hook.Add("PlayerSay", "IGS_OpenModelSlashCommand", function(ply, text)
    if string.lower(text) == "/models" then
        print("[IGS] Игрок использовал /models:", ply:Nick())

        local owned = {}
        local items = IGS:GetItems()

        if not items then
            print("[IGS] IGS:GetItems() вернул nil")
            return ""
        end

        for _, item in pairs(items) do
            if istable(item)
            and isfunction(item.GetCategory)
            and isfunction(item.HasPurchase)
            and isfunction(item.GetPlayerModel)
            then
                if item:GetCategory() == "Модельки" and item:HasPurchase(ply) then
                    local mdl = item:GetPlayerModel()
                    if mdl and isstring(mdl) then
                        table.insert(owned, {
                            name = item:GetName(),
                            model = mdl
                        })
                    end
                end
            end
        end

        print("[IGS] Найдено моделей: " .. #owned)

        ply.IGS_OwnedModels = owned

        net.Start("IGS_OpenModelMenu")
            net.WriteUInt(#owned, 8)
            for _, mdl in ipairs(owned) do
                net.WriteString(mdl.name)
                net.WriteString(mdl.model)
            end
        net.Send(ply)

        return ""
    end
end)

net.Receive("IGS_SetModel", function(_, ply)
    local mdl = net.ReadString()
    if not isstring(mdl) then return end

    for _, data in ipairs(ply.IGS_OwnedModels or {}) do
        if data.model == mdl then
            print("[IGS] Установка модели:", mdl)
            ply:SetModel(mdl)
            return
        end
    end
end)

garrysmod/lua/autorun/client

net.Receive("IGS_OpenModelMenu", function()
    local count = net.ReadUInt(8)
    if count == 0 then
        chat.AddText(Color(255, 100, 100), "[IGS] У тебя нет купленных моделей.")
        return
    end

    local models = {}
    for i = 1, count do
        table.insert(models, {
            uid = net.ReadString(),
            name = net.ReadString(),
            model = net.ReadString()
        })
    end

    local frame = vgui.Create("DFrame")
    frame:SetTitle("Купленные модели")
    frame:SetSize(400, 300)
    frame:Center()
    frame:MakePopup()

    local list = vgui.Create("DScrollPanel", frame)
    list:Dock(FILL)

    for _, m in ipairs(models) do
        local btn = list:Add("DButton")
        btn:Dock(TOP)
        btn:DockMargin(5, 5, 5, 0)
        btn:SetText(m.name)
        btn.DoClick = function()
            net.Start("IGS_SelectModel")
            net.WriteString(m.uid)
            net.SendToServer()

            chat.AddText(Color(100, 255, 100), "[IGS] Модель выбрана: " .. m.name)
        end
    end
end)

Для начала - не придумывать функции, которых не существует.

item.icon.icon - получение модели из SetIcon предмета ( где вторым аргументом должен быть true ).
Таким образом составляешь таблицу и передаёшь на клиент