aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/dataloader
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-09-09 12:48:29 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2017-09-09 12:48:29 -0400
commit497be6ff15989c7bf9de5beb138d2ef042dca6bd (patch)
treed9152a50baa82828b194b8248559fd8de5f6e683 /gamemode/core/dataloader
parent22f3c6d96fcb560c13445d4a6135ca3f01d27197 (diff)
downloadartery-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/core/dataloader')
-rw-r--r--gamemode/core/dataloader/cl_loadglobals.lua1
-rw-r--r--gamemode/core/dataloader/sv_loadglobals.lua98
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)