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, }