spacebuild/spacebuild

View on GitHub
lua/autorun/client/cl_caf_autostart.lua

Summary

Maintainability
Test Coverage
local gmod_version_required = 145;
if ( VERSION < gmod_version_required ) then
    error("SB CORE: Your gmod is out of date: found version ", VERSION, "required ", gmod_version_required)
end

local net = net

--Variable Declarations
local CAF2 = {}
CAF = CAF2;
local CAF3 = {}
CAF2.StartingUp = false;
CAF2.HasInternet = false;
CAF2.InternetEnabled = true --Change this to false if you crash when CAF2 loads clientside


surface.CreateFont( "GModCAFNotify", {font = "verdana", size = 15, weight = 600} ) 


--nederlands, english

local DEBUG = true
CAF3.DEBUG = DEBUG;
local Addons = {}
CAF3.Addons = Addons

--Derma stuff
local MainInfoMenuData = nil;
--local MainStatusMenuData = nil;
--local TopFrame = nil;
--local TopFrameHasText = false;
--local TopLabel = nil
--End Derma stuff

local addonlevel = {}
CAF3.addonlevel = addonlevel
addonlevel[1] = {}
addonlevel[2] = {}
addonlevel[3] = {}
addonlevel[4] = {}
addonlevel[5] = {}

local hooks = {}
CAF3.hooks = hooks;
hooks["think"] = {}
hooks["think2"] = {}
hooks["think3"] = {}
hooks["OnAddonDestruct"] = {}
hooks["OnAddonConstruct"] = {}
hooks["OnAddonExtraOptionChange"] = {}

local function ErrorOffStuff(String)
    Msg( "----------------------------------------------------------------------\n" )
    Msg("-----------Custom Addon Management Framework Error----------\n")
    Msg("----------------------------------------------------------------------\n")
    Msg(tostring(String).."\n")
end

CAF2.CAF3 = CAF3;
include("caf/core/shared/sh_general_caf.lua")
CAF2.CAF3 = nil;

-- Synchronize language with gmod interface
CAF2.SaveVar("CAF_LANGUAGE", GetConVar("gmod_language"):GetString())

local function OnAddonDestruct(name)
    if not name then return end
    if(CAF2.GetAddonStatus(name)) then
        local ok, err = pcall(Addons[name].__Destruct);
        if not ok then
            CAF2.WriteToDebugFile("CAF_Destruct", "Couldn't call destructor for "..name .. " error: " .. err .."\n")
            AddPopup(CAF.GetLangVar("Error unloading Addon")..": " .. CAF.GetLangVar(name), "top", CAF2.colors.red);
        else
            if err then
                AddPopup(CAF.GetLangVar("Addon")..": " .. CAF.GetLangVar(name) .. " "..CAF.GetLangVar("got disabled"),"top", CAF2.colors.green);
            else
                AddPopup(CAF.GetLangVar("An error occured when trying to disable Addon")..": " .. CAF.GetLangVar(name),"top", CAF2.colors.red);
            end
        end
    end
    if not CAF2.StartingUp then
        for k , v in pairs(hooks["OnAddonDestruct"]) do
            local ok, err = pcall(v, name)
            if not ok then
                CAF2.WriteToDebugFile("CAF_Hooks", "OnAddonDestruct Error " .. err .. "\n")
            end
        end
        CAF2.RefreshMainMenu();
    end
end

local function OnAddonConstruct(name)
    if not name then return end
    if(not CAF2.GetAddonStatus(name)) then
        if Addons[name] then
            local test, err = pcall(Addons[name].__Construct);
            if not test then
                CAF2.WriteToDebugFile("CAF_Construct", "Couldn't call constructor for "..name .. " error: " .. err .."\n")
                AddPopup(CAF.GetLangVar("Error loading Addon")..": " .. CAF.GetLangVar(name), "top", CAF2.colors.red);
            else
                if err then
                    AddPopup(CAF.GetLangVar("Addon")..": " .. CAF.GetLangVar(name) .. " "..CAF.GetLangVar("got enabled"),"top", CAF2.colors.green);
                else
                    AddPopup(CAF.GetLangVar("An error occured when trying to enable Addon")..": " .. CAF.GetLangVar(name),"top", CAF2.colors.red);
                end
            end
        end
    end
    if not CAF2.StartingUp then
        for k , v in pairs(hooks["OnAddonConstruct"]) do
            local ok, err = pcall(v, name)
            if not ok then
                CAF2.WriteToDebugFile("CAF_Hooks", "OnAddonConstruct Error " .. err .. "\n")
            end
        end
        CAF2.RefreshMainMenu();
    end
end

local function OnAddonExtraOptionChange(AddonName, OptionName, NewStatus)
    if not AddonName or not OptionName then return nil, CAF.GetLangVar("Missing Argument") end
    for k , v in pairs(hooks["OnAddonExtraOptionChange"]) do
        local ok, err = pcall(v, AddonName, OptionName, NewStatus)
        if not ok then
            CAF2.WriteToDebugFile("CAF_Hooks", "OnAddonExtraOptionChange Error " .. err .. "\n")
        end
    end
end

--Global function

function CAF2.WriteToDebugFile(filename, message)
    if not filename or not message then return nil , CAF.GetLangVar("Missing Argument") end
    if DEBUG then
        ErrorNoHalt("Filename: "..tostring(filename)..", Message: "..tostring(message).."\n")
    end
    local contents = file.Read("CAF_Debug/client/"..filename..".txt")
    contents = contents or "" 
    contents = contents .. message
    file.Write("CAF_Debug/client/"..filename..".txt", contents)
end

function CAF2.ClearDebugFile(filename)
    if not filename then return nil , CAF.GetLangVar("Missing Argument") end
    local contents = file.Read("CAF_Debug/client/"..filename..".txt")
    contents = contents or "" 
    file.Write("CAF_Debug/client/"..filename..".txt", "")
    return content
end

--Server-Client Synchronisation
function CAF2.ConstructAddon(len, client)
    local name = net.ReadString()
    OnAddonConstruct(name)
    --RunConsoleCommand("Main_CAF_Menu");
end
net.Receive("CAF_Addon_Construct", CAF2.ConstructAddon)

function CAF2.DestructAddon(len, client)
    local name = net.ReadString()
    OnAddonDestruct(name)
    --RunConsoleCommand("Main_CAF_Menu");
end
net.Receive("CAF_Addon_Destruct", CAF2.DestructAddon)

function CAF2.Start(len, client)
    CAF2.StartingUp = true;
end
net.Receive("CAF_Start_true", CAF2.Start)

function CAF2.endStart(len, client)
    CAF2.StartingUp = false;
end
net.Receive("CAF_Start_false", CAF2.endStart)

local displaypopups = {}
local popups = {}

--PopupSettings
local Font    = "GModCAFNotify"
--End popupsettings

local function DrawPopups()
    if GetConVarString('cl_hudversion') == "" then
        if displaypopups["top"] then
            local obj = displaypopups["top"]
            surface.SetFont( Font )
            local width, height = surface.GetTextSize(obj.message)
            if width == nil or height == nil then return end
            width = width + 16
            height = height + 16
            local left = (ScrW()/2)- (width/2);
            local top = 0;
            draw.RoundedBox( 4, left-1 , top, width+2, height+2, obj.color)
            draw.RoundedBox( 4, left , top+1, width, height, Color(0, 0, 0, 150))
            draw.DrawText(obj.message,    Font, left + 8, top + 9, obj.color, 0 )
        end
        if displaypopups["left"] then
            local obj = displaypopups["left"]
            surface.SetFont( Font )
            local width, height = surface.GetTextSize(obj.message)
            if width == nil or height == nil then return end
            width = width + 16
            height = height + 16
            local left = 0
            local top = ScrH() * 2/3;
            draw.RoundedBox( 4, left , top-1, width+2, height+2, obj.color)
            draw.RoundedBox( 4, left+1 , top, width, height, Color(0, 0, 0, 150))
            draw.DrawText(obj.message,    Font, left + 9, top + 8, obj.color, 0 )
        end
        if displaypopups["right"] then
            local obj = displaypopups["right"]
            surface.SetFont( Font )
            local width, height = surface.GetTextSize(obj.message)
            if width == nil or height == nil then return end
            width = width + 16
            height = height + 16
            local left = ScrW()- width;
            local top = ScrH() * 2/3;
            draw.RoundedBox( 4, left-1 , top-1, width + 2, height + 2, obj.color)
            draw.RoundedBox( 4, left , top, width, height, Color(0, 0, 0, 150))
            draw.DrawText(obj.message,    Font, left + 8, top + 8, obj.color, 0 )
        end
        if displaypopups["bottom"] then
            local obj = displaypopups["bottom"]
            surface.SetFont( Font )
            local width, height = surface.GetTextSize(obj.message)
            if width == nil or height == nil then return end
            width = width + 16
            height = height + 16
            local left = (ScrW()/2)- (width/2);
            local top = ScrH() - height
            draw.RoundedBox( 4, left-1 , top-2, width+2, height+2, obj.color)
            draw.RoundedBox( 4, left , top - 1, width, height, Color(0, 0, 0, 150))
            draw.DrawText(obj.message,    Font, left + 8, top + 7, obj.color, 0 )
        end
    end
end
hook.Add("HUDPaint", "CAF_Core_POPUPS", DrawPopups)

local function MessageOfTheDay()
    return "Welcome to CAF\nYou are using version "..CAF2.version;
end

--local function ShowNextTopMessage()
local function ShowNextPopupMessage()
    local ply = LocalPlayer();
    local locations = {"top", "left", "right", "bottom"};    
    for k, v in pairs(locations) do
        if displaypopups[v] == nil and popups[v] and table.Count(popups[v]) > 0 then
            local obj = popups[v][1];
            table.remove(popups[v], 1);
            if ply and ply.ChatPrint then
                ply:ChatPrint(obj.message.."\n")
            else
                Msg(obj.message.."\n")
            end
            displaypopups[v] = obj;
            timer.Simple(obj.time, function() ClearPopup(obj) end);
        end
    end
end

--function ClearTopTextMessage(obj)
function ClearPopup(obj)
    if obj then
        displaypopups[obj.location] = nil;
    end
    if table.Count(popups[obj.location]) > 0 then
        ShowNextPopupMessage();
    end
end

local MessageLog = {}

--function AddTopInfoMessage(message)
function AddPopup(message, location, color, displaytime)
    local obj = {}
    local allowedlocations = {"top", "left", "right", "bottom"};
    location = location or "top";
    if not table.HasValue(allowedlocations, location) then
        location = "top"
    end
    obj.message = message or "Corrupt Message";
    obj.location = location or "top"
    obj.time = displaytime or 1;
    obj.color = color or CAF2.colors.white;
    if not popups[location] then
        popups[location] = {}
    end
    table.insert(popups[location], obj);
    table.insert(MessageLog, obj);
    ShowNextPopupMessage();
end

local function GetHelpPanel(frame)
    local panel = vgui.Create("DPanel", frame)
    panel:StretchToParent( 6, 80, 6, 6 )
    
    local LeftTree = vgui.Create( "DTree", panel )
    LeftTree:SetSize( 200, panel:GetTall() - 2)
    LeftTree:SetPos(15, 1);

    local RightPanel = vgui.Create("DPanel", panel )
    RightPanel:SetSize(panel:GetWide() - 230, panel:GetTall() - 2);
    RightPanel:SetPos(220, 1);
    
    if not MainInfoMenuData then
        MainInfoMenuData = {}
        if table.Count(Addons) > 0 then
            for k, v in pairs(Addons) do
                local ok, err = pcall(v.GetMenu)
                if ok then
                    if err then
                        MainInfoMenuData[k] = err
                    end
                end
            end
        end
    end
    LeftTree:Clear()
    --Fill the Tree
    if table.Count(MainInfoMenuData) > 0 then
        for k, v in pairs(MainInfoMenuData) do
            --Addon Info
            local title = k;
            local node = LeftTree:AddNode(title)
            --node.Icon:SetImage(devlist.icon)
            for l, w in pairs(v) do
                --Sub Menu's
                local Node = node:AddNode(l)
                function Node.DoClick(btn)
                    if(w.hasmenu) then
                        --To Implement
                    elseif (CAF2.HasInternet and w.interneturl) then
                        local HTMLTest = vgui.Create("HTML", RightPanel)   
                        HTMLTest:StretchToParent( 10, 10, 10, 10 ) 
                        HTMLTest:OpenURL(w.interneturl)  
                    elseif(w.localurl) then
                        local HTMLTest = vgui.Create("HTML", RightPanel)  
                        HTMLTest:StretchToParent( 10, 10, 10, 10 ) 
                        HTMLTest:SetHTML(file.Read(w.localurl)) 
                    end
                end
                function Node.DoRightClick(btn)
                    -- To Implement
                end
                for m, x in pairs(w) do
                    --Links in submenu
                    local cnode = Node:AddNode(m)
                    function cnode.DoClick(btn)
                        if(x.hasmenu) then
                            --To Implement
                        elseif (CAF2.HasInternet and x.interneturl) then
                            RightPanel:Clear();
                            local HTMLTest = vgui.Create("HTML", RightPanel)  
                            HTMLTest:StretchToParent( 10, 10, 10, 10 ) 
                            HTMLTest:OpenURL(x.interneturl)  
                        elseif(x.localurl) then
                            RightPanel:Clear();
                            local HTMLTest = vgui.Create("HTML", RightPanel)  
                            HTMLTest:StretchToParent( 10, 10, 10, 10 ) 
                            HTMLTest:SetHTML(file.Read(x.localurl)) 
                        end
                    end
                    function cnode.DoRightClick(btn)
                        -- To Implement
                    end
                end
            end
        end
    end
    return panel
end

function CAF2.Notice(message, title)
    if not message then return false end;
    if not title then title = "Notice" end
    local dfpopup = vgui.Create("DFrame")
    dfpopup:SetDeleteOnClose() 
    dfpopup:SetDraggable( false ) 
    dfpopup:SetTitle(title)
    
    local lbl = vgui.Create("DLabel", dfpopup)
    lbl:SetPos(10, 25);
    lbl:SetText(message);
    lbl:SizeToContents();
    
    dfpopup:SetSize(lbl:GetWide() + 4, lbl:GetTall() + 25);
    dfpopup:Center();
    dfpopup:MakePopup();
    return true;
end

local function GetClientMenu(contentpanel)
    --Create clientside menu here => Language settings, ...
    local panel = vgui.Create("DPanel", contentpanel)
    local x = 10;
    local y = 0;
    
    --Title
    local lblTitle = vgui.Create("DLabel", panel)
    lblTitle:SetText(CAF2.GetLangVar("Clientside CAF Options"));
    lblTitle:SizeToContents()
    lblTitle:SetPos(x, y);
    
    y = y + 20;
    -- Language Selection
    local lbl = vgui.Create("DLabel", panel)
    lbl:SetText(CAF2.GetLangVar("Language")..":");
    lbl:SizeToContents()
    lbl:SetPos(x, y);
    
    x = x + lbl:GetWide() + 2;
    
    --[[local selection = vgui.Create("DMultiChoice", panel)
    selection:SetPos(x, y);
    for k, v in pairs(CAF.LANGUAGE) do
        selection:AddChoice( k ) 
    end
    function selection:OnSelect( index, value, data ) 
        CAF2.currentlanguage = value;
        CAF2.SaveVar("CAF_LANGUAGE", value)
        CAF2.Notice(CAF2.GetLangVar("Some Language Changes will only Show after a map reload!"));
    end
    selection:SetWide( 150 )
    
    
    y = y + 15
    x = x - lbl:GetWide() - 5
    --Other options here]]
    
    panel:SetSize(contentpanel:GetWide(), y + 10);
    return panel;
end

local function AddCAFInfoToStatus(List)
    
    
    local descriptiontxt = nil
    if GetDescription then
        descriptiontxt = GetDescription()
    end
    
    local v = {}
    function v.GetVersion()
        return CAF2.version, "Core";
    end
    
    function v.GetStatus()
        return true;
    end
    
    function v.CanChangeStatus()
        return false
    end
    
    function v.GetDisplayImage()
        return "icon16/application.png"; --Change to something else later on?
    end
    
    local cat = vgui.Create("DCAFCollapsibleCategory") 
    cat:Setup("Custom Addon Framework", v);
    --cat:SetExtraButtonAction(function() frame:Close()  end)
    
    local contentpanel = vgui.Create("DPanelList", cat)
    contentpanel:SetWide(List:GetWide())
    local clientMenu = nil;
    if GetClientMenu then
        clientMenu = GetClientMenu(contentpanel);
    end
    local serverMenu = nil;
    if GetServerMenu then
        serverMenu = GetServerMenu(contentpanel);
    end
    
    --Start Add Custom Stuff
    local x = 0;
    local y = 0;
    local ply = LocalPlayer();
    --Version Check
    local versionupdatetext = vgui.Create("DLabel", contentpanel)
    versionupdatetext:SetPos(x + 10, y)
    versionupdatetext:SetText(CAF.GetLangVar("No Update Information Available"))
    versionupdatetext:SetTextColor( Color(200,200,0,200) )
    versionupdatetext:SizeToContents()
    
    y = y + 30;
    
    --ServerMenu
    if serverMenu then
        serverMenu:SetPos(x, y)
        y = y + serverMenu:GetTall() + 15;
    end
    --Clientside menu
    if clientMenu then
        clientMenu:SetPos(x, y)
        y = y + clientMenu:GetTall() + 15;
    end
    
    --Description
    if descriptiontxt ~= nil then
        local list = vgui.Create("DPanelList",contentpanel)
        list:SetPos(x, y);
        local size = 1;
        list:SetPadding(10)
        --Description Blank Line
        lab = vgui.Create("DLabel", list)
        lab:SetText(CAF.GetLangVar("Description")..":")
        lab:SizeToContents()
        list:AddItem(lab)
        size = size + 1;
        --Description
        for k, v in pairs(descriptiontxt) do
            lab = vgui.Create("DLabel", list)
            lab:SetText(v)
            lab:SizeToContents()
            list:AddItem(lab)
            size = size + 1;
        end
        list:SetSize(List:GetWide()-10, 15 * size)
        contentpanel:SizeToContents()
        y = y + (15 * size) + 15
    end
    contentpanel:SetTall(y);
    --End Add Custom Stuff
    cat:SetContents(contentpanel)
    cat:SizeToContents()
    cat:InvalidateLayout()
    cat:SetExpanded(true)
    List:AddItem(cat)
end

local function GetStatusPanel(frame)
    local panel = vgui.Create("DPanel", frame)
    panel:StretchToParent( 6, 36, 6, 6 )
    local List = vgui.Create("DPanelList", panel)
    List:EnableHorizontal(false)
    List:EnableVerticalScrollbar(true)
    List:SetPadding(5)
    List:SetSpacing(5)
    List:StretchToParent( 2, 2, 2, 2 )
    List:SetPos(2, 2)
    
    local iteration = 0 
    AddCAFInfoToStatus(List);
    
    iteration = iteration + 1;
    
    if table.Count(Addons) > 0 then
        for k,v in pairs( Addons ) do
            if v.IsVisible == nil or v.IsVisible() then
                iteration = iteration + 1;
                
                local descriptiontxt = nil
                if v.GetDescription then
                    descriptiontxt = v.GetDescription()
                --else
                --    descriptiontxt = {CAF.GetLangVar("No Description")};
                end
                
                local cat = vgui.Create("DCAFCollapsibleCategory") 
                cat:Setup(k, v);
                --cat:SetExtraButtonAction(function() frame:Close()  end)
                
                local contentpanel = vgui.Create("DPanelList", cat)
                contentpanel:SetWide(List:GetWide())
                local clientMenu = nil;
                if v.GetClientMenu then
                    clientMenu = v.GetClientMenu(contentpanel);
                end
                local serverMenu = nil;
                if v.GetServerMenu then
                    serverMenu = v.GetServerMenu(contentpanel);
                end
                
                --Start Add Custom Stuff
                local x = 0;
                local y = 0;
                local ply = LocalPlayer();
                --Version Check
                local versionupdatetext = vgui.Create("DLabel", contentpanel)
                versionupdatetext:SetPos(x + 10, y)
                versionupdatetext:SetText(CAF.GetLangVar("No Update Information Available"))
                versionupdatetext:SetTextColor( Color(200,200,0,200) )
                versionupdatetext:SizeToContents()
                
                y = y + 30;
                
                --ServerMenu
                if serverMenu then
                    serverMenu:SetPos(x, y)
                    y = y + serverMenu:GetTall() + 15;
                end
                --Clientside menu
                if clientMenu then
                    clientMenu:SetPos(x, y)
                    y = y + clientMenu:GetTall() + 15;
                end
                
                --Description
                if descriptiontxt ~= nil then
                    local list = vgui.Create("DPanelList",contentpanel)
                    list:SetPos(x, y);
                    local size = 1;
                    list:SetPadding(10)
                    --Description Blank Line
                    lab = vgui.Create("DLabel", list)
                    lab:SetText(CAF.GetLangVar("Description")..":")
                    lab:SizeToContents()
                    list:AddItem(lab)
                    size = size + 1;
                    --Description
                    for k, v in pairs(descriptiontxt) do
                        lab = vgui.Create("DLabel", list)
                        lab:SetText(v)
                        lab:SizeToContents()
                        list:AddItem(lab)
                        size = size + 1;
                    end
                    list:SetSize(List:GetWide()-10, 15 * size)
                    contentpanel:SizeToContents()
                    y = y + (15 * size) + 15
                end
                contentpanel:SetTall(y);
                --End Add Custom Stuff
                cat:SetContents(contentpanel)
                cat:SizeToContents()
                cat:InvalidateLayout()
                --[[if iteration == 1 then
                    cat:SetExpanded(true)
                else]]
                    cat:SetExpanded(false)
                --end
                List:AddItem(cat)
            end
        end
    end
    return panel
end

function GetMessageLogPanel(frame)
    --TODO Create it
    local panel = vgui.Create("DPanel", frame)
    panel:StretchToParent( 6, 36, 6, 6 )
    local mylist = vgui.Create("DListView", panel)
    mylist:SetMultiSelect(false)
    mylist:SetPos(1,1)
    mylist:StretchToParent( 2, 2, 2, 2 ) --SetSize(panel:GetWide()- 2, panel:GetTall()-2)
    local colum =  mylist:AddColumn("Time")
    colum:SetFixedWidth(math.Round((mylist:GetWide() * (0.5/5))))
    colum =  mylist:AddColumn("Location")
    colum:SetFixedWidth(math.Round((mylist:GetWide() * (0.5/5))))
    colum =  mylist:AddColumn("Message")
    colum:SetFixedWidth(math.Round((mylist:GetWide() * (4/5))))
    for k, v in pairs(MessageLog) do
        local line = mylist:AddLine(CurTime(), v.location, v.message )
        line.Columns[3]:SetTextColor(v.color)  
    end
    return panel;
end

local function GetServerSettingsPanel(frame)
    local panel = vgui.Create("DPanel", frame)
    panel:StretchToParent( 6, 36, 6, 6 )
    return panel
end

local function GetAboutPanel(frame)
    local panel = vgui.Create("DPanel", frame)
    panel:StretchToParent( 6, 36, 6, 6 )
    --
    local mylist = vgui.Create("DListView", panel)
    mylist:SetMultiSelect(false)
    mylist:SetPos(1,1)
    mylist:SetSize(panel:GetWide()- 2, panel:GetTall()-2)
    local colum =  mylist:AddColumn( "")
    colum:SetFixedWidth(5)
    local colum1 =  mylist:AddColumn( "About")
    colum1:SetFixedWidth(mylist:GetWide() - 5)
    mylist.SortByColumn = function()
    end
    ----------
    --Text--
    ----------
    mylist:AddLine( "", "Custom Addon Framework" )
    mylist:AddLine( "", "More info to be added" )
    mylist:AddLine( "", "" )
    mylist:AddLine( "", "Made By SnakeSVx" )
    mylist:AddLine( "", "Official website: http://www.snakesvx.net" )
    --
    return panel
end

local MainFrame = nil;

function CAF2.CloseMainMenu()
    if MainFrame then MainFrame:Close() end
end

function CAF2.RefreshMainMenu()
    if MainFrame then
         CAF2.OpenMainMenu()
    end
end

function CAF2.OpenMainMenu()
    CAF2.CloseMainMenu();
    MainFrame= vgui.Create("DFrame")
    MainFrame:SetDeleteOnClose() 
    MainFrame:SetDraggable( false ) 
    MainFrame:SetTitle("Custom Addon Framework Main Menu")
    MainFrame:SetSize(ScrW() * 0.8, ScrH() * 0.9)
    MainFrame:Center()
    local ContentPanel = vgui.Create( "DPropertySheet", MainFrame )
    ContentPanel:Dock(FILL)
    ContentPanel:AddSheet( CAF.GetLangVar("Installed Addons"), GetStatusPanel(ContentPanel), "icon16/application.png", true, true )
    ContentPanel:AddSheet( CAF.GetLangVar("Info and Help"), GetHelpPanel(ContentPanel), "icon16/box.png", true, true )
    if LocalPlayer():IsAdmin() then
        ContentPanel:AddSheet( CAF.GetLangVar("Server Settings"), GetServerSettingsPanel(ContentPanel), "icon16/wrench.png", true, true )
    end
    ContentPanel:AddSheet( CAF.GetLangVar("Message Log"), GetMessageLogPanel(ContentPanel), "icon16/wrench.png", true, true )
    ContentPanel:AddSheet( CAF.GetLangVar("About"), GetAboutPanel(ContentPanel), "icon16/group.png", true, true )
    MainFrame:MakePopup()
end
concommand.Add("Main_CAF_Menu", CAF2.OpenMainMenu)

--Panel
local function BuildMenu( Panel )
    Panel:ClearControls( )
    Panel:AddControl( "Header", { Text = "Custom Addon Framework", Description   = "Custom Addon Framework" }  )
    Panel:AddControl( "Button", {
        Label = "Open Menu",
        Text = "Custom Addon Framework",
        Command = "Main_CAF_Menu"
        } )
end

local function CreateMenu( )
    spawnmenu.AddToolMenuOption( "Custom Addon Framework", "Custom Addon Framework", "MainInfoMenu", "Main Info Menu", "", "", BuildMenu, { } )
end
hook.Add( "PopulateToolMenu", "Caf_OpenMenu_AddMenu", CreateMenu )

function CAF2.POPUP(msg, location, color, displaytime)
    if msg then
        AddPopup(msg, location, color, displaytime);
    end
end

local function ProccessMessage(len, client)
    local msg = net.ReadString()
    local location = net.ReadString()
    local r = net.ReadUInt( 8 )
    local g = net.ReadUInt( 8 )
    local b = net.ReadUInt( 8 )
    local a = net.ReadUInt( 8 )
    local displaytime = net.ReadUInt( 16 )
    local color = Color(r, g, b, a);
    CAF2.POPUP(msg, location, color, displaytime);
end
net.Receive("CAF_Addon_POPUP", ProccessMessage)

--CAF = CAF2

--Include clientside files

--Core

local Files = file.Find( "caf/core/client/*.lua" , "LUA")
for k, File in ipairs(Files) do
    Msg(CAF.GetLangVar("Loading")..": "..File.."...")
    local ErrorCheck, PCallError = pcall(include, "caf/core/client/"..File)
    if(not ErrorCheck) then
        ErrorOffStuff(PCallError)
    else
        Msg("Loaded: Successfully\n")
    end
end

Files = file.Find("caf/languagevars/*.lua", "LUA")
for k, File in ipairs(Files) do
    Msg(CAF.GetLangVar("Loading")..": "..File.."...")
    local ErrorCheck, PCallError = pcall(include, "caf/languagevars/"..File)
    if(not ErrorCheck) then
        ErrorOffStuff(PCallError)
    else
        Msg("Sent: Successfully\n")
    end
end

--Addons
local Files = file.Find( "caf/addons/client/*.lua" , "LUA")
for k, File in ipairs(Files) do
    Msg(CAF.GetLangVar("Loading")..": "..File.."...")
    local ErrorCheck, PCallError = pcall(include, "caf/addons/client/"..File)
    if(not ErrorCheck) then
        ErrorOffStuff(PCallError)
    else
        Msg("Loaded: Successfully\n")
    end
end