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)