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)
|