mirror of
https://github.com/imezx/Warp.git
synced 2025-06-19 21:29:17 +00:00
33 lines
1.2 KiB
Lua
33 lines
1.2 KiB
Lua
--!strict
|
|
local RunService = game:GetService("RunService")
|
|
local SerInt = 0
|
|
|
|
local Event = require(script.Parent.Parent.Event).Reliable
|
|
local Assert = require(script.Parent.Assert)
|
|
|
|
return function(Identifier: string, timeout: number?): number
|
|
Assert(typeof(Identifier) == "string", "Identifier must be a string type.")
|
|
Assert(SerInt < 255, "reached max 255 identifiers.")
|
|
if RunService:IsServer() then
|
|
if not Event:GetAttribute(Identifier) then
|
|
SerInt += 1
|
|
Event:SetAttribute(Identifier, SerInt)
|
|
--Event:SetAttribute(Identifier, string.pack("I1", SerInt)) -- I1 -> 255 max, I2 -> ~ 6.5e4 max. (SerInt), removed/disabled for buffer migration.
|
|
end
|
|
else
|
|
local yieldThread: thread = coroutine.running()
|
|
local cancel = task.delay(timeout or 10, function() -- yield cancelation (timerout)
|
|
task.spawn(yieldThread, nil)
|
|
error(`Serdes: {Identifier} is taking too long to retrieve, seems like not replicated on server.`, 2)
|
|
end)
|
|
while coroutine.status(cancel) ~= "dead" and task.wait(0.5) do -- let it loop for yields!
|
|
if (Event:GetAttribute(Identifier)) then
|
|
task.cancel(cancel)
|
|
task.spawn(yieldThread, Event:GetAttribute(Identifier))
|
|
break
|
|
end
|
|
end
|
|
return coroutine.yield() -- yield
|
|
end
|
|
return Event:GetAttribute(Identifier)
|
|
end
|