Files
wnsrc/addons/sam-master/lua/sam/libs/sh_globals.lua
lifestorm ba1fc01b16 Upload
2024-08-04 23:12:27 +03:00

111 lines
2.5 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if SAM_LOADED then return end
local sam, netstream = sam, sam.netstream
local globals
if SERVER then
globals = {}
local order = {}
local get_order_key = function(key)
for i = 1, #order do
if order[i] == key then
return i
end
end
end
function sam.set_global(key, value, force)
if force or globals[key] ~= value then
globals[key] = value
if value ~= nil then
if not get_order_key(key) then
table.insert(order, key)
end
else
local i = get_order_key(key)
if i then
table.remove(order, i)
end
end
netstream.Start(nil, "SetGlobal", key, value)
end
end
hook.Add("OnEntityCreated", "SAM.Globals", function(ent)
if ent:IsPlayer() and ent:IsValid() then
local delay = FrameTime() * 5
local first = true
for _, key in ipairs(order) do
if (key == "Ranks") then
for rank, value in pairs(globals[key]) do
timer.Simple(delay, function() netstream.Start(ent, "SendRank", rank, value) end)
delay = delay + FrameTime() * 2
end
timer.Simple(delay, function() netstream.Start(ent, "SendRank", "Last") end)
delay = delay + FrameTime() * 5
else
if (first) then
timer.Simple(delay, function() netstream.Start(ent, "SendGlobals", {[key] = globals[key]}, {key}) end)
first = false
else
timer.Simple(delay, function() netstream.Start(ent, "SetGlobal", key, globals[key]) end)
end
delay = delay + FrameTime() * 5
end
end
end
end)
end
if CLIENT then
function sam.set_global(key, value)
if globals then
globals[key] = value
hook.Call("SAM.ChangedGlobalVar", nil, key, value)
end
end
netstream.Hook("SetGlobal", sam.set_global)
netstream.Hook("SendGlobals", function(vars, order)
globals = vars
for _, key in ipairs(order) do
hook.Call("SAM.ChangedGlobalVar", nil, key, vars[key])
end
end)
netstream.Hook("SendRank", function(rank, value)
if (rank ~= "Last" and value) then
globals = globals or {}
globals["Ranks"] = globals["Ranks"] or {}
globals["Ranks"][rank] = value
elseif (rank == "Last") then
hook.Call("SAM.ChangedGlobalVar", nil, "Ranks", globals["Ranks"])
end
end)
end
function sam.get_global(key, default)
if globals then
local value = globals[key]
if value ~= nil then
return value
end
end
return default
end