Advertisement
SneakySquid

Net Structures

Jan 24th, 2021
998
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.55 KB | None | 0 0
  1. local writers, readers do
  2.     local registered_types = 0
  3.     writers, readers = {}, {}
  4.  
  5.     local function add_type(name, ...)
  6.         _G["NET_" .. string.upper(name)] = registered_types
  7.  
  8.         if not ... then
  9.             writers[registered_types] = string.format("net.Write%s(${value})", name)
  10.             readers[registered_types] = string.format("${value} = net.Read%s()", name)
  11.         else
  12.             writers[registered_types], readers[registered_types] = ...
  13.         end
  14.  
  15.         registered_types = registered_types + 1
  16.     end
  17.  
  18.     add_type("Angle")
  19.     add_type("Bit")
  20.     add_type("Bool")
  21.     add_type("Color")
  22.  
  23.     add_type(
  24.         "Data",
  25.         "net.WriteUInt(#${value}, 32)\nnet.WriteData(${value}, #${value})",
  26.         "${value} = net.ReadData(net.ReadUInt(32))"
  27.     )
  28.  
  29.     add_type("Double")
  30.     add_type("Entity")
  31.     add_type("Float")
  32.  
  33.     add_type(
  34.         "Int8",
  35.         "net.WriteInt(${value}, 8)",
  36.         "${value} = net.ReadInt(8)"
  37.     )
  38.     add_type(
  39.         "Int16",
  40.         "net.WriteInt(${value}, 16)",
  41.         "${value} = net.ReadInt(16)"
  42.     )
  43.     add_type(
  44.         "Int32",
  45.         "net.WriteInt(${value}, 32)",
  46.         "${value} = net.ReadInt(32)"
  47.     )
  48.  
  49.     add_type("Matrix")
  50.     add_type("Normal")
  51.     add_type("String")
  52.     add_type("Table")
  53.     add_type("Type")
  54.  
  55.     add_type(
  56.         "UInt8",
  57.         "net.WriteUInt(${value}, 8)",
  58.         "${value} = net.ReadUInt(8)"
  59.     )
  60.     add_type(
  61.         "UInt16",
  62.         "net.WriteUInt(${value}, 16)",
  63.         "${value} = net.ReadUInt(16)"
  64.     )
  65.     add_type(
  66.         "UInt32",
  67.         "net.WriteUInt(${value}, 32)",
  68.         "${value} = net.ReadUInt(32)"
  69.     )
  70.  
  71.     add_type("Vector")
  72. end
  73.  
  74. local function n2s(n)
  75.     if n == 0 then return "a" end
  76.  
  77.     local s = ""
  78.  
  79.     while n > 0 do
  80.         s = s .. string.char(97 + n % 26)
  81.         n = math.floor(n / 26)
  82.     end
  83.  
  84.     return s
  85. end
  86.  
  87. local function generate_writer(...)
  88.     local func = {}
  89.     local vars = {}
  90.  
  91.     for i, t in ipairs({...}) do
  92.         local var = n2s(i - 1)
  93.         local line = string.gsub(writers[t], "${value}", var)
  94.  
  95.         table.insert(vars, var)
  96.         table.insert(func, line)
  97.     end
  98.  
  99.     table.insert(func, 1, string.format("local %s = ...", table.concat(vars, ", ")))
  100.  
  101.     return CompileString(table.concat(func, "\n"), "net_struct")
  102. end
  103.  
  104. local function generate_reader(...)
  105.     local func = {}
  106.     local vars = {}
  107.  
  108.     for i, t in ipairs({...}) do
  109.         local var = n2s(i - 1)
  110.         local line = string.gsub(readers[t], "${value}", var)
  111.  
  112.         table.insert(vars, var)
  113.         table.insert(func, line)
  114.     end
  115.  
  116.     table.insert(func, 1, string.format("local %s", table.concat(vars, ", ")))
  117.     table.insert(func, string.format("return %s", table.concat(vars, ", ")))
  118.  
  119.     return CompileString(table.concat(func, "\n"), "net_struct")
  120. end
  121.  
  122. return {
  123.     Writer = generate_writer,
  124.     Reader = generate_reader,
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement