diff --git a/BinaryFormat/BinaryFileReader.cs b/BinaryFormat/BinaryFileReader.cs index c19e304..1550f34 100644 --- a/BinaryFormat/BinaryFileReader.cs +++ b/BinaryFormat/BinaryFileReader.cs @@ -1,7 +1,7 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; @@ -17,43 +17,46 @@ namespace RobloxFiles.BinaryFormat File = file; } - // Reads 'count * sizeof(T)' interleaved bytes and converts - // them into an array of T[count] where each value in the - // array has been decoded by the provided 'decode' function. - public T[] ReadInterleaved(int count, Func decode) where T : struct + // Reads 'count * sizeof(T)' interleaved bytes + public T[] ReadInterleaved(int count, Func transform) where T : struct { - int bufferSize = Marshal.SizeOf(); - byte[] interleaved = ReadBytes(count * bufferSize); + int sizeof_T = Marshal.SizeOf(); + int blobSize = count * sizeof_T; - T[] values = new T[count]; + var blob = ReadBytes(blobSize); + var work = new byte[sizeof_T]; + var values = new T[count]; - for (int i = 0; i < count; i++) + for (int offset = 0; offset < count; offset++) { - long buffer = 0; - - for (int column = 0; column < bufferSize; column++) + for (int i = 0; i < sizeof_T; i++) { - long block = interleaved[(column * count) + i]; - int shift = (bufferSize - column - 1) * 8; - buffer |= (block << shift); + int index = (i * count) + offset; + work[sizeof_T - i - 1] = blob[index]; } - byte[] sequence = BitConverter.GetBytes(buffer); - values[i] = decode(sequence, 0); + values[offset] = transform(work, 0); } return values; } - // Decodes an int from an interleaved buffer. - private int DecodeInt(byte[] buffer, int startIndex) + // Rotates the sign bit of an int32 buffer. + public int RotateInt32(byte[] buffer, int startIndex) { int value = BitConverter.ToInt32(buffer, startIndex); - return (value >> 1) ^ (-(value & 1)); + return (int)((uint)value >> 1) ^ (-(value & 1)); } - - // Decodes a float from an interleaved buffer. - private float DecodeFloat(byte[] buffer, int startIndex) + + // Rotates the sign bit of an int64 buffer. + public long RotateInt64(byte[] buffer, int startIndex) + { + long value = BitConverter.ToInt64(buffer, startIndex); + return (long)((ulong)value >> 1) ^ (-(value & 1)); + } + + // Rotates the sign bit of a float buffer. + public float RotateFloat(byte[] buffer, int startIndex) { uint u = BitConverter.ToUInt32(buffer, startIndex); uint i = (u >> 1) | (u << 31); @@ -62,28 +65,10 @@ namespace RobloxFiles.BinaryFormat return BitConverter.ToSingle(b, 0); } - // Reads an interleaved buffer of integers. - public int[] ReadInts(int count) - { - return ReadInterleaved(count, DecodeInt); - } - - // Reads an interleaved buffer of floats. - public float[] ReadFloats(int count) - { - return ReadInterleaved(count, DecodeFloat); - } - - // Reads an interleaved buffer of unsigned integers. - public uint[] ReadUInts(int count) - { - return ReadInterleaved(count, BitConverter.ToUInt32); - } - - // Reads and accumulates an interleaved buffer of integers. + // Reads and accumulates an interleaved int32 buffer. public List ReadInstanceIds(int count) { - int[] values = ReadInts(count); + int[] values = ReadInterleaved(count, RotateInt32); for (int i = 1; i < count; ++i) values[i] += values[i - 1]; diff --git a/BinaryFormat/BinaryFileWriter.cs b/BinaryFormat/BinaryFileWriter.cs index 78e525d..50f351f 100644 --- a/BinaryFormat/BinaryFileWriter.cs +++ b/BinaryFormat/BinaryFileWriter.cs @@ -103,15 +103,21 @@ namespace RobloxFiles.BinaryFormat Marshal.FreeHGlobal(converter); } - - // Encodes an int for an interleaved buffer. - private static int EncodeInt(int value) + + // Rotates the sign bit of the provided int. + public int RotateInt(int value) { return (value << 1) ^ (value >> 31); } - - // Encodes a float for an interleaved buffer. - private static float EncodeFloat(float value) + + // Rotates the sign bit of the provided long. + public long RotateLong(long value) + { + return (value << 1) ^ (value >> 63); + } + + // Rotates the sign bit of the provided float. + public float RotateFloat(float value) { byte[] buffer = BitConverter.GetBytes(value); uint bits = BitConverter.ToUInt32(buffer, 0); @@ -125,13 +131,19 @@ namespace RobloxFiles.BinaryFormat // Writes an interleaved list of integers. public void WriteInts(List values) { - WriteInterleaved(values, EncodeInt); + WriteInterleaved(values, RotateInt); + } + + // Writes an interleaved list of longs + public void WriteLongs(List values) + { + WriteInterleaved(values, RotateLong); } // Writes an interleaved list of floats public void WriteFloats(List values) { - WriteInterleaved(values, EncodeFloat); + WriteInterleaved(values, RotateFloat); } // Accumulatively writes an interleaved array of integers. diff --git a/BinaryFormat/Chunks/PROP.cs b/BinaryFormat/Chunks/PROP.cs index 3de5c1a..a18ef82 100644 --- a/BinaryFormat/Chunks/PROP.cs +++ b/BinaryFormat/Chunks/PROP.cs @@ -78,8 +78,8 @@ namespace RobloxFiles.BinaryFormat.Chunks } // Setup some short-hand functions for actions used during the read procedure. - var readInts = new Func(() => reader.ReadInts(instCount)); - var readFloats = new Func(() => reader.ReadFloats(instCount)); + var readInts = new Func(() => reader.ReadInterleaved(instCount, reader.RotateInt32)); + var readFloats = new Func(() => reader.ReadInterleaved(instCount, reader.RotateFloat)); var readProperties = new Action>(read => { @@ -434,7 +434,7 @@ namespace RobloxFiles.BinaryFormat.Chunks } case PropertyType.Enum: { - uint[] enums = reader.ReadUInts(instCount); + uint[] enums = reader.ReadInterleaved(instCount, BitConverter.ToUInt32); readProperties(i => { @@ -619,22 +619,17 @@ namespace RobloxFiles.BinaryFormat.Chunks } case PropertyType.Int64: { - long[] longs = reader.ReadInterleaved(instCount, (buffer, start) => - { - long result = BitConverter.ToInt64(buffer, start); - return (long)((ulong)result >> 1) ^ (-(result & 1)); - }); - - readProperties(i => longs[i]); + var values = reader.ReadInterleaved(instCount, reader.RotateInt64); + readProperties(i => values[i]); break; } case PropertyType.SharedString: { - uint[] SharedKeys = reader.ReadUInts(instCount); + var keys = reader.ReadInterleaved(instCount, BitConverter.ToUInt32); readProperties(i => { - uint key = SharedKeys[i]; + uint key = keys[i]; return File.SharedStrings[key]; }); @@ -654,14 +649,16 @@ namespace RobloxFiles.BinaryFormat.Chunks } case PropertyType.UniqueId: { - readProperties(i => + var uniqueIds = reader.ReadInterleaved(instCount, (buffer, offset) => { - var index = reader.ReadUInt32(); - var time = reader.ReadUInt32(); - var random = reader.ReadUInt64(); - return new UniqueId(index, time, random); + var random = reader.RotateInt64(buffer, 0); + var time = BitConverter.ToUInt32(buffer, 8); + var index = BitConverter.ToUInt32(buffer, 12); + + return new UniqueId(random, time, index); }); + readProperties(i => uniqueIds[i]); break; } case PropertyType.FontFace: @@ -670,13 +667,11 @@ namespace RobloxFiles.BinaryFormat.Chunks { string family = reader.ReadString(); - if (family.EndsWith(".otf") || family.EndsWith(".ttf")) - return new FontFace(family); - var weight = (FontWeight)reader.ReadUInt16(); var style = (FontStyle)reader.ReadByte(); + var cachedFaceId = reader.ReadString(); - return new FontFace(family, weight, style); + return new FontFace(family, weight, style, cachedFaceId); }); break; @@ -1233,12 +1228,7 @@ namespace RobloxFiles.BinaryFormat.Chunks longs.Add(value); }); - writer.WriteInterleaved(longs, value => - { - // Move the sign bit to the front. - return (value << 1) ^ (value >> 63); - }); - + writer.WriteLongs(longs); break; } case PropertyType.SharedString: @@ -1293,14 +1283,16 @@ namespace RobloxFiles.BinaryFormat.Chunks } case PropertyType.UniqueId: { + var uniqueIds = new List(); + props.ForEach(prop => { var uniqueId = prop.CastValue(); - writer.Write(uniqueId.Index); - writer.Write(uniqueId.Time); - writer.Write(uniqueId.Random); + var rotated = writer.RotateLong(uniqueId.Random); + uniqueIds.Add(new UniqueId(rotated, uniqueId.Time, uniqueId.Index)); }); + writer.WriteInterleaved(uniqueIds); break; } case PropertyType.FontFace: @@ -1310,16 +1302,16 @@ namespace RobloxFiles.BinaryFormat.Chunks var font = prop.CastValue(); string family = font.Family; - writer.WriteString(font.Family); - - if (family.EndsWith(".otf") || family.EndsWith(".ttf")) - return; + writer.WriteString(family); var weight = (ushort)font.Weight; writer.Write(weight); var style = (byte)font.Style; writer.Write(style); + + var cachedFaceId = font.CachedFaceId; + writer.WriteString(cachedFaceId); }); break; diff --git a/DataTypes/CFrame.cs b/DataTypes/CFrame.cs index 24e79c0..07b2a4e 100644 --- a/DataTypes/CFrame.cs +++ b/DataTypes/CFrame.cs @@ -91,20 +91,14 @@ namespace RobloxFiles.DataTypes public CFrame(Vector3 eye, Vector3 look) { Vector3 zAxis = (eye - look).Unit, - xAxis = Vector3.Up.Cross(zAxis), + xAxis = Vector3.yAxis.Cross(zAxis), yAxis = zAxis.Cross(xAxis); if (xAxis.Magnitude == 0) { - xAxis = Vector3.z; - yAxis = Vector3.x; - zAxis = Vector3.y; - - if (zAxis.Y < 0) - { - xAxis = -xAxis; - zAxis = -zAxis; - } + xAxis = Vector3.zAxis; + yAxis = Vector3.xAxis; + zAxis = Vector3.yAxis; } m11 = xAxis.X; m12 = yAxis.X; m13 = zAxis.X; m14 = eye.X; @@ -299,18 +293,18 @@ namespace RobloxFiles.DataTypes public static CFrame FromAxisAngle(Vector3 axis, float theta) { - Vector3 r = VectorAxisAngle(axis, Vector3.x, theta), - u = VectorAxisAngle(axis, Vector3.y, theta), - b = VectorAxisAngle(axis, Vector3.z, theta); + Vector3 r = VectorAxisAngle(axis, Vector3.xAxis, theta), + u = VectorAxisAngle(axis, Vector3.yAxis, theta), + b = VectorAxisAngle(axis, Vector3.zAxis, theta); return new CFrame(0, 0, 0, r.X, u.X, b.X, r.Y, u.Y, b.Y, r.Z, u.Z, b.Z); } public static CFrame FromEulerAnglesXYZ(float x, float y, float z) { - CFrame cfx = FromAxisAngle(Vector3.x, x), - cfy = FromAxisAngle(Vector3.y, y), - cfz = FromAxisAngle(Vector3.z, z); + CFrame cfx = FromAxisAngle(Vector3.xAxis, x), + cfy = FromAxisAngle(Vector3.yAxis, y), + cfz = FromAxisAngle(Vector3.zAxis, z); return cfx * cfy * cfz; } @@ -410,9 +404,9 @@ namespace RobloxFiles.DataTypes { var tests = new float[3] { - XVector.Dot(Vector3.x), - YVector.Dot(Vector3.y), - ZVector.Dot(Vector3.z) + XVector.Dot(Vector3.xAxis), + YVector.Dot(Vector3.yAxis), + ZVector.Dot(Vector3.zAxis) }; foreach (var test in tests) diff --git a/DataTypes/FontFace.cs b/DataTypes/FontFace.cs index 7ba39ef..c714ba7 100644 --- a/DataTypes/FontFace.cs +++ b/DataTypes/FontFace.cs @@ -2,8 +2,9 @@ namespace RobloxFiles.DataTypes { - // Implementation of Roblox's Font datatype. - // Renamed to FontFace to avoid disambiguation with System.Font and the Font enum. + // Implementation of Roblox's FontFace datatype. + // In Luau this type is named Font, but we avoid that name + // to avoid ambiguity with System.Font and Roblox's Font enum. public class FontFace { @@ -11,8 +12,16 @@ namespace RobloxFiles.DataTypes public readonly FontWeight Weight = FontWeight.Regular; public readonly FontStyle Style = FontStyle.Normal; - public FontFace(Content family, FontWeight weight = FontWeight.Regular, FontStyle style = FontStyle.Normal) + // Roblox caches the asset of the font's face to make it + // load faster. At runtime both the Family and the CachedFaceId + // are loaded in parallel. If the CachedFaceId doesn't match with + // the family file's face asset, then the correct one will be loaded late. + // Setting this is not required, it's just a throughput optimization. + public Content CachedFaceId { get; set; } = ""; + + public FontFace(Content family, FontWeight weight = FontWeight.Regular, FontStyle style = FontStyle.Normal, string cachedFaceId = "") { + CachedFaceId = cachedFaceId; Family = family; Weight = weight; Style = style; diff --git a/DataTypes/UniqueId.cs b/DataTypes/UniqueId.cs index 98ced8c..c1564cd 100644 --- a/DataTypes/UniqueId.cs +++ b/DataTypes/UniqueId.cs @@ -1,16 +1,27 @@ -namespace RobloxFiles.DataTypes +using System; + +namespace RobloxFiles.DataTypes { public struct UniqueId { public readonly uint Time; public readonly uint Index; - public readonly ulong Random; + public readonly long Random; - public UniqueId(uint time, uint index, ulong random) + public UniqueId(long random, uint time, uint index) { Time = time; Index = index; Random = random; } + + public override string ToString() + { + string random = Random.ToString("x2").PadLeft(16, '0'); + string index = Index.ToString("x2").PadLeft(8, '0'); + string time = Time.ToString("x2").PadLeft(8, '0'); + + return $"{random}{time}{index}"; + } } } diff --git a/DataTypes/Vector3.cs b/DataTypes/Vector3.cs index cbd9280..1622065 100644 --- a/DataTypes/Vector3.cs +++ b/DataTypes/Vector3.cs @@ -98,13 +98,13 @@ namespace RobloxFiles.DataTypes public static readonly Vector3 zero = new Vector3(0, 0, 0); public static readonly Vector3 one = new Vector3(1, 1, 1); - public static readonly Vector3 x = new Vector3(1, 0, 0); - public static readonly Vector3 y = new Vector3(0, 1, 0); - public static readonly Vector3 z = new Vector3(0, 0, 1); + public static readonly Vector3 xAxis = new Vector3(1, 0, 0); + public static readonly Vector3 yAxis = new Vector3(0, 1, 0); + public static readonly Vector3 zAxis = new Vector3(0, 0, 1); - public static Vector3 Right => x; - public static Vector3 Up => y; - public static Vector3 Back => z; + public static Vector3 Right => xAxis; + public static Vector3 Up => yAxis; + public static Vector3 Back => zAxis; public float Dot(Vector3 other) { diff --git a/Plugins/GenerateApiDump/Formatting.lua b/Plugins/GenerateApiDump/Formatting.lua index da9c357..10ec4c2 100644 --- a/Plugins/GenerateApiDump/Formatting.lua +++ b/Plugins/GenerateApiDump/Formatting.lua @@ -5,10 +5,10 @@ export type FormatFunc = (any) -> string export type Format = { [string]: FormatFunc } export type IEnum = { GetEnumItems: (IEnum) -> {EnumItem} } -local function flags(flags: T, enum: IEnum): string +local function flags(flagType: any, enum: Enum): string local value = 0 - for i, item in enum:GetEnumItems() do + for i, item: EnumItem in enum:GetEnumItems() do if (flags :: any)[item.Name] then value += (2 ^ item.Value) end diff --git a/Plugins/GenerateApiDump/init.server.lua b/Plugins/GenerateApiDump/init.server.lua index 5038cfa..ac7f796 100644 --- a/Plugins/GenerateApiDump/init.server.lua +++ b/Plugins/GenerateApiDump/init.server.lua @@ -8,72 +8,68 @@ local classes = {} local outStream = "" local stackLevel = 0 -local singletons = -{ - Speaker = Instance.new("Sound"); -- close enough - Terrain = workspace:WaitForChild("Terrain", 1000); - ParabolaAdornment = Instance.new("BoxHandleAdornment"); -- close enough - StarterPlayerScripts = StarterPlayer:WaitForChild("StarterPlayerScripts"); - StarterCharacterScripts = StarterPlayer:WaitForChild("StarterCharacterScripts"); - ChatWindowConfiguration = TextChatService:WaitForChild("ChatWindowConfiguration", 10); - ChatInputBarConfiguration = TextChatService:WaitForChild("ChatInputBarConfiguration", 10); +local singletons = { + Speaker = Instance.new("Sound"), -- close enough + Terrain = workspace:WaitForChild("Terrain", 1000), + ParabolaAdornment = Instance.new("BoxHandleAdornment"), -- close enough + StarterPlayerScripts = StarterPlayer:WaitForChild("StarterPlayerScripts"), + StarterCharacterScripts = StarterPlayer:WaitForChild("StarterCharacterScripts"), + ChatWindowConfiguration = TextChatService:WaitForChild("ChatWindowConfiguration", 10), + ChatInputBarConfiguration = TextChatService:WaitForChild("ChatInputBarConfiguration", 10), } -local exceptionClasses = -{ - PackageLink = true; - ScriptDebugger = true; - ChatWindowConfiguration = true; - ChatInputBarConfiguration = true; +local exceptionClasses = { + PackageLink = true, + ScriptDebugger = true, + ChatWindowConfiguration = true, + ChatInputBarConfiguration = true, } -local numberTypes = -{ - int = true; - long = true; - int64 = true; - float = true; - double = true; +local numberTypes = { + int = true, + long = true, + int64 = true, + float = true, + double = true, } -local stringTypes = -{ - string = true; - Content = true; - BinaryString = true; - ProtectedString = true; +local stringTypes = { + string = true, + Content = true, + BinaryString = true, + ProtectedString = true, } -local isCoreScript = pcall(function () +local isCoreScript = pcall(function() local restricted = game:GetService("RobloxPluginGuiService") return tostring(restricted) end) local function write(formatString, ...) - local tabs = string.rep(' ', stackLevel * 4) + local tabs = string.rep(" ", stackLevel * 4) local fmt = formatString or "" - + local value = tabs .. fmt:format(...) outStream = outStream .. value end local function writeLine(formatString, ...) if not formatString then - outStream = outStream .. '\n' + outStream = outStream .. "\n" return end - - write(formatString .. '\n', ...) + + write(formatString .. "\n", ...) end local function openStack() - writeLine('{') + writeLine("{") stackLevel += 1 end local function closeStack() stackLevel -= 1 - writeLine('}') + writeLine("}") end local function clearStream() @@ -84,7 +80,7 @@ end local function exportStream(label) local results = outStream:gsub("\n\n\n", "\n\n") local export - + if plugin then export = Instance.new("Script") export.Archivable = false @@ -92,9 +88,9 @@ local function exportStream(label) export.Name = label export.Parent = workspace - Selection:Add{export} + Selection:Add({ export }) end - + if isCoreScript then StudioService:CopyToClipboard(results) elseif not plugin then @@ -108,101 +104,99 @@ end local function getTags(object) local tags = {} - + if object.Tags ~= nil then - for _,tag in pairs(object.Tags) do + for _, tag in pairs(object.Tags) do tags[tag] = true end end - + if object.Name == "Terrain" then tags.NotCreatable = nil end - + return tags end local function upcastInheritance(class, root) local superClass = classes[class.Superclass] - + if not superClass then return end - + if not root then root = class end - + if not superClass.Inherited then superClass.Inherited = root end - + upcastInheritance(superClass, root) end local function canCreateClass(class) local tags = getTags(class) local canCreate = true - + if tags.NotCreatable then canCreate = false end - + if tags.Service then canCreate = true end - + if tags.Settings then canCreate = false end - + if singletons[class.Name] then canCreate = true end - + return canCreate end local function collectProperties(class) local propMap = {} - - for _,member in ipairs(class.Members) do + + for _, member in ipairs(class.Members) do if member.MemberType == "Property" then local propName = member.Name propMap[propName] = member end end - + return propMap end local function createProperty(propName, propType) - local category = "DataType"; + local category = "DataType" local name = propType - - if propType:find(':') then - local data = string.split(propType, ':') + + if propType:find(":") then + local data = string.split(propType, ":") category = data[1] name = data[2] end - + return - { - Name = propName; - - Serialization = - { - CanSave = true; - CanLoad = true; - }; - - ValueType = - { - Category = category; - Name = name; - }; - - Security = "None"; +{ + Name = propName, + + Serialization = { + CanSave = true, + CanLoad = true, + }, + + ValueType = { + Category = category, + Name = name, + }, + + Security = "None", } end @@ -214,28 +208,27 @@ local formatting: Format = require(script.Formatting) type FormatFunc = formatting.FormatFunc type Format = formatting.Format -local formatLinks = -{ - ["int"] = "Int"; - ["long"] = "Int"; - - ["float"] = "Float"; - ["byte[]"] = "Bytes"; - ["double"] = "Double"; - ["boolean"] = "Bool"; - - ["string"] = "String"; - ["Content"] = "String"; - - ["Color3uint8"] = "Color3"; - ["ProtectedString"] = "String"; +local formatLinks = { + ["int"] = "Int", + ["long"] = "Int", + + ["float"] = "Float", + ["byte[]"] = "Bytes", + ["double"] = "Double", + ["boolean"] = "Bool", + + ["string"] = "String", + ["Content"] = "String", + + ["Color3uint8"] = "Color3", + ["ProtectedString"] = "String", } local function getFormatFunction(valueType: string): FormatFunc if not formatting[valueType] then valueType = formatLinks[valueType] end - + return formatting[valueType] or formatting.Null end @@ -250,7 +243,7 @@ function patchIndex:__index(key) if not rawget(self, key) then rawset(self, key, {}) end - + return self[key] end @@ -273,71 +266,70 @@ if plugin then button = toolbar:CreateButton( "Dump API", - "Generates a C# dump of Roblox's Class/Enum API.", + "Generates a C# dump of Roblox's Class/Enum API.", "rbxasset://textures/Icon_Stream_Off@2x.png" ) - + button.ClickableWhenViewportHidden = true end local function getAsync(url) local enabled - + if isCoreScript then enabled = HttpService:GetHttpEnabled() HttpService:SetHttpEnabled(true) end - + local result = HttpService:GetAsync(url) - + if isCoreScript then HttpService:SetHttpEnabled(enabled) end - + return result end local function generateClasses() local env = getfenv() local version = getAsync(baseUrl .. "version.txt") - + local apiDump = getAsync(baseUrl .. "API-Dump.json") apiDump = HttpService:JSONDecode(apiDump) - + local classNames = {} classes = {} - local enumMap = - { - Axis = true; - FontSize = true; - FontStyle = true; - FontWeight = true; + local enumMap = { + Axis = true, + FontSize = true, + FontStyle = true, + FontWeight = true, } - - for _,class in ipairs(apiDump.Classes) do + + for _, class in ipairs(apiDump.Classes) do local className = class.Name local superClass = classes[class.Superclass] - + if singletons[className] then class.Singleton = true class.Object = singletons[className] end - + if superClass and canCreateClass(class) then local classTags = getTags(class) - + if classTags.Service then - pcall(function () + pcall(function() if not className:find("Network") then class.Object = game:GetService(className) end end) elseif not classTags.NotCreatable then - pcall(function () + pcall(function() local dumpFolder = game:FindFirstChild("DumpFolder") class.Object = Instance.new(className) - + if dumpFolder then local old = dumpFolder:FindFirstChildOfClass(className) @@ -350,50 +342,50 @@ local function generateClasses() end end) end - + upcastInheritance(class) end - + classes[className] = class table.insert(classNames, className) end - + outStream = "" - + writeLine("// Auto-generated list of creatable Roblox classes.") writeLine("// Updated as of %s", version) writeLine() - + writeLine("using System;") writeLine() - + writeLine("using RobloxFiles.DataTypes;") writeLine("using RobloxFiles.Enums;") writeLine("using RobloxFiles.Utility;") writeLine() - + writeLine("#pragma warning disable IDE1006 // Naming Styles") writeLine() - + writeLine("namespace RobloxFiles") openStack() - + for i, className in ipairs(classNames) do local class = classes[className] local classTags = getTags(class) - + local registerClass = canCreateClass(class) local object = class.Object - + if class.Inherited then registerClass = true end - + if class.Name == "Instance" or class.Name == "Studio" then registerClass = false end - local noSecurityCheck = pcall(function () + local noSecurityCheck = pcall(function() if not classTags.Service then return tostring(object) end @@ -402,7 +394,7 @@ local function generateClasses() if not noSecurityCheck then object = nil end - + if not object then if class.Inherited then object = class.Inherited.Object @@ -412,40 +404,40 @@ local function generateClasses() registerClass = false end end - + if exceptionClasses[class.Name] then registerClass = true end - + if registerClass then local objectType - + if classTags.NotCreatable and class.Inherited and not class.Singleton then objectType = "abstract class" else objectType = "class" end - + writeLine("public %s %s : %s", objectType, className, class.Superclass) openStack() - + local classPatches = getPatches(className) local redirectProps = classPatches.Redirect - + local propMap = collectProperties(class) local propNames = {} - - for _,propName in pairs(classPatches.Remove) do + + for _, propName in pairs(classPatches.Remove) do propMap[propName] = nil end - + for propName in pairs(propMap) do table.insert(propNames, propName) end - + for propName, propType in pairs(classPatches.Add) do local prop = propMap[propName] - + if prop then local serial = prop.Serialization serial.CanSave = true @@ -455,13 +447,13 @@ local function generateClasses() table.insert(propNames, propName) end end - + local firstLine = true class.PropertyMap = propMap - + local ancestor = class local diffProps = {} - + while object do ancestor = classes[ancestor.Superclass] @@ -471,27 +463,25 @@ local function generateClasses() local inheritProps = ancestor.PropertyMap local inherited = ancestor.Inherited - - local baseObject = if inherited - then inherited.Object - else nil - + + local baseObject = if inherited then inherited.Object else nil + if inheritProps and baseObject then for name, prop in pairs(inheritProps) do local tags = getTags(prop) - + if tags.ReadOnly then continue end - - local gotPropValue, propValue = pcall(function () + + local gotPropValue, propValue = pcall(function() return object[name] end) - local gotBaseValue, baseValue = pcall(function () + local gotBaseValue, baseValue = pcall(function() return baseObject[name] end) - + if gotBaseValue and gotPropValue then if propValue ~= baseValue then diffProps[name] = propValue @@ -500,7 +490,7 @@ local function generateClasses() end end end - + if classTags.Service or next(diffProps) then local headerFormat = "public %s()" @@ -510,10 +500,10 @@ local function generateClasses() writeLine(headerFormat, className) openStack() - + if classTags.Service then writeLine("IsService = true;") - + if next(diffProps) then writeLine() end @@ -532,7 +522,7 @@ local function generateClasses() local value = diffProps[name] local valueType = typeof(value) local formatFunc = getFormatFunction(valueType) - + if formatFunc ~= formatting.Null then local result = formatFunc(value) @@ -544,37 +534,37 @@ local function generateClasses() end end end - + closeStack() end - + table.sort(propNames) - + for j, propName in ipairs(propNames) do local prop = propMap[propName] local propTags = getTags(prop) - + local serial = prop.Serialization local typeData = prop.ValueType local category = typeData.Category local valueType = typeData.Name - + local redirect = redirectProps[propName] local couldSave = (serial.CanSave or propTags.Deprecated or redirect) - + if serial.CanLoad and couldSave then if firstLine and (classTags.Service or next(diffProps)) then writeLine() end - + local name = propName local default = "" - + if propName == className then - name = name .. '_' + name = name .. "_" end - + if valueType == "int64" then valueType = "long" elseif valueType == "BinaryString" then @@ -582,40 +572,40 @@ local function generateClasses() elseif valueType == "Font" and category ~= "Enum" then valueType = "FontFace" end - + local first = name:sub(1, 1) - + if first == first:lower() then local pascal = first:upper() .. name:sub(2) if propMap[pascal] ~= nil and propTags.Deprecated then redirect = pascal end end - + if redirect then local get, set, flag - + if typeof(redirect) == "string" then get = redirect set = redirect .. " = value" - + if redirect == "value" then set = "this." .. set end else - get = redirect.Get - set = redirect.Set + get = redirect.Get + set = redirect.Set flag = redirect.Flag end - + if not firstLine and set then writeLine() end - + if propTags.Deprecated then writeLine("[Obsolete]") end - + if set then if flag then writeLine("public %s %s %s", flag, valueType, name) @@ -626,9 +616,9 @@ local function generateClasses() openStack() writeLine("get => %s;", get) - if set:find('\n') then + if set:find("\n") then writeLine() - + writeLine("set") openStack() @@ -645,23 +635,23 @@ local function generateClasses() else writeLine("public %s %s => %s;", valueType, name, get) end - + if j ~= #propNames and set then writeLine() end else local value = classPatches.Defaults[propName] local gotValue = (value ~= nil) - + if not gotValue then - gotValue, value = pcall(function () + gotValue, value = pcall(function() return object[propName] end) end - + if not gotValue and category ~= "Class" then -- Fallback to implicit defaults - + if numberTypes[valueType] then value = 0 gotValue = true @@ -673,9 +663,9 @@ local function generateClasses() gotValue = true elseif category == "DataType" then local DataType = env[valueType] - + if DataType and typeof(DataType) == "table" and not rawget(env, valueType) then - pcall(function () + pcall(function() value = DataType.new() gotValue = true end) @@ -685,7 +675,7 @@ local function generateClasses() local lowestId = math.huge local lowest - for _,item in pairs(enum:GetEnumItems()) do + for _, item in pairs(enum:GetEnumItems()) do local itemValue = item.Value if itemValue < lowestId then @@ -706,21 +696,27 @@ local function generateClasses() if gotValue then warn(src, "Fell back to implicit value for property:", id) else - warn(src, "!! Could not figure out default value for property:", id, "value error was:", value) + warn( + src, + "!! Could not figure out default value for property:", + id, + "value error was:", + value + ) end end - + if gotValue then local formatKey = if category == "Enum" then "Enum" else valueType local formatFunc = getFormatFunction(formatKey) - + if formatFunc == formatting.Null then local literal = typeof(value) formatFunc = getFormatFunction(literal) end - + local result - + if formatFunc then if typeof(formatFunc) == "string" then result = formatFunc @@ -732,7 +728,7 @@ local function generateClasses() if result == "" then result = nil end - + if result ~= nil then default = " = " .. result end @@ -747,34 +743,34 @@ local function generateClasses() -- .____. propTags.Deprecated = false end - + if propTags.Deprecated then if not firstLine then writeLine() end - + writeLine("[Obsolete]") end - + writeLine("public %s %s%s;", valueType, name, default) - + if propTags.Deprecated and j ~= #propNames then writeLine() end end - + firstLine = false end end - + closeStack() - - if (i ~= #classNames) then + + if i ~= #classNames then writeLine() end end end - + closeStack() exportStream("Classes") @@ -784,64 +780,64 @@ end local function generateEnums(whiteList) local version = getfenv().version():gsub("%. ", ".") clearStream() - + writeLine("// Auto-generated list of Roblox enums.") writeLine("// Updated as of %s", version) writeLine() writeLine("namespace RobloxFiles.Enums") openStack() - + local enums = Enum:GetEnums() - + for i, enum in ipairs(enums) do local enumName = tostring(enum) if whiteList and not whiteList[enumName] then continue end - + writeLine("public enum %s", enumName) openStack() - + local enumItems = enum:GetEnumItems() local lastValue = -1 local mapped = {} - - table.sort(enumItems, function (a, b) + + table.sort(enumItems, function(a, b) return a.Value < b.Value end) - + for j, enumItem in ipairs(enumItems) do local text = "" - local comma = ',' - + local comma = "," + local name = enumItem.Name local value = enumItem.Value - + if not mapped[value] then if (value - lastValue) ~= 1 then - text = " = " .. value; + text = " = " .. value end - + if j == #enumItems then comma = "" end - + lastValue = value mapped[value] = true writeLine("%s%s%s", name, text, comma) end end - + closeStack() - + if i ~= #enums then writeLine() end end - + closeStack() exportStream("Enums") end @@ -859,4 +855,4 @@ end if game.Name:sub(1, 9) == "Null.rbxl" then generateAll() -end \ No newline at end of file +end diff --git a/Plugins/sourcemap.json b/Plugins/sourcemap.json new file mode 100644 index 0000000..4566f30 --- /dev/null +++ b/Plugins/sourcemap.json @@ -0,0 +1 @@ +{"name":"GenerateApiDump","className":"Script","filePaths":["GenerateApiDump\\init.server.lua","default.project.json"],"children":[{"name":"Formatting","className":"ModuleScript","filePaths":["GenerateApiDump\\Formatting.lua"]},{"name":"PropertyPatches","className":"ModuleScript","filePaths":["GenerateApiDump\\PropertyPatches.lua"]}]} \ No newline at end of file diff --git a/RobloxFileFormat.dll b/RobloxFileFormat.dll index 7631e9f..b15f49b 100644 Binary files a/RobloxFileFormat.dll and b/RobloxFileFormat.dll differ diff --git a/Tokens/Font.cs b/Tokens/Font.cs index b21069c..c17e80d 100644 --- a/Tokens/Font.cs +++ b/Tokens/Font.cs @@ -66,9 +66,9 @@ namespace RobloxFiles.Tokens var style = (FontWeight)attribute.ReadByte(); var family = attribute.ReadString(); - _ = attribute.ReadInt(); // Reserved + var cachedFaceId = attribute.ReadString(); - return new FontFace(family, style, weight); + return new FontFace(family, style, weight, cachedFaceId); } public void WriteAttribute(RbxAttribute attribute, FontFace value) diff --git a/Tokens/UniqueId.cs b/Tokens/UniqueId.cs index aa8c197..db1e352 100644 --- a/Tokens/UniqueId.cs +++ b/Tokens/UniqueId.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Xml; using RobloxFiles.DataTypes; @@ -14,13 +15,21 @@ namespace RobloxFiles.Tokens if (Guid.TryParse(hex, out var guid)) { - var bytes = guid.ToByteArray(); - var random = BitConverter.ToUInt64(bytes, 0); + var bytes = new byte[16]; - var time = BitConverter.ToUInt32(bytes, 8); - var index = BitConverter.ToUInt32(bytes, 12); + for (int i = 0; i < 16; i++) + { + var hexChar = hex.Substring(i * 2, 2); + bytes[15 - i] = Convert.ToByte(hexChar, 16); + } + + var rand = BitConverter.ToInt64(bytes, 8); + var time = BitConverter.ToUInt32(bytes, 4); + var index = BitConverter.ToUInt32(bytes, 0); + + var uniqueId = new UniqueId(rand, time, index); + prop.Value = uniqueId; - prop.Value = new UniqueId(time, index, random); return true; } @@ -30,8 +39,8 @@ namespace RobloxFiles.Tokens public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) { var uniqueId = prop.CastValue(); - var random = BitConverter.GetBytes(uniqueId.Random); + var random = BitConverter.GetBytes(uniqueId.Random); var time = BitConverter.GetBytes(uniqueId.Time); var index = BitConverter.GetBytes(uniqueId.Index); diff --git a/Tree/Property.cs b/Tree/Property.cs index d538785..0ba6e6b 100644 --- a/Tree/Property.cs +++ b/Tree/Property.cs @@ -59,7 +59,7 @@ namespace RobloxFiles internal static BindingFlags BindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase; // TODO: Map typeof(ProtectedString) to PropertyType.ProtectedString - // if binary files are ever publically allowed to read it. + // if binary files are ever publicly allowed to read it. public static readonly IReadOnlyDictionary Types = new Dictionary() { diff --git a/UnitTest/Files/Binary.rbxl b/UnitTest/Files/Binary.rbxl index b5437a3..e5b9828 100644 Binary files a/UnitTest/Files/Binary.rbxl and b/UnitTest/Files/Binary.rbxl differ diff --git a/UnitTest/Files/Xml.rbxlx b/UnitTest/Files/Xml.rbxlx index 4fc4f92..28e4388 100644 --- a/UnitTest/Files/Xml.rbxlx +++ b/UnitTest/Files/Xml.rbxlx @@ -1,14 +1,14 @@ null nil - + false 0 0 Default^0^-1 - RBX14AE6C7228F945B580979619731749BB + RBXEBB40C2699034B359FA22A13918BC8C6 0 true -500 @@ -52,12 +52,14 @@ -1 0 false + 0 64 0 1024 true false + 0 2c3758b9147ff16b01b8290f000271ed @@ -76,7 +78,7 @@ - + false @@ -106,6 +108,7 @@ true true false + Default 0 4288914085 @@ -137,7 +140,6 @@ false 256 - rbxassetid://3186730087 rbxassetid://3186730087 Hull qKQHnbGqNyW9YBYUZo8CWQ== @@ -182,6 +184,7 @@ 0 0 + 0 1.90382576 4.49005699 @@ -189,7 +192,7 @@ - + false @@ -219,6 +222,7 @@ true true false + Default 0 4288914085 @@ -250,7 +254,6 @@ false 256 - rbxassetid://3186730087 rbxassetid://3186730087 Box +qv2o0HSW+htH+ALwYQpiw== @@ -295,6 +298,7 @@ 0 0 + 0 1.90382576 4.49005699 @@ -302,7 +306,7 @@ - + 0 @@ -349,7 +353,7 @@ - + false @@ -379,6 +383,7 @@ true true true + Default 0 4288914085 @@ -410,7 +415,6 @@ false 256 - rbxassetid://3186726050 rbxassetid://3186726050 Box +qv2o0HSW+htH+ALwYQpiw== @@ -455,6 +459,7 @@ 0 0 + 0 4.72215939 3.58347774 @@ -462,7 +467,7 @@ - + false @@ -492,6 +497,7 @@ true true false + Default 0 4288914085 @@ -523,7 +529,6 @@ false 256 - rbxassetid://3186726050 rbxassetid://3186726050 Default h8IPxf7q0MVs4uyaKSOhVA== @@ -568,6 +573,7 @@ 0 0 + 0 4.72215939 3.58347774 @@ -575,7 +581,7 @@ - + false @@ -605,6 +611,7 @@ true true false + Default 0 4288914085 @@ -636,7 +643,6 @@ false 256 - rbxassetid://3186726050 rbxassetid://3186726050 Hull yk4/m1d5tPD+2SapafAV9A== @@ -681,6 +687,7 @@ 0 0 + 0 4.72215939 3.58347774 @@ -688,7 +695,7 @@ - + false @@ -718,6 +725,7 @@ true true false + Default 0 4288914085 @@ -749,7 +757,6 @@ false 256 - rbxassetid://3186726050 rbxassetid://3186726050 PreciseConvexDecomposition ezvavG8GMWP28xfkKnsm/w== @@ -794,6 +801,7 @@ 0 0 + 0 4.72215939 3.58347774 @@ -801,7 +809,7 @@ - + false @@ -831,6 +839,7 @@ true true false + Default 0 4288914085 @@ -862,7 +871,6 @@ false 256 - rbxassetid://3186726050 rbxassetid://3186726050 LOD ezvavG8GMWP28xfkKnsm/w== @@ -907,6 +915,7 @@ 0 0 + 0 4.72215939 3.58347774 @@ -915,7 +924,7 @@ - + @@ -958,7 +967,7 @@ 2c3758b9147ff16b01b8290f00028683 - + 1 true @@ -989,6 +998,7 @@ true true true + Default 0 4288914085 @@ -1335,7 +1345,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + BoolValue @@ -1345,7 +1355,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + BrickColorValue @@ -1355,7 +1365,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 194 - + Color3Value @@ -1369,7 +1379,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + CFrameValue @@ -1392,7 +1402,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + IntValue @@ -1402,7 +1412,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1234 - + NumberValue @@ -1412,17 +1422,17 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 9.0000999999999997669 - + ObjectValue -1 2c3758b9147ff16b01b8290f000286e1 - RBXC8BE375880894BB19728E94D7F5BD673 + RBX1EB529B1D1854577B8D81E9C55C71A48 - + RayValue @@ -1443,7 +1453,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + StringValue @@ -1453,7 +1463,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A TestingLol - + true @@ -1483,6 +1493,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A true true true + Default 0 4288914085 @@ -1552,9 +1563,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 - + - RBXF53875E3E93C4F2CAE5B33F12FAA7B38 + RBX9AD1F5DA2030470586271DA8130205E8 0 @@ -1572,9 +1583,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + - RBXF53875E3E93C4F2CAE5B33F12FAA7B38 + RBX9AD1F5DA2030470586271DA8130205E8 1 @@ -1593,7 +1604,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + 0 @@ -1640,12 +1651,14 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 0 - + false ColorSequence + + 0 {354D4B09-10FD-4C87-A7C0-B69F8E2A5066} 2c3758b9147ff16b01b8290f0002870d - + false SizeSequence + + 0 {E785E241-396B-423F-964A-E545D5BAB3EC} 2c3758b9147ff16b01b8290f0002870e - + false TransparencySequence + + 0 {B05FC7FC-88AB-427D-A9AA-DF55CCFE8554} - + Vector3Value @@ -1736,7 +1753,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1776,7 +1793,13 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null 0 false + 0 + 0 + 0 + 0 + false null + 0 0.5 -50 @@ -1791,7 +1814,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true 1 - + UDimTest @@ -1817,7 +1840,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -1864,7 +1887,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1894,6 +1917,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true true true + Default 0 4288914085 @@ -1959,7 +1983,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1989,6 +2013,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true true true + Default 0 4288914085 @@ -2055,7 +2080,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + INF @@ -2067,7 +2092,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1.3337000000000001076 - + false @@ -2097,6 +2122,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true true false + Default 0 4288914085 @@ -2128,7 +2154,6 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 256 - rbxassetid://3186730087 rbxassetid://3186730087 Default wqN+0m4YPEAIF5tOPQwXdA== @@ -2173,6 +2198,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + 0 1.90382576 4.49005699 @@ -2180,7 +2206,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + - + 0 @@ -2209,9 +2235,19 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> -1 2c3758b9147ff16b01b8290f00028598 + 1 - + + + + VideoCaptureService + -1 + + 7a17f39c2cd995540269f61800155571 + + + NonReplicatedCSGDictionaryService @@ -2220,7 +2256,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285a4 - + CSGDictionaryService @@ -2229,7 +2265,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285a5 - + false @@ -2240,7 +2276,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285aa - + TimerService @@ -2249,7 +2285,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ab - + true @@ -2262,7 +2298,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ad - + ReplicatedFirst @@ -2271,7 +2307,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285b1 - + TweenService @@ -2280,89 +2316,49 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285b3 - + Asphalt Basalt - null Brick - null Cobblestone - null Concrete - null CorrodedMetal CrackedLava - null DiamondPlate - null Fabric - null Foil Glacier - null Granite - null Grass Ground - null Ice LeafyGrass Limestone - null Marble - null Metal Mud MaterialService Pavement - null Pebble - null Plastic Rock Salt - null Sand Sandstone - null Slate - null SmoothPlastic Snow -1 - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null - null 2c3758b9147ff16b01b8290f000285b4 - false - null + false Wood - null WoodPlanks - + 0 @@ -2373,7 +2369,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 7a17f39c2cd995540269f61800149fc0 - + true @@ -2383,7 +2379,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 7a17f39c2cd995540269f6180014a183 - + true @@ -2395,7 +2391,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> - + PermissionsService @@ -2404,7 +2400,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285b8 - + false @@ -2418,7 +2414,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ba - + 0 @@ -2433,7 +2429,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285bc - + true @@ -2451,6 +2447,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 + 0 true 0 0 @@ -2479,7 +2476,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285bd true - + StarterPlayerScripts @@ -2488,7 +2485,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f0002872a - + StarterCharacterScripts @@ -2498,7 +2495,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> - + StarterPack @@ -2507,7 +2504,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285be - + StarterGui @@ -2520,7 +2517,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 0 - + LocalizationService @@ -2529,7 +2526,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285c1 - + TeleportService @@ -2538,7 +2535,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285c5 - + CollectionService @@ -2547,7 +2544,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285c7 - + PhysicsService @@ -2556,7 +2553,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285c8 - + Geometry @@ -2565,7 +2562,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ca - + false false @@ -2575,7 +2572,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285cc - + InsertionHash @@ -2586,7 +2583,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> - + GamePassService @@ -2595,7 +2592,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285cd - + 1000 @@ -2605,7 +2602,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ce - + CookiesService @@ -2614,7 +2611,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285cf - + VRService @@ -2623,7 +2620,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285d9 - + ContextActionService @@ -2632,7 +2629,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285da - + ScriptService @@ -2641,7 +2638,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285dc - + AssetService @@ -2650,7 +2647,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285dd - + TouchInputService @@ -2659,7 +2656,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285de - + @@ -2669,7 +2666,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285e1 - + Selection @@ -2678,7 +2675,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285e4 - + false @@ -2688,7 +2685,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285e6 - + ServerStorage @@ -2696,7 +2693,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285e7 - + NodePresets @@ -2706,7 +2703,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> - + ReplicatedStorage @@ -2715,7 +2712,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285e8 - + LuaWebService @@ -2724,7 +2721,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285ef - + ProcessInstancePhysicsService @@ -2733,7 +2730,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285f2 - + 0 @@ -2779,7 +2776,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028631 - + Instance @@ -2788,7 +2785,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028633 - + AnimationFromVideoCreatorService @@ -2797,7 +2794,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 7a17f39c2cd995540269f6180015546d - + true @@ -2808,7 +2805,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028695 - + FlyweightService @@ -2817,7 +2814,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000286a6 - + true @@ -2827,7 +2824,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000286b7 - + LanguageService @@ -2836,7 +2833,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000285f9 - + MemoryStoreService @@ -2845,7 +2842,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000286ca - + true @@ -2856,16 +2853,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000286f2 - - - - ReplicatedScriptService - -1 - - 2c3758b9147ff16b01b8290f00028704 - - - + Teams @@ -2874,7 +2862,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028734 - + true @@ -2892,7 +2880,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028738 - + {"lastSaveTime":0,"lastKnownPublishRequest":0,"users":[]} @@ -2902,18 +2890,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f00028753 - - - false - - - VideoCaptureService - -1 - - 7a17f39c2cd995540269f61800155571 - - - + VirtualInputManager @@ -2922,7 +2899,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f0002875c - + VoiceChatInternal @@ -2931,7 +2908,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 7a17f39c2cd995540269f61800155575 - + true @@ -2941,7 +2918,7 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 7a17f39c2cd995540269f61800155576 - + DumpFolder @@ -2949,43 +2926,63 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> 2c3758b9147ff16b01b8290f000286a8 - + + + 1 + 0 + + 0 + UIAspectRatioConstraint + -1 + + 32ea8b09883b240203574492000ab351 + + + - - INF - INF - - + RayValue + -1 + + 32ea8b09883b240203574492000ab368 + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + + + + Vector3Value + -1 + + 32ea8b09883b240203574492000ab36a + 0 0 - - UISizeConstraint - -1 - - 7a17f39c2cd995540269f61800155556 + 0 + - - - - StringValue - -1 - - 7a17f39c2cd995540269f6180015556d - - - - + Vector3Curve -1 - 7a17f39c2cd995540269f6180015556f + 32ea8b09883b240203574492000ab36b - + 0 @@ -3005,52 +3002,40 @@ ZWN0b3IyEAAA4EAAAABBCwAAAFRlc3RWZWN0b3IzEQAAEEEAACBBAAAwQQ==]]> Accoutrement -1 - 7a17f39c2cd995540269f61800155465 + 32ea8b09883b240203574492000ab24d - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - Accessory - -1 - - 7a17f39c2cd995540269f61800155466 - - - + - 2 true - KeyframeSequence + CurveAnimation 2 -1 - 7a17f39c2cd995540269f6180015546b + 32ea8b09883b240203574492000ab253 - + + + + AnimationController + -1 + + 32ea8b09883b240203574492000ab255 + + + AnimationRigData -1 - 7a17f39c2cd995540269f6180015546f + 32ea8b09883b240203574492000ab257 + AQAAAAAAAAA= + AQAAAAAAAAA= + AQAAAAAAAAA= + AQAAAAAAAAA= AQAAAAEAAAAAAAAA AQAAAAEAAAAAAAAA AQAAAAEAAAAAAA== @@ -3060,9 +3045,10 @@ AAA=]]> AAA=]]> + AQAAAAAAAAA= - + @@ -3082,19 +3068,19 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f61800155472 + 32ea8b09883b240203574492000ab25b - + Backpack -1 - 7a17f39c2cd995540269f61800155476 + 32ea8b09883b240203574492000ab260 - + false @@ -3103,10 +3089,10 @@ AAA=]]> -1 - 7a17f39c2cd995540269f61800155477 + 32ea8b09883b240203574492000ab261 - + true @@ -3132,10 +3118,10 @@ AAA=]]> - 7a17f39c2cd995540269f61800155478 + 32ea8b09883b240203574492000ab262 - + true @@ -3162,10 +3148,10 @@ AAA=]]> 194 - 7a17f39c2cd995540269f61800155479 + 32ea8b09883b240203574492000ab263 - + null null @@ -3187,31 +3173,31 @@ AAA=]]> 0 1 0 0.5 0 1 0.5 0 - 7a17f39c2cd995540269f6180015547c + 32ea8b09883b240203574492000ab266 1 1 0 - + BindableEvent -1 - 7a17f39c2cd995540269f6180015547d + 32ea8b09883b240203574492000ab267 - + BindableFunction -1 - 7a17f39c2cd995540269f6180015547e + 32ea8b09883b240203574492000ab268 - + 0 @@ -3228,10 +3214,10 @@ AAA=]]> 1250 -1 - 7a17f39c2cd995540269f6180015547f + 32ea8b09883b240203574492000ab269 - + @@ -3242,10 +3228,10 @@ AAA=]]> BodyForce -1 - 7a17f39c2cd995540269f61800155480 + 32ea8b09883b240203574492000ab26a - + @@ -3272,10 +3258,10 @@ AAA=]]> 3000 -1 - 7a17f39c2cd995540269f61800155481 + 32ea8b09883b240203574492000ab26b - + 1250 @@ -3293,10 +3279,10 @@ AAA=]]> -1 - 7a17f39c2cd995540269f61800155482 + 32ea8b09883b240203574492000ab26c - + @@ -3312,10 +3298,10 @@ AAA=]]> BodyThrust -1 - 7a17f39c2cd995540269f61800155483 + 32ea8b09883b240203574492000ab26d - + @@ -3327,7 +3313,7 @@ AAA=]]> 1250 -1 - 7a17f39c2cd995540269f61800155484 + 32ea8b09883b240203574492000ab26e 0 2 @@ -3335,7 +3321,7 @@ AAA=]]> - + 0.699999988 @@ -3360,10 +3346,10 @@ AAA=]]> 5 500 3000 - 7a17f39c2cd995540269f61800155485 + 32ea8b09883b240203574492000ab26f - + @@ -3403,10 +3389,10 @@ AAA=]]> Camera -1 - 7a17f39c2cd995540269f61800155487 + 32ea8b09883b240203574492000ab272 - + @@ -3442,10 +3428,10 @@ AAA=]]> 0.498039246 0.278431386 - 7a17f39c2cd995540269f61800155488 + 32ea8b09883b240203574492000ab273 - + 0 @@ -3455,10 +3441,10 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f61800155489 + 32ea8b09883b240203574492000ab274 - + @@ -3470,10 +3456,10 @@ AAA=]]> -1 - 7a17f39c2cd995540269f6180015548a + 32ea8b09883b240203574492000ab275 - + @@ -3481,24 +3467,24 @@ AAA=]]> 1 1 - Shirt - + + ShirtGraphic -1 - 7a17f39c2cd995540269f6180015548b + 32ea8b09883b240203574492000ab277 - + Skin 226 -1 - 7a17f39c2cd995540269f6180015548d + 32ea8b09883b240203574492000ab278 - + @@ -3506,10 +3492,10 @@ AAA=]]> ClickDetector -1 - 7a17f39c2cd995540269f6180015548e + 32ea8b09883b240203574492000ab279 - + @@ -3523,19 +3509,19 @@ AAA=]]> Clouds -1 - 7a17f39c2cd995540269f6180015548f + 32ea8b09883b240203574492000ab27a - + Configuration -1 - 7a17f39c2cd995540269f61800155490 + 32ea8b09883b240203574492000ab27b - + 0 null @@ -3561,27 +3547,17 @@ AAA=]]> 10000 1 AlignOrientation - - 1 - 0 - 0 - false false 10 false - - 0 - 1 - 0 - -1 - 7a17f39c2cd995540269f61800155491 + 32ea8b09883b240203574492000ab27c false - + false null @@ -3603,11 +3579,11 @@ AAA=]]> false -1 - 7a17f39c2cd995540269f61800155492 + 32ea8b09883b240203574492000ab27d false - + 0 @@ -3625,11 +3601,11 @@ AAA=]]> 2 -1 - 7a17f39c2cd995540269f61800155493 + 32ea8b09883b240203574492000ab27e false - + null null @@ -3646,56 +3622,40 @@ AAA=]]> false -45 45 - 7a17f39c2cd995540269f61800155494 + 32ea8b09883b240203574492000ab27f 45 false - - - 0 - 45 - 0 - 0 - null - null - - 1009 - true - false - -45 - INF - 0 - HingeConstraint - 0.150000006 - 0 - 0 - -1 - - 0 - 7a17f39c2cd995540269f61800155495 - 45 - false - - - + + + null + null + + 194 + true + Plane + -1 + + 32ea8b09883b240203574492000ab284 + false + + + null null 194 - false - INF - INF true RigidConstraint -1 - 7a17f39c2cd995540269f61800155499 + 32ea8b09883b240203574492000ab285 false - + null null @@ -3710,11 +3670,11 @@ AAA=]]> -1 0.100000001 - 7a17f39c2cd995540269f6180015549a + 32ea8b09883b240203574492000ab286 false - + null null @@ -3727,7 +3687,7 @@ AAA=]]> -1 0.100000001 - 7a17f39c2cd995540269f6180015549b + 32ea8b09883b240203574492000ab287 false false 10000 @@ -3736,48 +3696,31 @@ AAA=]]> 5 - + - 0 - 0 - false - 45 - 0 - 0 - 0 null null - 1009 + 3 + 200 + 0 true - 0 + 1 false - 45 - -45 - 0 - INF - INF - 0 - 0 - CylindricalConstraint - 0 - false - 0 - 0 - 0.150000006 + INF + 5 + 0 + SpringConstraint + 0.400000006 -1 - 0 + 0 - 0 - 0 - 7a17f39c2cd995540269f6180015549c - 45 - 5 - 0 + 0.100000001 + 32ea8b09883b240203574492000ab28a false - + null null @@ -3793,11 +3736,11 @@ AAA=]]> 0 0 - 7a17f39c2cd995540269f6180015549f + 32ea8b09883b240203574492000ab28b false - + null null @@ -3816,11 +3759,11 @@ AAA=]]> -1 100 - 7a17f39c2cd995540269f618001554a0 + 32ea8b09883b240203574492000ab28c false - + null null @@ -3834,11 +3777,11 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554a1 + 32ea8b09883b240203574492000ab28d false - + false null @@ -3855,128 +3798,112 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554a2 + 32ea8b09883b240203574492000ab28e false - + HumanoidController -1 - 7a17f39c2cd995540269f618001554a3 + 32ea8b09883b240203574492000ab28f - + SkateboardController -1 - 7a17f39c2cd995540269f618001554a4 + 32ea8b09883b240203574492000ab290 - + - VehicleController + 16 + 8 + + 0 + 0 + 1 + + + 0 + 0 + 0 + + ControllerManager -1 - 7a17f39c2cd995540269f618001554a5 + 32ea8b09883b240203574492000ab296 - + CustomEvent 0 -1 - 7a17f39c2cd995540269f618001554a6 + 32ea8b09883b240203574492000ab297 - + CustomEventReceiver null -1 - 7a17f39c2cd995540269f618001554a7 + 32ea8b09883b240203574492000ab298 - + - 0 - 0 - 0 - 2 - 2 - BlockMesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - -1 - - 7a17f39c2cd995540269f618001554a8 - - 1 - 1 - 1 - - - - - - - 0 - 25 true - - Dialog - 1 + DialogChoice + -1 - 0 - 0 - + 32ea8b09883b240203574492000ab2a4 + + + + + + + 500000 + 4 + 1 + 1 + Explosion + 0 0 0 - 7a17f39c2cd995540269f618001554b1 - - - - - - EulerRotationCurve - 0 -1 - 7a17f39c2cd995540269f618001554b4 + 1 + 32ea8b09883b240203574492000ab2a9 + true - + FaceControls -1 - 7a17f39c2cd995540269f618001554b7 + 32ea8b09883b240203574492000ab2ac - + @@ -3990,11 +3917,11 @@ AAA=]]> 0 - 7a17f39c2cd995540269f618001554b8 + 32ea8b09883b240203574492000ab2ad 1 - + @@ -4012,11 +3939,11 @@ AAA=]]> 0 - 7a17f39c2cd995540269f618001554b9 + 32ea8b09883b240203574492000ab2ae 1 - + 0 @@ -4026,33 +3953,44 @@ AAA=]]> -1 1 - 7a17f39c2cd995540269f618001554ba + 32ea8b09883b240203574492000ab2b1 - + - 0 - 2 - 1 - MotorFeature + + 0.92549026 + 0.545098066 + 0.274509817 + + true + Fire + + 0.545098066 + 0.313725501 + 0.215686291 + -1 - 1 - 7a17f39c2cd995540269f618001554bb + 1 + 32ea8b09883b240203574492000ab2b3 + 9 + 5 - + - FloatCurve + ? + false + FunctionalTest -1 - 7a17f39c2cd995540269f618001554bd - AQAAAAAAAAAAAAAAAAAWRQAAAAA= + 32ea8b09883b240203574492000ab2b7 - + false @@ -4075,9 +4013,9 @@ AAA=]]> 0 1 - false + true false - + 1 1 1 @@ -4098,7 +4036,13 @@ AAA=]]> null 0 false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4108,12 +4052,12 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554c1 + 32ea8b09883b240203574492000ab2b9 true 1 - + false @@ -4153,7 +4097,13 @@ AAA=]]> null 0 false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4164,12 +4114,12 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554c2 + 32ea8b09883b240203574492000ab2ba true 1 - + true @@ -4231,7 +4181,13 @@ AAA=]]> 0 true false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4259,12 +4215,12 @@ AAA=]]> 1 0 - 7a17f39c2cd995540269f618001554c3 + 32ea8b09883b240203574492000ab2bb true 1 - + true @@ -4317,7 +4273,13 @@ AAA=]]> 0 true false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4347,12 +4309,12 @@ AAA=]]> false 2 1 - 7a17f39c2cd995540269f618001554c4 + 32ea8b09883b240203574492000ab2bc true 1 - + false @@ -4377,23 +4339,17 @@ AAA=]]> 1 false false - - - 1 - 1 - 1 - - - 0 - 0 - - - 0 - 0 - - 0 + 0 + + rbxasset://fonts/families/LegacyArial.json + 400 + + rbxasset://fonts/arial.ttf + 0 - ImageLabel + 1 + -1 + TextLabel null null null @@ -4404,12 +4360,17 @@ AAA=]]> 0 0 - 0 + false null 0 - 0 false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4417,31 +4378,33 @@ AAA=]]> 0 0 - - - 0 - 0 - - - 0 - 0 - - - 1 -1 - - 1 - 0 - 1 - 0 - - 7a17f39c2cd995540269f618001554c5 + Label + + 0.105882362 + 0.164705887 + 0.207843155 + + false + 8 + + 0 + 0 + 0 + + 1 + 0 + 0 + false + 2 + 1 + 32ea8b09883b240203574492000ab2be true 1 - + false @@ -4505,7 +4468,13 @@ AAA=]]> 4 true true + 0 + 0 + 0 + 0 + true null + 0 0 0 @@ -4516,14 +4485,14 @@ AAA=]]> -1 rbxasset://textures/ui/Scroll/scroll-top.png - 7a17f39c2cd995540269f618001554c7 + 32ea8b09883b240203574492000ab2bf 0 0 true 1 - + true @@ -4581,7 +4550,13 @@ AAA=]]> null 0 true + 0 + 0 + 0 + 0 + false null + 0 true 0 @@ -4612,12 +4587,12 @@ AAA=]]> false 2 1 - 7a17f39c2cd995540269f618001554c8 + 32ea8b09883b240203574492000ab2c0 true 1 - + false @@ -4659,7 +4634,13 @@ AAA=]]> null 0 false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4670,14 +4651,14 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554c9 + 32ea8b09883b240203574492000ab2c1 true 1 1 - + false @@ -4753,7 +4734,13 @@ AAA=]]> null 0 false + 0 + 0 + 0 + 0 + false null + 0 0 0 @@ -4763,12 +4750,12 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554ca + 32ea8b09883b240203574492000ab2c2 true 1 - + false null @@ -4797,6 +4784,11 @@ AAA=]]> null true null + 0 + 0 + 0 + 0 + false 0 0 @@ -4819,27 +4811,34 @@ AAA=]]> 0 - 7a17f39c2cd995540269f618001554cb + 32ea8b09883b240203574492000ab2c3 0 - + + true + 1 + null true - 0 true - false - ScreenGui + 2 + AdGui true null + 0 + 0 + 0 + 0 + false -1 - 7a17f39c2cd995540269f618001554cc + 32ea8b09883b240203574492000ab2c6 0 - + true null @@ -4859,16 +4858,21 @@ AAA=]]> 50 true null + 0 + 0 + 0 + 0 + false 0 -1 0 - 7a17f39c2cd995540269f618001554ce + 32ea8b09883b240203574492000ab2c7 0 0 - + @@ -4889,13 +4893,13 @@ AAA=]]> null 0 - 7a17f39c2cd995540269f618001554cf + 32ea8b09883b240203574492000ab2c8 2 true 0.0625 - + null @@ -4915,11 +4919,11 @@ AAA=]]> 1 0 - 7a17f39c2cd995540269f618001554d0 + 32ea8b09883b240203574492000ab2c9 true - + 0 null @@ -4958,12 +4962,12 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d1 + 32ea8b09883b240203574492000ab2ca true -1 - + 0 null @@ -4999,12 +5003,12 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d2 + 32ea8b09883b240203574492000ab2cb true -1 - + 0 null @@ -5042,12 +5046,50 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d3 + 32ea8b09883b240203574492000ab2cc true -1 - + + + + true + 0 + true + false + ScreenGui + true + null + 0 + 0 + 0 + 0 + false + -1 + + 32ea8b09883b240203574492000ab2c4 + 0 + + + + + null + + + 0.94901967 + 0.952941239 + 0.952941239 + + ParabolaAdornment + -1 + + 0 + 2c3758b9147ff16b01b8290f000286e4 + true + + + 0 null @@ -5086,45 +5128,12 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d4 + 32ea8b09883b240203574492000ab2cd true -1 - - - - true - 0 - true - false - GuiMain - true - null - -1 - - 7a17f39c2cd995540269f618001554cd - 0 - - - - - null - - - 0.94901967 - 0.952941239 - 0.952941239 - - ParabolaAdornment - -1 - - 0 - 2c3758b9147ff16b01b8290f000286e4 - true - - - + 0 null @@ -5160,12 +5169,12 @@ AAA=]]> 1 0 - 7a17f39c2cd995540269f618001554d5 + 32ea8b09883b240203574492000ab2ce true -1 - + 0 null @@ -5190,8 +5199,7 @@ AAA=]]> 0.411764741 0.674509823 - SphereHandleAdornment - 1 + WireframeHandleAdornment 0 0 @@ -5200,12 +5208,12 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d6 + 32ea8b09883b240203574492000ab2d0 true -1 - + null @@ -5224,11 +5232,11 @@ AAA=]]> 1 0 - 7a17f39c2cd995540269f618001554d8 + 32ea8b09883b240203574492000ab2d2 true - + null @@ -5244,11 +5252,11 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554d9 + 32ea8b09883b240203574492000ab2d3 true - + null @@ -5265,11 +5273,11 @@ AAA=]]> 0 0 - 7a17f39c2cd995540269f618001554da + 32ea8b09883b240203574492000ab2d4 true - + null @@ -5283,29 +5291,22 @@ AAA=]]> 0 0 - 7a17f39c2cd995540269f618001554db + 32ea8b09883b240203574492000ab2d5 true - + - - 0.0509803966 - 0.411764741 - 0.674509823 - - null - SelectionPartLasso - null + + + HiddenSurfaceRemovalAsset -1 - 0 - 7a17f39c2cd995540269f618001554dc - true + 32ea8b09883b240203574492000ab2d9 - + null @@ -5326,10 +5327,10 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554e0 + 32ea8b09883b240203574492000ab2da - + true @@ -5339,6 +5340,7 @@ AAA=]]> 0 0 + true 100 0 100 @@ -5360,85 +5362,42 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f618001554e1 + 32ea8b09883b240203574492000ab2db true 16 - + - [] - - 0.300000012 - 0 - 1 - - - 0 - - 0 - - 0 - - - 0 - - 0 - 0 - 0 - - 1 - 1 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - - 0 - 0 - 0 - - HumanoidDescription - - 0 - 1 - 0 - - 0 - 0 - 0 - - 0 - - 0 - 0 - 0 - - 0 - 0 - + null + true + null + IKControl + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 -1 - 0 - 0 - - 0 - 0 - 0 - - 7a17f39c2cd995540269f618001554e2 - - 0 - 1 + null + 0 + 32ea8b09883b240203574492000ab2dd + 1 - + 0 @@ -5476,10 +5435,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e4 + 32ea8b09883b240203574492000ab2df - + 0 @@ -5517,10 +5476,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e5 + 32ea8b09883b240203574492000ab2e0 - + @@ -5577,10 +5536,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e6 + 32ea8b09883b240203574492000ab2e1 - + @@ -5617,10 +5576,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e7 + 32ea8b09883b240203574492000ab2e2 - + @@ -5657,10 +5616,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e8 + 32ea8b09883b240203574492000ab2e3 - + @@ -5699,10 +5658,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554e9 + 32ea8b09883b240203574492000ab2e4 - + @@ -5741,10 +5700,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554ea + 32ea8b09883b240203574492000ab2e5 - + @@ -5781,10 +5740,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554eb + 32ea8b09883b240203574492000ab2e6 - + @@ -5821,10 +5780,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554ec + 32ea8b09883b240203574492000ab2e7 - + @@ -5865,10 +5824,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554ed + 32ea8b09883b240203574492000ab2e8 - + @@ -5905,41 +5864,40 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f618001554ee + 32ea8b09883b240203574492000ab2e9 - + + + + + Animation + -1 + + 32ea8b09883b240203574492000ab252 + + + Keyframe -1 0 - 7a17f39c2cd995540269f618001554ef + 32ea8b09883b240203574492000ab2ea - - - - true - CurveAnimation - 2 - -1 - - 7a17f39c2cd995540269f6180015546a - - - + KeyframeMarker -1 - 7a17f39c2cd995540269f618001554f0 + 32ea8b09883b240203574492000ab2eb - + 1 @@ -5954,10 +5912,10 @@ AAA=]]> false -1 - 7a17f39c2cd995540269f618001554f1 + 32ea8b09883b240203574492000ab2ed - + 90 @@ -5974,10 +5932,10 @@ AAA=]]> false -1 - 7a17f39c2cd995540269f618001554f2 + 32ea8b09883b240203574492000ab2ee - + 90 @@ -5994,10 +5952,10 @@ AAA=]]> false -1 - 7a17f39c2cd995540269f618001554f3 + 32ea8b09883b240203574492000ab2ef - + [] @@ -6005,40 +5963,42 @@ AAA=]]> -1 en-us - 7a17f39c2cd995540269f618001554f4 + 32ea8b09883b240203574492000ab2f0 - + false Script - {0DA76407-E724-4B17-981A-2CE9FB3AE48E} + + 0 + {96A7EA07-3B16-40AA-88BF-E1E130E46989} -1 - 7a17f39c2cd995540269f618001554f5 + 32ea8b09883b240203574492000ab2f1 - + - false - - LocalScript - {571930D4-D133-4EEA-A230-22EED83107A1} - + MarkerCurve -1 - 7a17f39c2cd995540269f618001554f7 + 32ea8b09883b240203574492000ab2f7 + AAAAAAEAAAAKAAAAAAAAFkUAAAAA - + 256 + + false + 0 MaterialVariant @@ -6047,32 +6007,31 @@ AAA=]]> -1 10 - - - 7a17f39c2cd995540269f618001554fc + + 32ea8b09883b240203574492000ab2f8 - + Message -1 - 7a17f39c2cd995540269f618001554fd + 32ea8b09883b240203574492000ab2f9 - + Hint -1 - 7a17f39c2cd995540269f618001554fe + 32ea8b09883b240203574492000ab2fa - + true @@ -6081,10 +6040,10 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f61800155501 + 32ea8b09883b240203574492000ab2fd - + false @@ -6114,6 +6073,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6164,7 +6124,7 @@ AAA=]]> 0 0 0 - 7a17f39c2cd995540269f61800155502 + 32ea8b09883b240203574492000ab2fe 0 0 @@ -6177,7 +6137,7 @@ AAA=]]> - + false @@ -6207,6 +6167,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6257,7 +6218,7 @@ AAA=]]> 3 0 0 - 7a17f39c2cd995540269f61800155503 + 32ea8b09883b240203574492000ab2ff 0 0 @@ -6272,7 +6233,7 @@ AAA=]]> - + false @@ -6302,6 +6263,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6353,7 +6315,7 @@ AAA=]]> 3 0 0 - 7a17f39c2cd995540269f61800155504 + 32ea8b09883b240203574492000ab300 0 0 @@ -6368,7 +6330,7 @@ AAA=]]> - + false @@ -6398,6 +6360,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6449,7 +6412,7 @@ AAA=]]> 3 0 0 - 7a17f39c2cd995540269f61800155506 + 32ea8b09883b240203574492000ab302 0 0 @@ -6464,7 +6427,7 @@ AAA=]]> - + false @@ -6494,6 +6457,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6547,7 +6511,7 @@ AAA=]]> 3 0 0 - 7a17f39c2cd995540269f61800155507 + 32ea8b09883b240203574492000ab303 0 0 @@ -6562,7 +6526,7 @@ AAA=]]> - + false false @@ -6593,6 +6557,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6647,7 +6612,7 @@ AAA=]]> 3 0 0 - 7a17f39c2cd995540269f61800155508 + 32ea8b09883b240203574492000ab304 0 0 @@ -6662,7 +6627,7 @@ AAA=]]> - + false @@ -6692,6 +6657,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6742,7 +6708,7 @@ AAA=]]> 0 0 0 - 7a17f39c2cd995540269f61800155509 + 32ea8b09883b240203574492000ab305 0 0 @@ -6756,7 +6722,7 @@ AAA=]]> - + false @@ -6786,6 +6752,7 @@ AAA=]]> true true true + Default 0 4288914085 @@ -6817,7 +6784,6 @@ AAA=]]> false 256 - MeshPart yuZpQdnvvUBOTYh1jqZ2cA== @@ -6856,12 +6822,13 @@ AAA=]]> 0 0 0 - 7a17f39c2cd995540269f6180015550a + 32ea8b09883b240203574492000ab306 0 0 0 + 0 4 1.20000005 @@ -6869,7 +6836,7 @@ AAA=]]> - + false @@ -6902,6 +6869,7 @@ AAA=]]> true yuZpQdnvvUBOTYh1jqZ2cA== + Default 0 4294967295 @@ -6965,7 +6933,7 @@ AAA=]]> 0 0 0 - 7a17f39c2cd995540269f6180015550b + 32ea8b09883b240203574492000ab307 false 0 @@ -6979,7 +6947,7 @@ AAA=]]> - + true @@ -7012,6 +6980,7 @@ AAA=]]> true yuZpQdnvvUBOTYh1jqZ2cA== + Default 0 4294967295 @@ -7075,7 +7044,7 @@ AAA=]]> 0 0 0.100000001 - 7a17f39c2cd995540269f6180015550c + 32ea8b09883b240203574492000ab308 false 0 @@ -7089,7 +7058,1445 @@ AAA=]]> - + + + false + + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + true + true + true + true + Default + 0 + 4288914085 + + false + + false + -0.5 + 0.5 + 0 + 0 + true + -0.5 + 0.5 + 0 + 0 + false + false + 256 + + 25 + VehicleSeat + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 + -0.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + -1 + 0 + 0 + + 0 + 0 + -0.5 + 0.5 + 3 + 0 + 10 + 0 + 1 + 32ea8b09883b240203574492000ab30b + + 0 + 0 + 0 + + + 4 + 1.20000005 + 2 + + + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + Model + false + null + -1 + + 32ea8b09883b240203574492000ab30c + + + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + WorldModel + false + null + -1 + + 32ea8b09883b240203574492000ab30e + + + + + + null + null + + true + + PathfindingLink + -1 + + 32ea8b09883b240203574492000ab311 + + + + + + + PathfindingModifier + false + -1 + + 32ea8b09883b240203574492000ab312 + + + + + + 0 + 0 + NumberPose + -1 + + 32ea8b09883b240203574492000ab316 + 0 + 1 + + + + + + true + 0.400000006 + BloomEffect + 24 + -1 + + 0.949999988 + 32ea8b09883b240203574492000ab318 + + + + + + 0 + 0 + true + ColorCorrectionEffect + 0 + -1 + + + 1 + 1 + 1 + + 32ea8b09883b240203574492000ab31a + + + + + + true + 0.75 + 0.0500000007 + 10 + DepthOfFieldEffect + 0.75 + -1 + + 32ea8b09883b240203574492000ab31b + + + + + + true + 0.25 + SunRaysEffect + -1 + 1 + + 32ea8b09883b240203574492000ab31c + + + + + Interact + + true + true + true + 0 + 1000 + 0 + 101 + 10 + ProximityPrompt + + true + null + -1 + 0 + + + 0 + 0 + + 32ea8b09883b240203574492000ab31d + + + + + + + ReflectionMetadataCallbacks + -1 + + 32ea8b09883b240203574492000ab31f + + + + + + ReflectionMetadataClasses + -1 + + 32ea8b09883b240203574492000ab320 + + + + + + ReflectionMetadataEnums + -1 + + 32ea8b09883b240203574492000ab321 + + + + + + ReflectionMetadataEvents + -1 + + 32ea8b09883b240203574492000ab322 + + + + + + ReflectionMetadataFunctions + -1 + + 32ea8b09883b240203574492000ab323 + + + + + + true + + false + + false + false + + 0 + 2147483647 + + true + false + ReflectionMetadataClass + + 5000 + + false + + -1 + + 0 + 0 + 0 + 32ea8b09883b240203574492000ab324 + + + + + + true + + false + + false + false + + + false + ReflectionMetadataEnum + 5000 + + false + + -1 + + 0 + 0 + 0 + 32ea8b09883b240203574492000ab325 + + + + + + true + + false + + false + false + + + false + ReflectionMetadataEnumItem + 5000 + + false + + -1 + + 0 + 0 + 0 + 32ea8b09883b240203574492000ab326 + + + + + + true + + false + + false + false + + + false + ReflectionMetadataMember + 5000 + + false + + -1 + + 0 + 0 + 0 + 32ea8b09883b240203574492000ab327 + + + + + + ReflectionMetadataProperties + -1 + + 32ea8b09883b240203574492000ab328 + + + + + + ReflectionMetadataYieldFunctions + -1 + + 32ea8b09883b240203574492000ab329 + + + + + + RemoteEvent + -1 + + 32ea8b09883b240203574492000ab32a + + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 10 + 0 + 50 + + 70 + RenderingTest + 21 + false + -1 + + + 32ea8b09883b240203574492000ab32c + + + + + + RotationCurve + -1 + + 32ea8b09883b240203574492000ab32e + AAAAAAAAAAAAAAAAAAAWRQAAAAA= + + + + + + true + 11 + rbxasset://sky/moon.jpg + Sky + rbxasset://textures/sky/sky512_bk.tex + rbxasset://textures/sky/sky512_dn.tex + rbxasset://textures/sky/sky512_ft.tex + rbxasset://textures/sky/sky512_lf.tex + rbxasset://textures/sky/sky512_rt.tex + rbxasset://textures/sky/sky512_up.tex + -1 + 3000 + 21 + rbxasset://sky/sun.jpg + + 32ea8b09883b240203574492000ab331 + + + + + + + 1 + 1 + 1 + + true + Smoke + -1 + + 1 + 32ea8b09883b240203574492000ab332 + 0.5 + 1 + 1 + + + + + + 10 + false + Sound + false + 1 + false + 0 + null + + -1 + + 0 + 32ea8b09883b240203574492000ab334 + 0.5 + 10000 + + + + + + 0.150000006 + true + 0.5 + ChorusSoundEffect + 0 + 0.5 + -1 + + 32ea8b09883b240203574492000ab335 + + + + + 0.100000001 + + true + 0 + CompressorSoundEffect + 0 + 40 + 0.100000001 + null + -1 + + -40 + 32ea8b09883b240203574492000ab336 + + + + + + true + 0.75 + DistortionSoundEffect + 0 + -1 + + 32ea8b09883b240203574492000ab338 + + + + + + 1 + 0 + true + 0.5 + EchoSoundEffect + 0 + -1 + + 32ea8b09883b240203574492000ab339 + 0 + + + + + + true + 0 + -20 + -10 + EqualizerSoundEffect + 0 + -1 + + 32ea8b09883b240203574492000ab33a + + + + + + 0.449999988 + true + 0.850000024 + FlangeSoundEffect + 0 + 5 + -1 + + 32ea8b09883b240203574492000ab33b + + + + + + true + PitchShiftSoundEffect + 1.25 + 0 + -1 + + 32ea8b09883b240203574492000ab33c + + + + + + 1 + 0.5 + true + 5 + TremoloSoundEffect + 0 + -1 + + 32ea8b09883b240203574492000ab33e + + + + + + true + Sparkles + -1 + + 0.564705908 + 0.0980392247 + 1 + + + 1 + 32ea8b09883b240203574492000ab340 + + + + + + StarterGear + -1 + + 32ea8b09883b240203574492000ab343 + + + + + 0 + + + + SurfaceAppearance + + + -1 + + + 32ea8b09883b240203574492000ab345 + + + + + + TeleportOptions + + + false + -1 + + 32ea8b09883b240203574492000ab347 + + + + + + true + TextChatCommand + + + -1 + + 32ea8b09883b240203574492000ab34b + + + + + + TextChatMessageProperties + -1 + + 32ea8b09883b240203574492000ab34c + + + + + null + null + + 1 + 0 1 1 1 0 1 1 1 1 0 + true + false + 2 + 0 + 0 + 0 + 0.100000001 + Trail + -1 + + + 1 + 0 + 0 0.5 0 1 0.5 0 + 32ea8b09883b240203574492000ab34f + 0 1 0 1 1 0 + + + + + + + INF + INF + + + 0 + 0 + + UISizeConstraint + -1 + + 32ea8b09883b240203574492000ab352 + + + + + + 100 + 1 + UITextSizeConstraint + -1 + + 32ea8b09883b240203574492000ab353 + + + + + + + 0 + 8 + + UICorner + -1 + + 32ea8b09883b240203574492000ab354 + + + + + + 0 1 1 1 0 1 1 1 1 0 + true + UIGradient + + 0 + 0 + + 0 + -1 + + 0 0 0 1 0 0 + 32ea8b09883b240203574492000ab355 + + + + + + + 0 + 5 + 0 + 5 + + + 0 + 100 + 0 + 100 + + 0 + 0 + 1 + UIGridLayout + 0 + -1 + 0 + + 32ea8b09883b240203574492000ab356 + 1 + + + + + + 1 + 1 + UIListLayout + + 0 + 0 + + 0 + -1 + + 32ea8b09883b240203574492000ab357 + 1 + + + + + + 1 + false + false + 1 + 0 + UITableLayout + + 0 + 0 + 0 + 0 + + 0 + -1 + + 32ea8b09883b240203574492000ab359 + 1 + + + + + + UIPadding + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + -1 + + 32ea8b09883b240203574492000ab35a + + + + + + UIScale + 1 + -1 + + 32ea8b09883b240203574492000ab35b + + + + + 0 + + + 0 + 0 + 0 + + true + 0 + UIStroke + -1 + + 1 + 0 + 32ea8b09883b240203574492000ab35c + + + + + + BinaryStringValue + -1 + + 32ea8b09883b240203574492000ab35e + + + + + + + BoolValue + -1 + + 32ea8b09883b240203574492000ab35f + false + + + + + + BrickColorValue + -1 + + 32ea8b09883b240203574492000ab360 + 194 + + + + + + CFrameValue + -1 + + 32ea8b09883b240203574492000ab361 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + Color3Value + -1 + + 32ea8b09883b240203574492000ab362 + + 0 + 0 + 0 + + + + + + + 1 + 0 + DoubleConstrainedValue + -1 + + 32ea8b09883b240203574492000ab363 + 0 + + + + + + 10 + 0 + IntConstrainedValue + -1 + + 32ea8b09883b240203574492000ab364 + 0 + + + + + + IntValue + -1 + + 32ea8b09883b240203574492000ab365 + 0 + + + + + + NumberValue + -1 + + 32ea8b09883b240203574492000ab366 + 0 + + + + + + ObjectValue + -1 + + 32ea8b09883b240203574492000ab367 + null + + + + + + Tween + -1 + + 32ea8b09883b240203574492000ab350 + + + + + false + + 0 + 0 + + + true + 0 + + 0.639215708 + 0.635294139 + 0.647058845 + + 0 + + 0.105882362 + 0.164705887 + 0.207843155 + + 0 + 1 + false + false + + + 1 + 1 + 1 + + + 0 + 0 + + + 0 + 0 + + 0 + 0 + ImageLabel + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + null + 0 + 0 + false + 0 + 0 + 0 + 0 + false + null + 0 + + 0 + 0 + 0 + 0 + + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + -1 + + + 1 + 0 + 1 + 0 + + 32ea8b09883b240203574492000ab2bd + true + 1 + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + Accessory + -1 + + 32ea8b09883b240203574492000ab24e + + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 + 0 + Pose + -1 + + 32ea8b09883b240203574492000ab317 + 1 + + + + + false + + -0.5 + 0.5 + 5 + 0 + -0.5 + 0.5 + 5 + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + true + true + true + true + Default + 0 + 4288914085 + + false + + -0.5 + 0.5 + 5 + 0 + -0.5 + 0.5 + 5 + 0 + false + false + 256 + + TrussPart + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 + -0.5 + 0.5 + 5 + 0 + 0 + + 0 + 0 + 0 + + -1 + + -0.5 + 0.5 + 5 + 0 + 0 + 32ea8b09883b240203574492000ab30a + + 0 + 0 + 0 + + + 2 + 2 + 2 + + 0 + + + + + + SoundGroup + -1 + + 32ea8b09883b240203574492000ab33f + 0.5 + + + + + + + 1 + 1 + 1 + + Shirt + + -1 + + 32ea8b09883b240203574492000ab276 + + + + + 0 + 0 + false + 45 + 0 + 0 + 0 + null + null + + 1009 + true + 0 + false + 45 + -45 + 0 + INF + INF + 0 + 0 + CylindricalConstraint + 0 + false + 0 + 0 + 0.150000006 + -1 + 0 + + 0 + 0 + 32ea8b09883b240203574492000ab288 + 45 + 5 + 0 + false + + + + + + 0 + 0 + 0 + 2 + 2 + BlockMesh + + 0 + 0 + 0 + + + 1 + 1 + 1 + + -1 + + 32ea8b09883b240203574492000ab299 + + 1 + 1 + 1 + + + + + + + FloatCurve + -1 + + 32ea8b09883b240203574492000ab2b4 + AQAAAAAAAAAAAAAAAAAWRQAAAAA= + + + false @@ -7122,6 +8529,7 @@ AAA=]]> true yuZpQdnvvUBOTYh1jqZ2cA== + Default 0 4294967295 @@ -7185,7 +8593,7 @@ AAA=]]> 0 0 0 - 7a17f39c2cd995540269f6180015550d + 32ea8b09883b240203574492000ab309 false 0 @@ -7199,40 +8607,7 @@ AAA=]]> - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - Model - false - null - -1 - - 7a17f39c2cd995540269f61800155510 - - - - + 0 @@ -7261,72 +8636,11 @@ AAA=]]> null -1 - 7a17f39c2cd995540269f61800155511 + 32ea8b09883b240203574492000ab30d - - - - - - PartOperationAsset - -1 - - 7a17f39c2cd995540269f61800155513 - - - - - - - PathfindingModifier - false - -1 - - 7a17f39c2cd995540269f61800155516 - - - - - - 0 - 0 - NumberPose - -1 - - 7a17f39c2cd995540269f6180015551a - 0 - 1 - - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - 0 - Pose - -1 - - 7a17f39c2cd995540269f6180015551b - 1 - - - + true @@ -7334,420 +8648,10 @@ AAA=]]> 24 -1 - 7a17f39c2cd995540269f6180015551d + 32ea8b09883b240203574492000ab319 - - - - true - 0.75 - 0.0500000007 - 10 - DepthOfFieldEffect - 0.75 - -1 - - 7a17f39c2cd995540269f6180015551f - - - - - - true - 0.25 - SunRaysEffect - -1 - 1 - - 7a17f39c2cd995540269f61800155520 - - - - - Interact - - true - true - true - 0 - 1000 - 0 - 101 - 10 - ProximityPrompt - - true - null - -1 - 0 - - - 0 - 0 - - 7a17f39c2cd995540269f61800155521 - - - - - - - ReflectionMetadataCallbacks - -1 - - 7a17f39c2cd995540269f61800155523 - - - - - - ReflectionMetadataClasses - -1 - - 7a17f39c2cd995540269f61800155524 - - - - - - ReflectionMetadataEnums - -1 - - 7a17f39c2cd995540269f61800155525 - - - - - - ReflectionMetadataEvents - -1 - - 7a17f39c2cd995540269f61800155526 - - - - - - ReflectionMetadataFunctions - -1 - - 7a17f39c2cd995540269f61800155527 - - - - - - true - - false - - false - false - - 0 - 2147483647 - - true - false - ReflectionMetadataClass - - 5000 - - false - -1 - - 0 - 0 - 0 - 7a17f39c2cd995540269f61800155528 - - - - - - true - - false - - false - false - - - false - ReflectionMetadataEnum - 5000 - - false - -1 - - 0 - 0 - 0 - 7a17f39c2cd995540269f61800155529 - - - - - - true - - false - - false - false - - - false - ReflectionMetadataEnumItem - 5000 - - false - -1 - - 0 - 0 - 0 - 7a17f39c2cd995540269f6180015552a - - - - - - true - - false - - false - false - - - false - ReflectionMetadataMember - 5000 - - false - -1 - - 0 - 0 - 0 - 7a17f39c2cd995540269f6180015552b - - - - - - ReflectionMetadataProperties - -1 - - 7a17f39c2cd995540269f6180015552c - - - - - - ReflectionMetadataYieldFunctions - -1 - - 7a17f39c2cd995540269f6180015552d - - - - - - RemoteEvent - -1 - - 7a17f39c2cd995540269f6180015552e - - - - - - RemoteFunction - -1 - - 7a17f39c2cd995540269f6180015552f - - - - - - RotationCurve - -1 - - 7a17f39c2cd995540269f61800155532 - AAAAAAAAAAAAAAAAAAAWRQAAAAA= - - - - - - true - 11 - rbxasset://sky/moon.jpg - Sky - rbxasset://textures/sky/sky512_bk.tex - rbxasset://textures/sky/sky512_dn.tex - rbxasset://textures/sky/sky512_ft.tex - rbxasset://textures/sky/sky512_lf.tex - rbxasset://textures/sky/sky512_rt.tex - rbxasset://textures/sky/sky512_up.tex - -1 - 3000 - 21 - rbxasset://sky/sun.jpg - - 7a17f39c2cd995540269f61800155534 - - - - - - - 1 - 1 - 1 - - true - Smoke - -1 - - 1 - 7a17f39c2cd995540269f61800155535 - 0.5 - 1 - 1 - - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - -1 - - 0 - 7a17f39c2cd995540269f61800155537 - 0.5 - 10000 - - - - - - 0.150000006 - true - 0.5 - ChorusSoundEffect - 0 - 0.5 - -1 - - 7a17f39c2cd995540269f61800155538 - - - - - 0.100000001 - - true - 0 - CompressorSoundEffect - 0 - 40 - 0.100000001 - null - -1 - - -40 - 7a17f39c2cd995540269f61800155539 - - - - - - true - 0.75 - DistortionSoundEffect - 0 - -1 - - 7a17f39c2cd995540269f6180015553b - - - - - - 1 - 0 - true - 0.5 - EchoSoundEffect - 0 - -1 - - 7a17f39c2cd995540269f6180015553c - 0 - - - - - - true - 0 - -20 - -10 - EqualizerSoundEffect - 0 - -1 - - 7a17f39c2cd995540269f6180015553d - - - - - - 0.449999988 - true - 0.850000024 - FlangeSoundEffect - 0 - 5 - -1 - - 7a17f39c2cd995540269f6180015553e - - - - - - true - PitchShiftSoundEffect - 1.25 - 0 - -1 - - 7a17f39c2cd995540269f6180015553f - - - + 1.5 @@ -7759,201 +8663,20 @@ AAA=]]> 0 -1 - 7a17f39c2cd995540269f61800155540 + 32ea8b09883b240203574492000ab33d 0 - - - - SoundGroup - -1 - - 7a17f39c2cd995540269f61800155542 - 0.5 - - - + StandalonePluginScripts -1 - 7a17f39c2cd995540269f61800155545 + 32ea8b09883b240203574492000ab342 - - - 0 - - - - SurfaceAppearance - - - -1 - - - 7a17f39c2cd995540269f61800155549 - - - - - - true - Team - -1 - - 1 - 7a17f39c2cd995540269f6180015554a - - - - - - - 1 - 0 - - TerrainDetail - - - -1 - 10 - - - 7a17f39c2cd995540269f6180015554c - - - - - - TextChatMessageProperties - -1 - - 7a17f39c2cd995540269f61800155551 - - - - - null - null - - 1 - 0 1 1 1 0 1 1 1 1 0 - true - false - 2 - 0 - 0 - 0 - 0.100000001 - Trail - -1 - - - 1 - 0 - 0 0.5 0 1 0.5 0 - 7a17f39c2cd995540269f61800155553 - 0 1 0 1 1 0 - - - - - - Tween - -1 - - 7a17f39c2cd995540269f61800155554 - - - - - - 100 - 1 - UITextSizeConstraint - -1 - - 7a17f39c2cd995540269f61800155557 - - - - - - - 0 - 8 - - UICorner - -1 - - 7a17f39c2cd995540269f61800155558 - - - - - - 0 1 1 1 0 1 1 1 1 0 - true - UIGradient - - 0 - 0 - - 0 - -1 - - 0 0 0 1 0 0 - 7a17f39c2cd995540269f61800155559 - - - - - - - 0 - 5 - 0 - 5 - - - 0 - 100 - 0 - 100 - - 0 - 0 - 1 - UIGridLayout - 0 - -1 - 0 - - 7a17f39c2cd995540269f6180015555a - 1 - - - - - - 1 - 1 - UIListLayout - - 0 - 0 - - 0 - -1 - - 7a17f39c2cd995540269f6180015555b - 1 - - - + true @@ -7974,472 +8697,11 @@ AAA=]]> true 1 - 7a17f39c2cd995540269f6180015555c + 32ea8b09883b240203574492000ab358 1 - - - - UIPadding - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - -1 - - 7a17f39c2cd995540269f6180015555e - - - - - - UIScale - 1 - -1 - - 7a17f39c2cd995540269f6180015555f - - - - - 0 - - - 0 - 0 - 0 - - true - 0 - UIStroke - -1 - - 1 - 0 - 7a17f39c2cd995540269f61800155560 - - - - - - BinaryStringValue - -1 - - 7a17f39c2cd995540269f61800155562 - - - - - - - BoolValue - -1 - - 7a17f39c2cd995540269f61800155563 - false - - - - - - BrickColorValue - -1 - - 7a17f39c2cd995540269f61800155564 - 194 - - - - - - CFrameValue - -1 - - 7a17f39c2cd995540269f61800155565 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - - - - - Color3Value - -1 - - 7a17f39c2cd995540269f61800155566 - - 0 - 0 - 0 - - - - - - - 1 - 0 - DoubleConstrainedValue - -1 - - 7a17f39c2cd995540269f61800155567 - 0 - - - - - - 10 - 0 - IntConstrainedValue - -1 - - 7a17f39c2cd995540269f61800155568 - 0 - - - - - - IntValue - -1 - - 7a17f39c2cd995540269f61800155569 - 0 - - - - - - NumberValue - -1 - - 7a17f39c2cd995540269f6180015556a - 0 - - - - - - ObjectValue - -1 - - 7a17f39c2cd995540269f6180015556b - null - - - - - - RayValue - -1 - - 7a17f39c2cd995540269f6180015556c - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - - 1 - 0 - - 0 - UIAspectRatioConstraint - -1 - - 7a17f39c2cd995540269f61800155555 - - - - - false - - 0 - 0 - - - true - 0 - - 0.639215708 - 0.635294139 - 0.647058845 - - 0 - - 0.105882362 - 0.164705887 - 0.207843155 - - 0 - 1 - false - false - 0 - - rbxasset://fonts/families/LegacyArial.json - 400 - - rbxasset://fonts/arial.ttf - - 0 - 1 - -1 - TextLabel - null - null - null - null - - 0 - 0 - 0 - 0 - - false - null - 0 - false - null - - 0 - 0 - 0 - 0 - - 0 - -1 - - Label - - 0.105882362 - 0.164705887 - 0.207843155 - - false - 8 - - 0 - 0 - 0 - - 1 - 0 - 0 - false - 2 - 1 - 7a17f39c2cd995540269f618001554c6 - true - 1 - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - Hat - -1 - - 7a17f39c2cd995540269f61800155467 - - - - - - true - 0.400000006 - BloomEffect - 24 - -1 - - 0.949999988 - 7a17f39c2cd995540269f6180015551c - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 4288914085 - - false - - false - -0.5 - 0.5 - 0 - 0 - true - -0.5 - 0.5 - 0 - 0 - false - false - 256 - - 25 - VehicleSeat - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - 0 - 0 - - 0 - 0 - -0.5 - 0.5 - 3 - 0 - 10 - 0 - 1 - 7a17f39c2cd995540269f6180015550f - - 0 - 0 - 0 - - - 4 - 1.20000005 - 2 - - - - - - - true - Sparkles - -1 - - 0.564705908 - 0.0980392247 - 1 - - - 1 - 7a17f39c2cd995540269f61800155543 - - - - - - - 1 - 1 - 1 - - - ShirtGraphic - -1 - - 7a17f39c2cd995540269f6180015548c - - - + 0 null @@ -8460,13 +8722,13 @@ AAA=]]> 0 0 - 7a17f39c2cd995540269f6180015549d + 32ea8b09883b240203574492000ab289 5 0 false - + 0 @@ -8487,7 +8749,7 @@ AAA=]]> -1 - 7a17f39c2cd995540269f618001554a9 + 32ea8b09883b240203574492000ab29a 1 1 @@ -8495,230 +8757,111 @@ AAA=]]> - + Folder -1 - 7a17f39c2cd995540269f618001554be + 32ea8b09883b240203574492000ab2b5 - + - false + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + - -0.5 - 0.5 - 5 - 0 - -0.5 - 0.5 - 5 - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 5 - 0 - -0.5 - 0.5 - 5 - 0 - false - false - 256 - - TrussPart - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 5 - 0 - 0 - - 0 - 0 - 0 - + Hat -1 - -0.5 - 0.5 - 5 - 0 - 0 - 7a17f39c2cd995540269f6180015550e - - 0 - 0 - 0 - - - 2 - 2 - 2 - - 0 + 32ea8b09883b240203574492000ab24f - + - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - WorldModel - false - null + 2 + true + KeyframeSequence + 2 -1 - 7a17f39c2cd995540269f61800155512 - + 32ea8b09883b240203574492000ab254 - + + 0 + 45 + 0 + 0 + null + null - 0 - 0 + 1009 true - ColorCorrectionEffect - 0 + false + -45 + INF + 0 + HingeConstraint + 0.150000006 + 0 + 0 -1 - - 1 - 1 - 1 - - 7a17f39c2cd995540269f6180015551e + 0 + 32ea8b09883b240203574492000ab280 + 45 + false - + + false + null + null - 1 - 0.5 + 23 true - 5 - TremoloSoundEffect - 0 + false + 1000 + INF + LineForce + false -1 - 7a17f39c2cd995540269f61800155541 + 32ea8b09883b240203574492000ab281 + false - - - - StarterGear - -1 - - 7a17f39c2cd995540269f61800155546 - - - - - - 1 - false - false - 1 - 0 - UITableLayout - - 0 - 0 - 0 - 0 - - 0 - -1 - - 7a17f39c2cd995540269f6180015555d - 1 - - - + null null - 3 - 200 - 0 + 194 true - 1 - false - INF - 5 - 0 - SpringConstraint - 0.400000006 + PlaneConstraint -1 - 0 - 0.100000001 - 7a17f39c2cd995540269f6180015549e + 32ea8b09883b240203574492000ab283 false - + 2 @@ -8738,7 +8881,7 @@ AAA=]]> -1 - 7a17f39c2cd995540269f618001554aa + 32ea8b09883b240203574492000ab29b 1 1 @@ -8746,207 +8889,80 @@ AAA=]]> - + + + + 0 + 25 + true + + + Dialog + 1 + -1 + + 0 + 0 + + 0 + 0 + 0 + + 32ea8b09883b240203574492000ab2a3 + + + + + + EulerRotationCurve + 0 + -1 + + 32ea8b09883b240203574492000ab2a6 + + + + + + 0 + 2 + 1 + MotorFeature + -1 + + 1 + 32ea8b09883b240203574492000ab2b2 + + + ForceField -1 - 7a17f39c2cd995540269f618001554bf + 32ea8b09883b240203574492000ab2b6 true - - - - - Animation - -1 - - 7a17f39c2cd995540269f61800155469 - - - + - AnimationController + + 0.0509803966 + 0.411764741 + 0.674509823 + + null + SelectionPartLasso + null -1 - 7a17f39c2cd995540269f6180015546c - - - - - false - null - null - - 23 - true - false - 1000 - INF - LineForce - false - -1 - - 7a17f39c2cd995540269f61800155496 - false - - - - - null - null - - 26 - true - - 1 - 0 - 0 - - -0 - 1000 - LinearVelocity - - 0 - 0 - - - 1 - 0 - 0 - - 2 - - 0 - 1 - 0 - - -1 - - 7a17f39c2cd995540269f61800155497 - - 0 - 0 - 0 - - 2 - false - - - - - null - null - - 194 - true - Plane - -1 - - 7a17f39c2cd995540269f61800155498 - false - - - - - - 2 - 2 - - 0 - SpecialMesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - -1 - - - 7a17f39c2cd995540269f618001554ab - - 1 - 1 - 1 - - - - - - - true - - DialogChoice - - -1 - - 7a17f39c2cd995540269f618001554b2 - - - - - - - 500000 - 4 - 1 - 1 - Explosion - - 0 - 0 - 0 - - -1 - - 1 - 7a17f39c2cd995540269f618001554b6 + 0 + 32ea8b09883b240203574492000ab2d6 true - - - - - 0.92549026 - 0.545098066 - 0.274509817 - - true - Fire - - 0.545098066 - 0.313725501 - 0.215686291 - - -1 - - 1 - 7a17f39c2cd995540269f618001554bc - 9 - 5 - - - - - - ? - false - FunctionalTest - -1 - - 7a17f39c2cd995540269f618001554c0 - - - + @@ -8964,44 +8980,50 @@ AAA=]]> -1 0 - 7a17f39c2cd995540269f618001554dd + 32ea8b09883b240203574492000ab2d7 true - + - - - HiddenSurfaceRemovalAsset + false + + LocalScript + + 0 + {7C4B4A96-81A2-4D37-BEA4-83839CA0DA4E} + -1 - 7a17f39c2cd995540269f618001554df + 32ea8b09883b240203574492000ab2f3 - + ModuleScript - {F699FCFF-4C9B-45AB-8F48-701C0C20BAB5} + + {0F7D13F1-3E52-4247-ACA7-7DA2422218F3} -1 - 7a17f39c2cd995540269f618001554f9 + 32ea8b09883b240203574492000ab2f5 - + - MarkerCurve + + + PartOperationAsset -1 - 7a17f39c2cd995540269f618001554fb - AAAAAAEAAAAKAAAAAAAAFkUAAAAA + 32ea8b09883b240203574492000ab30f - + 0 @@ -9044,68 +9066,49 @@ AAA=]]> rbxasset://textures/particles/sparkles_main.dds 1 0 0 0 1 0 0 - 7a17f39c2cd995540269f61800155514 + 32ea8b09883b240203574492000ab310 0 0 - - - null - null - - true - - PathfindingLink - -1 - - 7a17f39c2cd995540269f61800155515 - - - + - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 10 - 0 - 50 - - 70 - RenderingTest - 21 - false + RemoteFunction -1 - - 7a17f39c2cd995540269f61800155530 + 32ea8b09883b240203574492000ab32b - + - TeleportOptions - - - false + true + Team -1 - 7a17f39c2cd995540269f6180015554b + 1 + 32ea8b09883b240203574492000ab346 - + + + + + 1 + 0 + + TerrainDetail + + + -1 + 10 + + + 32ea8b09883b240203574492000ab348 + + + @@ -9122,45 +9125,317 @@ AAA=]]> AQU= -1 - 7a17f39c2cd995540269f6180015554d + 32ea8b09883b240203574492000ab349 - + TextChannel -1 - 7a17f39c2cd995540269f6180015554f + 32ea8b09883b240203574492000ab34a - + + StringValue + -1 + + 32ea8b09883b240203574492000ab369 + + + + + + null + null + + 26 true - TextChatCommand - - + + 1 + 0 + 0 + + -0 + 1000 + LinearVelocity + + 0 + 0 + + + 1 + 0 + 0 + + 2 + + 0 + 1 + 0 + -1 - 7a17f39c2cd995540269f61800155550 + 32ea8b09883b240203574492000ab282 + + 0 + 0 + 0 + + 2 + false - + - Vector3Value + VehicleController -1 - 7a17f39c2cd995540269f6180015556e - + 32ea8b09883b240203574492000ab291 + + + + + + true + 10000 + 1 + AirController + 10000 + 1 + false + -1 + + 32ea8b09883b240203574492000ab292 + 0 0 0 - + + + 0 + + INF + 1 + ClimbController + INF + 1 + false + -1 + + 32ea8b09883b240203574492000ab293 + + + + + 1 + 0 + 100 + 10000 + + 0 + 2 + 1 + 1 + 1 + GroundController + false + -1 + 10000 + 100 + + 1 + 32ea8b09883b240203574492000ab294 + + + + + 0 + + 1 + SwimController + 10000 + 1 + false + 10000 + 1 + -1 + + 32ea8b09883b240203574492000ab295 + + + + + + 2 + 2 + + 0 + SpecialMesh + + 0 + 0 + 0 + + + 1 + 1 + 1 + + -1 + + + 32ea8b09883b240203574492000ab29c + + 1 + 1 + 1 + + + + + + + true + 0 + true + false + GuiMain + true + null + 0 + 0 + 0 + 0 + false + -1 + + 32ea8b09883b240203574492000ab2c5 + 0 + + + + + 0 + null + false + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + 0.0509803966 + 0.411764741 + 0.674509823 + + SphereHandleAdornment + 1 + + 0 + 0 + 0 + + -1 + + 0 + 32ea8b09883b240203574492000ab2cf + true + -1 + + + + + [] + + + 0.300000012 + 0 + 1 + + + 0 + + 0 + + 0 + + + 0 + + 0 + 0 + 0 + + 1 + 1 + 0 + 0 + 0 + + 0 + 0 + 0 + + 0 + + 0 + 0 + 0 + + 0 + HumanoidDescription + + 0 + 1 + 0 + + 0 + 0 + 0 + + 0 + + 0 + 0 + 0 + + 0 + 0 + + -1 + 0 + + 0 + + 0 + 0 + 0 + + 32ea8b09883b240203574492000ab2dc + + 0 + 1 + + + @@ -9183,10 +9458,19 @@ AAA=]]> -1 3 - 7a17f39c2cd995540269f61800155577 + 32ea8b09883b240203574492000ab370 + + + + FacialAnimationStreamingService + -1 + + 32ea8b09883b240203574492000ab2b0 + + Q1NHUEhTBwAAAANxenpBq3RavVrWxL3W0ls9BipCQyiCLz9FsibAiDtQQzU4HkEiYwdDEAAA AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAACAPxUAAAAEAAAA+dYAQK5wBr+S diff --git a/Utility/FontUtility.cs b/Utility/FontUtility.cs index c71385a..0921e6c 100644 --- a/Utility/FontUtility.cs +++ b/Utility/FontUtility.cs @@ -1,7 +1,8 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; +using System.Collections.Generic; using RobloxFiles.Enums; +using RobloxFiles.DataTypes; namespace RobloxFiles.Utility { @@ -26,6 +27,56 @@ namespace RobloxFiles.Utility { 96, FontSize.Size96 }, }; + public static readonly IReadOnlyDictionary FontFaces = new Dictionary() + { + { Font.Legacy, new FontFace("rbxasset://fonts/families/LegacyArial.json") }, + { Font.Arial, new FontFace("rbxasset://fonts/families/Arial.json") }, + { Font.ArialBold, new FontFace("rbxasset://fonts/families/Arial.json", FontWeight.Bold) }, + { Font.SourceSans, new FontFace("rbxasset://fonts/families/SourceSansPro.json") }, + { Font.SourceSansBold, new FontFace("rbxasset://fonts/families/SourceSansPro.json", FontWeight.Bold) }, + { Font.SourceSansSemibold, new FontFace("rbxasset://fonts/families/SourceSansPro.json", FontWeight.SemiBold) }, + { Font.SourceSansLight, new FontFace("rbxasset://fonts/families/SourceSansPro.json", FontWeight.Light) }, + { Font.SourceSansItalic, new FontFace("rbxasset://fonts/families/SourceSansPro.json", FontWeight.Regular, FontStyle.Italic) }, + { Font.Bodoni, new FontFace("rbxasset://fonts/families/AccanthisADFStd.json") }, + { Font.Garamond, new FontFace("rbxasset://fonts/families/Guru.json") }, + { Font.Cartoon, new FontFace("rbxasset://fonts/families/ComicNeueAngular.json") }, + { Font.Code, new FontFace("rbxasset://fonts/families/Inconsolata.json") }, + { Font.Highway, new FontFace("rbxasset://fonts/families/HighwayGothic.json") }, + { Font.SciFi, new FontFace("rbxasset://fonts/families/Zekton.json") }, + { Font.Arcade, new FontFace("rbxasset://fonts/families/PressStart2P.json") }, + { Font.Fantasy, new FontFace("rbxasset://fonts/families/Balthazar.json") }, + { Font.Antique, new FontFace("rbxasset://fonts/families/RomanAntique.json") }, + { Font.Gotham, new FontFace("rbxasset://fonts/families/GothamSSm.json") }, + { Font.GothamMedium, new FontFace("rbxasset://fonts/families/GothamSSm.json", FontWeight.Medium) }, + { Font.GothamBold, new FontFace("rbxasset://fonts/families/GothamSSm.json", FontWeight.Bold) }, + { Font.GothamBlack, new FontFace("rbxasset://fonts/families/GothamSSm.json", FontWeight.Heavy) }, + { Font.AmaticSC, new FontFace("rbxasset://fonts/families/AmaticSC.json") }, + { Font.Bangers, new FontFace("rbxasset://fonts/families/Bangers.json") }, + { Font.Creepster, new FontFace("rbxasset://fonts/families/Creepster.json") }, + { Font.DenkOne, new FontFace("rbxasset://fonts/families/DenkOne.json") }, + { Font.Fondamento, new FontFace("rbxasset://fonts/families/Fondamento.json") }, + { Font.FredokaOne, new FontFace("rbxasset://fonts/families/FredokaOne.json") }, + { Font.GrenzeGotisch, new FontFace("rbxasset://fonts/families/GrenzeGotisch.json") }, + { Font.IndieFlower, new FontFace("rbxasset://fonts/families/IndieFlower.json") }, + { Font.JosefinSans, new FontFace("rbxasset://fonts/families/JosefinSans.json") }, + { Font.Jura, new FontFace("rbxasset://fonts/families/Jura.json") }, + { Font.Kalam, new FontFace("rbxasset://fonts/families/Kalam.json") }, + { Font.LuckiestGuy, new FontFace("rbxasset://fonts/families/LuckiestGuy.json") }, + { Font.Merriweather, new FontFace("rbxasset://fonts/families/Merriweather.json") }, + { Font.Michroma, new FontFace("rbxasset://fonts/families/Michroma.json") }, + { Font.Nunito, new FontFace("rbxasset://fonts/families/Nunito.json") }, + { Font.Oswald, new FontFace("rbxasset://fonts/families/Oswald.json") }, + { Font.PatrickHand, new FontFace("rbxasset://fonts/families/PatrickHand.json") }, + { Font.PermanentMarker, new FontFace("rbxasset://fonts/families/PermanentMarker.json") }, + { Font.Roboto, new FontFace("rbxasset://fonts/families/Roboto.json") }, + { Font.RobotoCondensed, new FontFace("rbxasset://fonts/families/RobotoCondensed.json") }, + { Font.RobotoMono, new FontFace("rbxasset://fonts/families/RobotoMono.json") }, + { Font.Sarpanch, new FontFace("rbxasset://fonts/families/Sarpanch.json") }, + { Font.SpecialElite, new FontFace("rbxasset://fonts/families/SpecialElite.json") }, + { Font.TitilliumWeb, new FontFace("rbxasset://fonts/families/TitilliumWeb.json") }, + { Font.Ubuntu, new FontFace("rbxasset://fonts/families/Ubuntu.json") }, + }; + public static FontSize GetFontSize(int fontSize) { if (fontSize > 60) @@ -57,5 +108,19 @@ namespace RobloxFiles.Utility return value; } + + public static Font GetFont(FontFace face) + { + var result = Font.Unknown; + + var faceQuery = FontFaces + .Where(pair => face.Equals(pair.Value)) + .Select(pair => pair.Key); + + if (faceQuery.Any()) + result = faceQuery.First(); + + return result; + } } }