SneakySquid icon

Net Structures

SneakySquid | PRO | 07/17/24 12:42:57 PM UTC (Edited) | 0 ⭐ | 1295 👁️ | Never ⏰ | []
Lua |

2.55 KB

|

None

|

0 👍

/

0 👎

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