/*PLUGIN.Name = "Server-side NWVars" PLUGIN.Description = "Server-side managment of nwvars" PLUGIN.Author = "KatNotDinner"*/ if CLIENT then return end /*function PLUGIN.Init() print( "This is the server side NWVars plugin." ) end*/ --Major update tons of fixes and optimizations both on client and server local nwents = {} local meta1 = FindMetaTable( "Entity" ) local meta2 = FindMetaTable( "Player" ) function meta1:SetNWString( str, val ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.String = self.NWvars.String or {} --self.NWvars.String[ str ] = self.NWvars.String[ str ] or {} self.NWvars.String[ str ] = val net.Start( "String" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteString( val ) net.Broadcast() end function meta1:SetNWEntity( str, ent ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Entity = self.NWvars.Entity or {} --self.NWvars.Entity[ str ] = self.NWvars.Entity[ str ] or {} self.NWvars.Entity[ str ] = ent net.Start( "Entity" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteEntity( ent ) net.Broadcast() end function meta1:SetNWBool( str, bool ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Bool = self.NWvars.Bool or {} --self.NWvars.Bool[ str ] = self.NWvars.Bool[ str ] or {} self.NWvars.Bool[ str ] = bool net.Start( "Bool" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteBit( bool ) net.Broadcast() end function meta1:SetNWFloat( str, fl ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Float = self.NWvars.Float or {} --self.NWvars.Float[ str ] = self.NWvars.Float[ str ] or {} self.NWvars.Float[ str ] = fl net.Start( "Float" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteFloat( fl ) net.Broadcast() end function meta1:SetNWInt( str, int ) print("\n"..int) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Int = self.NWvars.Int or {} --self.NWvars.Int[ str ] = self.NWvars.Int[ str ] or {} self.NWvars.Int[ str ] = int net.Start( "Int" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteInt( int, 32 ) net.Broadcast() end function meta1:SetNWAngle( str, ang, b ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Angle = self.NWvars.Angle or {} --self.NWvars.Angle[ str ] = self.NWvars.Angle[ str ] or {} self.NWvars.Angle[ str ] = ang net.Start( "Angle" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteAngle( ang ) net.Broadcast() end function meta1:SetNWVector( str, vec ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Vector = self.NWvars.Vector or {} --self.NWvars.Vector[ str ] = self.NWvars.Vector[ str ] or {} self.NWvars.Vector[ str ] = vec net.Start( "Vector" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteVector( vec ) net.Broadcast() end function meta1:GetNWBool( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Bool[ str ] then return end return self.NWvars.Bool[ str ] end function meta1:GetNWString( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.String[ str ] then return end return self.NWvars.String[ str ] end function meta1:GetNWAngle( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Angle[ str ] then return end return self.NWvars.Angle[ str ] end function meta1:GetNWVector( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Vector[ str ] then return end return self.NWvars.Vector[ str ] end function meta1:GetNWFloat( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Float[ str ] then return end return self.NWvars.Float[ str ] end function meta1:GetNWInt( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Int[ str ] then return end return self.NWvars.Int[ str ] end function meta1:GetNWEntity( str ) if !self.NWvars then Error( "No NWVars for Entity "..self:EntIndex().."!" ) debug.Trace() return end if !self.NWvars.Entity[ str ] then return end return self.NWvars.Entity[ str ] end function meta1:GetNetworkedVar( str ) if self.NWvars.Vector[ str ] then return self.NWvars.Vector[ str ] elseif self.NWvars.Entity[ str ] then return self.NWvars.Entity[ str ] elseif self.NWvars.String[ str ] then return self.NWvars.String[ str ] elseif self.NWvars.Float[ str ] then return self.NWvars.Float elseif self.NWvars.Angle[ str ] then return self.NWvars.Angle[ str ] elseif self.NWvars.Bool[ str ] then return self.NWvars.Bool[ str ] end end function meta1:SetNetworkedVar( str, var ) if type(var) == "string" then self:SetNWString( str, var ) return elseif type(var) == "number" then if tostring(var):find( "." ) then self:SetNWFloat( str, var ) else self:SetNWInt( str, var ) end elseif type(var) == "bool" then self:SetNWBool( str, var ) elseif var.p and var.y and var.r then self:SetNWAngle( str, var ) elseif var.x and var.y and var.z then self:SetNWVector( str, var ) elseif IsValid(var) then self:SetNWEntity( str, var ) end end /*function meta2:SetNWString( str, val ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.String[ str ] = self.NWvars.String[ str ] or {} self.NWvars.String[ str ] = val net.Start( "String" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteString( val ) net.Broadcast() end function meta2:SetNWEntity( str, ent ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Entity[ str ] = self.NWvars.Entity[ str ] or {} self.NWvars.Entity[ str ] = ent net.Start( "Entity" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteEntity( ent ) net.Broadcast() end function meta2:SetNWBool( str, bool ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Bool[ str ] = self.NWvars.Bool[ str ] or {} self.NWvars.Bool[ str ] = bool net.Start( "Bool" ) net.WriteEntity( self ) net.WriteString( str ) if bool then net.WriteInt( 1 ) else net.WriteInt( 2 ) end net.Broadcast() end function meta2:SetNWFloat( str, fl ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Float[ str ] = self.NWvars.Float[ str ] or {} self.NWvars.Float[ str ] = fl net.Start( "Float" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteFloat( fl ) net.Broadcast() end function meta2:SetNWInt( str, int ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Int[ str ] = self.NWvars.Int[ str ] or {} self.NWvars.Int[ str ] = int net.Start( "Int" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteInt( int ) net.Broadcast() end function meta2:SetNWAngle( str, ang, b ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Angle[ str ] = self.NWvars.Angle[ str ] or {} self.NWvars.Angle[ str ] = ang net.Start( "Angle" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteAngle( ang ) net.Broadcast() end function meta2:SetNWVector( str, vec ) nwents[self] = nwents[self] or true self.NWvars = self.NWvars or {} self.NWvars.Vector[ str ] = self.NWvars.Vector[ str ] or {} self.NWvars.Vector[ str ] = vec net.Start( "Vector" ) net.WriteEntity( self ) net.WriteString( str ) net.WriteVector( vec ) net.Broadcast() end function meta2:SetNetworkedVar( str, var ) if type(var) == "string" then self:SetNWString( str, var ) return elseif type(var) == "number" then if tostring(var):find( "." ) then self:SetNWFloat( str, var ) else self:SetNWInt( str, var ) end elseif type(var) == "bool" then self:SetNWBool( str, var ) elseif var.p and var.y and var.r then self:SetNWAngle( str, var ) elseif var.x and var.y and var.z then self:SetNWVector( str, var ) elseif IsValid(var) then self:SetNWEntity( str, var ) end end function meta2:GetNWBool( str ) if !self.NWvars.Bool[ str ] then return end return self.NWvars.Bool[ str ] end function meta2:GetNWString( str ) if !self.NWvars.String[ str ] then return end return self.NWvars.String[ str ] end function meta2:GetNWAngle( str ) if !self.NWvars.Angle[ str ] then return end return self.NWvars.Angle[ str ] end function meta2:GetNWVector( str ) if !self.NWvars.Vector[ str ] then return end return self.NWvars.Vector[ str ] end function meta2:GetNWFloat( str ) if !self.NWvars.Float[ str ] then return end return self.NWvars.Float[ str ] end function meta2:GetNWInt( str ) if !self.NWvars.Int[ str ] then return end return self.NWvars.Int[ str ] end function meta2:GetNWEntity( str ) if !self.NWvars.Entity[ str ] then return end return self.NWvars.Entity[ str ] end function meta2:GetNetworkedVar( str ) if self.NWvars.Vector[ str ] then return self.NWvars.Vector[ str ] elseif self.NWvars.Entity[ str ] then return self.NWvars.Entity[ str ] elseif self.NWvars.String[ str ] then return self.NWvars.String[ str ] elseif self.NWvars.Float[ str ] then return self.NWvars.Float elseif self.NWvars.Angle[ str ] then return self.NWvars.Angle[ str ] elseif self.NWvars.Bool[ str ] then return self.NWvars.Bool[ str ] end end */ hook.Add( "PlayerInitialSpawn", "NWVars", function( ply ) local time = 0 -- We should create some delays between the datastreams if nwents then timer.Simple( 0, function() for k, v in pairs(nwents) do time = time + .3 timer.Simple( time, function() if k.NWvars then net.Start( "NWVars", ply ) net.WriteEntity( k ) net.WriteTable(k.NWvars) net.Send(ply) end end ) end end ) end end ) hook.Add( "PlayerDisconnected", "lolwut", function( ply ) if nwents and nwents[ply] then nwents[ply] = nil end end ) net.Receive( "AngleCL", function(ply, len ) -- kinda messed up argument names local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadAngle() ent.NWvars = ent.NWvars or {} ent.NWvars.Angle = ent.NWvars.Angle or {} ent.NWvars.Angle[ str ] = ent.NWvars.Angle[ str ] or {} ent.NWvars.Angle[ str ] = var timer.Simple( .5, function() ent:SetNWAngle( str, var ) end ) end ) net.Receive( "VectorCL", function(ply, len ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadVector() ent.NWvars = ent.NWvars or {} ent.NWvars.Vector = ent.NWvars.Vector or {} ent.NWvars.Vector[ str ] = ent.NWvars.Vector[ str ] or {} ent.NWvars.Vector[ str ] = var timer.Simple( .5, function() ent:SetNWVector( str, var ) end ) end ) net.Receive( "EntityCL", function(ply, len ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadEntity() ent.NWvars = ent.NWvars or {} ent.NWvars.Entity = ent.NWvars.Entity or {} ent.NWvars.Entity[ str ] = ent.NWvars.String[ str ] or {} ent.NWvars.Entity[ str ] = var timer.Simple( .5, function() ent:SetNWEntity( str, var ) end ) end ) net.Receive( "StringCL", function(ply, len ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadString() ent.NWvars = ent.NWvars or {} ent.NWvars.String = ent.NWvars.String or {} ent.NWvars.String[ str ] = ent.NWvars.String[ str ] or {} ent.NWvars.String[ str ] = var timer.Simple( .5, function() ent:SetNWString( str, var ) end ) end ) net.Receive( "FloatCL", function(ply, len ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadFloat() ent.NWvars = ent.NWvars or {} ent.NWvars.Float = ent.NWvars.Float or {} ent.NWvars.Float[ str ] = ent.NWvars.Float[ str ] or {} ent.NWvars.Float[ str ] = var timer.Simple( .5, function() ent:SetNWFloat( str, var ) end ) end ) net.Receive( "IntCL", function( le, ply ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadInt( 32 ) ent.NWvars = ent.NWvars or {} ent.NWvars.Int = ent.NWvars.Int or {} ent.NWvars.Int[ str ] = ent.NWvars.Int[ str ] or {} ent.NWvars.Int[ str ] = var timer.Simple( .5, function() ent:SetNWInt( str, var ) end ) end ) net.Receive( "BoolCL", function(ply, len ) local ent = net.ReadEntity() local str = net.ReadString() local var = net.ReadBit() ent.NWvars = ent.NWvars or {} ent.NWvars.Bool = ent.NWvars.Bool or {} ent.NWvars.Bool[ str ] = ent.NWvars.Bool[ str ] or {} ent.NWvars.Bool[ str ] = var timer.Simple( .5, function() ent:SetNWBool( str, var ) end ) end ) meta1.SetNWVar = meta1.SetNetworkedVar -- making sure that I override ALL of the nwvar functions meta1.SetNetworkedInt = meta1.SetNWInt meta1.SetNetworkedFloat = meta1.SetNWFloat meta1.SetNetworkedEntity = meta1.SetNWEntity meta1.SetNetworkedString = meta1.SetNWString meta1.SetNetworkedBool = meta1.SetNWBool meta1.SetNetworkedAngle = meta1.SetNWAngle meta1.SetNetworkedVector = meta1.SetNWVector /* _R.Player.SetNWVar = meta2.SetNetworkedVar -- making sure that I override ALL of the nwvar functions _R.Player.SetNetworkedInt = meta2.SetNWInt _R.Player.SetNetworkedFloat = meta2.SetNWFloat _R.Player.SetNetworkedEntity = meta2.SetNWEntity _R.Player.SetNetworkedString = meta2.SetNWString _R.Player.SetNetworkedBool = meta2.SetNWBool _R.Player.SetNetworkedAngle = meta2.SetNWAngle _R.Player.SetNetworkedVector = meta2.SetNWVector*/