ViolLua.Visuals = { 
    Records    = ViolLua.Records,
    Menu       = ViolLua.Menu,
    Config     = ViolLua.Config,
    Client     = ViolLua.Client,
    Colors     = ViolLua.Colors,
    Notify     = ViolLua.Notify,
    Resolution = ViolLua.Resolution,
    Materials  = ViolLua.Materials,
    Ragebot    = ViolLua.Ragebot,
    Overlay    = ViolLua.Overlay,
    CSEntity   = ViolLua.CSEntity,
    Hitmarker  = ViolLua.Hitmarker,
    Gamemodes  = ViolLua.Gamemodes,
    Gamemode   = ViolLua.Gamemode,
    Items      = ViolLua.Items,

    Fonts = {
        [ 'Icons' ] = 'ViolLua-icons',
        [ 'Main' ]  = 'ViolLua-main',
        [ 'Small' ] = 'ViolLua-small'
    },

    Effects = {
        [ 'Tesla' ]        = 'TeslaHitboxes',
        [ 'Gibs' ]         = 'AntlionGib',
        [ 'Sparks' ]       = 'ElectricSpark',
        [ 'Heavy Sparks' ] = 'Sparks',
        [ 'Explosion' ]    = 'Explosion',
        [ 'Vortigaunt' ]   = 'VortDispel'
    },

    Fade = { },
    Offsets = { }
}

surface.CreateFont( 'ViolLua-main', {
   font = 'Verdana',
   extended = false,
   size = 12, 
   weight = 700,
   antialias = false,
   shadow = true,
   outline = false
} )

surface.CreateFont( 'ViolLua-icons', {
    font = 'HalfLife2',
    extended = true,
    size = 18, 
    weight = 900,
    antialias = true,
    shadow = true,
    outline = false
} )

surface.CreateFont( 'ViolLua-small', {
    font = 'Consolas',
    extended = false,
    size = 12, 
    weight = 500,
    antialias = false,
    shadow = true,
    outline = false
} )

ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/animations/handler.lua' )

ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/draggables/handler.lua' )

ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/chams/handler.lua' )

ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/footsteps.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/modulate.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/impacts.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/view.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/sky.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/weather.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/anonymizer.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/world/announcer.lua' )

ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/icons.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/indicators.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/items.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/glow.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/dock.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/renderer.lua' )
ViolLua:LoadFile( 'lua/ViolLua/modules/visuals/wallhack/handler.lua' )

function ViolLua.Visuals:Update( )
    -- We shouldn't run if we haven't even had the time for a FrameStageNotify yet.
    if ( not self.Client.Local ) then 
        return
    end
    
    self:Watermark( )
    self:Notifications( )
    self:Wallhack( )
    self:Entities( )
end

function ViolLua.Visuals:Update3D( ) 
    if ( not self.Client.Local ) then 
        return
    end

    cam.Start3D( )
        self:PlayerChams( )
        self:FakeChams( )
    cam.End3D( )

    self.Sky:Handler( )
end

ViolLua.Hooks:New( 'RenderScreenspaceEffects', ViolLua.Visuals.Update3D, ViolLua.Visuals )
ViolLua.Hooks:New( 'DrawOverlay', ViolLua.Visuals.Update, ViolLua.Visuals )