aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/dataloader/sv_loadglobals.lua
blob: cf6f8381bb3ff8dd20b6e42a42663094c791d324 (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
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")
    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)
            print("Loading global file:", f)
            local filetxt = file.Read(f,"GAME")
            local filename = string.GetFileFromFilename(f)
            if string.find(filename,"^cl_") then
                print("Added",f,"to be loaded clientside")
                coroutine.yield(f,filetxt)
            elseif string.find(filename,"^sv_") then
                CompileString(filetxt,f)()
                coroutine.yield()
            else
                CompileString(filetxt,f)()
                coroutine.yield(f,filetxt)
            end
        end)
    end)
end

local csco = {}
local function load_cs_files(ply)
    print("Told to load csfiles for", ply:Nick())
    csco[ply] = coroutine.create(function()
        print("Loading cs files, toload is")
        for k,v in pairs(toload) do print(k) end
        for k,v in pairs(toload) do
            print("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
        print("co is", co)
        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)
    print("Doing player inital span, loading globals for " , ply:Nick())
    timer.Simple(1,function()
        load_cs_files(ply)
        state = "loading_cl"
    end)
end)