From 497be6ff15989c7bf9de5beb138d2ef042dca6bd Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Sat, 9 Sep 2017 12:48:29 -0400 Subject: Improved data loader Data loader now uses coroutines so that it probably won't crash clients. --- gamemode/core/dataloader/cl_loadglobals.lua | 1 + 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) -- cgit v1.2.3-70-g09d2