local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local outgoing_buff: buffer
local outgoing_used: number
local outgoing_size: number
local outgoing_inst: { Instance }
local outgoing_apos: number
local incoming_buff: buffer
local incoming_read: number
local incoming_inst: { Instance }
local incoming_ipos: number
-- thanks to https://dom.rojo.space/binary.html#cframe
local CFrameSpecialCases = {
CFrame.Angles(0, 0, 0),
CFrame.Angles(math.rad(90), 0, 0),
CFrame.Angles(0, math.rad(180), math.rad(180)),
CFrame.Angles(math.rad(-90), 0, 0),
CFrame.Angles(0, math.rad(180), math.rad(90)),
CFrame.Angles(0, math.rad(90), math.rad(90)),
CFrame.Angles(0, 0, math.rad(90)),
CFrame.Angles(0, math.rad(-90), math.rad(90)),
CFrame.Angles(math.rad(-90), math.rad(-90), 0),
CFrame.Angles(0, math.rad(-90), 0),
CFrame.Angles(math.rad(90), math.rad(-90), 0),
CFrame.Angles(0, math.rad(90), math.rad(180)),
CFrame.Angles(0, math.rad(-90), math.rad(180)),
CFrame.Angles(0, math.rad(180), math.rad(0)),
CFrame.Angles(math.rad(-90), math.rad(-180), math.rad(0)),
CFrame.Angles(0, math.rad(0), math.rad(180)),
CFrame.Angles(math.rad(90), math.rad(180), math.rad(0)),
CFrame.Angles(0, math.rad(0), math.rad(-90)),
CFrame.Angles(0, math.rad(-90), math.rad(-90)),
CFrame.Angles(0, math.rad(-180), math.rad(-90)),
CFrame.Angles(0, math.rad(90), math.rad(-90)),
CFrame.Angles(math.rad(90), math.rad(90), 0),
CFrame.Angles(0, math.rad(90), 0),
CFrame.Angles(math.rad(-90), math.rad(90), 0),
}
local function alloc(len: number)
if outgoing_used + len > outgoing_size then
while outgoing_used + len > outgoing_size do
outgoing_size = outgoing_size * 1.5
end
local new_buff = buffer.create(outgoing_size)
buffer.copy(new_buff, 0, outgoing_buff, 0, outgoing_used)
outgoing_buff = new_buff
end
outgoing_apos = outgoing_used
outgoing_used = outgoing_used + len
return outgoing_apos
end
local function read(len: number)
local pos = incoming_read
incoming_read = incoming_read + len
return pos
end
local function save()
return {
buff = outgoing_buff,
used = outgoing_used,
size = outgoing_size,
inst = outgoing_inst,
}
end
local function load(data: {
buff: buffer,
used: number,
size: number,
inst: { Instance },
})
outgoing_buff = data.buff
outgoing_used = data.used
outgoing_size = data.size
outgoing_inst = data.inst
end
local function load_empty()
outgoing_buff = buffer.create(64)
outgoing_used = 0
outgoing_size = 64
outgoing_inst = {}
end
load_empty()
local types = {}