From 91862a65fe67780eb671ac97e79e789ba659717b Mon Sep 17 00:00:00 2001 From: EternityDev Date: Thu, 21 Nov 2024 13:57:53 +0700 Subject: [PATCH] add more type support to buffer --- Warp.rbxm | Bin 16947 -> 17180 bytes src/Index/Util/Buffer/Dedicated.luau | 70 ++++++++++++++---------- src/Index/Util/Buffer/init.luau | 78 +++++++++++++++------------ 3 files changed, 86 insertions(+), 62 deletions(-) diff --git a/Warp.rbxm b/Warp.rbxm index 1b2dab814dfc7faefe11ddb1940c8fabc195c3e3..3d627817bd2ccf9ea84e43f221d48d4a864dd175 100644 GIT binary patch delta 4890 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 E4SV+s+yDRo delta 4583 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 diff --git a/src/Index/Util/Buffer/Dedicated.luau b/src/Index/Util/Buffer/Dedicated.luau index da6050d..c7c6661 100644 --- a/src/Index/Util/Buffer/Dedicated.luau +++ b/src/Index/Util/Buffer/Dedicated.luau @@ -127,6 +127,47 @@ end function DedicatedBuffer.pack(self: any, data: {any}) if typeof(data) == "nil" then self:wi8(0) + elseif typeof(data) == "Instance" then + self:wi8(-1) -- Instance marker + self:pack(data.ClassName) -- Serialize ClassName + self:pack(data.Name) -- Serialize Name + self:pack(data:GetAttributes()) + elseif typeof(data) == "table" then + --local isArray = (next(data) ~= nil and #data > 0) and true or false + local isArray = true + local count = 0 + for k in data do + count += 1 + if typeof(k) ~= "number" or math.floor(k) ~= k then + isArray = false + end + end + if isArray then + self:wi8(-2) -- array marker + self:wu16(count) -- use 32-bit length + for _, v in data do + self:pack(v) + end + else + self:wi8(-3) -- dictionary marker + self:wu16(count) -- number of key-value pairs + for k, v in data do + self:pack(k) -- pack the key + self:pack(v) -- pack the value + end + end + elseif typeof(data) == "EnumItem" then + self:wi8(-4) + self:wi8(#`{data.EnumType}`) + self:wstring(`{data.EnumType}`) + self:wu8(data.Value) + elseif typeof(data) == "BrickColor" then + self:wi8(-5) + self:wi16(data.Number) + elseif typeof(data) == "Enum" then + self:wi8(-6) + self:wi8(#`{data}`) + self:wstring(`{data}`) elseif typeof(data) == "number" then if math.floor(data) == data then -- Integer if data >= 0 and data <= 255 then @@ -181,35 +222,6 @@ function DedicatedBuffer.pack(self: any, data: {any}) self:wu8(data.R * 255) self:wu8(data.G * 255) self:wu8(data.B * 255) - elseif typeof(data) == "table" then - --local isArray = (next(data) ~= nil and #data > 0) and true or false - local isArray = true - local count = 0 - for k in data do - count += 1 - if typeof(k) ~= "number" or math.floor(k) ~= k then - isArray = false - end - end - if isArray then - self:wi8(13) -- array marker - self:wu16(count) -- use 32-bit length - for _, v in data do - self:pack(v) - end - else - self:wi8(14) -- dictionary marker - self:wu16(count) -- number of key-value pairs - for k, v in data do - self:pack(k) -- pack the key - self:pack(v) -- pack the value - end - end - elseif typeof(data) == "Instance" then - self:wi8(15) -- Instance marker - self:pack(data.ClassName) -- Serialize ClassName - self:pack(data.Name) -- Serialize Name - self:pack(data:GetAttributes()) else warn(`Unsupported data type: {typeof(data)} value: {data}`) end diff --git a/src/Index/Util/Buffer/init.luau b/src/Index/Util/Buffer/init.luau index e1ee3ef..7fa1e1a 100644 --- a/src/Index/Util/Buffer/init.luau +++ b/src/Index/Util/Buffer/init.luau @@ -19,10 +19,53 @@ local readstring = buffer.readstring local len = buffer.len local function readValue(b: buffer, position: number): (any, number) - local typeByte = readu8(b, position) + local typeByte = readi8(b, position) position += 1 if typeByte == 0 then -- nil return nil, position + elseif typeByte == -1 then -- Instance + local className, position1 = readValue(b, position) + local name, position2 = readValue(b, position1) + local properties, position3 = readValue(b, position2) + local instance: Instance = Instance.new(className) + instance.Name = name + for key, value in properties do + instance:SetAttribute(key, value) + end + return instance, position3 + elseif typeByte == -2 then -- array + local length = readu16(b, position) + position += 2 + local array = {} + for _ = 1, length do + local value + value, position = readValue(b, position) + table.insert(array, value) + end + return array, position + elseif typeByte == -3 then -- dictionary + local length = readu16(b, position) + position += 2 + local dict = {} + for _ = 1, length do + local key, value + key, position = readValue(b, position) + value, position = readValue(b, position) + dict[key] = value + end + return dict, position + elseif typeByte == -4 then -- EnumItem + local length = readi8(b, position) + local value = readstring(b, position + 1, length) + local value2 = readu8(b, position + 1 + length) + return Enum[value]:FromValue(value2), position + 2 + length + elseif typeByte == -5 then -- BrickColor + local value = readi16(b, position) + return BrickColor.new(value), position + 2 + elseif typeByte == -6 then -- Enum + local length = readi8(b, position) + local value = readstring(b, position + 1, length) + return Enum[value], position + 1 + length elseif typeByte == 1 then -- int u8 local value = readu8(b, position) return value, position + 1 @@ -65,42 +108,11 @@ local function readValue(b: buffer, position: number): (any, number) table.insert(components, readf32(b, position + (i - 1) * 4)) end return CFrame.new(unpack(components)), position + 48 - elseif typeByte == 12 then -- Vector2 + elseif typeByte == 12 then -- Color3 local r = readu8(b, position) local g = readu8(b, position + 1) local b = readu8(b, position + 2) return Color3.fromRGB(r, g, b), position + 3 - elseif typeByte == 13 then -- array - local length = readu16(b, position) - position += 2 - local array = {} - for _ = 1, length do - local value - value, position = readValue(b, position) - table.insert(array, value) - end - return array, position - elseif typeByte == 14 then -- dictionary - local length = readu16(b, position) - position += 2 - local dict = {} - for _ = 1, length do - local key, value - key, position = readValue(b, position) - value, position = readValue(b, position) - dict[key] = value - end - return dict, position - elseif typeByte == 15 then -- Instance - local className, position1 = readValue(b, position) - local name, position2 = readValue(b, position1) - local properties, position3 = readValue(b, position2) - local instance: Instance = Instance.new(className) - instance.Name = name - for key, value in properties do - instance:SetAttribute(key, value) - end - return instance, position3 end error(`Unsupported type marker: {typeByte}`) end