local writers, readers do
local registered_types = 0
writers, readers = {}, {}
local function add_type(name, ...)
_G["NET_" .. string.upper(name)] = registered_types
if not ... then
writers[registered_types] = string.format("net.Write%s(${value})", name)
readers[registered_types] = string.format("${value} = net.Read%s()", name)
else
writers[registered_types], readers[registered_types] = ...
end
registered_types = registered_types + 1
end
add_type("Angle")
add_type("Bit")
add_type("Bool")
add_type("Color")
add_type(
"Data",
"net.WriteUInt(#${value}, 32)\nnet.WriteData(${value}, #${value})",
"${value} = net.ReadData(net.ReadUInt(32))"
)
add_type("Double")
add_type("Entity")
add_type("Float")
add_type(
"Int8",
"net.WriteInt(${value}, 8)",
"${value} = net.ReadInt(8)"
)
add_type(
"Int16",
"net.WriteInt(${value}, 16)",
"${value} = net.ReadInt(16)"
)
add_type(
"Int32",
"net.WriteInt(${value}, 32)",
"${value} = net.ReadInt(32)"
)
add_type("Matrix")
add_type("Normal")
add_type("String")
add_type("Table")
add_type("Type")
add_type(
"UInt8",
"net.WriteUInt(${value}, 8)",
"${value} = net.ReadUInt(8)"
)
add_type(
"UInt16",
"net.WriteUInt(${value}, 16)",
"${value} = net.ReadUInt(16)"
)
add_type(
"UInt32",
"net.WriteUInt(${value}, 32)",
"${value} = net.ReadUInt(32)"
)
add_type("Vector")
end
local function n2s(n)
if n == 0 then return "a" end
local s = ""
while n > 0 do
s = s .. string.char(97 + n % 26)
n = math.floor(n / 26)
end
return s
end
local function generate_writer(...)
local func = {}
local vars = {}
for i, t in ipairs({...}) do
local var = n2s(i - 1)
local line = string.gsub(writers[t], "${value}", var)
table.insert(vars, var)
table.insert(func, line)
end
table.insert(func, 1, string.format("local %s = ...", table.concat(vars, ", ")))
return CompileString(table.concat(func, "\n"), "net_struct")
end
local function generate_reader(...)
local func = {}
local vars = {}
for i, t in ipairs({...}) do
local var = n2s(i - 1)
local line = string.gsub(readers[t], "${value}", var)
table.insert(vars, var)
table.insert(func, line)
end
table.insert(func, 1, string.format("local %s", table.concat(vars, ", ")))
table.insert(func, string.format("return %s", table.concat(vars, ", ")))
return CompileString(table.concat(func, "\n"), "net_struct")
end
return {
Writer = generate_writer,
Reader = generate_reader,
}
Comments