diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2017-09-09 12:48:29 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2017-09-09 12:48:29 -0400 |
| commit | 497be6ff15989c7bf9de5beb138d2ef042dca6bd (patch) | |
| tree | d9152a50baa82828b194b8248559fd8de5f6e683 /gamemode | |
| parent | 22f3c6d96fcb560c13445d4a6135ca3f01d27197 (diff) | |
| download | artery-497be6ff15989c7bf9de5beb138d2ef042dca6bd.tar.gz artery-497be6ff15989c7bf9de5beb138d2ef042dca6bd.tar.bz2 artery-497be6ff15989c7bf9de5beb138d2ef042dca6bd.zip | |
Improved data loader
Data loader now uses coroutines so that it probably won't crash clients.
Diffstat (limited to 'gamemode')
| -rw-r--r-- | gamemode/core/dataloader/cl_loadglobals.lua | 1 | ||||
| -rw-r--r-- | gamemode/core/dataloader/sv_loadglobals.lua | 98 |
2 files changed, 72 insertions, 27 deletions
diff --git a/gamemode/core/dataloader/cl_loadglobals.lua b/gamemode/core/dataloader/cl_loadglobals.lua index 919ecb5..2cf770c 100644 --- a/gamemode/core/dataloader/cl_loadglobals.lua +++ b/gamemode/core/dataloader/cl_loadglobals.lua @@ -20,6 +20,7 @@ net.Receive("artery_loadfile",function() end local thash = tonumber(util.CRC(cache)) if hash != thash then + print("I need to load a file",filename," but my hash was old, redownloading!") net.Start("artery_requestcsfile") net.WriteString(filename) net.SendToServer() diff --git a/gamemode/core/dataloader/sv_loadglobals.lua b/gamemode/core/dataloader/sv_loadglobals.lua index 31e2c56..cf6f838 100644 --- a/gamemode/core/dataloader/sv_loadglobals.lua +++ b/gamemode/core/dataloader/sv_loadglobals.lua @@ -1,5 +1,5 @@ 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/" @@ -21,35 +21,69 @@ util.AddNetworkString("artery_loadfile") util.AddNetworkString("artery_requestcsfile") util.AddNetworkString("artery_respondfile") local toload = {} +local co local function loadglobals() - ExecuteOnFolder("global",true,function(f) - local filetxt = file.Read(f,"GAME") - local filename = string.GetFileFromFilename(f) - if string.find(filename,"^cl_") then - toload[f] = filetxt - elseif string.find(filename,"^sv_") then - CompileString(filetxt,f)() - else - toload[f] = filetxt - CompileString(filetxt,f)() - end + 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) - for k,v in pairs(toload) do - net.Start("artery_loadfile") - net.WriteString(k) - local hash = util.CRC(v) - net.WriteUInt(tonumber(hash),32) - net.Send(ply) - end + 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 -hook.Add("PlayerInitialSpawn","artery_loadglobals",function(ply) - timer.Simple(1,function() - load_cs_files(ply) - 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) @@ -59,12 +93,22 @@ net.Receive("artery_requestcsfile",function(ln,ply) 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() - for k,v in pairs(player.GetAll()) do - load_cs_files(v) - end + 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) |
