add sborka
This commit is contained in:
164
garrysmod/gamemodes/militaryrp/schema/libs/thirdparty/sh_netstream2.lua
vendored
Normal file
164
garrysmod/gamemodes/militaryrp/schema/libs/thirdparty/sh_netstream2.lua
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
--[[
|
||||
NetStream - 2.0.0
|
||||
|
||||
Alexander Grist-Hucker
|
||||
http://www.revotech.org
|
||||
|
||||
Credits to:
|
||||
thelastpenguin for pON.
|
||||
https://github.com/thelastpenguin/gLUA-Library/tree/master/pON
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile();
|
||||
|
||||
local _player = player
|
||||
|
||||
netstream = netstream or {};
|
||||
netstream.stored = netstream.stored or {};
|
||||
|
||||
-- A function to split data for a data stream.
|
||||
function netstream.Split(data)
|
||||
local index = 1;
|
||||
local result = {};
|
||||
local buffer = {};
|
||||
|
||||
for i = 0, string.len(data) do
|
||||
buffer[#buffer + 1] = string.sub(data, i, i);
|
||||
|
||||
if (#buffer == 32768) then
|
||||
result[#result + 1] = table.concat(buffer);
|
||||
index = index + 1;
|
||||
buffer = {};
|
||||
end;
|
||||
end;
|
||||
|
||||
result[#result + 1] = table.concat(buffer);
|
||||
|
||||
return result;
|
||||
end;
|
||||
|
||||
-- A function to hook a data stream.
|
||||
function netstream.Hook(name, Callback)
|
||||
netstream.stored[name] = Callback;
|
||||
end;
|
||||
|
||||
if (SERVER) then
|
||||
util.AddNetworkString("NetStreamDS");
|
||||
|
||||
-- A function to start a net stream.
|
||||
function netstream.Start(player, name, ...)
|
||||
local recipients = {};
|
||||
local bShouldSend = false;
|
||||
local bSendPVS = false;
|
||||
|
||||
if (type(player) != "table") then
|
||||
if (!player) then
|
||||
player = _player.GetAll();
|
||||
elseif (type(player) == "Vector") then
|
||||
bSendPVS = true;
|
||||
else
|
||||
player = {player};
|
||||
end;
|
||||
end;
|
||||
|
||||
if (type(player) != "Vector") then
|
||||
for k, v in pairs(player) do
|
||||
if (type(v) == "Player") then
|
||||
recipients[#recipients + 1] = v;
|
||||
|
||||
bShouldSend = true;
|
||||
elseif (type(k) == "Player") then
|
||||
recipients[#recipients + 1] = k;
|
||||
|
||||
bShouldSend = true;
|
||||
end;
|
||||
end;
|
||||
else
|
||||
bShouldSend = true;
|
||||
end;
|
||||
|
||||
local dataTable = {...};
|
||||
local encodedData = pon.encode(dataTable);
|
||||
|
||||
if (encodedData and #encodedData > 0 and bShouldSend) then
|
||||
net.Start("NetStreamDS");
|
||||
net.WriteString(name);
|
||||
net.WriteUInt(#encodedData, 32);
|
||||
net.WriteData(encodedData, #encodedData);
|
||||
if (bSendPVS) then
|
||||
net.SendPVS(player);
|
||||
else
|
||||
net.Send(recipients);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
net.Receive("NetStreamDS", function(length, player)
|
||||
local NS_DS_NAME = net.ReadString();
|
||||
local NS_DS_LENGTH = net.ReadUInt(32);
|
||||
local NS_DS_DATA = net.ReadData(NS_DS_LENGTH);
|
||||
|
||||
if (NS_DS_NAME and NS_DS_DATA and NS_DS_LENGTH) then
|
||||
player.nsDataStreamName = NS_DS_NAME;
|
||||
player.nsDataStreamData = "";
|
||||
|
||||
if (player.nsDataStreamName and player.nsDataStreamData) then
|
||||
player.nsDataStreamData = NS_DS_DATA;
|
||||
|
||||
if (netstream.stored[player.nsDataStreamName]) then
|
||||
local bStatus, value = pcall(pon.decode, player.nsDataStreamData);
|
||||
|
||||
if (bStatus) then
|
||||
netstream.stored[player.nsDataStreamName](player, unpack(value));
|
||||
else
|
||||
ErrorNoHalt("NetStream: '"..NS_DS_NAME.."'\n"..value.."\n");
|
||||
end;
|
||||
else
|
||||
ErrorNoHalt("NetStream: Undefined hook for '"..NS_DS_NAME.."'\n")
|
||||
end;
|
||||
|
||||
player.nsDataStreamName = nil;
|
||||
player.nsDataStreamData = nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
NS_DS_NAME, NS_DS_DATA, NS_DS_LENGTH = nil, nil, nil;
|
||||
end);
|
||||
else
|
||||
-- A function to start a net stream.
|
||||
function netstream.Start(name, ...)
|
||||
local dataTable = {...};
|
||||
local encodedData = pon.encode(dataTable);
|
||||
|
||||
if (encodedData and #encodedData > 0) then
|
||||
net.Start("NetStreamDS");
|
||||
net.WriteString(name);
|
||||
net.WriteUInt(#encodedData, 32);
|
||||
net.WriteData(encodedData, #encodedData);
|
||||
net.SendToServer();
|
||||
end;
|
||||
end;
|
||||
|
||||
net.Receive("NetStreamDS", function(length)
|
||||
local NS_DS_NAME = net.ReadString();
|
||||
local NS_DS_LENGTH = net.ReadUInt(32);
|
||||
local NS_DS_DATA = net.ReadData(NS_DS_LENGTH);
|
||||
|
||||
if (NS_DS_NAME and NS_DS_DATA and NS_DS_LENGTH) then
|
||||
if (netstream.stored[NS_DS_NAME]) then
|
||||
local bStatus, value = pcall(pon.decode, NS_DS_DATA);
|
||||
|
||||
if (bStatus) then
|
||||
netstream.stored[NS_DS_NAME](unpack(value));
|
||||
else
|
||||
ErrorNoHalt("NetStream: '"..NS_DS_NAME.."'\n"..value.."\n");
|
||||
end;
|
||||
else
|
||||
ErrorNoHalt("NetSteam: Undefined hook for '"..NS_DS_NAME.."'\n")
|
||||
end;
|
||||
end;
|
||||
|
||||
NS_DS_NAME, NS_DS_DATA, NS_DS_LENGTH = nil, nil, nil;
|
||||
end);
|
||||
end;
|
||||
Reference in New Issue
Block a user