aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/dataloader/sv_loadglobals.lua
blob: 7689c549a6e874c0043a1c58bdcb239511313eb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
print("Load globals called")
local log = nrequire("log.lua")
local function ExecuteOnFolder(dir, recursive, func)
    recursive = recursive ~= nil and recursive or false
    local path = "data/artery/"
    local fpath = table.concat({path,dir,"/*"})
    local files, directories = file.Find(fpath,"GAME")
    print("Looking for files in ", fpath, "Found:")
    print("files:")
    PrintTable(files)
    print("dirs:")
    PrintTable(directories)
    for k,v in pairs(files) do
        local callpath = table.concat({path,dir,"/",v})
        func(callpath)
    end
    if recursive then
        for k,v in pairs(directories) do
            local npath = table.concat({dir,"/",v})
            ExecuteOnFolder(npath,true,func)
        end
    end
end

util.AddNetworkString("artery_loadfile")
util.AddNetworkString("artery_requestcsfile")
util.AddNetworkString("artery_respondfile")
local toload = {}
local co
local function loadglobals()
    co = coroutine.create(function()
        ExecuteOnFolder("global",true,function(f)
            log.debug("Loading global file : " .. f)
            local filetxt = file.Read(f,"GAME")
            local filename = string.GetFileFromFilename(f)
            if string.find(filename,"^cl_") then
                coroutine.yield(f,filetxt)
            elseif string.find(filename,"^sv_") then
                local func = CompileString(filetxt,f,false)
                if type(func) == "function" then
                    xpcall(func,function(e)
                        log.error(string.format("%s : %s",f,e))
                    end)
                else
                    log.error(string.format("Failed to compile file %s :\n%s"),filename,func)
                end
                coroutine.yield()
            else
                local func = CompileString(filetxt,f,false)
                if type(func) == "function" then
                    xpcall(func,function(e)
                        log.error(string.format("%s : %s",f,e))
                    end)
                else
                    log.error(string.format("Failed to compile file %s :\n%s",filename,func))
                end
                coroutine.yield(f,filetxt)
            end
        end)
    end)
end

local csco = {}
local function load_cs_files(ply)
    log.debug("Told to load csfiles for", ply:Nick())
    csco[ply] = coroutine.create(function()
        for k,v in pairs(toload) do print(k) end
        for k,v in pairs(toload) do
            log.debug("Loading cs file:", k,"for",ply:Nick())
            net.Start("artery_loadfile")
            net.WriteString(k)
            local hash = util.CRC(v)
            net.WriteUInt(tonumber(hash),32)
            net.Send(ply)
            coroutine.yield()
        end
    end)
end

local state = "done"
local n
timer.Create("inc_load_timer",0.1,0,function()
    if state == "loading_sv" then
        if coroutine.status(co) == "suspended" then
            local _,fn,t = coroutine.resume(co)
            if fn and t then
                toload[fn] = t
            end
        else
            print("Done loading sv, setting state to load cl")
            state = "loading_cl"
        end
    elseif state == "loading_cl" then
        if not n then
            _,n = next(csco)
        end
        if n and coroutine.status(n) == "suspended" then
            coroutine.resume(n)
        else
            state = "done"
        end
    end
end)

net.Receive("artery_requestcsfile",function(ln,ply)
    local which = net.ReadString()
    net.Start("artery_respondfile")
    net.WriteString(which)
    net.WriteString(toload[which])
    net.Send(ply)
end)
concommand.Add("artery_reloadglobals_cs",function(ply,cmd,args)
    load_cs_files(ply)
    state = "loading_cl"
end)
concommand.Add("artery_reloadglobals",function(ply,cmd,args)
    if not ply:IsAdmin() then return end
    loadglobals()
    state = "loading_sv"
end)

loadglobals()
state = "loading_sv"
hook.Add("PlayerInitialSpawn","artery_loadglobals",function(ply)
    log.debug("Doing player inital spawn, loading globals for " , ply:Nick())
    timer.Simple(1,function()
        load_cs_files(ply)
        state = "loading_cl"
    end)
end)