From b3a74b18fd778dada9c2af18fb2c7f73da94ac8e Mon Sep 17 00:00:00 2001 From: AlmTech Date: Sat, 14 Sep 2019 16:47:18 +0200 Subject: [PATCH] Added data caching for networking --- gamemode/engine/lib/server/sv_networking.lua | 56 ++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 gamemode/engine/lib/server/sv_networking.lua diff --git a/gamemode/engine/lib/server/sv_networking.lua b/gamemode/engine/lib/server/sv_networking.lua new file mode 100644 index 0000000..589f7a3 --- /dev/null +++ b/gamemode/engine/lib/server/sv_networking.lua @@ -0,0 +1,56 @@ +-- __ _ _______ _ __ +-- / / /\ | | |__ __| | | \ \ +-- / / / \ | |_ __ ___ | | ___ ___| |__ \ \ +-- < < / /\ \ | | '_ ` _ \| |/ _ \/ __| '_ \ > > +-- \ \ / ____ \| | | | | | | | __/ (__| | | | / / +-- \_\ /_/ \_\_|_| |_| |_|_|\___|\___|_| |_| /_/ + +Quantum.Net = {} +util.AddNetworkString( "quantum_menu_net" ) +util.AddNetworkString( "quantum_menu_button_net" ) + +local function CacheDatatableMethod( id, datatable, ply ) + if( ply.cache == nil ) then ply.cache = {} end + + if( ply.cache[id] == nil ) then -- if this is the first time then create a cache record + ply.cache[id] = { + cache = datatable + -- won't be defining the count here + } + end + + if( ply.cache[id].count == nil ) then ply.cache[id].count = 1 else ply.cache[id].count = ply.cache[id].count + 1 end -- keep count of how many times we have cached this datatable + + if( ply.cache[id].count > 1 ) then -- dont want to filter out data if this is the first time. + for k, v in pairs( datatable ) do -- loop through the datatable + for k2, v2 in pairs( table.GetKeys( ply.cache[id].cache ) ) do -- check each key with each key from the record cache + if( tostring(k) == tostring(v2) ) then -- check if the keys are the same + if( v == ply.cache[id].cache[tostring(v2)] ) then -- check if the value/contents are the same + datatable[k] = nil -- if so then remove the key from the datatable + else -- if the key's value has changed we dont remove it since the client needs to know about it + ply.cache[id].cache[tostring(v2)] = v -- and then update the cache so we know about it next time + end + end + end + end + end + datatable.id = id -- give it the id so that the client side could handle it + -- Always give the id since it is highly "valuable". + -- Don't want the client mixing up the NPC, which this caching system could do if not handled correctly. + return datatable +end + +local function SendDatatableToClient( client, dt, type ) + local datatable = CacheDatatableMethod( type, dt, client ) -- before we actually send the stuff, cache it and remove unneeded stuff + net.Start( "quantum_menu_net" ) + if( table.Count( datatable ) > 0 ) then -- if it's empty just dont send it because we will save 8 bits + net.WriteTable( datatable ) -- send the data to the player + end + net.Send( client ) +end + + +net.Receive( "quantum_menu_button_net", function( len, pl ) + local funcid = net.ReadString() + local args = net.ReadTable() +end)