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

177 lines
3.9 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
--[[
NetStream - 2.0.1
https://github.com/alexgrist/NetStream/blob/master/netstream2.lua
Alexander Grist-Hucker
http://www.revotech.org
]]--
--[[
if SERVER then
netstream.Hook("Hi", function(ply, ...) -- Third argument is called to check if the player has permission to send the net message before decoding
print(...)
end, function(ply)
if not ply:IsAdmin() then
return false
end
end)
-- OR
netstream.Hook("Hi", function(ply, ...)
print(...)
end)
netstream.Start(Entity(1), "Hi", "a", 1, {}, true, false, nil, "!") -- First argument player or table of players or any other argument to send to all players
netstream.Start({Entity(1), Entity(2)}, "Hi", "a", 1, {}, true, false, nil, "!")
netstream.Start(nil, "Hi", "a", 1, {}, true, false, nil, "!")
end
if CLIENT then
netstream.Hook("Hi", function(...)
print(...)
end)
netstream.Start("Hi", "a", 1, {}, true, false, nil, "!")
end
]]--
-- Config
local addonName = "SAM"
local mainTable = sam -- _G.netstream = netstream
local mp = sam.mp
--
local type = sam.type
local pcall = pcall
local unpack = unpack
local net = net
local table_maxn = table.maxn
local netStreamSend = addonName .. ".NetStreamDS.Sending"
local netstream = {}
if istable(mainTable) then
mainTable.netstream = netstream
end
local checks = {}
local receivers = {}
local concat = table.concat
local pack = function(t, n)
local buffer = {}
mp.packers["array"](buffer, t, n)
return concat(buffer)
end
if SERVER then
util.AddNetworkString(netStreamSend)
-- local str_sub = string.sub
-- local function Split(str, buffer, result)
-- if not result then
-- result = {}
-- end
-- if not buffer then
-- buffer = 32768
-- end
-- local len = #str
-- if len >= buffer then
-- result[#result + 1] = str_sub(str, 1, buffer - 1)
-- str = str_sub(str, buffer, len)
-- else
-- result[#result + 1] = str
-- return result
-- end
-- return Split(str, buffer, result)
-- end
local player_GetAll = player.GetAll
function netstream.Start(ply, name, ...)
local ply_type = type(ply)
if ply_type ~= "Player" and ply_type ~= "table" then
ply = player_GetAll()
end
local encoded_data = pack({...}, select("#", ...))
local length = #encoded_data
net.Start(netStreamSend)
net.WriteString(name)
net.WriteUInt(length, 17)
net.WriteData(encoded_data, length)
net.Send(ply)
end
function netstream.Hook(name, callback, check)
receivers[name] = callback
if type(check) == "function" then
checks[name] = check
end
end
net.Receive(netStreamSend, function(_, ply)
local name = net.ReadString()
local callback = receivers[name]
if not callback then return end
local length = net.ReadUInt(17)
local check = checks[name]
if check and check(ply, length) == false then return end
local data = net.ReadData(length)
local status
status, data = pcall(mp.unpack, data)
if not status or not sam.istable(data) then return end
callback(ply, unpack(data, 1, table_maxn(data)))
end)
else
checks = nil
function netstream.Start(name, ...)
local encoded_data = pack({...}, select("#", ...))
local length = #encoded_data
net.Start(netStreamSend)
net.WriteString(name)
net.WriteUInt(length, 17)
net.WriteData(encoded_data, length)
net.SendToServer()
end
function netstream.Hook(name, callback)
receivers[name] = callback
end
net.Receive(netStreamSend, function()
local callback = receivers[net.ReadString()]
if not callback then return end
local length = net.ReadUInt(17)
local data = net.ReadData(length)
data = mp.unpack(data)
callback(unpack(data, 1, table_maxn(data)))
end)
end
return netstream