diff --git a/BinaryFormat/BinaryRobloxFile.cs b/BinaryFormat/BinaryRobloxFile.cs index 345f711..cb4b79c 100644 --- a/BinaryFormat/BinaryRobloxFile.cs +++ b/BinaryFormat/BinaryRobloxFile.cs @@ -82,31 +82,46 @@ namespace RobloxFiles switch (chunk.ChunkType) { case "INST": + { handler = new INST(); break; + } case "PROP": + { handler = new PROP(); break; + } case "PRNT": + { handler = new PRNT(); break; + } case "META": + { handler = new META(); break; + } case "SSTR": + { handler = new SSTR(); break; + } case "SIGN": + { handler = new SIGN(); break; + } case "END\0": + { ChunksImpl.Add(chunk); reading = false; break; + } case string unhandled: - Console.Error.WriteLine("BinaryRobloxFile - Unhandled chunk-type: {0}!", unhandled); + { + LogError($"BinaryRobloxFile - Unhandled chunk-type: {unhandled}!"); break; - default: break; + } } if (handler != null) diff --git a/BinaryFormat/Chunks/PROP.cs b/BinaryFormat/Chunks/PROP.cs index ece1580..62f8185 100644 --- a/BinaryFormat/Chunks/PROP.cs +++ b/BinaryFormat/Chunks/PROP.cs @@ -1,31 +1,32 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Text; using RobloxFiles.Enums; using RobloxFiles.DataTypes; using RobloxFiles.Utility; - using System.Diagnostics; +using System.IO; namespace RobloxFiles.BinaryFormat.Chunks { public class PROP : IBinaryFileChunk { private BinaryRobloxFile File; + public string Name { get; internal set; } - public int ClassIndex { get; internal set; } - public string ClassName { get; private set; } + + private INST Class => File.Classes[ClassIndex]; + public string ClassName => Class?.ClassName; public PropertyType Type { get; internal set; } - public byte TypeId + internal byte TypeId { get { return (byte)Type; } - internal set { Type = (PropertyType)value; } + set { Type = (PropertyType)value; } } public override string ToString() @@ -35,26 +36,29 @@ namespace RobloxFiles.BinaryFormat.Chunks public void Load(BinaryRobloxFileReader reader) { - BinaryRobloxFile file = reader.File; - File = file; - + File = reader.File; ClassIndex = reader.ReadInt32(); Name = reader.ReadString(); - byte propType = reader.ReadByte(); - Type = (PropertyType)propType; - - INST inst = file.Classes[ClassIndex]; - ClassName = inst.ClassName; + try + { + byte propType = reader.ReadByte(); + Type = (PropertyType)propType; + } + catch (EndOfStreamException) + { + RobloxFile.LogError($"Got corrupted PROP chunk (@ {this})!"); + return; + } - var ids = inst.InstanceIds; - int instCount = inst.NumInstances; - var props = new Property[inst.NumInstances]; + var ids = Class.InstanceIds; + int instCount = Class.NumInstances; + var props = new Property[instCount]; for (int i = 0; i < instCount; i++) { int id = ids[i]; - Instance instance = file.Instances[id]; + Instance instance = File.Instances[id]; if (instance == null) { @@ -62,7 +66,7 @@ namespace RobloxFiles.BinaryFormat.Chunks continue; } - Property prop = new Property(instance, this); + var prop = new Property(instance, this); props[i] = prop; instance.AddProperty(ref prop); @@ -88,10 +92,11 @@ namespace RobloxFiles.BinaryFormat.Chunks switch (Type) { case PropertyType.String: + { readProperties(i => { string value = reader.ReadString(); - + // Leave an access point for the original byte sequence, in case this is a BinaryString. // This will allow the developer to read the sequence without any mangling from C# strings. byte[] buffer = reader.GetLastStringBuffer(); @@ -104,7 +109,9 @@ namespace RobloxFiles.BinaryFormat.Chunks { case "Tags": case "AttributesSerialize": + { return buffer; + } default: { Property prop = props[i]; @@ -130,21 +137,31 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Bool: + { readProperties(i => reader.ReadBoolean()); break; + } case PropertyType.Int: + { int[] ints = readInts(); readProperties(i => ints[i]); break; + } case PropertyType.Float: + { float[] floats = readFloats(); readProperties(i => floats[i]); break; + } case PropertyType.Double: + { readProperties(i => reader.ReadDouble()); break; + } case PropertyType.UDim: + { float[] UDim_Scales = readFloats(); int[] UDim_Offsets = readInts(); @@ -156,11 +173,13 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.UDim2: - float[] UDim2_Scales_X = readFloats(), + { + float[] UDim2_Scales_X = readFloats(), UDim2_Scales_Y = readFloats(); - int[] UDim2_Offsets_X = readInts(), + int[] UDim2_Offsets_X = readInts(), UDim2_Offsets_Y = readInts(); readProperties(i => @@ -175,7 +194,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Ray: + { readProperties(i => { float posX = reader.ReadFloat(), @@ -186,14 +207,16 @@ namespace RobloxFiles.BinaryFormat.Chunks dirY = reader.ReadFloat(), dirZ = reader.ReadFloat(); - Vector3 origin = new Vector3(posX, posY, posZ); - Vector3 direction = new Vector3(dirX, dirY, dirZ); + var origin = new Vector3(posX, posY, posZ); + var direction = new Vector3(dirX, dirY, dirZ); return new Ray(origin, direction); }); break; + } case PropertyType.Faces: + { readProperties(i => { byte faces = reader.ReadByte(); @@ -201,7 +224,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Axes: + { readProperties(i => { byte axes = reader.ReadByte(); @@ -209,17 +234,21 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.BrickColor: + { int[] BrickColorIds = readInts(); readProperties(i => { - int number = BrickColorIds[i]; - return BrickColor.FromNumber(number); + BrickColor color = BrickColorIds[i]; + return color; }); break; + } case PropertyType.Color3: + { float[] Color3_R = readFloats(), Color3_G = readFloats(), Color3_B = readFloats(); @@ -234,7 +263,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Vector2: + { float[] Vector2_X = readFloats(), Vector2_Y = readFloats(); @@ -247,7 +278,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Vector3: + { float[] Vector3_X = readFloats(), Vector3_Y = readFloats(), Vector3_Z = readFloats(); @@ -262,16 +295,30 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.CFrame: case PropertyType.Quaternion: - // Temporarily load the rotation matrices into their properties. - // We'll update them to CFrames once we iterate over the position data. + case PropertyType.OptionalCFrame: + { float[][] matrices = new float[instCount][]; + if (Type == PropertyType.OptionalCFrame) + { + byte cframeType = (byte)PropertyType.CFrame; + byte readType = reader.ReadByte(); + + if (readType != cframeType) + { + RobloxFile.LogError($"Unexpected property type in OptionalCFrame (expected {cframeType}, got {readType})"); + readProperties(i => null); + break; + } + } + for (int i = 0; i < instCount; i++) { byte rawOrientId = reader.ReadByte(); - + if (rawOrientId > 0) { // Make sure this value is in a safe range. @@ -296,11 +343,14 @@ namespace RobloxFiles.BinaryFormat.Chunks } else if (Type == PropertyType.Quaternion) { - float qx = reader.ReadFloat(), qy = reader.ReadFloat(), - qz = reader.ReadFloat(), qw = reader.ReadFloat(); + float qx = reader.ReadFloat(), + qy = reader.ReadFloat(), + qz = reader.ReadFloat(), + qw = reader.ReadFloat(); - Quaternion quaternion = new Quaternion(qx, qy, qz, qw); + var quaternion = new Quaternion(qx, qy, qz, qw); var rotation = quaternion.ToCFrame(); + matrices[i] = rotation.GetComponents(); } else @@ -321,7 +371,9 @@ namespace RobloxFiles.BinaryFormat.Chunks CFrame_Y = readFloats(), CFrame_Z = readFloats(); - readProperties(i => + var CFrames = new CFrame[instCount]; + + for (int i = 0; i < instCount; i++) { float[] matrix = matrices[i]; @@ -345,11 +397,34 @@ namespace RobloxFiles.BinaryFormat.Chunks components = position.Concat(matrix).ToArray(); } - return new CFrame(components); - }); + CFrames[i] = new CFrame(components); + } + if (Type == PropertyType.OptionalCFrame) + { + byte boolType = (byte)PropertyType.Bool; + byte readType = reader.ReadByte(); + + if (readType != boolType) + { + RobloxFile.LogError($"Unexpected property type in OptionalCFrame (expected {boolType}, got {readType})"); + readProperties(i => null); + break; + } + + for (int i = 0; i < instCount; i++) + { + var cf = CFrames[i]; + bool active = reader.ReadBoolean(); + CFrames[i] = active ? cf : null; + } + } + + readProperties(i => CFrames[i]); break; + } case PropertyType.Enum: + { uint[] enums = reader.ReadUInts(instCount); readProperties(i => @@ -366,31 +441,35 @@ namespace RobloxFiles.BinaryFormat.Chunks if (info == null) { - RobloxFile.LogError($"Enum cast failed for {inst.ClassName}.{Name} using value {value}!"); + RobloxFile.LogError($"Enum cast failed for {ClassName}.{Name} using value {value}!"); return value; } - + return Enum.Parse(info.MemberType, value.ToInvariantString()); } catch { - RobloxFile.LogError($"Enum cast failed for {inst.ClassName}.{Name} using value {value}!"); + RobloxFile.LogError($"Enum cast failed for {ClassName}.{Name} using value {value}!"); return value; } }); break; + } case PropertyType.Ref: + { var instIds = reader.ReadInstanceIds(instCount); readProperties(i => { int instId = instIds[i]; - return instId >= 0 ? file.Instances[instId] : null; + return instId >= 0 ? File.Instances[instId] : null; }); break; + } case PropertyType.Vector3int16: + { readProperties(i => { short x = reader.ReadInt16(), @@ -401,7 +480,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.NumberSequence: + { readProperties(i => { int numKeys = reader.ReadInt32(); @@ -420,7 +501,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.ColorSequence: + { readProperties(i => { int numKeys = reader.ReadInt32(); @@ -443,7 +526,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.NumberRange: + { readProperties(i => { float min = reader.ReadFloat(); @@ -453,7 +538,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Rect: + { float[] Rect_X0 = readFloats(), Rect_Y0 = readFloats(), Rect_X1 = readFloats(), Rect_Y1 = readFloats(); @@ -466,11 +553,13 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.PhysicalProperties: + { readProperties(i => { bool custom = reader.ReadBoolean(); - + if (custom) { float Density = reader.ReadFloat(), @@ -493,11 +582,13 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Color3uint8: + { byte[] Color3uint8_R = reader.ReadBytes(instCount), Color3uint8_G = reader.ReadBytes(instCount), Color3uint8_B = reader.ReadBytes(instCount); - + readProperties(i => { byte r = Color3uint8_R[i], @@ -509,26 +600,32 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Int64: - long[] Int64s = reader.ReadInterleaved(instCount, (buffer, start) => + { + long[] longs = reader.ReadInterleaved(instCount, (buffer, start) => { long result = BitConverter.ToInt64(buffer, start); return (long)((ulong)result >> 1) ^ (-(result & 1)); }); - readProperties(i => Int64s[i]); + readProperties(i => longs[i]); break; + } case PropertyType.SharedString: + { uint[] SharedKeys = reader.ReadUInts(instCount); readProperties(i => { uint key = SharedKeys[i]; - return file.SharedStrings[key]; + return File.SharedStrings[key]; }); break; + } case PropertyType.ProtectedString: + { readProperties(i => { int length = reader.ReadInt32(); @@ -538,10 +635,12 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } default: - RobloxFile.LogError($"Unhandled property type: {Type}!"); + { + RobloxFile.LogError($"Unhandled property type: {Type} in {this}!"); break; - // + } } reader.Dispose(); @@ -574,7 +673,7 @@ namespace RobloxFiles.BinaryFormat.Chunks Name = prop.Name, Type = prop.Type, - ClassName = inst.ClassName, + File = writer.File, ClassIndex = inst.ClassIndex }; @@ -630,6 +729,7 @@ namespace RobloxFiles.BinaryFormat.Chunks break; case PropertyType.Bool: + { props.ForEach(prop => { bool value = prop.CastValue(); @@ -637,29 +737,27 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Int: - var ints = new List(); - - props.ForEach(prop => - { - int value = prop.CastValue(); - ints.Add(value); - }); + { + var ints = props + .Select(prop => prop.CastValue()) + .ToList(); writer.WriteInts(ints); break; + } case PropertyType.Float: - var floats = new List(); - - props.ForEach(prop => - { - float value = prop.CastValue(); - floats.Add(value); - }); + { + var floats = props + .Select(prop => prop.CastValue()) + .ToList(); writer.WriteFloats(floats); break; + } case PropertyType.Double: + { props.ForEach(prop => { double value = prop.CastValue(); @@ -667,7 +765,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.UDim: + { var UDim_Scales = new List(); var UDim_Offsets = new List(); @@ -682,7 +782,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteInts(UDim_Offsets); break; + } case PropertyType.UDim2: + { var UDim2_Scales_X = new List(); var UDim2_Scales_Y = new List(); @@ -707,7 +809,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteInts(UDim2_Offsets_Y); break; + } case PropertyType.Ray: + { props.ForEach(prop => { Ray ray = prop.CastValue(); @@ -724,27 +828,30 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Faces: case PropertyType.Axes: + { props.ForEach(prop => { byte value = prop.CastValue(); writer.Write(value); }); - + break; + } case PropertyType.BrickColor: - var BrickColorIds = new List(); + { + var brickColorIds = props + .Select(prop => prop.CastValue()) + .Select(value => value.Number) + .ToList(); - props.ForEach(prop => - { - BrickColor value = prop.CastValue(); - BrickColorIds.Add(value.Number); - }); - - writer.WriteInts(BrickColorIds); + writer.WriteInts(brickColorIds); break; + } case PropertyType.Color3: + { var Color3_R = new List(); var Color3_G = new List(); var Color3_B = new List(); @@ -762,7 +869,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteFloats(Color3_B); break; + } case PropertyType.Vector2: + { var Vector2_X = new List(); var Vector2_Y = new List(); @@ -777,7 +886,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteFloats(Vector2_Y); break; + } case PropertyType.Vector3: + { var Vector3_X = new List(); var Vector3_Y = new List(); var Vector3_Z = new List(); @@ -795,12 +906,18 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteFloats(Vector3_Z); break; + } case PropertyType.CFrame: case PropertyType.Quaternion: + case PropertyType.OptionalCFrame: + { var CFrame_X = new List(); var CFrame_Y = new List(); var CFrame_Z = new List(); + if (Type == PropertyType.OptionalCFrame) + writer.Write((byte)PropertyType.CFrame); + props.ForEach(prop => { CFrame value = null; @@ -809,7 +926,10 @@ namespace RobloxFiles.BinaryFormat.Chunks value = q.ToCFrame(); else value = prop.CastValue(); - + + if (value == null) + value = new CFrame(); + Vector3 pos = value.Position; CFrame_X.Add(pos.X); CFrame_Y.Add(pos.Y); @@ -845,27 +965,47 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteFloats(CFrame_Y); writer.WriteFloats(CFrame_Z); + if (Type == PropertyType.OptionalCFrame) + { + writer.Write((byte)PropertyType.Bool); + + props.ForEach(prop => + { + if (prop.Value is null) + { + writer.Write(false); + return; + } + + writer.Write(true); + }); + } + break; + } case PropertyType.Enum: - var Enums = new List(); + { + var enums = new List(); props.ForEach(prop => { if (prop.Value is uint raw) { - Enums.Add(raw); + enums.Add(raw); return; } int signed = (int)prop.Value; uint value = (uint)signed; - Enums.Add(value); + enums.Add(value); }); - writer.WriteInterleaved(Enums); + writer.WriteInterleaved(enums); break; + } case PropertyType.Ref: + { var InstanceIds = new List(); props.ForEach(prop => @@ -883,7 +1023,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteInstanceIds(InstanceIds); break; + } case PropertyType.Vector3int16: + { props.ForEach(prop => { Vector3int16 value = prop.CastValue(); @@ -891,9 +1033,11 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.Write(value.Y); writer.Write(value.Z); }); - + break; + } case PropertyType.NumberSequence: + { props.ForEach(prop => { NumberSequence value = prop.CastValue(); @@ -910,7 +1054,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.ColorSequence: + { props.ForEach(prop => { ColorSequence value = prop.CastValue(); @@ -932,7 +1078,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.NumberRange: + { props.ForEach(prop => { NumberRange value = prop.CastValue(); @@ -941,7 +1089,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Rect: + { var Rect_X0 = new List(); var Rect_Y0 = new List(); @@ -966,9 +1116,11 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteFloats(Rect_X1); writer.WriteFloats(Rect_Y1); - + break; + } case PropertyType.PhysicalProperties: + { props.ForEach(prop => { bool custom = (prop.Value != null); @@ -988,7 +1140,9 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; + } case PropertyType.Color3uint8: + { var Color3uint8_R = new List(); var Color3uint8_G = new List(); var Color3uint8_B = new List(); @@ -1011,23 +1165,27 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.Write(bBuffer); break; + } case PropertyType.Int64: - var Int64s = new List(); + { + var longs = new List(); props.ForEach(prop => { long value = prop.CastValue(); - Int64s.Add(value); + longs.Add(value); }); - writer.WriteInterleaved(Int64s, value => + writer.WriteInterleaved(longs, value => { // Move the sign bit to the front. return (value << 1) ^ (value >> 63); }); break; + } case PropertyType.SharedString: + { var sharedKeys = new List(); SSTR sstr = file.SSTR; @@ -1048,10 +1206,10 @@ namespace RobloxFiles.BinaryFormat.Chunks } string key = shared.Key; - + if (!sstr.Lookup.ContainsKey(key)) { - uint id = (uint)(sstr.Lookup.Count); + uint id = (uint)sstr.Lookup.Count; sstr.Strings.Add(id, shared); sstr.Lookup.Add(key, id); } @@ -1062,7 +1220,9 @@ namespace RobloxFiles.BinaryFormat.Chunks writer.WriteInterleaved(sharedKeys); break; + } case PropertyType.ProtectedString: + { props.ForEach(prop => { var protect = prop.CastValue(); @@ -1073,7 +1233,12 @@ namespace RobloxFiles.BinaryFormat.Chunks }); break; - default: break; + } + default: + { + RobloxFile.LogError($"Unhandled property type: {Type} in {this}!"); + break; + } } } diff --git a/Generated/Classes.cs b/Generated/Classes.cs index 8732bc6..8e86e9c 100644 --- a/Generated/Classes.cs +++ b/Generated/Classes.cs @@ -1,5 +1,5 @@ // Auto-generated list of creatable Roblox classes. -// Updated as of 0.474.0.420553 +// Updated as of 0.476.0.421371 using System; @@ -7,10 +7,6 @@ using RobloxFiles.DataTypes; using RobloxFiles.Enums; using RobloxFiles.Utility; -#pragma warning disable CA1041 // Provide ObsoleteAttribute message -#pragma warning disable CA1051 // Do not declare visible instance fields -#pragma warning disable CA1707 // Identifiers should not contain underscores -#pragma warning disable CA1716 // Identifiers should not match keywords #pragma warning disable IDE1006 // Naming Styles namespace RobloxFiles @@ -2095,6 +2091,14 @@ namespace RobloxFiles } } + public class MemoryStoreService : Instance + { + public MemoryStoreService() + { + IsService = true; + } + } + public class Message : Instance { public string Text = ""; @@ -2402,7 +2406,9 @@ namespace RobloxFiles public CFrame ModelMeshCFrame = new CFrame(); public SharedString ModelMeshData = SharedString.FromBase64("yuZpQdnvvUBOTYh1jqZ2cA=="); public Vector3 ModelMeshSize = new Vector3(); + public bool NeedsPivotMigration; public BasePart PrimaryPart; + public CFrame WorldPivotData; } public class Actor : Model @@ -2421,6 +2427,7 @@ namespace RobloxFiles } public bool AllowThirdPartySales; + public ClientAnimatorThrottlingMode ClientAnimatorThrottling = ClientAnimatorThrottlingMode.Default; public string CollisionGroups = "Default^0^1"; public Camera CurrentCamera; public double DistributedGameTime; @@ -2532,10 +2539,11 @@ namespace RobloxFiles IsService = true; } + public string DEPRECATED_SerializedEmulatedPolicyInfo = ""; public string EmulatedCountryCode = ""; public string EmulatedGameLocale = ""; public bool PlayerEmulationEnabled; - public string SerializedEmulatedPolicyInfo = ""; + public byte[] SerializedEmulatedPolicyInfo = Array.Empty(); } public class Players : Instance @@ -2678,6 +2686,14 @@ namespace RobloxFiles public int MaxPromptsVisible = 16; } + public class PublishService : Instance + { + public PublishService() + { + IsService = true; + } + } + public class RbxAnalyticsService : Instance { public RbxAnalyticsService() diff --git a/Generated/Enums.cs b/Generated/Enums.cs index aea3910..b70abe5 100644 --- a/Generated/Enums.cs +++ b/Generated/Enums.cs @@ -1,5 +1,5 @@ // Auto-generated list of Roblox enums. -// Updated as of 0.473.0.420291 +// Updated as of 0.476.0.421371 namespace RobloxFiles.Enums { @@ -124,6 +124,13 @@ namespace RobloxFiles.Enums Orbital } + public enum ClientAnimatorThrottlingMode + { + Default, + Disabled, + Enabled + } + public enum DevCameraOcclusionMode { Zoom, diff --git a/Plugins/GenerateApiDump.rbxm b/Plugins/GenerateApiDump.rbxm index 1cff98b..2f2b34a 100644 Binary files a/Plugins/GenerateApiDump.rbxm and b/Plugins/GenerateApiDump.rbxm differ diff --git a/Plugins/GenerateApiDump/PropertyPatches.lua b/Plugins/GenerateApiDump/PropertyPatches.lua index 478fdba..5bc8823 100644 --- a/Plugins/GenerateApiDump/PropertyPatches.lua +++ b/Plugins/GenerateApiDump/PropertyPatches.lua @@ -377,6 +377,8 @@ return ModelMeshCFrame = "CFrame"; ModelMeshData = "SharedString"; ModelMeshSize = "Vector3"; + NeedsPivotMigration = "bool"; + WorldPivotData = "OptionalCFrame"; }; }; diff --git a/Plugins/GenerateApiDump/init.server.lua b/Plugins/GenerateApiDump/init.server.lua index ecf7db7..7faab5c 100644 --- a/Plugins/GenerateApiDump/init.server.lua +++ b/Plugins/GenerateApiDump/init.server.lua @@ -217,6 +217,7 @@ local formatLinks = ["Instance"] = "Null"; ["Color3uint8"] = "Color3"; + ["OptionalCFrame"] = "Null"; ["ProtectedString"] = "String"; } @@ -357,10 +358,10 @@ local function generateClasses() writeLine("using RobloxFiles.Utility;") writeLine() - writeLine("#pragma warning disable CA1041 // Provide ObsoleteAttribute message") - writeLine("#pragma warning disable CA1051 // Do not declare visible instance fields") - writeLine("#pragma warning disable CA1707 // Identifiers should not contain underscores") - writeLine("#pragma warning disable CA1716 // Identifiers should not match keywords") + -- writeLine("#pragma warning disable CA1041 // Provide ObsoleteAttribute message") + -- writeLine("#pragma warning disable CA1051 // Do not declare visible instance fields") + -- writeLine("#pragma warning disable CA1707 // Identifiers should not contain underscores") + -- writeLine("#pragma warning disable CA1716 // Identifiers should not match keywords") writeLine("#pragma warning disable IDE1006 // Naming Styles") writeLine() @@ -639,6 +640,10 @@ local function generateClasses() writeLine("[Obsolete]") end + + if valueType == "OptionalCFrame" then + valueType = "CFrame" + end writeLine("public %s %s%s;", valueType, name, default) diff --git a/RobloxFileFormat.csproj b/RobloxFileFormat.csproj index 153ee32..e6de790 100644 --- a/RobloxFileFormat.csproj +++ b/RobloxFileFormat.csproj @@ -98,6 +98,7 @@ + diff --git a/RobloxFileFormat.dll b/RobloxFileFormat.dll index ee32b3b..c7ff0d6 100644 Binary files a/RobloxFileFormat.dll and b/RobloxFileFormat.dll differ diff --git a/Tokens/CFrame.cs b/Tokens/CFrame.cs index 31e0702..f79330d 100644 --- a/Tokens/CFrame.cs +++ b/Tokens/CFrame.cs @@ -30,6 +30,23 @@ namespace RobloxFiles.Tokens return new CFrame(components); } + public static void WriteCFrame(Property prop, XmlDocument doc, XmlNode node) + { + CFrame cf = prop.CastValue(); + float[] components = cf.GetComponents(); + + for (int i = 0; i < 12; i++) + { + string coordName = Coords[i]; + float coordValue = components[i]; + + XmlElement coord = doc.CreateElement(coordName); + coord.InnerText = coordValue.ToInvariantString(); + + node.AppendChild(coord); + } + } + public bool ReadProperty(Property prop, XmlNode token) { CFrame result = ReadCFrame(token); @@ -46,19 +63,7 @@ namespace RobloxFiles.Tokens public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) { - CFrame cf = prop.CastValue(); - float[] components = cf.GetComponents(); - - for (int i = 0; i < 12; i++) - { - string coordName = Coords[i]; - float coordValue = components[i]; - - XmlElement coord = doc.CreateElement(coordName); - coord.InnerText = coordValue.ToInvariantString(); - - node.AppendChild(coord); - } + WriteCFrame(prop, doc, node); } } } diff --git a/Tokens/OptionalCFrame.cs b/Tokens/OptionalCFrame.cs new file mode 100644 index 0000000..010ac80 --- /dev/null +++ b/Tokens/OptionalCFrame.cs @@ -0,0 +1,33 @@ +using System.Xml; +using RobloxFiles.DataTypes; + +namespace RobloxFiles.Tokens +{ + public class OptionalCFrameToken : IXmlPropertyToken + { + public string XmlPropertyToken => "OptionalCoordinateFrame"; + + public bool ReadProperty(Property prop, XmlNode token) + { + XmlNode first = token.FirstChild; + prop.Type = PropertyType.OptionalCFrame; + + if (first?.Name == "CFrame") + prop.Value = CFrameToken.ReadCFrame(first); + + return true; + } + + public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) + { + CFrame value = prop.CastValue(); + + if (value != null) + { + XmlElement cfNode = doc.CreateElement("CFrame"); + CFrameToken.WriteCFrame(prop, doc, cfNode); + node.AppendChild(cfNode); + } + } + } +} diff --git a/Tokens/ProtectedString.cs b/Tokens/ProtectedString.cs index 5ede316..363af24 100644 --- a/Tokens/ProtectedString.cs +++ b/Tokens/ProtectedString.cs @@ -13,8 +13,8 @@ namespace RobloxFiles.Tokens public bool ReadProperty(Property prop, XmlNode token) { ProtectedString contents = token.InnerText; - prop.Type = PropertyType.ProtectedString; - prop.Value = contents; + prop.Type = PropertyType.String; + prop.Value = contents.ToString(); return true; } diff --git a/Tree/Attributes.cs b/Tree/Attributes.cs index 3dc7822..42133dd 100644 --- a/Tree/Attributes.cs +++ b/Tree/Attributes.cs @@ -13,36 +13,36 @@ namespace RobloxFiles public enum AttributeType { - // Null = 1, + // Null = 1, String = 2, Bool = 3, - // Int = 4, + // Int = 4, Float = 5, Double = 6, - // Array = 7, - // Dictionary = 8, + // Array = 7, + // Dictionary = 8, UDim = 9, UDim2 = 10, - // Ray = 11, - // Faces = 12, - // Axes = 13 + // Ray = 11, + // Faces = 12, + // Axes = 13 BrickColor = 14, Color3 = 15, Vector2 = 16, Vector3 = 17, - // Vector2int16 = 18, - // Vector3int16 = 19, - // CFrame = 20, - // Enum = 21, + // Vector2int16 = 18, + // Vector3int16 = 19, + // CFrame = 20, + // Enum = 21, NumberSequence = 23, - // NumberSequenceKeypoint = 24, + // NumberSequenceKeypoint = 24, ColorSequence = 25, - // ColorSequenceKeypoint = 26, + // ColorSequenceKeypoint = 26, NumberRange = 27, Rect = 28, - // PhysicalProperties = 29 - // Region3 = 31, - // Region3int16 = 32 + // PhysicalProperties = 29 + // Region3 = 31, + // Region3int16 = 32 } public class Attribute : IDisposable @@ -87,7 +87,6 @@ namespace RobloxFiles { var attributeSupport = new Dictionary(); var supportedTypes = new Dictionary(); - var assembly = Assembly.GetExecutingAssembly(); var handlerTypes = @@ -247,7 +246,7 @@ namespace RobloxFiles internal Attributes(MemoryStream stream) { - using (BinaryReader reader = new BinaryReader(stream)) + using (var reader = new BinaryReader(stream)) Initialize(reader); stream.Dispose(); diff --git a/Tree/Property.cs b/Tree/Property.cs index de8375b..be46578 100644 --- a/Tree/Property.cs +++ b/Tree/Property.cs @@ -1,12 +1,9 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Reflection; -using RobloxFiles.BinaryFormat; using RobloxFiles.BinaryFormat.Chunks; - using RobloxFiles.DataTypes; using RobloxFiles.Utility; @@ -42,14 +39,14 @@ namespace RobloxFiles Color3uint8, Int64, SharedString, - ProtectedString + ProtectedString, + OptionalCFrame } public class Property { public string Name { get; internal set; } public Instance Instance { get; internal set; } - public PropertyType Type { get; internal set; } public string XmlToken { get; internal set; } @@ -58,8 +55,10 @@ namespace RobloxFiles internal object RawValue; internal static BindingFlags BindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase; - - // !! FIXME: Map typeof(ProtectedString) to PropertyType.ProtectedString when binary files are allowed to read it. + + // TODO: Map typeof(ProtectedString) to PropertyType.ProtectedString + // if binary files are ever publically allowed to read it. + public static readonly IReadOnlyDictionary Types = new Dictionary() { { typeof(Axes), PropertyType.Axes }, @@ -103,8 +102,7 @@ namespace RobloxFiles RawBuffer = RawValue as byte[]; return; } - - if (RawValue is SharedString sharedString) + else if (RawValue is SharedString sharedString) { if (sharedString != null) { @@ -112,8 +110,7 @@ namespace RobloxFiles return; } } - - if (RawValue is ProtectedString protectedString) + else if (RawValue is ProtectedString protectedString) { if (protectedString != null) { @@ -128,27 +125,36 @@ namespace RobloxFiles switch (Type) { case PropertyType.Int: + { if (Value is long) { Type = PropertyType.Int64; goto case PropertyType.Int64; } - + RawBuffer = BitConverter.GetBytes((int)Value); break; + } case PropertyType.Bool: + { RawBuffer = BitConverter.GetBytes((bool)Value); break; + } case PropertyType.Int64: + { RawBuffer = BitConverter.GetBytes((long)Value); break; + } case PropertyType.Float: + { RawBuffer = BitConverter.GetBytes((float)Value); break; + } case PropertyType.Double: + { RawBuffer = BitConverter.GetBytes((double)Value); break; - default: break; + } } } @@ -163,8 +169,7 @@ namespace RobloxFiles if (typeName == Name) { - FieldInfo directField = instType - .GetFields() + FieldInfo directField = instType.GetFields() .Where(field => field.Name.StartsWith(Name, StringComparison.InvariantCulture)) .Where(field => field.DeclaringType == instType) .FirstOrDefault(); @@ -276,6 +281,7 @@ namespace RobloxFiles get { // Improvise what the buffer should be if this is a primitive. + if (RawBuffer == null && Value != null) ImproviseRawBuffer(); diff --git a/UnitTest/Files/Binary.rbxl b/UnitTest/Files/Binary.rbxl index 2fa7d97..0a2d581 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 813f2c7..2daccf3 100644 --- a/UnitTest/Files/Xml.rbxlx +++ b/UnitTest/Files/Xml.rbxlx @@ -1,12 +1,13 @@ null nil - + false + 0 Default^0^1 - RBXB6729B4B8E0F4D3398108C05AFD9B65E + RBX3A482CA70FD44861880A3A8DC2E280B0 0 true -500 @@ -50,8 +51,10 @@ 0 Workspace + false 0 null + 0 -1 false 64 @@ -60,8 +63,24 @@ true false + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + - + false @@ -125,6 +144,20 @@ Hull qKQHnbGqNyW9YBYUZo8CWQ== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -157,7 +190,7 @@ - + false @@ -221,6 +254,20 @@ Box +qv2o0HSW+htH+ALwYQpiw== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -253,7 +300,7 @@ - + 0 @@ -292,11 +339,28 @@ 0 Car + false null -1 + + + 8 + 15.4043007 + -5 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + - + false @@ -360,6 +424,20 @@ Box +qv2o0HSW+htH+ALwYQpiw== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -392,7 +470,7 @@ - + false @@ -456,6 +534,20 @@ Default h8IPxf7q0MVs4uyaKSOhVA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -488,7 +580,7 @@ - + false @@ -552,6 +644,20 @@ Hull yk4/m1d5tPD+2SapafAV9A== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -584,7 +690,7 @@ - + false @@ -648,6 +754,20 @@ PreciseConvexDecomposition ezvavG8GMWP28xfkKnsm/w== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -680,7 +800,7 @@ - + false @@ -744,6 +864,20 @@ LOD ezvavG8GMWP28xfkKnsm/w== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 0 -0.5 @@ -777,31 +911,31 @@ - + - -148.10675 - 310.932129 - 221.675095 - 0.847654164 - 0.397796452 - -0.351056159 + -96.3363647 + 232.183411 + 219.286392 + 0.87256825 + 0.357689083 + -0.332690984 2.98023224e-08 - 0.661684453 - 0.749782503 - 0.530549169 - -0.635556281 - 0.560879588 + 0.681056798 + 0.732230723 + 0.48849234 + -0.638921261 + 0.594268441 null 0 70 0 - -147.404663 - 309.432617 - 220.553375 + -95.6709824 + 230.718948 + 218.097855 1 0 0 @@ -819,9 +953,9 @@ - + - 0 + 1 true -0.5 @@ -896,6 +1030,20 @@ AAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAA AAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAP//AP//AP//Af/5AAAAAAAAAAAAAAAB AAD/AAD/AAD/AAH/AAAAAAAAAAAAAAABAP//AP//AP//Af//AAAAAAAAAAAAAAABAAD/AAD/ AAD/AAH/AAAAAAAAAAAAAAABAAAAAAAAAAA=]]> + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -1179,7 +1327,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + BoolValue @@ -1188,7 +1336,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + BrickColorValue @@ -1197,7 +1345,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 194 - + Color3Value @@ -1210,7 +1358,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + CFrameValue @@ -1232,7 +1380,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + IntValue @@ -1241,7 +1389,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1234 - + NumberValue @@ -1250,16 +1398,16 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 9.0000999999999997669 - + ObjectValue -1 - RBX473F017243BF4D4CBB814CA63559A93A + RBX5440245BA17340CFA5B3B3B0A58C0598 - + RayValue @@ -1279,7 +1427,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + StringValue @@ -1288,7 +1436,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A TestingLol - + true @@ -1339,6 +1487,20 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false 288 Adornee + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -1370,9 +1532,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 - + - RBX31EFCF342C8F4FEBA9CBF3E1E39463CB + RBXE99549CBA437433983F6F1CF98398AB5 0 @@ -1389,9 +1551,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + - RBX31EFCF342C8F4FEBA9CBF3E1E39463CB + RBXE99549CBA437433983F6F1CF98398AB5 1 @@ -1409,7 +1571,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + 0 @@ -1444,7 +1606,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 0 - + false @@ -1469,7 +1631,7 @@ script.Parent.Color = ColorSequence.new(keyPoints)]]> - + false @@ -1495,7 +1657,7 @@ script.Parent.Size = NumberSequence.new(keyPoints)]]> - + false @@ -1523,7 +1685,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Vector3Value @@ -1536,7 +1698,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1590,7 +1752,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true 1 - + UDimTest @@ -1615,7 +1777,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -1653,28 +1815,17 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - StuffModel + WorldPivot + false null -1 - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.824234 - 4.9126358 - 66.4635315 - -1 + + + 0 + 0 + 0 + 1 0 0 0 @@ -1682,195 +1833,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - -1 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 3 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 1 - 1.20000005 - 2 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.5 - 0.5 - 0.5 - - -1 - - - - 2 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.824234 - 1.76263595 - 66.4662399 - -0.00581110455 - -0.00449447986 - -0.999973893 - -0.00369083951 - 0.999983251 - -0.00447307248 - 0.999977231 - 0.00366474991 - -0.00582750374 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 3 - 0 - 0 - - 0 - 0 - 0 - - 2 - 1 - - 1 - 0.800000012 - 5 - - - - - - 2 - 2 - http://www.roblox.com/asset/?id=3835506 - 5 - Mesh - - 0 - 0 - 0 - - - 1.95000005 - 1.95000005 - 1 - - -1 - - rbxasset://textures/SwordTexture.png - - 1 - 1 - 1 - - - - - + 1 + + + + false @@ -1883,751 +1850,9 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 81.824234 - 3.31261897 - 66.4648056 - -0.983122289 - -9.21184459e-22 - -0.182950243 - 0.000145678569 - 0.999999702 - -0.000782835006 - 0.182950184 - -0.000796274282 - -0.983121991 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 1 - - 1 - 2 - 1 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.200000003 - 0.150000006 - 0.200000003 - - -1 - - - - 1 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 81.824234 - 6.71261597 - 66.4620972 - 0.983122289 - -9.21184459e-22 - 0.182950243 - -0.000145678569 - 0.999999702 - 0.000782835006 - -0.182950184 - -0.000796274282 - 0.983121991 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Fire - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 1 - 2.4000001 - 1 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.100000001 - 0.0500000007 - 0.100000001 - - -1 - - - - 2 - 2 - 2 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 81.8667603 - 8.40447044 - 66.481575 - 0.532605886 - -9.03015316e-05 - -0.846363485 - 0.000780273927 - 0.999999642 - 0.000384323037 - 0.846363187 - -0.000865087903 - 0.532605767 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 0 - 1 - - 1 - 1 - 2 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.5 - 0.5 - 0.5 - - -1 - - - - 26 - 26 - 26 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.824234 - 10.7126522 - 66.4589081 - 0.983122289 - -9.21184459e-22 - 0.182950243 - -0.000145678569 - 0.999999702 - 0.000782835006 - -0.182950184 - -0.000796274282 - 0.983121991 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 3 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 3 - 1.20000005 - 1 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.0199999996 - 0.0199999996 - 0.0199999996 - - -1 - - - - 1 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.824234 - 9.51264191 - 66.4598694 - -1.00000024 - 7.13597931e-12 - -4.07523348e-09 - -7.13597931e-12 - 1 - -1.86238705e-10 - -4.07523348e-09 - 1.86238705e-10 - -1.00000024 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 3 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 1 - 1.20000005 - 2 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.100000001 - 0.100000001 - 0.100000001 - - -1 - - - - 1 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 81.3461609 - 12.5252705 - 66.6214447 - -0.983122289 - 0.000145678569 - -0.182950184 - 0.000145678569 - 1 - 1.34392722e-05 - 0.182950184 - -1.34392867e-05 - -0.983122349 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0.699999988 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 1 - 2.4000001 - 1 - - - - - - 2 - 2 - rbxasset://fonts/hammer.mesh - 5 - Mesh - - 0 - 0 - 0 - - - 0.600000024 - 0.600000024 - 0.600000024 - - -1 - - rbxasset://textures/hammertex128.png - - 1 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.2617798 - 14.2252684 - 65.6200104 - -0.182950184 - -0.983122289 - 0.000145678569 - 1.34392722e-05 - 0.000145678569 - 1 - -0.983122349 - 0.182950184 - -1.34392867e-05 - - false - true - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - Handle - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 1 - 4.80000019 - 1 - - - - - - 2 - 2 - - 5 - Mesh - - 0 - 0 - 0 - - - 0.200000003 - -0.230000004 - -0.200000003 - - -1 - - - - 1 - 1 - 1 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 4 - 0 - - 81.324234 - 15.4126358 - 65.4635315 + -32.25 + 0.5 + 5.75 1 0 0 @@ -2638,9 +1863,9 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 1 - false + true true - false + true 0 4288914085 @@ -2657,7 +1882,21 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 - Part + WithPivot + + 32.25 + -0.5 + -5.75 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -2673,7 +1912,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -0.5 0.5 - 3 + 0 0 0 @@ -2685,32 +1924,105 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 4 - 1.20000005 + 1 + 2 + + + + + + false + + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + + -32.25 + 0.5 + 1.75 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + true + true + true + 0 + 4288914085 + + false + + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + false + false + 256 + NoPivot + + 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.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + 1 + 1 + + 4 + 1 2 - - - - 10 - false - OMGGGGG - true - 1 - false - 0 - null - - -1 - - 0 - 1 - 10000 - - - + INF @@ -2721,7 +2033,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1.3337000000000001076 - + false @@ -2785,6 +2097,20 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Default wqN+0m4YPEAIF5tOPQwXdA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -2817,23 +2143,23 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + - + Attributes -1 - + 0 @@ -2846,7 +2172,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + NonReplicatedCSGDictionaryService @@ -2854,7 +2180,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + CSGDictionaryService @@ -2862,7 +2188,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -2872,7 +2198,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + TimerService @@ -2880,7 +2206,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -2892,7 +2218,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ReplicatedFirst @@ -2900,7 +2226,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + TweenService @@ -2908,7 +2234,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + PermissionsService @@ -2916,26 +2242,26 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + + PlayerEmulatorService false - + -1 - + 0 0 false - false StudioData -1 0 @@ -2943,7 +2269,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -2987,7 +2313,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + StarterPlayerScripts @@ -2995,7 +2321,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + StarterCharacterScripts @@ -3004,7 +2330,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + StarterPack @@ -3012,7 +2338,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + StarterGui @@ -3023,7 +2349,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + LocalizationService @@ -3031,7 +2357,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + TeleportService @@ -3039,7 +2365,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + CollectionService @@ -3047,7 +2373,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + PhysicsService @@ -3055,7 +2381,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Geometry @@ -3063,7 +2389,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false false @@ -3072,8 +2398,17 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 + + + + InsertionHash + -1 + + {13812C15-10FD-484C-84A8-A73EEF4CA830} + + - + GamePassService @@ -3081,7 +2416,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 1000 @@ -3090,7 +2425,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + CookiesService @@ -3098,7 +2433,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + VRService @@ -3106,7 +2441,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ContextActionService @@ -3114,7 +2449,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ScriptService @@ -3122,7 +2457,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + AssetService @@ -3130,7 +2465,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + TouchInputService @@ -3138,7 +2473,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3147,7 +2482,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Selection @@ -3155,7 +2490,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -3164,7 +2499,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ServerStorage @@ -3172,7 +2507,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ReplicatedStorage @@ -3180,7 +2515,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + LuaWebService @@ -3188,7 +2523,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -3233,7 +2568,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 00:00:00 - + true @@ -3243,7 +2578,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + FlyweightService @@ -3251,7 +2586,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -3260,7 +2595,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + LanguageService @@ -3268,7 +2603,15 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + + + + MemoryStoreService + -1 + + + + true @@ -3278,7 +2621,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ReplicatedScriptService @@ -3286,7 +2629,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Teams @@ -3294,7 +2637,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -3311,7 +2654,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 10 - + {"lastSaveTime":0,"lastKnownPublishRequest":0,"users":[]} @@ -3320,7 +2663,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + VirtualInputManager @@ -3328,26 +2671,37 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + DumpFolder -1 - + - - 0 - 8 - - UICorner + 100 + 1 + UITextSizeConstraint -1 - + + + + Vector3Value + -1 + + + 0 + 0 + 0 + + + + 0 @@ -3369,7 +2723,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -3391,7 +2745,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -3413,16 +2767,15 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + - - Animation + AnimationController -1 - + @@ -3444,7 +2797,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Backpack @@ -3452,7 +2805,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -3463,7 +2816,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -3491,7 +2844,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -3520,7 +2873,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + null null @@ -3546,7 +2899,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + BindableEvent @@ -3554,7 +2907,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + BindableFunction @@ -3562,7 +2915,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -3581,7 +2934,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3594,7 +2947,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3623,7 +2976,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 1250 @@ -3643,7 +2996,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3661,7 +3014,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3680,7 +3033,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0.699999988 @@ -3707,7 +3060,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 3000 - + @@ -3749,7 +3102,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3787,7 +3140,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -3799,7 +3152,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3813,7 +3166,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3827,7 +3180,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -3841,16 +3194,17 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + - Skin - 226 + + 32 + ClickDetector -1 - + 0.5 @@ -3860,7 +3214,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Configuration @@ -3868,7 +3222,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 null @@ -3888,7 +3242,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + false null @@ -3907,7 +3261,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + 0 @@ -3928,7 +3282,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + null null @@ -3949,9 +3303,10 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + 0 + 45 0 0 null @@ -3974,7 +3329,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + false null @@ -3992,7 +3347,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + null null @@ -4000,6 +3355,9 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 26 true 5 + 90 + 90 + false RodConstraint -1 @@ -4007,7 +3365,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + null null @@ -4023,11 +3381,12 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + 0 0 false + 45 0 0 0 @@ -4038,6 +3397,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true 0 false + 45 -45 0 INF @@ -4061,7 +3421,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + 0 null @@ -4070,6 +3430,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1009 true false + 45 0 INF 0 @@ -4086,30 +3447,28 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + null null - 3 + 8 200 - 0 + 0.00999999978 true - 1 - false - INF - 5 - 0 - SpringConstraint + false + 45 + INF + TorsionSpringConstraint 0.400000006 + 0 -1 - 0 + 100 - 0.100000001 false - + null null @@ -4126,7 +3485,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + false null @@ -4146,7 +3505,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + HumanoidController @@ -4154,7 +3513,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + SkateboardController @@ -4162,7 +3521,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + VehicleController @@ -4170,7 +3529,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + CustomEvent @@ -4179,7 +3538,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + CustomEventReceiver @@ -4188,7 +3547,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -4216,7 +3575,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -4244,34 +3603,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - 2 - 2 - - FileMesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - -1 - - - - 1 - 1 - 1 - - - - + 0 @@ -4292,7 +3624,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -4304,7 +3636,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 500000 @@ -4322,7 +3654,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + @@ -4338,7 +3670,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + @@ -4358,7 +3690,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + 0 @@ -4370,7 +3702,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + 0 @@ -4382,7 +3714,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + @@ -4403,7 +3735,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 5 - + Folder @@ -4411,16 +3743,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - ForceField - -1 - - true - - - + false @@ -4475,7 +3798,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + true @@ -4568,7 +3891,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + true @@ -4597,6 +3920,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 0 1 + -1 false TextButton null @@ -4648,7 +3972,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + false @@ -4735,7 +4059,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + false @@ -4763,6 +4087,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 0 1 + -1 TextLabel null null @@ -4811,16 +4136,15 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + - false + true 0 0 true - 0 0 0.639215708 @@ -4835,47 +4159,37 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 1 - rbxasset://textures/ui/Scroll/scroll-bottom.png - - 0 - 0 - - - 0 - 0 - 2 - 0 - - true + true + false false - 0 - 0 + 0 0 - rbxasset://textures/ui/Scroll/scroll-middle.png - ScrollingFrame + 1 + -1 + false + TextBox null null null null + + 0.699999988 + 0.699999988 + 0.699999988 + + 0 0 0 0 + false null 0 - - 1 - 1 - 1 - - 0 - 12 - 4 - true true null + true 0 0 @@ -4885,14 +4199,31 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 -1 - rbxasset://textures/ui/Scroll/scroll-top.png - 0 - 0 + TextBox + + 0.105882362 + 0.164705887 + 0.207843155 + + true + false + 8 + + 0 + 0 + 0 + + 1 + 0 + 0 + false + 2 + 1 true 1 - + false @@ -4951,7 +4282,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + false @@ -5041,7 +4372,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + false null @@ -5094,7 +4425,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + true @@ -5109,7 +4440,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + true @@ -5124,34 +4455,33 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + - true - null - false - true - - 800 - 600 - - false - true - 5 - 0 - SurfaceGui - 50 - true - null - 0 + + 0.0509803966 + 0.411764741 + 0.674509823 + + 0 + null + FloorWire -1 + 4 - 0 - 0 - 0 + + + 1 + 1 + + null + 0 + 2 + true + 0.0625 - + null @@ -5174,7 +4504,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + 0 null @@ -5217,7 +4547,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - + 0 null @@ -5257,7 +4587,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - + 0 null @@ -5299,7 +4629,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - + 0 null @@ -5342,7 +4672,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - + 0 null @@ -5382,7 +4712,50 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - + + + true + null + false + + true + + 800 + 600 + + false + true + 5 + 0 + SurfaceGui + 50 + true + null + 0 + -1 + + 0 + 0 + 0 + + + + + null + + + 0.94901967 + 0.952941239 + 0.952941239 + + ParabolaAdornment + -1 + + 0 + true + + + 0 null @@ -5421,49 +4794,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> -1 - - - - - 0.0509803966 - 0.411764741 - 0.674509823 - - 0 - null - FloorWire - -1 - 4 - - - - 1 - 1 - - null - 0 - 2 - true - 0.0625 - - - - - null - - - 0.94901967 - 0.952941239 - 0.952941239 - - ParabolaAdornment - -1 - - 0 - true - - - + null @@ -5485,7 +4816,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + null @@ -5504,7 +4835,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + null @@ -5524,7 +4855,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + null @@ -5541,7 +4872,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + @@ -5558,7 +4889,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + @@ -5579,7 +4910,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> true - + true @@ -5614,7 +4945,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 16 - + @@ -5685,7 +5016,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 1 - + 0 @@ -5725,7 +5056,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 0 @@ -5765,7 +5096,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -5824,7 +5155,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -5865,7 +5196,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -5906,7 +5237,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -5947,7 +5278,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -5988,7 +5319,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -6027,7 +5358,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -6066,7 +5397,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -6109,7 +5440,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -6148,7 +5479,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Keyframe @@ -6157,7 +5488,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + KeyframeMarker @@ -6166,7 +5497,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 2 @@ -6177,7 +5508,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 1 @@ -6194,7 +5525,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 90 @@ -6213,7 +5544,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + 90 @@ -6232,7 +5563,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + [] @@ -6242,7 +5573,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6254,7 +5585,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6266,7 +5597,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + @@ -6277,7 +5608,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Message @@ -6286,7 +5617,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + Hint @@ -6295,7 +5626,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -6306,7 +5637,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6352,6 +5683,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 CornerWedgePart + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6382,7 +5727,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6428,6 +5773,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 Part + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6460,7 +5819,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6506,6 +5865,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 FlagStand + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6539,7 +5912,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6586,6 +5959,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 Seat + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6618,7 +6005,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6664,6 +6051,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 SkateboardPlatform + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6699,7 +6100,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false false @@ -6749,6 +6150,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 256 SpawnLocation true + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6782,7 +6197,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6828,6 +6243,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 WedgePart + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -6859,7 +6288,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -6923,6 +6352,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> MeshPart yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -6955,7 +6398,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -7015,6 +6458,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> PartOperation yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -7048,7 +6505,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + true @@ -7108,6 +6565,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> NegateOperation yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -7141,7 +6612,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -7201,6 +6672,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> UnionOperation yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 1 -0.5 @@ -7234,7 +6719,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + false @@ -7280,6 +6765,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false 256 TrussPart + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -7311,7 +6810,1238 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 - + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + Actor + false + null + -1 + + + + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + WorldModel + false + null + -1 + + + + + + + + 0 + 0 + 0 + + + 0 1 1 1 0 1 1 1 1 0 + 0 + 1 + true + 5 10 + 0 + 0 + false + ParticleEmitter + 0 + 20 + 0 0 + 0 0 + 0 1 0 1 1 0 + -1 + 5 5 + + 0 + 0 + + + rbxasset://textures/particles/sparkles_main.dds + 1 + 0 0 0 1 0 0 + 0 + 0 + + + + + + 0 + 0 + NumberPose + -1 + + 0 + 1 + + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 + 0 + Pose + -1 + + 1 + + + + + + true + 0.400000006 + BloomEffect + 24 + -1 + + 0.949999988 + + + + + + 0 + 0 + true + ColorCorrectionEffect + 0 + -1 + + + 1 + 1 + 1 + + + + + + + true + 0.25 + SunRaysEffect + -1 + 1 + + + + + + Interact + + true + true + true + 0 + 1000 + 0 + 101 + 10 + ProximityPrompt + + true + null + -1 + 0 + + + 0 + 0 + + + + + + + + ReflectionMetadataCallbacks + -1 + + + + + + + ReflectionMetadataClasses + -1 + + + + + + + ReflectionMetadataEnums + -1 + + + + + + + ReflectionMetadataEvents + -1 + + + + + + + ReflectionMetadataFunctions + -1 + + + + + + + true + + false + + false + false + 0 + 2147483647 + true + false + ReflectionMetadataClass + + 5000 + + false + -1 + + 0 + 0 + 0 + + + + + + + true + + false + + false + false + false + ReflectionMetadataEnum + 5000 + + false + -1 + + 0 + 0 + 0 + + + + + + + true + + false + + false + false + false + ReflectionMetadataEnumItem + 5000 + + false + -1 + + 0 + 0 + 0 + + + + + + + true + + false + + false + false + false + ReflectionMetadataMember + 5000 + + false + -1 + + 0 + 0 + 0 + + + + + + + ReflectionMetadataProperties + -1 + + + + + + + ReflectionMetadataYieldFunctions + -1 + + + + + + + RemoteEvent + -1 + + + + + + + RemoteFunction + -1 + + + + + + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 10 + 0 + 50 + + 70 + RenderingTest + 21 + false + -1 + + + + + + + + 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 + + + + + + + + 1 + 1 + 1 + + true + Smoke + -1 + + 0.5 + 1 + 1 + + + + + + 10 + false + Sound + false + 1 + false + 0 + null + + -1 + + 0 + 0.5 + 10000 + + + + + + 0.150000006 + true + 0.5 + ChorusSoundEffect + 0 + 0.5 + -1 + + + + + + 0.100000001 + + true + 0 + CompressorSoundEffect + 0 + 40 + 0.100000001 + null + -1 + + -40 + + + + + + true + 0.75 + DistortionSoundEffect + 0 + -1 + + + + + + + 1 + 0 + true + 0.5 + EchoSoundEffect + 0 + -1 + + 0 + + + + + + true + 0 + -20 + -10 + EqualizerSoundEffect + 0 + -1 + + + + + + + 0.449999988 + true + 0.850000024 + FlangeSoundEffect + 0 + 5 + -1 + + + + + + + true + PitchShiftSoundEffect + 1.25 + 0 + -1 + + + + + + + 1.5 + 1 + 1 + -6 + true + ReverbSoundEffect + 0 + -1 + + 0 + + + + + + 1 + 0.5 + true + 5 + TremoloSoundEffect + 0 + -1 + + + + + + + true + Sparkles + -1 + + 0.564705908 + 0.0980392247 + 1 + + + + + + + + StarterGear + -1 + + + + + + + true + Team + -1 + + 1 + + + + + + TeleportOptions + + + false + -1 + + + + + + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + TerrainRegion + AQU= + -1 + + + + + + null + null + + 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 + 0 1 0 1 1 0 + + + + + + Tween + -1 + + + + + + 1 + 0 + + 0 + UIAspectRatioConstraint + -1 + + + + + + + + 0 + 8 + + UICorner + -1 + + + + + + + 0 1 1 1 0 1 1 1 1 0 + true + UIGradient + + 0 + 0 + + 0 + -1 + + 0 0 0 1 0 0 + + + + + + + 0 + 5 + 0 + 5 + + + 0 + 100 + 0 + 100 + + 0 + 0 + 1 + UIGridLayout + 0 + -1 + 0 + + 1 + + + + + + 1 + 1 + UIListLayout + + 0 + 0 + + 0 + -1 + + 1 + + + + + true + + false + 1 + 2 + 0 + true + 1 + UIPageLayout + + 0 + 0 + + true + 0 + -1 + + true + 1 + 1 + + + + + + 1 + false + false + 1 + 0 + UITableLayout + + 0 + 0 + 0 + 0 + + 0 + -1 + + 1 + + + + + + UIScale + 1 + -1 + + + + + + 0 + + + 0 + 0 + 0 + + true + 0 + UIStroke + -1 + + 1 + 0 + + + + + + BinaryStringValue + -1 + + + + + + + + BoolValue + -1 + + false + + + + + + BrickColorValue + -1 + + 194 + + + + + + CFrameValue + -1 + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + + + + + Color3Value + -1 + + + 0 + 0 + 0 + + + + + + + 1 + 0 + DoubleConstrainedValue + -1 + + 0 + + + + + + 10 + 0 + IntConstrainedValue + -1 + + 0 + + + + + + IntValue + -1 + + 0 + + + + + + NumberValue + -1 + + 0 + + + + + + ObjectValue + -1 + + null + + + + + + RayValue + -1 + + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + + + + + + StringValue + -1 + + + + + + + + + INF + INF + + + 0 + 0 + + UISizeConstraint + -1 + + + + + + false + + 0 + 0 + + + true + 0 + 0 + + 0.639215708 + 0.635294139 + 0.647058845 + + 0 + + 0.105882362 + 0.164705887 + 0.207843155 + + 0 + 1 + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 2 + 0 + + true + false + 0 + 0 + 0 + rbxasset://textures/ui/Scroll/scroll-middle.png + ScrollingFrame + null + null + null + null + + 0 + 0 + 0 + 0 + + null + 0 + + 1 + 1 + 1 + + 0 + 12 + 4 + true + true + null + + 0 + 0 + 0 + 0 + + 0 + -1 + + rbxasset://textures/ui/Scroll/scroll-top.png + 0 + 0 + true + 1 + + + + + + + Animation + -1 + + + + + + + true + BlurEffect + 24 + -1 + + + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + Model + false + null + -1 + + + + + + + + StandalonePluginScripts + -1 + + + + + + + Skin + 226 + -1 + + + + + + null + null + + 3 + 200 + 0 + true + 1 + false + INF + 5 + 0 + SpringConstraint + 0.400000006 + -1 + 0 + + 0.100000001 + false + + + + + + 2 + 2 + + FileMesh + + 0 + 0 + 0 + + + 1 + 1 + 1 + + -1 + + + + 1 + 1 + 1 + + + + + + + ForceField + -1 + + true + + + false @@ -7360,6 +8090,20 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 256 25 VehicleSeat + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 -0.5 0.5 @@ -7396,51 +8140,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - WorldModel - null - -1 - - - - + @@ -7450,66 +8150,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - 0 - 0 - NumberPose - -1 - - 0 - 1 - - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - 0 - Pose - -1 - - 1 - - - - - - true - 0.400000006 - BloomEffect - 24 - -1 - - 0.949999988 - - - - - - true - BlurEffect - 24 - -1 - - - - + true @@ -7522,409 +8163,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - Interact - - true - true - true - 0 - 1000 - 0 - 101 - 10 - ProximityPrompt - - true - null - -1 - 0 - - - 0 - 0 - - - - - - - - ReflectionMetadataCallbacks - -1 - - - - - - - ReflectionMetadataClasses - -1 - - - - - - - ReflectionMetadataEnums - -1 - - - - - - - ReflectionMetadataEvents - -1 - - - - - - - ReflectionMetadataFunctions - -1 - - - - - - - true - - false - - false - false - 0 - 2147483647 - true - false - ReflectionMetadataClass - - 5000 - - false - -1 - - 0 - 0 - 0 - - - - - - - true - - false - - false - false - false - ReflectionMetadataEnum - 5000 - - false - -1 - - 0 - 0 - 0 - - - - - - - true - - false - - false - false - false - ReflectionMetadataEnumItem - 5000 - - false - -1 - - 0 - 0 - 0 - - - - - - - true - - false - - false - false - false - ReflectionMetadataMember - 5000 - - false - -1 - - 0 - 0 - 0 - - - - - - - ReflectionMetadataProperties - -1 - - - - - - - ReflectionMetadataYieldFunctions - -1 - - - - - - - RemoteEvent - -1 - - - - - - - RemoteFunction - -1 - - - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 10 - 0 - 50 - - 70 - RenderingTest - 21 - false - -1 - - - - - - - - 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 - - - - - - - - 1 - 1 - 1 - - true - Smoke - -1 - - 0.5 - 1 - 1 - - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - -1 - - 0 - 0.5 - 10000 - - - - - - 0.150000006 - true - 0.5 - ChorusSoundEffect - 0 - 0.5 - -1 - - - - - - 0.100000001 - - true - 0 - CompressorSoundEffect - 0 - 40 - 0.100000001 - null - -1 - - -40 - - - - - - true - 0.75 - DistortionSoundEffect - 0 - -1 - - - - - - - 1 - 0 - true - 0.5 - EchoSoundEffect - 0 - -1 - - 0 - - - - - - true - 0 - -20 - -10 - EqualizerSoundEffect - 0 - -1 - - - - - - - 0.449999988 - true - 0.850000024 - FlangeSoundEffect - 0 - 5 - -1 - - - - - - - true - PitchShiftSoundEffect - 1.25 - 0 - -1 - - - - - - - 1.5 - 1 - 1 - -6 - true - ReverbSoundEffect - 0 - -1 - - 0 - - - - - - 1 - 0.5 - true - 5 - TremoloSoundEffect - 0 - -1 - - - - + SoundGroup @@ -7933,15 +8172,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0.5 - - - - StandalonePluginScripts - -1 - - - - + 0 @@ -7955,198 +8186,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - TeleportOptions - - - false - -1 - - - - - - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - TerrainRegion - AQU= - -1 - - - - - - null - null - - 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 - 0 1 0 1 1 0 - - - - - - Tween - -1 - - - - - - 1 - 0 - - 0 - UIAspectRatioConstraint - -1 - - - - - - - - INF - INF - - - 0 - 0 - - UISizeConstraint - -1 - - - - - - - 0 1 1 1 0 1 1 1 1 0 - true - UIGradient - - 0 - 0 - - 0 - -1 - - 0 0 0 1 0 0 - - - - - - - 0 - 5 - 0 - 5 - - - 0 - 100 - 0 - 100 - - 0 - 0 - 1 - UIGridLayout - 0 - -1 - 0 - - 1 - - - - - - 1 - 1 - UIListLayout - - 0 - 0 - - 0 - -1 - - 1 - - - - - true - - false - 1 - 2 - 0 - true - 1 - UIPageLayout - - 0 - 0 - - true - 0 - -1 - - true - 1 - 1 - - - - - - 1 - false - false - 1 - 0 - UITableLayout - - 0 - 0 - 0 - 0 - - 0 - -1 - - 1 - - - + UIPadding @@ -8170,361 +8210,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - 0 - - - 0 - 0 - 0 - - true - 0 - UIStroke - -1 - - 1 - 0 - - - - - - BinaryStringValue - -1 - - - - - - - - BoolValue - -1 - - false - - - - - - BrickColorValue - -1 - - 194 - - - - - - CFrameValue - -1 - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - - - - - Color3Value - -1 - - - 0 - 0 - 0 - - - - - - - 1 - 0 - DoubleConstrainedValue - -1 - - 0 - - - - - - 10 - 0 - IntConstrainedValue - -1 - - 0 - - - - - - IntValue - -1 - - 0 - - - - - - NumberValue - -1 - - 0 - - - - - - ObjectValue - -1 - - null - - - - - - RayValue - -1 - - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - - - StringValue - -1 - - - - - - - - Vector3Value - -1 - - - 0 - 0 - 0 - - - - - - - 100 - 1 - UITextSizeConstraint - -1 - - - - - - true - - 0 - 0 - - - true - 0 - - 0.639215708 - 0.635294139 - 0.647058845 - - 0 - - 0.105882362 - 0.164705887 - 0.207843155 - - 0 - 1 - true - false - false - 0 - 0 - 1 - false - TextBox - null - null - null - null - - 0.699999988 - 0.699999988 - 0.699999988 - - - - 0 - 0 - 0 - 0 - - false - null - 0 - true - null - true - - 0 - 0 - 0 - 0 - - 0 - -1 - - TextBox - - 0.105882362 - 0.164705887 - 0.207843155 - - true - false - 8 - - 0 - 0 - 0 - - 1 - 0 - 0 - false - 2 - 1 - true - 1 - - - - - - AnimationController - -1 - - - - - - - 0 - 0 - true - ColorCorrectionEffect - 0 - -1 - - - 1 - 1 - 1 - - - - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - Actor - null - -1 - - - - - - - StarterGear - -1 - - - - - - - - 32 - ClickDetector - -1 - - - - + null null @@ -8543,7 +8229,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> false - + 2 @@ -8571,7 +8257,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - + ? @@ -8581,131 +8267,7 @@ dFN0cmluZwIEAAAAVGVzdA==]]> - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - Model - null - -1 - - - - - - - 0 - 0 - 0 - - - 0 1 1 1 0 1 1 1 1 0 - 0 - 1 - true - 5 10 - 0 - 0 - false - ParticleEmitter - 0 - 20 - 0 0 - 0 0 - 0 1 0 1 1 0 - -1 - 5 5 - - 0 - 0 - - - rbxasset://textures/particles/sparkles_main.dds - 1 - 0 0 0 1 0 0 - 0 - 0 - - - - - - true - 0.25 - SunRaysEffect - -1 - 1 - - - - - - - true - Sparkles - -1 - - 0.564705908 - 0.0980392247 - 1 - - - - - - - - true - Team - -1 - - 1 - - - - - - UIScale - 1 - -1 - - - - + @@ -8722,7 +8284,6 @@ dFN0cmluZwIEAAAAVGVzdA==]]> 0 1 - true WeldConstraint null null diff --git a/UnitTest/RobloxFileFormat.UnitTest.csproj b/UnitTest/RobloxFileFormat.UnitTest.csproj index 22f9de0..7c39e46 100644 --- a/UnitTest/RobloxFileFormat.UnitTest.csproj +++ b/UnitTest/RobloxFileFormat.UnitTest.csproj @@ -27,5 +27,5 @@ - + diff --git a/XmlFormat/XmlRobloxFile.cs b/XmlFormat/XmlRobloxFile.cs index f727cae..3d4fd17 100644 --- a/XmlFormat/XmlRobloxFile.cs +++ b/XmlFormat/XmlRobloxFile.cs @@ -65,6 +65,10 @@ namespace RobloxFiles if (child.Name == "Item") { Instance item = XmlRobloxFileReader.ReadInstance(child, this); + + if (item == null) + continue; + item.Parent = this; } else if (child.Name == "SharedStrings")