mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
177 lines
3.9 KiB
Lua
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 |