From f8c914dd0b8ea7f4a3ac4da800014bd2442706ef Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 14 Apr 2022 20:52:05 -0500 Subject: [PATCH] 0.522.0.5220281 (+ Font Type Support & Bug Fixes) --- BinaryFormat/Chunks/PROP.cs | 38 + DataTypes/CFrame.cs | 111 +- DataTypes/FontFace.cs | 52 + DataTypes/Rect.cs | 4 +- DataTypes/Vector2.cs | 55 +- DataTypes/Vector3.cs | 48 +- Generated/Classes.cs | 479 +- Generated/Enums.cs | 34 +- Interfaces/IXmlPropertyToken.cs | 2 +- Plugins/GenerateApiDump.rbxm | Bin 16338 -> 17926 bytes Plugins/GenerateApiDump/Formatting.lua | 219 +- Plugins/GenerateApiDump/PropertyPatches.lua | 114 +- Plugins/GenerateApiDump/init.server.lua | 60 +- RobloxFileFormat.csproj | 2 + Tokens/Font.cs | 89 + Tree/Attributes.cs | 3 +- Tree/Instance.cs | 7 + Tree/Property.cs | 44 +- UnitTest/Files/Binary.rbxl | Bin 290042 -> 305429 bytes UnitTest/Files/Xml.rbxlx | 4839 ++++++++++--------- XmlFormat/XmlFileWriter.cs | 8 + 21 files changed, 3577 insertions(+), 2631 deletions(-) create mode 100644 DataTypes/FontFace.cs create mode 100644 Tokens/Font.cs diff --git a/BinaryFormat/Chunks/PROP.cs b/BinaryFormat/Chunks/PROP.cs index 20a1f1d..0e6f332 100644 --- a/BinaryFormat/Chunks/PROP.cs +++ b/BinaryFormat/Chunks/PROP.cs @@ -662,6 +662,23 @@ namespace RobloxFiles.BinaryFormat.Chunks break; } + case PropertyType.FontFace: + { + readProperties(i => + { + 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(); + + return new FontFace(family, weight, style); + }); + + break; + } default: { RobloxFile.LogError($"Unhandled property type: {Type} in {this}!"); @@ -1283,6 +1300,27 @@ namespace RobloxFiles.BinaryFormat.Chunks break; } + case PropertyType.FontFace: + { + props.ForEach(prop => + { + var font = prop.CastValue(); + + string family = font.Family; + writer.WriteString(font.Family); + + if (family.EndsWith(".otf") || family.EndsWith(".ttf")) + return; + + var weight = (ushort)font.Weight; + writer.Write(weight); + + var style = (byte)font.Style; + writer.Write(style); + }); + + break; + } default: { RobloxFile.LogError($"Unhandled property type: {Type} in {this}!"); diff --git a/DataTypes/CFrame.cs b/DataTypes/CFrame.cs index fb5305a..ca45ca2 100644 --- a/DataTypes/CFrame.cs +++ b/DataTypes/CFrame.cs @@ -1,12 +1,11 @@ using System; using System.Diagnostics.Contracts; -using RobloxFiles.Enums; namespace RobloxFiles.DataTypes { public class CFrame { - private float m14, m24, m34; + private readonly float m14, m24, m34; private readonly float m11 = 1, m12, m13; private readonly float m21, m22 = 1, m23; @@ -18,28 +17,23 @@ namespace RobloxFiles.DataTypes public float Y => m24; public float Z => m34; - public Vector3 Position - { - get => new Vector3(X, Y, Z); + public Vector3 Position => new Vector3(m41, m42, m43); + public CFrame Rotation => (this - Position); - set - { - Contract.Requires(value != null); + public Vector3 XVector => new Vector3(m11, m21, m31); + public Vector3 YVector => new Vector3(m12, m22, m32); + public Vector3 ZVector => new Vector3(m13, m23, m33); - m14 = value.X; - m24 = value.Y; - m34 = value.Z; - } - } - - public Vector3 RightVector => new Vector3( m11, m21, m31); - public Vector3 UpVector => new Vector3( m12, m22, m32); - public Vector3 LookVector => new Vector3(-m13, -m23, -m33); + public Vector3 RightVector => XVector; + public Vector3 UpVector => YVector; + public Vector3 LookVector => -ZVector; public Vector3 ColumnX => new Vector3(m11, m12, m13); public Vector3 ColumnY => new Vector3(m21, m22, m23); public Vector3 ColumnZ => new Vector3(m31, m32, m33); + public static readonly CFrame Identity = new CFrame(); + public override int GetHashCode() { var components = GetComponents(); @@ -96,23 +90,20 @@ namespace RobloxFiles.DataTypes public CFrame(Vector3 eye, Vector3 look) { - Vector3 zAxis = (eye - look).Unit; - Vector3 xAxis = Vector3.Up.Cross(zAxis); - Vector3 yAxis = zAxis.Cross(xAxis); + Vector3 zAxis = (eye - look).Unit, + xAxis = Vector3.Up.Cross(zAxis), + yAxis = zAxis.Cross(xAxis); if (xAxis.Magnitude == 0) { + xAxis = Vector3.z; + yAxis = Vector3.x; + zAxis = Vector3.y; + if (zAxis.Y < 0) { - xAxis = new Vector3(0, 0, -1); - yAxis = new Vector3(1, 0, 0); - zAxis = new Vector3(0, -1, 0); - } - else - { - xAxis = new Vector3(0, 0, 1); - yAxis = new Vector3(1, 0, 0); - zAxis = new Vector3(0, 1, 0); + xAxis = -xAxis; + zAxis = -zAxis; } } @@ -123,9 +114,9 @@ namespace RobloxFiles.DataTypes public CFrame(float nx, float ny, float nz, float i, float j, float k, float w) { - float ii = i * i; - float jj = j * j; - float kk = k * k; + float ii = i * i, + jj = j * j, + kk = k * k; m14 = nx; m24 = ny; @@ -308,18 +299,18 @@ namespace RobloxFiles.DataTypes public static CFrame FromAxisAngle(Vector3 axis, float theta) { - Vector3 u = VectorAxisAngle(axis, Vector3.Up, theta); - Vector3 b = VectorAxisAngle(axis, Vector3.Back, theta); - Vector3 r = VectorAxisAngle(axis, Vector3.Right, theta); + Vector3 r = VectorAxisAngle(axis, Vector3.x, theta), + u = VectorAxisAngle(axis, Vector3.y, theta), + b = VectorAxisAngle(axis, Vector3.z, 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.Right, x), - cfy = FromAxisAngle(Vector3.Up, y), - cfz = FromAxisAngle(Vector3.Back, z); + CFrame cfx = FromAxisAngle(Vector3.x, x), + cfy = FromAxisAngle(Vector3.y, y), + cfz = FromAxisAngle(Vector3.z, z); return cfx * cfy * cfz; } @@ -386,7 +377,13 @@ namespace RobloxFiles.DataTypes public float[] GetComponents() { - return new float[] { m14, m24, m34, m11, m12, m13, m21, m22, m23, m31, m32, m33 }; + return new float[] + { + m14, m24, m34, + m11, m12, m13, + m21, m22, m23, + m31, m32, m33 + }; } public EulerAngles ToEulerAngles() => new EulerAngles @@ -411,28 +408,27 @@ namespace RobloxFiles.DataTypes public bool IsAxisAligned() { - float[] matrix = GetComponents(); - - byte sum0 = 0, - sum1 = 0; - - for (int i = 3; i < 12; i++) + var tests = new float[3] { - float t = Math.Abs(matrix[i]); + XVector.Dot(Vector3.x), + YVector.Dot(Vector3.y), + ZVector.Dot(Vector3.z) + }; - if (t.FuzzyEquals(1, 1e-8f)) - { - // Approximately ±1 - sum1++; - } - else if (t.FuzzyEquals(0, 1e-8f)) - { - // Approximately ±0 - sum0++; - } + foreach (var test in tests) + { + float dot = Math.Abs(test); + + if (dot.FuzzyEquals(1)) + continue; + + if (dot.FuzzyEquals(0)) + continue; + + return false; } - return (sum0 == 6 && sum1 == 3); + return true; } private static bool IsLegalOrientId(int orientId) @@ -450,7 +446,6 @@ namespace RobloxFiles.DataTypes int xNormal = ColumnX.ToNormalId(); int yNormal = ColumnY.ToNormalId(); - int orientId = (6 * xNormal) + yNormal; if (!IsLegalOrientId(orientId)) diff --git a/DataTypes/FontFace.cs b/DataTypes/FontFace.cs new file mode 100644 index 0000000..7ba39ef --- /dev/null +++ b/DataTypes/FontFace.cs @@ -0,0 +1,52 @@ +using RobloxFiles.Enums; + +namespace RobloxFiles.DataTypes +{ + // Implementation of Roblox's Font datatype. + // Renamed to FontFace to avoid disambiguation with System.Font and the Font enum. + + public class FontFace + { + public readonly Content Family = "rbxasset://fonts/families/LegacyArial.json"; + public readonly FontWeight Weight = FontWeight.Regular; + public readonly FontStyle Style = FontStyle.Normal; + + public FontFace(Content family, FontWeight weight = FontWeight.Regular, FontStyle style = FontStyle.Normal) + { + Family = family; + Weight = weight; + Style = style; + } + + public override string ToString() + { + return $"Font {{ Family = {Family}, Weight = {Weight}, Style = {Style}}}"; + } + + public override int GetHashCode() + { + int hash = Family.GetHashCode() + ^ Weight.GetHashCode() + ^ Style.GetHashCode(); + + return hash; + } + + public override bool Equals(object obj) + { + if (!(obj is FontFace font)) + return false; + + if (Family != font.Family) + return false; + + if (Weight != font.Weight) + return false; + + if (Style != font.Style) + return false; + + return true; + } + } +} diff --git a/DataTypes/Rect.cs b/DataTypes/Rect.cs index a43bd90..a967582 100644 --- a/DataTypes/Rect.cs +++ b/DataTypes/Rect.cs @@ -12,8 +12,8 @@ public Rect(Vector2 min = null, Vector2 max = null) { - Min = min ?? Vector2.Zero; - Max = max ?? Vector2.Zero; + Min = min ?? Vector2.zero; + Max = max ?? Vector2.zero; } public Rect(float minX, float minY, float maxX, float maxY) diff --git a/DataTypes/Vector2.cs b/DataTypes/Vector2.cs index e62068c..a3083a6 100644 --- a/DataTypes/Vector2.cs +++ b/DataTypes/Vector2.cs @@ -1,28 +1,14 @@ -using System; +#pragma warning disable IDE1006 // Naming Styles +using System; namespace RobloxFiles.DataTypes { + public class Vector2 { public readonly float X, Y; public override string ToString() => $"{X}, {Y}"; - public float Magnitude - { - get - { - float product = Dot(this); - double magnitude = Math.Sqrt(product); - - return (float)magnitude; - } - } - - public Vector2 Unit - { - get { return this / Magnitude; } - } - public Vector2(float x = 0, float y = 0) { X = x; @@ -34,18 +20,21 @@ namespace RobloxFiles.DataTypes X = coords.Length > 0 ? coords[0] : 0; Y = coords.Length > 1 ? coords[1] : 0; } + + public float Magnitude => (float)Math.Sqrt(X*X + Y*Y); + public Vector2 Unit => this / Magnitude; private delegate Vector2 Operator(Vector2 a, Vector2 b); private static Vector2 UpcastFloatOp(Vector2 vec, float num, Operator upcast) { - Vector2 numVec = new Vector2(num, num); + var numVec = new Vector2(num, num); return upcast(vec, numVec); } private static Vector2 UpcastFloatOp(float num, Vector2 vec, Operator upcast) { - Vector2 numVec = new Vector2(num, num); + var numVec = new Vector2(num, num); return upcast(numVec, vec); } @@ -70,29 +59,17 @@ namespace RobloxFiles.DataTypes public static Vector2 operator /(Vector2 v, float n) => UpcastFloatOp(v, n, div); public static Vector2 operator /(float n, Vector2 v) => UpcastFloatOp(n, v, div); - public static Vector2 operator -(Vector2 v) - { - return new Vector2(-v.X, -v.Y); - } + public static Vector2 operator -(Vector2 v) => new Vector2(-v.X, -v.Y); - public static Vector2 Zero => new Vector2(0, 0); + public static Vector2 zero => new Vector2(0, 0); + public static Vector2 one => new Vector2(1, 1); - public float Dot(Vector2 other) - { - float dotX = X * other.X; - float dotY = Y * other.Y; - - return dotX + dotY; - } - - public Vector2 Cross(Vector2 other) - { - float crossX = X * other.Y; - float crossY = Y * other.X; - - return new Vector2(crossX, crossY); - } + public static Vector2 x => new Vector2(1, 0); + public static Vector2 y => new Vector2(0, 1); + public float Dot(Vector2 other) => (X * other.X) + (Y * other.Y); + public Vector2 Cross(Vector2 other) => new Vector2(X * other.Y, Y * other.X); + public Vector2 Lerp(Vector2 other, float t) { return this + (other - this) * t; diff --git a/DataTypes/Vector3.cs b/DataTypes/Vector3.cs index 05cd072..cbd9280 100644 --- a/DataTypes/Vector3.cs +++ b/DataTypes/Vector3.cs @@ -1,5 +1,4 @@ using System; -using System.Text; using RobloxFiles.Enums; namespace RobloxFiles.DataTypes @@ -19,7 +18,7 @@ namespace RobloxFiles.DataTypes return (float)magnitude; } } - + public Vector3 Unit { get { return this / Magnitude; } @@ -60,7 +59,7 @@ namespace RobloxFiles.DataTypes } private delegate Vector3 Operator(Vector3 a, Vector3 b); - + private static Vector3 UpcastFloatOp(Vector3 vec, float num, Operator upcast) { Vector3 numVec = new Vector3(num, num, num); @@ -73,36 +72,39 @@ namespace RobloxFiles.DataTypes return upcast(numVec, vec); } - private static readonly Operator add = new Operator((a, b) => new Vector3(a.X + b.X, a.Y + b.Y, a.Z + b.Z)); - private static readonly Operator sub = new Operator((a, b) => new Vector3(a.X - b.X, a.Y - b.Y, a.Z - b.Z)); - private static readonly Operator mul = new Operator((a, b) => new Vector3(a.X * b.X, a.Y * b.Y, a.Z * b.Z)); - private static readonly Operator div = new Operator((a, b) => new Vector3(a.X / b.X, a.Y / b.Y, a.Z / b.Z)); + private static readonly Operator add = (a, b) => new Vector3(a.X + b.X, a.Y + b.Y, a.Z + b.Z); + private static readonly Operator sub = (a, b) => new Vector3(a.X - b.X, a.Y - b.Y, a.Z - b.Z); + private static readonly Operator mul = (a, b) => new Vector3(a.X * b.X, a.Y * b.Y, a.Z * b.Z); + private static readonly Operator div = (a, b) => new Vector3(a.X / b.X, a.Y / b.Y, a.Z / b.Z); public static Vector3 operator +(Vector3 a, Vector3 b) => add(a, b); - public static Vector3 operator +(Vector3 v, float n) => UpcastFloatOp(v, n, add); - public static Vector3 operator +(float n, Vector3 v) => UpcastFloatOp(n, v, add); + public static Vector3 operator +(Vector3 v, float n) => UpcastFloatOp(v, n, add); + public static Vector3 operator +(float n, Vector3 v) => UpcastFloatOp(n, v, add); public static Vector3 operator -(Vector3 a, Vector3 b) => sub(a, b); - public static Vector3 operator -(Vector3 v, float n) => UpcastFloatOp(v, n, sub); - public static Vector3 operator -(float n, Vector3 v) => UpcastFloatOp(n, v, sub); + public static Vector3 operator -(Vector3 v, float n) => UpcastFloatOp(v, n, sub); + public static Vector3 operator -(float n, Vector3 v) => UpcastFloatOp(n, v, sub); public static Vector3 operator *(Vector3 a, Vector3 b) => mul(a, b); - public static Vector3 operator *(Vector3 v, float n) => UpcastFloatOp(v, n, mul); - public static Vector3 operator *(float n, Vector3 v) => UpcastFloatOp(n, v, mul); + public static Vector3 operator *(Vector3 v, float n) => UpcastFloatOp(v, n, mul); + public static Vector3 operator *(float n, Vector3 v) => UpcastFloatOp(n, v, mul); public static Vector3 operator /(Vector3 a, Vector3 b) => div(a, b); - public static Vector3 operator /(Vector3 v, float n) => UpcastFloatOp(v, n, div); - public static Vector3 operator /(float n, Vector3 v) => UpcastFloatOp(n, v, div); + public static Vector3 operator /(Vector3 v, float n) => UpcastFloatOp(v, n, div); + public static Vector3 operator /(float n, Vector3 v) => UpcastFloatOp(n, v, div); - public static Vector3 operator -(Vector3 v) - { - return new Vector3(-v.X, -v.Y, -v.Z); - } + public static Vector3 operator -(Vector3 v) => new Vector3(-v.X, -v.Y, -v.Z); + + public static readonly Vector3 zero = new Vector3(0, 0, 0); + public static readonly Vector3 one = new Vector3(1, 1, 1); - public static readonly Vector3 Zero = new Vector3(0, 0, 0); - public static readonly Vector3 Right = new Vector3(1, 0, 0); - public static readonly Vector3 Up = new Vector3(0, 1, 0); - public static readonly Vector3 Back = new Vector3(0, 0, 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 Vector3 Right => x; + public static Vector3 Up => y; + public static Vector3 Back => z; public float Dot(Vector3 other) { diff --git a/Generated/Classes.cs b/Generated/Classes.cs index e31bcda..574c2f7 100644 --- a/Generated/Classes.cs +++ b/Generated/Classes.cs @@ -1,5 +1,5 @@ // Auto-generated list of creatable Roblox classes. -// Updated as of 0.514.0.5140398 +// Updated as of 0.522.0.5220281 using System; @@ -106,6 +106,12 @@ namespace RobloxFiles public class AnimationRigData : Instance { + public byte[] label = Convert.FromBase64String("AQAAAAEAAAAAAAAA"); + public byte[] name = Convert.FromBase64String("AQAAAAEAAAAAAAAA"); + public byte[] parent = Convert.FromBase64String("AQAAAAEAAAAAAA=="); + public byte[] postTransform = Convert.FromBase64String("AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="); + public byte[] preTransform = Convert.FromBase64String("AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="); + public byte[] transform = Convert.FromBase64String("AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="); } public class Animator : Instance @@ -157,9 +163,9 @@ namespace RobloxFiles public Color3 Color = Color3.FromRGB(199, 170, 107); public Color3 Decay = Color3.FromRGB(92, 60, 13); public float Density = 0.395f; - public float Glare; - public float Haze; - public float Offset; + public float Glare = 0; + public float Haze = 0; + public float Offset = 0; } public class Attachment : Instance @@ -271,12 +277,12 @@ namespace RobloxFiles public float Puffiness = 1; public Content ReferenceMeshId = ""; public CFrame ReferenceOrigin = new CFrame(); - public float ShrinkFactor; + public float ShrinkFactor = 0; } public class WrapTarget : BaseWrap { - public float Stiffness; + public float Stiffness = 0; } public class Beam : Instance @@ -285,12 +291,12 @@ namespace RobloxFiles public Attachment Attachment1; public float Brightness = 1; public ColorSequence Color = new ColorSequence(1, 1, 1); - public float CurveSize0; - public float CurveSize1; + public float CurveSize0 = 0; + public float CurveSize1 = 0; public bool Enabled = true; public bool FaceCamera; - public float LightEmission; - public float LightInfluence; + public float LightEmission = 0; + public float LightInfluence = 0; public int Segments = 10; public Content Texture = ""; public float TextureLength = 1; @@ -299,7 +305,7 @@ namespace RobloxFiles public NumberSequence Transparency = new NumberSequence(0.5f); public float Width0 = 1; public float Width1 = 1; - public float ZOffset; + public float ZOffset = 0; } public class BindableEvent : Instance @@ -595,10 +601,10 @@ namespace RobloxFiles public class CharacterMesh : CharacterAppearance { - public long BaseTextureId; + public long BaseTextureId = 0; public BodyPart BodyPart = BodyPart.Head; - public long MeshId; - public long OverlayTextureId; + public long MeshId = 0; + public long OverlayTextureId = 0; } public abstract class Clothing : CharacterAppearance @@ -703,7 +709,7 @@ namespace RobloxFiles public class AngularVelocity : Constraint { public Vector3 AngularVelocity_ = new Vector3(); - public float MaxTorque; + public float MaxTorque = 0; public bool ReactionTorqueEnabled; public ActuatorRelativeTo RelativeTo = ActuatorRelativeTo.World; } @@ -711,9 +717,9 @@ namespace RobloxFiles public class BallSocketConstraint : Constraint { public bool LimitsEnabled; - public float MaxFrictionTorqueXml; + public float MaxFrictionTorqueXml = 0; public float Radius = 0.15f; - public float Restitution; + public float Restitution = 0; public bool TwistLimitsEnabled; public float TwistLowerAngle = -45; public float TwistUpperAngle = 45; @@ -724,16 +730,16 @@ namespace RobloxFiles { public ActuatorType ActuatorType = ActuatorType.None; public float AngularResponsiveness = 45; - public float AngularSpeed; - public float AngularVelocity; + public float AngularSpeed = 0; + public float AngularVelocity = 0; public bool LimitsEnabled; public float LowerAngle = -45; public float MotorMaxAcceleration = float.MaxValue; - public float MotorMaxTorque; + public float MotorMaxTorque = 0; public float Radius = 0.15f; - public float Restitution; - public float ServoMaxTorque; - public float TargetAngle; + public float Restitution = 0; + public float ServoMaxTorque = 0; + public float TargetAngle = 0; public float UpperAngle = 45; } @@ -749,7 +755,7 @@ namespace RobloxFiles public class LinearVelocity : Constraint { public Vector3 LineDirection = new Vector3(1, 0, 0); - public float LineVelocity; + public float LineVelocity = 0; public float MaxForce = 1000; public Vector2 PlaneVelocity = new Vector2(); public Vector3 PrimaryTangentAxis = new Vector3(1, 0, 0); @@ -782,7 +788,7 @@ namespace RobloxFiles public class RopeConstraint : Constraint { public float Length = 5; - public float Restitution; + public float Restitution = 0; public float Thickness = 0.1f; public bool WinchEnabled; public float WinchForce = 10000; @@ -796,16 +802,16 @@ namespace RobloxFiles public ActuatorType ActuatorType = ActuatorType.None; public bool LimitsEnabled; public float LinearResponsiveness = 45; - public float LowerLimit; + public float LowerLimit = 0; public float MotorMaxAcceleration = float.MaxValue; - public float MotorMaxForce; - public float Restitution; - public float ServoMaxForce; + public float MotorMaxForce = 0; + public float Restitution = 0; + public float ServoMaxForce = 0; public float Size = 0.15f; - public float Speed; - public float TargetPosition; + public float Speed = 0; + public float TargetPosition = 0; public float UpperLimit = 5; - public float Velocity; + public float Velocity = 0; } public class CylindricalConstraint : SlidingBallConstraint @@ -813,16 +819,16 @@ namespace RobloxFiles public ActuatorType AngularActuatorType = ActuatorType.None; public bool AngularLimitsEnabled; public float AngularResponsiveness = 45; - public float AngularRestitution; - public float AngularSpeed; - public float AngularVelocity; - public float InclinationAngle; + public float AngularRestitution = 0; + public float AngularSpeed = 0; + public float AngularVelocity = 0; + public float InclinationAngle = 0; public float LowerAngle = -45; public float MotorMaxAngularAcceleration = float.MaxValue; - public float MotorMaxTorque; + public float MotorMaxTorque = 0; public bool RotationAxisVisible; - public float ServoMaxTorque; - public float TargetAngle; + public float ServoMaxTorque = 0; + public float TargetAngle = 0; public float UpperAngle = 45; } @@ -833,14 +839,14 @@ namespace RobloxFiles public class SpringConstraint : Constraint { public float Coils = 3; - public float Damping; + public float Damping = 0; public float FreeLength = 1; public bool LimitsEnabled; public float MaxForce = float.MaxValue; public float MaxLength = 5; - public float MinLength; + public float MinLength = 0; public float Radius = 0.4f; - public float Stiffness; + public float Stiffness = 0; public float Thickness = 0.1f; } @@ -862,7 +868,7 @@ namespace RobloxFiles public float MaxAngle = 45; public float MaxTorque = float.MaxValue; public float Radius = 0.4f; - public float Restitution; + public float Restitution = 0; public float Stiffness = 100; } @@ -871,7 +877,7 @@ namespace RobloxFiles public bool LimitsEnabled; public float MaxAngle = 45; public float Radius = 0.2f; - public float Restitution; + public float Restitution = 0; } public class VectorForce : Constraint @@ -947,7 +953,7 @@ namespace RobloxFiles public class CustomEvent : Instance { - public float PersistedCurrentValue; + public float PersistedCurrentValue = 0; } public class CustomEventReceiver : Instance @@ -966,9 +972,9 @@ namespace RobloxFiles public abstract class BevelMesh : DataModelMesh { - public float Bevel; - public float Bevel_Roundness; - public float Bulge; + public float Bevel = 0; + public float Bevel_Roundness = 0; + public float Bulge = 0; } public class BlockMesh : BevelMesh @@ -1052,7 +1058,7 @@ namespace RobloxFiles public string InitialPrompt = ""; public DialogPurpose Purpose = DialogPurpose.Help; public DialogTone Tone = DialogTone.Neutral; - public float TriggerDistance; + public float TriggerDistance = 0; public Vector3 TriggerOffset = new Vector3(); } @@ -1125,17 +1131,17 @@ namespace RobloxFiles public float Shiny = 20; [Obsolete] - public float Specular; + public float Specular = 0; public Content Texture = ""; - public float Transparency; + public float Transparency = 0; public int ZIndex = 1; } public class Texture : Decal { - public float OffsetStudsU; - public float OffsetStudsV; + public float OffsetStudsU = 0; + public float OffsetStudsV = 0; public float StudsPerTileU = 2; public float StudsPerTileV = 2; } @@ -1190,6 +1196,7 @@ namespace RobloxFiles public class FloatCurve : Instance { + public byte[] ValuesAndTimes = Convert.FromBase64String("AAAAAAEAAAAKAAAAAAAAFkUAAAAA"); } public class FlyweightService : Instance @@ -1305,7 +1312,7 @@ namespace RobloxFiles } public Color3 BackgroundColor3 = Color3.FromRGB(163, 162, 165); - public float BackgroundTransparency; + public float BackgroundTransparency = 0; [Obsolete] public BrickColor BorderColor @@ -1322,13 +1329,13 @@ namespace RobloxFiles [Obsolete] public bool Draggable; - public int LayoutOrder; + public int LayoutOrder = 0; public GuiObject NextSelectionDown; public GuiObject NextSelectionLeft; public GuiObject NextSelectionRight; public GuiObject NextSelectionUp; public UDim2 Position = new UDim2(); - public float Rotation; + public float Rotation = 0; public bool Selectable; public GuiObject SelectionImageObject; public UDim2 Size = new UDim2(); @@ -1347,7 +1354,7 @@ namespace RobloxFiles public class CanvasGroup : GuiObject { public Color3 GroupColor = new Color3(1, 1, 1); - public float GroupTransparency; + public float GroupTransparency = 0; } public class Frame : GuiObject @@ -1370,11 +1377,11 @@ namespace RobloxFiles public Color3 ImageColor3 = new Color3(1, 1, 1); public Vector2 ImageRectOffset = new Vector2(); public Vector2 ImageRectSize = new Vector2(); - public float ImageTransparency; + public float ImageTransparency = 0; public Content PressedImage = ""; public ResamplerMode ResampleMode = ResamplerMode.Default; public ScaleType ScaleType = ScaleType.Stretch; - public Rect SliceCenter = new Rect(new Vector2(), new Vector2()); + public Rect SliceCenter = new Rect(); public float SliceScale = 1; public UDim2 TileSize = new UDim2(1, 0, 1, 0); } @@ -1382,6 +1389,7 @@ namespace RobloxFiles public class TextButton : GuiButton { public Font Font = Font.Legacy; + public FontFace FontFace = new FontFace("rbxasset://fonts/families/LegacyArial.json"); [Obsolete] public FontSize FontSize @@ -1407,7 +1415,7 @@ namespace RobloxFiles public float TextSize = 8; public Color3 TextStrokeColor3 = new Color3(); public float TextStrokeTransparency = 1; - public float TextTransparency; + public float TextTransparency = 0; public TextTruncate TextTruncate = TextTruncate.None; [Obsolete] @@ -1443,10 +1451,10 @@ namespace RobloxFiles public Color3 ImageColor3 = new Color3(1, 1, 1); public Vector2 ImageRectOffset = new Vector2(); public Vector2 ImageRectSize = new Vector2(); - public float ImageTransparency; + public float ImageTransparency = 0; public ResamplerMode ResampleMode = ResamplerMode.Default; public ScaleType ScaleType = ScaleType.Stretch; - public Rect SliceCenter = new Rect(new Vector2(), new Vector2()); + public Rect SliceCenter = new Rect(); public float SliceScale = 1; public UDim2 TileSize = new UDim2(1, 0, 1, 0); } @@ -1454,6 +1462,7 @@ namespace RobloxFiles public class TextLabel : GuiLabel { public Font Font = Font.Legacy; + public FontFace FontFace = new FontFace("rbxasset://fonts/families/LegacyArial.json"); [Obsolete] public FontSize FontSize @@ -1479,7 +1488,7 @@ namespace RobloxFiles public float TextSize = 8; public Color3 TextStrokeColor3 = new Color3(); public float TextStrokeTransparency = 1; - public float TextTransparency; + public float TextTransparency = 0; public TextTruncate TextTruncate = TextTruncate.None; [Obsolete] @@ -1515,7 +1524,7 @@ namespace RobloxFiles public ScrollBarInset HorizontalScrollBarInset = ScrollBarInset.None; public Content MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png"; public Color3 ScrollBarImageColor3 = new Color3(1, 1, 1); - public float ScrollBarImageTransparency; + public float ScrollBarImageTransparency = 0; public int ScrollBarThickness = 12; public ScrollingDirection ScrollingDirection = ScrollingDirection.XY; public bool ScrollingEnabled = true; @@ -1528,6 +1537,7 @@ namespace RobloxFiles { public bool ClearTextOnFocus = true; public Font Font = Font.Legacy; + public FontFace FontFace = new FontFace("rbxasset://fonts/families/LegacyArial.json"); [Obsolete] public FontSize FontSize @@ -1558,7 +1568,7 @@ namespace RobloxFiles public float TextSize = 8; public Color3 TextStrokeColor3 = new Color3(); public float TextStrokeTransparency = 1; - public float TextTransparency; + public float TextTransparency = 0; public TextTruncate TextTruncate = TextTruncate.None; [Obsolete] @@ -1588,7 +1598,7 @@ namespace RobloxFiles { public bool Looped; public bool Playing; - public double TimePosition; + public double TimePosition = 0; public Content Video = ""; public float Volume = 1; } @@ -1599,7 +1609,7 @@ namespace RobloxFiles public CFrame CameraCFrame = new CFrame(); public float CameraFieldOfView = 70; public Color3 ImageColor3 = new Color3(1, 1, 1); - public float ImageTransparency; + public float ImageTransparency = 0; public Color3 LightColor = Color3.FromRGB(140, 140, 140); public Vector3 LightDirection = new Vector3(-1, -1, -1); } @@ -1618,12 +1628,12 @@ namespace RobloxFiles public bool AlwaysOnTop; public float Brightness = 1; public bool ClipsDescendants; - public float DistanceLowerLimit; - public float DistanceStep; + public float DistanceLowerLimit = 0; + public float DistanceStep = 0; public float DistanceUpperLimit = -1; public Vector3 ExtentsOffset = new Vector3(); public Vector3 ExtentsOffsetWorldSpace = new Vector3(); - public float LightInfluence; + public float LightInfluence = 0; public float MaxDistance = float.MaxValue; public Instance PlayerToHideFrom; public UDim2 Size = new UDim2(); @@ -1634,7 +1644,7 @@ namespace RobloxFiles public class ScreenGui : LayerCollector { - public int DisplayOrder; + public int DisplayOrder = 0; public bool IgnoreGuiInset; } @@ -1651,11 +1661,11 @@ namespace RobloxFiles public Vector2 CanvasSize = new Vector2(800, 600); public bool ClipsDescendants; public NormalId Face = NormalId.Front; - public float LightInfluence; + public float LightInfluence = 0; public float PixelsPerStud = 50; public SurfaceGuiSizingMode SizingMode = SurfaceGuiSizingMode.FixedSize; - public float ToolPunchThroughDistance; - public float ZOffset; + public float ToolPunchThroughDistance = 0; + public float ZOffset = 0; } public abstract class GuiBase3d : GuiBase @@ -1668,13 +1678,13 @@ namespace RobloxFiles } public Color3 Color3 = Color3.FromRGB(13, 105, 172); - public float Transparency; + public float Transparency = 0; public bool Visible = true; } public class FloorWire : GuiBase3d { - public float CycleOffset; + public float CycleOffset = 0; public BasePart From; public float StudsBetweenTextures = 4; public Content Texture = ""; @@ -1733,7 +1743,7 @@ namespace RobloxFiles { public float Angle = 360; public float Height = 1; - public float InnerRadius; + public float InnerRadius = 0; public float Radius = 1; } @@ -1842,6 +1852,8 @@ namespace RobloxFiles public class HiddenSurfaceRemovalAsset : Instance { + public byte[] HSRData; + public byte[] HSRMeshIdData; } public class Highlight : Instance @@ -1852,7 +1864,7 @@ namespace RobloxFiles public Color3 FillColor = new Color3(1, 0, 0); public float FillTransparency = 0.5f; public Color3 OutlineColor = new Color3(1, 1, 1); - public float OutlineTransparency; + public float OutlineTransparency = 0; } public class HttpRbxApiService : Instance @@ -1895,7 +1907,7 @@ namespace RobloxFiles public float HealthDisplayDistance = 100; public HumanoidHealthDisplayType HealthDisplayType = HumanoidHealthDisplayType.DisplayWhenDamaged; public float Health_XML = 100; - public float HipHeight; + public float HipHeight = 0; public Vector3 InternalBodyScale = new Vector3(1, 1, 1); public float InternalHeadScale = 1; public float JumpHeight = 7.2f; @@ -1922,42 +1934,42 @@ namespace RobloxFiles public string AccessoryBlob = "[]"; public string BackAccessory = ""; public float BodyTypeScale = 0.3f; - public long ClimbAnimation; + public long ClimbAnimation = 0; public float DepthScale = 1; public string EmotesDataInternal = "[]"; public string EquippedEmotesDataInternal = "[]"; - public long Face; + public long Face = 0; public string FaceAccessory = ""; - public long FallAnimation; + public long FallAnimation = 0; public string FrontAccessory = ""; - public long GraphicTShirt; + public long GraphicTShirt = 0; public string HairAccessory = ""; public string HatAccessory = ""; - public long Head; + public long Head = 0; public Color3 HeadColor = new Color3(); public float HeadScale = 1; public float HeightScale = 1; - public long IdleAnimation; - public long JumpAnimation; - public long LeftArm; + public long IdleAnimation = 0; + public long JumpAnimation = 0; + public long LeftArm = 0; public Color3 LeftArmColor = new Color3(); - public long LeftLeg; + public long LeftLeg = 0; public Color3 LeftLegColor = new Color3(); public string NeckAccessory = ""; - public long Pants; + public long Pants = 0; public float ProportionScale = 1; - public long RightArm; + public long RightArm = 0; public Color3 RightArmColor = new Color3(); - public long RightLeg; + public long RightLeg = 0; public Color3 RightLegColor = new Color3(); - public long RunAnimation; - public long Shirt; + public long RunAnimation = 0; + public long Shirt = 0; public string ShouldersAccessory = ""; - public long SwimAnimation; - public long Torso; + public long SwimAnimation = 0; + public long Torso = 0; public Color3 TorsoColor = new Color3(); public string WaistAccessory = ""; - public long WalkAnimation; + public long WalkAnimation = 0; public float WidthScale = 1; } @@ -2009,7 +2021,7 @@ namespace RobloxFiles public abstract class DynamicRotate : JointInstance { - public float BaseAngle; + public float BaseAngle = 0; } public class RotateP : DynamicRotate @@ -2042,8 +2054,8 @@ namespace RobloxFiles public class Motor : JointInstance { - public float DesiredAngle; - public float MaxVelocity; + public float DesiredAngle = 0; + public float MaxVelocity = 0; } public class Motor6D : Motor @@ -2060,10 +2072,10 @@ namespace RobloxFiles public class VelocityMotor : JointInstance { - public float CurrentAngle; - public float DesiredAngle; + public float CurrentAngle = 0; + public float DesiredAngle = 0; public Hole Hole; - public float MaxVelocity; + public float MaxVelocity = 0; } public class Weld : JointInstance @@ -2088,7 +2100,7 @@ namespace RobloxFiles public class Keyframe : Instance { - public float Time; + public float Time = 0; } public class KeyframeMarker : Instance @@ -2158,12 +2170,12 @@ namespace RobloxFiles public float Brightness = 1; public Color3 ColorShift_Bottom = new Color3(); public Color3 ColorShift_Top = new Color3(); - public float EnvironmentDiffuseScale; - public float EnvironmentSpecularScale; - public float ExposureCompensation; + public float EnvironmentDiffuseScale = 0; + public float EnvironmentSpecularScale = 0; + public float ExposureCompensation = 0; public Color3 FogColor = Color3.FromRGB(191, 191, 191); public float FogEnd = 100000; - public float FogStart; + public float FogStart = 0; public float GeographicLatitude = 41.7333f; public bool GlobalShadows; public Color3 OutdoorAmbient = Color3.FromRGB(127, 127, 127); @@ -2275,6 +2287,7 @@ namespace RobloxFiles public class MarkerCurve : Instance { + public byte[] ValuesAndTimes = Convert.FromBase64String("AAAAAAEAAAAKAAAAAAAAFkUAAAAA"); } public class MarketplaceService : Instance @@ -2292,23 +2305,53 @@ namespace RobloxFiles IsService = true; } + public string AsphaltName = "Asphalt"; + public string BasaltName = "Basalt"; public MaterialVariant Brick; + public string BrickName = "Brick"; public MaterialVariant Cobblestone; + public string CobblestoneName = "Cobblestone"; public MaterialVariant Concrete; + public string ConcreteName = "Concrete"; public MaterialVariant CorrodedMetal; + public string CorrodedMetalName = "CorrodedMetal"; + public string CrackedLavaName = "CrackedLava"; public MaterialVariant DiamondPlate; + public string DiamondPlateName = "DiamondPlate"; public MaterialVariant Fabric; + public string FabricName = "Fabric"; public MaterialVariant Foil; + public string FoilName = "Foil"; + public string GlacierName = "Glacier"; public MaterialVariant Granite; + public string GraniteName = "Granite"; public MaterialVariant Grass; + public string GrassName = "Grass"; + public string GroundName = "Ground"; public MaterialVariant Ice; + public string IceName = "Ice"; + public string LeafyGrassName = "LeafyGrass"; + public string LimestoneName = "Limestone"; public MaterialVariant Marble; + public string MarbleName = "Marble"; public MaterialVariant Metal; + public string MetalName = "Metal"; + public string MudName = "Mud"; + public string PavementName = "Pavement"; public MaterialVariant Pebble; + public string PebbleName = "Pebble"; public MaterialVariant Plastic; + public string PlasticName = "Plastic"; + public string RockName = "Rock"; + public string SaltName = "Salt"; public MaterialVariant Sand; + public string SandName = "Sand"; + public string SandstoneName = "Sandstone"; public MaterialVariant Slate; + public string SlateName = "Slate"; public MaterialVariant SmoothPlastic; + public string SmoothPlasticName = "SmoothPlastic"; + public string SnowName = "Snow"; public MaterialVariant TerrainAsphalt; public MaterialVariant TerrainBasalt; public MaterialVariant TerrainBrick; @@ -2332,7 +2375,9 @@ namespace RobloxFiles public MaterialVariant TerrainWoodPlanks; public bool Use2022Materials; public MaterialVariant Wood; + public string WoodName = "Wood"; public MaterialVariant WoodPlanks; + public string WoodPlanksName = "WoodPlanks"; } public class MaterialVariant : Instance @@ -2344,6 +2389,8 @@ namespace RobloxFiles public Content NormalMap = ""; public Content RoughnessMap = ""; public float StudsPerTile = 10; + public Content TexturePack0 = ""; + public Content TexturePack1 = ""; } public class MemStorageService : Instance @@ -2399,14 +2446,6 @@ namespace RobloxFiles { } - public class NetworkClient : NetworkPeer - { - public NetworkClient() - { - IsService = true; - } - } - public class NoCollisionConstraint : Instance { public bool Enabled = true; @@ -2463,7 +2502,7 @@ namespace RobloxFiles public bool CanQuery = true; public bool CanTouch = true; public bool CastShadow = true; - public int CollisionGroupId; + public int CollisionGroupId = 0; public Color3 Color { @@ -2505,15 +2544,23 @@ namespace RobloxFiles public bool Locked; public bool Massless; public Material Material = Material.Plastic; + + public string MaterialVariant + { + get => MaterialVariantSerialized; + set => MaterialVariantSerialized = value; + } + + public string MaterialVariantSerialized = ""; public CFrame PivotOffset = new CFrame(); public Vector3 Position { get => CFrame.Position; - set => CFrame.Position = value; + set => CFrame = new CFrame(value) * CFrame.Rotation; } - public float Reflectance; + public float Reflectance = 0; [Obsolete] public float RightParamA = -0.5f; @@ -2526,7 +2573,7 @@ namespace RobloxFiles [Obsolete] public InputType RightSurfaceInput = InputType.NoInput; - public int RootPriority; + public int RootPriority = 0; [Obsolete] public Vector3 RotVelocity = new Vector3(); @@ -2548,7 +2595,7 @@ namespace RobloxFiles [Obsolete] public InputType TopSurfaceInput = InputType.NoInput; - public float Transparency; + public float Transparency = 0; [Obsolete] public Vector3 Velocity = new Vector3(); @@ -2609,9 +2656,9 @@ namespace RobloxFiles public class SkateboardPlatform : Part { - public int Steer; + public int Steer = 0; public bool StickyWheels = true; - public int Throttle; + public int Throttle = 0; } public class SpawnLocation : Part @@ -2630,7 +2677,7 @@ namespace RobloxFiles public class Terrain : BasePart { public TerrainAcquisitionMethod AcquisitionMethod = TerrainAcquisitionMethod.None; - public byte[] ClusterGridV3 = Array.Empty(); + public byte[] ClusterGridV3; public bool Decoration; public byte[] MaterialColors = Convert.FromBase64String("AAAAAAAAan8/P39rf2Y/ilY+j35fi21PZmxvZbDqw8faiVpHOi4kHh4lZlw76JxKc3trhHtagcLgc4RKxr21zq2UlJSM"); public byte[] PhysicsGrid = Convert.FromBase64String("AgMAAAAAAAAAAAAAAAA="); @@ -2645,9 +2692,9 @@ namespace RobloxFiles public abstract class TriangleMeshPart : BasePart { public Vector3 InitialSize = new Vector3(1, 1, 1); - public byte[] LODData = Array.Empty(); + public byte[] LODData; public SharedString PhysicalConfigData = SharedString.FromBase64("1B2M2Y8AsgTpgAmY7PhCfg=="); - public byte[] PhysicsData = Array.Empty(); + public byte[] PhysicsData; } public class MeshPart : TriangleMeshPart @@ -2672,13 +2719,13 @@ namespace RobloxFiles public class PartOperation : TriangleMeshPart { public Content AssetId = ""; - public byte[] ChildData = Array.Empty(); + public byte[] ChildData; public SharedString ChildData2 = SharedString.FromBase64("yuZpQdnvvUBOTYh1jqZ2cA=="); public FormFactor FormFactor = FormFactor.Custom; - public byte[] MeshData = Array.Empty(); + public byte[] MeshData; public SharedString MeshData2 = SharedString.FromBase64("yuZpQdnvvUBOTYh1jqZ2cA=="); public RenderFidelity RenderFidelity = RenderFidelity.Precise; - public float SmoothingAngle; + public float SmoothingAngle = 0; public bool UsePartColor; } @@ -2706,10 +2753,10 @@ namespace RobloxFiles public bool Disabled; public bool HeadsUpDisplay = true; public float MaxSpeed = 25; - public int Steer; - public float SteerFloat; - public int Throttle; - public float ThrottleFloat; + public int Steer = 0; + public float SteerFloat = 0; + public int Throttle = 0; + public float ThrottleFloat = 0; public float Torque = 10; public float TurnSpeed = 1; } @@ -2745,7 +2792,7 @@ namespace RobloxFiles public ClientAnimatorThrottlingMode ClientAnimatorThrottling = ClientAnimatorThrottlingMode.Default; public string CollisionGroups = "Default^0^1"; public Camera CurrentCamera; - public double DistributedGameTime; + public double DistributedGameTime = 0; public bool ExplicitAutoJoints = true; public float FallenPartsDestroyHeight = -500; public Vector3 GlobalWind = new Vector3(); @@ -2774,7 +2821,7 @@ namespace RobloxFiles { public bool AutoUpdate; public Content PackageIdSerialize = ""; - public long VersionIdSerialize; + public long VersionIdSerialize = 0; } public class PackageService : Instance @@ -2795,8 +2842,8 @@ namespace RobloxFiles public class PartOperationAsset : Instance { - public byte[] ChildData = Array.Empty(); - public byte[] MeshData = Array.Empty(); + public byte[] ChildData; + public byte[] MeshData; } public class ParticleEmitter : Instance @@ -2804,7 +2851,7 @@ namespace RobloxFiles public Vector3 Acceleration = new Vector3(); public float Brightness = 1; public ColorSequence Color = new ColorSequence(1, 1, 1); - public float Drag; + public float Drag = 0; public NormalId EmissionDirection = NormalId.Top; public bool Enabled = true; public NumberRange FlipbookFramerate = new NumberRange(1); @@ -2813,8 +2860,8 @@ namespace RobloxFiles public ParticleFlipbookMode FlipbookMode = ParticleFlipbookMode.Loop; public bool FlipbookStartRandom; public NumberRange Lifetime = new NumberRange(5, 10); - public float LightEmission; - public float LightInfluence; + public float LightEmission = 0; + public float LightInfluence = 0; public bool LockedToPart; public ParticleOrientation Orientation = ParticleOrientation.FacingCamera; public float Rate = 20; @@ -2831,7 +2878,7 @@ namespace RobloxFiles public Content Texture = "rbxasset://textures/particles/sparkles_main.dds"; public float TimeScale = 1; public NumberSequence Transparency = new NumberSequence(0); - public float VelocityInheritance; + public float VelocityInheritance = 0; [Obsolete] public float VelocitySpread @@ -2840,7 +2887,7 @@ namespace RobloxFiles set => SpreadAngle = new Vector2(value, value); } - public float ZOffset; + public float ZOffset = 0; } public class PathfindingLink : Instance @@ -2865,7 +2912,7 @@ namespace RobloxFiles } [Obsolete] - public float EmptyCutoff; + public float EmptyCutoff = 0; } public class PermissionsService : Instance @@ -2895,7 +2942,7 @@ namespace RobloxFiles public string EmulatedCountryCode = ""; public string EmulatedGameLocale = ""; public bool PlayerEmulationEnabled; - public byte[] SerializedEmulatedPolicyInfo = Array.Empty(); + public byte[] SerializedEmulatedPolicyInfo; } public class Players : Instance @@ -2907,7 +2954,7 @@ namespace RobloxFiles public bool CharacterAutoLoads = true; public int MaxPlayersInternal = 16; - public int PreferredPlayersInternal; + public int PreferredPlayersInternal = 0; public float RespawnTime = 5; } @@ -2967,7 +3014,7 @@ namespace RobloxFiles public class NumberPose : PoseBase { - public double Value; + public double Value = 0; } public class Pose : PoseBase @@ -2975,7 +3022,7 @@ namespace RobloxFiles public CFrame CFrame = new CFrame(); [Obsolete] - public float MaskWeight; + public float MaskWeight = 0; } public abstract class PostEffect : Instance @@ -2997,9 +3044,9 @@ namespace RobloxFiles public class ColorCorrectionEffect : PostEffect { - public float Brightness; - public float Contrast; - public float Saturation; + public float Brightness = 0; + public float Contrast = 0; + public float Saturation = 0; public Color3 TintColor = new Color3(1, 1, 1); } @@ -3033,7 +3080,7 @@ namespace RobloxFiles public bool Enabled = true; public ProximityPromptExclusivity Exclusivity = ProximityPromptExclusivity.OnePerButton; public KeyCode GamepadKeyCode = KeyCode.ButtonX; - public float HoldDuration; + public float HoldDuration = 0; public KeyCode KeyboardKeyCode = KeyCode.E; public float MaxActivationDistance = 10; public string ObjectText = ""; @@ -3108,14 +3155,14 @@ namespace RobloxFiles public int PropertyOrder = 5000; public string ScriptContext = ""; public bool ServerOnly; - public double UIMaximum; - public double UIMinimum; - public double UINumTicks; + public double UIMaximum = 0; + public double UIMinimum = 0; + public double UINumTicks = 0; } public class ReflectionMetadataClass : ReflectionMetadataItem { - public int ExplorerImageIndex; + public int ExplorerImageIndex = 0; public int ExplorerOrder = int.MaxValue; public bool Insertable = true; public string PreferredParent = ""; @@ -3204,6 +3251,7 @@ namespace RobloxFiles public class RotationCurve : Instance { + public byte[] ValuesAndTimes = Convert.FromBase64String("AAAAAAEAAAAKAAAAAAAAFkUAAAAA"); } public class RunService : Instance @@ -3371,7 +3419,7 @@ namespace RobloxFiles public RollOffMode RollOffMode = RollOffMode.Inverse; public SoundGroup SoundGroup; public Content SoundId = ""; - public double TimePosition; + public double TimePosition = 0; public float Volume = 0.5f; public float xmlRead_MaxDistance_3 = 10000; @@ -3385,7 +3433,7 @@ namespace RobloxFiles public abstract class SoundEffect : Instance { public bool Enabled = true; - public int Priority; + public int Priority = 0; } public class ChorusSoundEffect : SoundEffect @@ -3398,7 +3446,7 @@ namespace RobloxFiles public class CompressorSoundEffect : SoundEffect { public float Attack = 0.1f; - public float GainMakeup; + public float GainMakeup = 0; public float Ratio = 40; public float Release = 0.1f; public Instance SideChain; @@ -3417,14 +3465,14 @@ namespace RobloxFiles public class EchoSoundEffect : SoundEffect { public float Delay = 1; - public float DryLevel; + public float DryLevel = 0; public float Feedback = 0.5f; - public float WetLevel; + public float WetLevel = 0; } public class EqualizerSoundEffect : SoundEffect { - public float HighGain; + public float HighGain = 0; public float LowGain = -20; public float MidGain = -10; } @@ -3447,7 +3495,7 @@ namespace RobloxFiles public float Density = 1; public float Diffusion = 1; public float DryLevel = -6; - public float WetLevel; + public float WetLevel = 0; } public class TremoloSoundEffect : SoundEffect @@ -3544,16 +3592,16 @@ namespace RobloxFiles public DevTouchCameraMovementMode DevTouchCameraMovementMode = DevTouchCameraMovementMode.UserChoice; public DevTouchMovementMode DevTouchMovementMode = DevTouchMovementMode.UserChoice; public bool EnableMouseLockOption = true; - public long GameSettingsAssetIDFace; - public long GameSettingsAssetIDHead; - public long GameSettingsAssetIDLeftArm; - public long GameSettingsAssetIDLeftLeg; - public long GameSettingsAssetIDPants; - public long GameSettingsAssetIDRightArm; - public long GameSettingsAssetIDRightLeg; - public long GameSettingsAssetIDShirt; - public long GameSettingsAssetIDTeeShirt; - public long GameSettingsAssetIDTorso; + public long GameSettingsAssetIDFace = 0; + public long GameSettingsAssetIDHead = 0; + public long GameSettingsAssetIDLeftArm = 0; + public long GameSettingsAssetIDLeftLeg = 0; + public long GameSettingsAssetIDPants = 0; + public long GameSettingsAssetIDRightArm = 0; + public long GameSettingsAssetIDRightLeg = 0; + public long GameSettingsAssetIDShirt = 0; + public long GameSettingsAssetIDTeeShirt = 0; + public long GameSettingsAssetIDTorso = 0; public GameAvatarType GameSettingsAvatar = GameAvatarType.R15; public R15CollisionType GameSettingsR15Collision = R15CollisionType.OuterBox; public NumberRange GameSettingsScaleRangeBodyType = new NumberRange(0, 1); @@ -3599,13 +3647,12 @@ namespace RobloxFiles IsService = true; } - public long CommitInflightAuthorId; + public long CommitInflightAuthorId = 0; public string CommitInflightGuid = ""; - public int CommitInflightPlaceVersion; + public int CommitInflightPlaceVersion = 0; public bool EnableScriptCollabByDefaultOnLoad; - public bool EnableTeamCreateStreamingOnLoad; - public long SrcPlaceId; - public long SrcUniverseId; + public long SrcPlaceId = 0; + public long SrcUniverseId = 0; } public class StudioDeviceEmulatorService : Instance @@ -3658,7 +3705,7 @@ namespace RobloxFiles public bool AutoColorCharacters = true; [Obsolete] - public int Score; + public int Score = 0; public BrickColor TeamColor = BrickColor.FromNumber(1); } @@ -3689,6 +3736,14 @@ namespace RobloxFiles public bool CustomizedTeleportUI; } + public class TemporaryCageMeshProvider : Instance + { + public TemporaryCageMeshProvider() + { + IsService = true; + } + } + public class TemporaryScriptService : Instance { public TemporaryScriptService() @@ -3697,6 +3752,18 @@ namespace RobloxFiles } } + public class TerrainDetail : Instance + { + public Content ColorMap = ""; + public TerrainFace Face = TerrainFace.Side; + public MaterialPattern MaterialPattern = MaterialPattern.Regular; + public Content MetalnessMap = ""; + public Content NormalMap = ""; + public Content RoughnessMap = ""; + public float StudsPerTile = 10; + public Content TexturePack1 = ""; + } + public class TerrainRegion : Instance { public Vector3int16 ExtentsMax = new Vector3int16(); @@ -3718,8 +3785,8 @@ namespace RobloxFiles public bool Is30FpsThrottleEnabled = true; public bool IsPhysicsEnvironmentalThrottled = true; public bool IsSleepAllowed = true; - public int NumberOfPlayers; - public double SimulateSecondsLag; + public int NumberOfPlayers = 0; + public double SimulateSecondsLag = 0; public double Timeout = 10; } @@ -3742,6 +3809,21 @@ namespace RobloxFiles public string SecondaryAlias = ""; } + public abstract class TextChatConfigurations : Instance + { + } + + public class ChatInputBarConfiguration : TextChatConfigurations + { + public bool Enabled = true; + public TextChannel TargetTextChannel; + } + + public class ChatWindowConfiguration : TextChatConfigurations + { + public bool Enabled = true; + } + public class TextChatMessageProperties : Instance { } @@ -3815,9 +3897,9 @@ namespace RobloxFiles public bool Enabled = true; public bool FaceCamera; public float Lifetime = 2; - public float LightEmission; - public float LightInfluence; - public float MaxLength; + public float LightEmission = 0; + public float LightInfluence = 0; + public float MaxLength = 0; public float MinLength = 0.1f; public Content Texture = ""; public float TextureLength = 1; @@ -3891,7 +3973,7 @@ namespace RobloxFiles public ColorSequence Color = new ColorSequence(1, 1, 1); public bool Enabled = true; public Vector2 Offset = new Vector2(); - public float Rotation; + public float Rotation = 0; public NumberSequence Transparency = new NumberSequence(0); } @@ -3911,7 +3993,7 @@ namespace RobloxFiles { public UDim2 CellPadding = new UDim2(0, 5, 0, 5); public UDim2 CellSize = new UDim2(0, 100, 0, 100); - public int FillDirectionMaxCells; + public int FillDirectionMaxCells = 0; public StartCorner StartCorner = StartCorner.TopLeft; } @@ -3961,7 +4043,7 @@ namespace RobloxFiles public bool Enabled = true; public LineJoinMode LineJoinMode = LineJoinMode.Round; public float Thickness = 1; - public float Transparency; + public float Transparency = 0; } public class UnvalidatedAssetService : Instance @@ -4008,7 +4090,7 @@ namespace RobloxFiles public class BinaryStringValue : ValueBase { - public byte[] Value = Array.Empty(); + public byte[] Value; } public class BoolValue : ValueBase @@ -4040,7 +4122,7 @@ namespace RobloxFiles } public double MaxValue = 1; - public double MinValue; + public double MinValue = 0; public double Value { @@ -4048,7 +4130,7 @@ namespace RobloxFiles set => this.value = value; } - public double value; + public double value = 0; } public class IntConstrainedValue : ValueBase @@ -4060,7 +4142,7 @@ namespace RobloxFiles } public long MaxValue = 10; - public long MinValue; + public long MinValue = 0; public long Value { @@ -4068,17 +4150,17 @@ namespace RobloxFiles set => this.value = value; } - public long value; + public long value = 0; } public class IntValue : ValueBase { - public long Value; + public long Value = 0; } public class NumberValue : ValueBase { - public double Value; + public double Value = 0; } public class ObjectValue : ValueBase @@ -4113,6 +4195,17 @@ namespace RobloxFiles } } + public class VideoCaptureService : Instance + { + public VideoCaptureService() + { + IsService = true; + } + + public bool Active; + public string CameraID = ""; + } + public class VirtualInputManager : Instance { public VirtualInputManager() @@ -4152,7 +4245,7 @@ namespace RobloxFiles IsService = true; } - public bool GenerateDefaultChannel = true; + public bool EnableDefaultVoice = true; } public class WeldConstraint : Instance diff --git a/Generated/Enums.cs b/Generated/Enums.cs index 98e1a97..27f9d84 100644 --- a/Generated/Enums.cs +++ b/Generated/Enums.cs @@ -1,5 +1,5 @@ // Auto-generated list of Roblox enums. -// Updated as of 0.514.0.5140398 +// Updated as of 0.522.0.5220281 namespace RobloxFiles.Enums { @@ -332,7 +332,8 @@ namespace RobloxFiles.Enums Sarpanch, SpecialElite, TitilliumWeb, - Ubuntu + Ubuntu, + Unknown = 100 } public enum FontSize @@ -354,6 +355,25 @@ namespace RobloxFiles.Enums Size96 } + public enum FontStyle + { + Normal, + Italic + } + + public enum FontWeight + { + Thin = 100, + ExtraLight = 200, + Light = 300, + Regular = 400, + Medium = 500, + SemiBold = 600, + Bold = 700, + ExtraBold = 800, + Heavy = 900 + } + public enum FormFactor { Symmetric, @@ -1061,7 +1081,8 @@ namespace RobloxFiles.Enums { Default, Immediate, - Deferred + Deferred, + AncestryDeferred } public enum SizeConstraint @@ -1158,6 +1179,13 @@ namespace RobloxFiles.Enums Other } + public enum TerrainFace + { + Top, + Side, + Bottom + } + public enum TextTruncate { None, diff --git a/Interfaces/IXmlPropertyToken.cs b/Interfaces/IXmlPropertyToken.cs index 29decb1..1ba3602 100644 --- a/Interfaces/IXmlPropertyToken.cs +++ b/Interfaces/IXmlPropertyToken.cs @@ -6,7 +6,7 @@ namespace RobloxFiles.Tokens { string XmlPropertyToken { get; } - bool ReadProperty(Property prop, XmlNode token); + bool ReadProperty(Property prop, XmlNode node); void WriteProperty(Property prop, XmlDocument doc, XmlNode node); } } diff --git a/Plugins/GenerateApiDump.rbxm b/Plugins/GenerateApiDump.rbxm index 75f8db0b8c45600b545626f5cab5a05826dfdd1b..4469a6c223b54afdbc7149e8aa0105804ab85951 100644 GIT binary patch literal 17926 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 Wj-4SUm*T4(Mn8r<&ioGtyZ;ZK%K=aT diff --git a/Plugins/GenerateApiDump/Formatting.lua b/Plugins/GenerateApiDump/Formatting.lua index 669f28e..5a79d79 100644 --- a/Plugins/GenerateApiDump/Formatting.lua +++ b/Plugins/GenerateApiDump/Formatting.lua @@ -1,43 +1,67 @@ +--!strict local Format = {} -function Format.Null(value) +type IFlags = { [string]: boolean } +type IEnum = { GetEnumItems: (IEnum) -> {EnumItem} } + +type IAxes = +{ + X: boolean; + Y: boolean; + Z: boolean; +} + +type IFaces = +{ + Left: boolean; + Right: boolean; + + Top: boolean; + Bottom: boolean; + + Front: boolean; + Back: boolean; +} + +function Format.Null(value: any): nil return nil end -function Format.Bytes(value) +function Format.Bytes(value: string): string if #value > 0 then - local fmt = "Convert.FromBase64String(%q)" - return fmt:format(value) - else - return "Array.Empty()" + return string.format("Convert.FromBase64String(%q)", value) end + + return "Array.Empty()" end -function Format.Bool(value) +function Format.Bool(value: boolean?): string? if value then return "true" end + + return nil end -function Format.String(value) +function Format.String(value: string): string return string.format("%q", value) end -function Format.Int(value, default) - if value == 2147483647 then +function Format.Int(value: number): string + if value == 2^31-1 then return "int.MaxValue" - elseif value == -2147483648 then + elseif value == -2^31 then return "int.MinValue" - elseif value ~= 0 or default then + else return string.format("%i", value) end end -function Format.Number(value, default) +function Format.Number(value: number): string local int = math.floor(value) if math.abs(value - int) < 0.001 then - return Format.Int(int, default) + return Format.Int(int) end local result = string.format("%.5f", value) @@ -46,12 +70,10 @@ function Format.Number(value, default) return result end -function Format.Double(value, default) - local result = Format.Number(value, default) +function Format.Double(value: number): string + local result = Format.Number(value) - if not result then - return nil - elseif result == "inf" then + if result == "inf" then return "double.MaxValue" elseif result == "-inf" then return "double.MinValue" @@ -60,12 +82,10 @@ function Format.Double(value, default) end end -function Format.Float(value, default) - local result = Format.Number(value, default) +function Format.Float(value: number): string + local result = Format.Number(value) - if not result then - return nil - elseif result == "inf" then + if result == "inf" then return "float.MaxValue" elseif result == "-inf" then return "float.MinValue" @@ -78,44 +98,44 @@ function Format.Float(value, default) end end -function Format.Flags(flag, enum) +function Format.Flags(flags: IFlags, enum: IEnum): string local value = 0 for _,item in pairs(enum:GetEnumItems()) do - if flag[item.Name] then + if flags[item.Name] then value += (2 ^ item.Value) end end - return value + return tostring(value) end -function Format.Axes(axes) +function Format.Axes(axes: IAxes): string return "(Axes)" .. Format.Flags(axes, Enum.Axis) end -function Format.Faces(faces) +function Format.Faces(faces: IFaces): string return "(Faces)" .. Format.Flags(faces, Enum.NormalId) end -function Format.EnumItem(item) +function Format.EnumItem(item: EnumItem): string local enum = tostring(item.EnumType) return enum .. '.' .. item.Name end -function Format.BrickColor(brickColor) +function Format.BrickColor(brickColor: BrickColor): string local fmt = "BrickColor.FromNumber(%i)" return fmt:format(brickColor.Number) end -function Format.Color3(color) +function Format.Color3(color: Color3): string if color == Color3.new() then return "new Color3()" end - local r = Format.Float(color.R, true) - local g = Format.Float(color.G, true) - local b = Format.Float(color.B, true) + local r = Format.Float(color.R) + local g = Format.Float(color.G) + local b = Format.Float(color.B) local fmt = "%s(%s, %s, %s)"; local constructor = "new Color3"; @@ -131,159 +151,176 @@ function Format.Color3(color) return fmt:format(constructor, r, g, b) end -function Format.UDim(udim) +function Format.UDim(udim: UDim): string if udim == UDim.new() then return "new UDim()" end - local scale = Format.Float(udim.Scale, true) - local offset = Format.Int(udim.Offset, true) + local scale = Format.Float(udim.Scale) + local offset = Format.Int(udim.Offset) local fmt = "new UDim(%s, %s)" return fmt:format(scale, offset) end -function Format.UDim2(udim2) +function Format.UDim2(udim2: UDim2): string if udim2 == UDim2.new() then return "new UDim2()" end - local xScale = Format.Float(udim2.X.Scale, true) - local yScale = Format.Float(udim2.Y.Scale, true) + local xScale = Format.Float(udim2.X.Scale) + local yScale = Format.Float(udim2.Y.Scale) - local xOffset = Format.Int(udim2.X.Offset, true) - local yOffset = Format.Int(udim2.Y.Offset, true) + local xOffset = Format.Int(udim2.X.Offset) + local yOffset = Format.Int(udim2.Y.Offset) local fmt = "new UDim2(%s, %s, %s, %s)" return fmt:format(xScale, xOffset, yScale, yOffset) end -function Format.Vector2(v2) +function Format.Vector2(v2: Vector2): string if v2.Magnitude < 0.001 then return "new Vector2()" end - local x = Format.Float(v2.X, true) - local y = Format.Float(v2.Y, true) + local x = Format.Float(v2.X) + local y = Format.Float(v2.Y) local fmt = "new Vector2(%s, %s)" return fmt:format(x, y) end -function Format.Vector3(v3) +function Format.Vector3(v3: Vector3): string if v3.Magnitude < 0.001 then return "new Vector3()" end - local x = Format.Float(v3.X, true) - local y = Format.Float(v3.Y, true) - local z = Format.Float(v3.Z, true) + local x = Format.Float(v3.X) + local y = Format.Float(v3.Y) + local z = Format.Float(v3.Z) local fmt = "new Vector3(%s, %s, %s)" return fmt:format(x, y, z) end -function Format.CFrame(cf) - local blankCF = CFrame.new() - - if cf == blankCF then +function Format.CFrame(cf: CFrame): string + if cf == CFrame.identity then return "new CFrame()" end - local rot = cf - cf.p - - if rot == blankCF then - local fmt = "new CFrame(%s, %s, %s)" + if cf.Rotation == CFrame.identity then + local x = Format.Float(cf.X) + local y = Format.Float(cf.Y) + local z = Format.Float(cf.Z) - local x = Format.Float(cf.X, true) - local y = Format.Float(cf.Y, true) - local z = Format.Float(cf.Z, true) - - return fmt:format(x, y, z) + return string.format("new CFrame(%s, %s, %s)", x, y, z) else local comp = { cf:GetComponents() } + local matrix = "" - for i = 1,12 do - comp[i] = Format.Float(comp[i], true) + for i = 1, 12 do + local sep = (if i > 1 then ", " else "") + matrix ..= sep .. Format.Float(comp[i]) end - local fmt = "new CFrame(%s)" - local matrix = table.concat(comp, ", ") - - return fmt:format(matrix) + return string.format("new CFrame(%s)", matrix) end end -function Format.NumberRange(nr) +function Format.NumberRange(nr: NumberRange): string local min = nr.Min local max = nr.Max local fmt = "new NumberRange(%s)" - local value = Format.Float(min, true) + local value = Format.Float(min) if min ~= max then - value = value .. ", " .. Format.Float(max, true) + value = value .. ", " .. Format.Float(max) end return fmt:format(value) end -function Format.Ray(ray) +function Format.Ray(ray: Ray): string if ray == Ray.new() then return "new Ray()" end - local fmt = "new Ray(%s, %s)" - local origin = Format.Vector3(ray.Origin) local direction = Format.Vector3(ray.Direction) + local fmt = "new Ray(%s, %s)" return fmt:format(origin, direction) end -function Format.Rect(rect) +function Format.Rect(rect: Rect): string + local min: any = rect.Min + local max: any = rect.Max + + if min == max and min == Vector2.zero then + return "new Rect()" + end + + min = Format.Vector2(min) + max = Format.Vector2(max) + local fmt = "new Rect(%s, %s)" - - local min = Format.Vector2(rect.Min) - local max = Format.Vector2(rect.Max) - return fmt:format(min, max) end -function Format.ColorSequence(cs) +function Format.ColorSequence(cs: ColorSequence): string local csKey = cs.Keypoints[1] - - local fmt = "new ColorSequence(%s)" local value = tostring(csKey.Value) + local fmt = "new ColorSequence(%s)" return fmt:format(value) end -function Format.NumberSequence(ns) +function Format.NumberSequence(ns: NumberSequence): string local nsKey = ns.Keypoints[1] - local fmt = "new NumberSequence(%s)" - local value = Format.Float(nsKey.Value, true) + local value = Format.Float(nsKey.Value) return fmt:format(value) end -function Format.Vector3int16(v3) +function Format.Vector3int16(v3: Vector3int16): string if v3 == Vector3int16.new() then return "new Vector3int16()" end - local x = Format.Int(v3.X, true) - local y = Format.Int(v3.Y, true) - local z = Format.Int(v3.Z, true) + local x = Format.Int(v3.X) + local y = Format.Int(v3.Y) + local z = Format.Int(v3.Z) local fmt = "new Vector3int16(%s, %s, %s)" return fmt:format(x, y, z) end -function Format.SharedString(str) +function Format.SharedString(str: string): string local fmt = "SharedString.FromBase64(%q)" return fmt:format(str) end +function Format.FontFace(font: Font): string + local family = string.format("%q", font.Family) + local args = { family } + + local style = font.Style + local weight = font.Weight + + if style ~= Enum.FontStyle.Normal then + table.insert(args, "FontStyle." .. style.Name) + end + + if #args > 1 or weight ~= Enum.FontWeight.Regular then + table.insert(args, "FontWeight." .. weight.Name) + end + + local fmt = "new FontFace(%s)" + local argStr = table.concat(args, ", ") + + return fmt:format(argStr) +end + return Format \ No newline at end of file diff --git a/Plugins/GenerateApiDump/PropertyPatches.lua b/Plugins/GenerateApiDump/PropertyPatches.lua index e418cf1..831cc91 100644 --- a/Plugins/GenerateApiDump/PropertyPatches.lua +++ b/Plugins/GenerateApiDump/PropertyPatches.lua @@ -63,6 +63,29 @@ local GuiTextMixIn = return { + AnimationRigData = + { + Add = + { + label = "BinaryString"; + name = "BinaryString"; + parent = "BinaryString"; + postTransform = "BinaryString"; + preTransform = "BinaryString"; + transform = "BinaryString"; + }; + + Defaults = + { + label = "AQAAAAEAAAAAAAAA"; + name = "AQAAAAEAAAAAAAAA"; + parent = "AQAAAAEAAAAAAA=="; + postTransform = "AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="; + preTransform = "AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="; + transform = "AQAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA="; + } + }; + BallSocketConstraint = { -- Why does this even exist? @@ -73,13 +96,21 @@ return { Add = { + MaterialVariantSerialized = "string"; + MaterialVariant = "string"; Color3uint8 = "Color3uint8"; size = "Vector3"; }; Redirect = { - Position = "CFrame.Position"; + Position = + { + Get = "CFrame.Position"; + Set = "CFrame = new CFrame(value) * CFrame.Rotation"; + }; + + MaterialVariant = "MaterialVariantSerialized"; BrickColor = UseColor3("Color"); Color = "Color3uint8"; Size = "size"; @@ -88,6 +119,7 @@ return Defaults = { Color3uint8 = Color3.fromRGB(163, 162, 165); + MaterialVariantSerialized = ""; size = Vector3.new(4, 1.2, 2); }; }; @@ -200,6 +232,12 @@ return Size = "size_xml"; }; }; + + FloatCurve = + { + Add = { ValuesAndTimes = "BinaryString" }; + Defaults = { ValuesAndTimes = "AAAAAAEAAAAKAAAAAAAAFkUAAAAA" }; + }; FormFactorPart = { @@ -244,6 +282,15 @@ return Transparency = "BackgroundTransparency"; } }; + + HiddenSurfaceRemovalAsset = + { + Add = + { + HSRData = "BinaryString"; + HSRMeshIdData = "BinaryString"; + } + }; HttpService = { @@ -355,6 +402,60 @@ return Source = "ProtectedString"; }; }; + + MarkerCurve = + { + Add = { ValuesAndTimes = "BinaryString" }; + Defaults = { ValuesAndTimes = "AAAAAAEAAAAKAAAAAAAAFkUAAAAA" }; + }; + + MaterialService = + { + Defaults = + { + AsphaltName = "Asphalt"; + BasaltName = "Basalt"; + BrickName = "Brick"; + CobblestoneName = "Cobblestone"; + ConcreteName = "Concrete"; + CorrodedMetalName = "CorrodedMetal"; + CrackedLavaName = "CrackedLava"; + DiamondPlateName = "DiamondPlate"; + FabricName = "Fabric"; + FoilName = "Foil"; + GlacierName = "Glacier"; + GraniteName = "Granite"; + GrassName = "Grass"; + GroundName = "Ground"; + IceName = "Ice"; + LeafyGrassName = "LeafyGrass"; + LimestoneName = "Limestone"; + MarbleName = "Marble"; + MetalName = "Metal"; + MudName = "Mud"; + PavementName = "Pavement"; + PebbleName = "Pebble"; + PlasticName = "Plastic"; + RockName = "Rock"; + SaltName = "Salt"; + SandName = "Sand"; + SandstoneName = "Sandstone"; + SlateName = "Slate"; + SmoothPlasticName = "SmoothPlastic"; + SnowName = "Snow"; + WoodName = "Wood"; + WoodPlanksName = "WoodPlanks"; + } + }; + + MaterialVariant = + { + Add = + { + TexturePack0 = "Content"; + TexturePack1 = "Content"; + } + }; MeshPart = { @@ -457,6 +558,12 @@ return LuobuWhitelisted = TryGetEnumItem("TriStateBoolean", "Unknown"); }; }; + + RotationCurve = + { + Add = { ValuesAndTimes = "BinaryString" }; + Defaults = { ValuesAndTimes = "AAAAAAEAAAAKAAAAAAAAFkUAAAAA" }; + }; SelectionBox = { @@ -604,6 +711,11 @@ return MaterialColors = "AAAAAAAAan8/P39rf2Y/ilY+j35fi21PZmxvZbDqw8faiVpHOi4kHh4lZlw76JxKc3trhHtagcLgc4RKxr21zq2UlJSM"; }; }; + + TerrainDetail = + { + Add = { TexturePack1 = "Content"; } + }; TerrainRegion = { diff --git a/Plugins/GenerateApiDump/init.server.lua b/Plugins/GenerateApiDump/init.server.lua index 0af7a69..e1f7b82 100644 --- a/Plugins/GenerateApiDump/init.server.lua +++ b/Plugins/GenerateApiDump/init.server.lua @@ -2,6 +2,7 @@ local Selection = game:GetService("Selection") local HttpService = game:GetService("HttpService") local StarterPlayer = game:GetService("StarterPlayer") local StudioService = game:GetService("StudioService") +local TextChatService = game:GetService("TextChatService") local classes = {} local outStream = "" @@ -14,12 +15,16 @@ local singletons = ParabolaAdornment = Instance.new("BoxHandleAdornment"); -- close enough StarterPlayerScripts = StarterPlayer:WaitForChild("StarterPlayerScripts"); StarterCharacterScripts = StarterPlayer:WaitForChild("StarterCharacterScripts"); + ChatWindowConfiguration = TextChatService:WaitForChild("ChatWindowConfiguration"); + ChatInputBarConfiguration = TextChatService:WaitForChild("ChatInputBarConfiguration"); } local exceptionClasses = { PackageLink = true; ScriptDebugger = true; + ChatWindowConfiguration = true; + ChatInputBarConfiguration = true; } local numberTypes = @@ -205,7 +210,10 @@ end -- Formatting --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -local formatting = require(script.Formatting) +type FormatFunc = (any) -> string; +type Format = { [string]: FormatFunc } + +local formatting: Format = require(script.Formatting) local formatLinks = { @@ -227,7 +235,7 @@ local formatLinks = ["ProtectedString"] = "String"; } -local function getFormatFunction(valueType) +local function getFormatFunction(valueType: string): FormatFunc? if not formatting[valueType] then valueType = formatLinks[valueType] end @@ -307,6 +315,8 @@ local function generateClasses() { Axis = true; FontSize = true; + FontStyle = true; + FontWeight = true; } for _,class in ipairs(apiDump.Classes) do @@ -323,7 +333,9 @@ local function generateClasses() if classTags.Service then pcall(function () - class.Object = game:GetService(className) + if not className:find("Network") then + class.Object = game:GetService(className) + end end) elseif not classTags.NotCreatable then pcall(function () @@ -364,10 +376,6 @@ 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 IDE1006 // Naming Styles") writeLine() @@ -468,7 +476,10 @@ local function generateClasses() local propTags = getTags(prop) local serial = prop.Serialization - local valueType = prop.ValueType.Name + 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) @@ -489,6 +500,8 @@ local function generateClasses() valueType = "long" elseif valueType == "BinaryString" then valueType = "byte[]" + elseif valueType == "Font" and category ~= "Enum" then + valueType = "FontFace" end local first = name:sub(1, 1) @@ -567,33 +580,29 @@ local function generateClasses() end) end - local typeData = prop.ValueType - local category = typeData.Category - if not gotValue and category ~= "Class" then -- Fallback to implicit defaults - local typeName = typeData.Name - - if numberTypes[typeName] then + + if numberTypes[valueType] then value = 0 gotValue = true - elseif stringTypes[typeName] then + elseif stringTypes[valueType] then value = "" gotValue = true - elseif typeName == "SharedString" then + elseif valueType == "SharedString" then value = "yuZpQdnvvUBOTYh1jqZ2cA==" gotValue = true elseif category == "DataType" then - local DataType = env[typeName] + local DataType = env[valueType] - if DataType and typeof(DataType) == "table" and not rawget(env, typeName) then + if DataType and typeof(DataType) == "table" and not rawget(env, valueType) then pcall(function () value = DataType.new() gotValue = true end) end elseif category == "Enum" then - local enum = Enum[typeName] + local enum = Enum[valueType] local lowestId = math.huge local lowest @@ -623,7 +632,8 @@ local function generateClasses() end if gotValue then - local formatFunc = getFormatFunction(valueType) + local formatKey = if category == "Enum" then "Enum" else valueType + local formatFunc = getFormatFunction(formatKey) if not formatFunc then local literal = typeof(value) @@ -636,10 +646,12 @@ local function generateClasses() local result - if typeof(formatFunc) == "string" then - result = formatFunc - else - result = formatFunc(value) + if formatFunc then + if typeof(formatFunc) == "string" then + result = formatFunc + else + result = formatFunc(value) + end end if result ~= nil then diff --git a/RobloxFileFormat.csproj b/RobloxFileFormat.csproj index d5ff747..0a0dbe6 100644 --- a/RobloxFileFormat.csproj +++ b/RobloxFileFormat.csproj @@ -77,6 +77,7 @@ + @@ -115,6 +116,7 @@ + diff --git a/Tokens/Font.cs b/Tokens/Font.cs new file mode 100644 index 0000000..b21069c --- /dev/null +++ b/Tokens/Font.cs @@ -0,0 +1,89 @@ +using System; +using System.Xml; + +using RobloxFiles.Enums; +using RobloxFiles.DataTypes; + +namespace RobloxFiles.Tokens +{ + public class FontToken : IXmlPropertyToken, IAttributeToken + { + public string XmlPropertyToken => "Font"; + public AttributeType AttributeType => AttributeType.FontFace; + + public bool ReadProperty(Property prop, XmlNode node) + { + try + { + var familyNode = node["Family"]; + var family = familyNode.InnerText; + + var weightNode = node["Weight"]; + var weight = (FontWeight)uint.Parse(weightNode.InnerText); + + var styleNode = node["Style"]; + Enum.TryParse(styleNode.InnerText, out FontStyle style); + + prop.Value = new FontFace(family, weight, style); + return true; + } + catch + { + return false; + } + } + + public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) + { + FontFace font = prop.CastValue(); + var weight = (uint)font.Weight; + + string family = font.Family; + string contentType = "null"; + + if (family.Length > 0) + contentType = "url"; + + var contentNode = doc.CreateElement(contentType); + contentNode.InnerText = family; + + var familyNode = doc.CreateElement("Family"); + familyNode.AppendChild(contentNode); + node.AppendChild(familyNode); + + var weightNode = doc.CreateElement("Weight"); + weightNode.InnerText = $"{weight}"; + node.AppendChild(weightNode); + + var styleNode = doc.CreateElement("Style"); + styleNode.InnerText = $"{font.Style}"; + node.AppendChild(styleNode); + } + + public FontFace ReadAttribute(RbxAttribute attribute) + { + var weight = (FontStyle)attribute.ReadShort(); + var style = (FontWeight)attribute.ReadByte(); + + var family = attribute.ReadString(); + _ = attribute.ReadInt(); // Reserved + + return new FontFace(family, style, weight); + } + + public void WriteAttribute(RbxAttribute attribute, FontFace value) + { + var weight = (short)value.Weight; + var style = (byte)value.Style; + + var family = value.Family; + var writer = attribute.Writer; + + writer.Write(weight); + writer.Write(style); + + attribute.WriteString(family); + attribute.WriteInt(0); // Reserved + } + } +} diff --git a/Tree/Attributes.cs b/Tree/Attributes.cs index 2da020d..3cee16c 100644 --- a/Tree/Attributes.cs +++ b/Tree/Attributes.cs @@ -43,7 +43,8 @@ namespace RobloxFiles Rect = 28, // PhysicalProperties = 29 // Region3 = 31, - // Region3int16 = 32 + // Region3int16 = 32, + FontFace = 33 } public class RbxAttribute : IDisposable diff --git a/Tree/Instance.cs b/Tree/Instance.cs index 81689ce..e72c142 100644 --- a/Tree/Instance.cs +++ b/Tree/Instance.cs @@ -688,6 +688,8 @@ namespace RobloxFiles if (fieldType.IsEnum) xmlToken = "token"; + else if (propType == PropertyType.Ref) + xmlToken = "Ref"; switch (xmlToken) { @@ -723,6 +725,11 @@ namespace RobloxFiles xmlToken = "CoordinateFrame"; break; } + case "FontFace": + { + xmlToken = "Font"; + break; + } case "Optional`1": { // TODO: If more optional types are added, diff --git a/Tree/Property.cs b/Tree/Property.cs index f2fdd99..d538785 100644 --- a/Tree/Property.cs +++ b/Tree/Property.cs @@ -41,7 +41,8 @@ namespace RobloxFiles SharedString, ProtectedString, OptionalCFrame, - UniqueId + UniqueId, + FontFace } public class Property @@ -72,29 +73,30 @@ namespace RobloxFiles { typeof(double), PropertyType.Double }, { typeof(string), PropertyType.String }, - { typeof(Ray), PropertyType.Ray }, - { typeof(Rect), PropertyType.Rect }, - { typeof(UDim), PropertyType.UDim }, - { typeof(UDim2), PropertyType.UDim2 }, - { typeof(CFrame), PropertyType.CFrame }, - { typeof(Color3), PropertyType.Color3 }, - { typeof(Content), PropertyType.String }, - { typeof(Vector2), PropertyType.Vector2 }, - { typeof(Vector3), PropertyType.Vector3 }, + { typeof(Ray), PropertyType.Ray }, + { typeof(Rect), PropertyType.Rect }, + { typeof(UDim), PropertyType.UDim }, + { typeof(UDim2), PropertyType.UDim2 }, + { typeof(CFrame), PropertyType.CFrame }, + { typeof(Color3), PropertyType.Color3 }, + { typeof(Content), PropertyType.String }, + { typeof(Vector2), PropertyType.Vector2 }, + { typeof(Vector3), PropertyType.Vector3 }, + { typeof(FontFace), PropertyType.FontFace }, - { typeof(BrickColor), PropertyType.BrickColor }, - { typeof(Quaternion), PropertyType.Quaternion }, - { typeof(Color3uint8), PropertyType.Color3uint8 }, - { typeof(NumberRange), PropertyType.NumberRange }, - { typeof(SharedString), PropertyType.SharedString }, - { typeof(Vector3int16), PropertyType.Vector3int16 }, + { typeof(BrickColor), PropertyType.BrickColor }, + { typeof(Quaternion), PropertyType.Quaternion }, + { typeof(Color3uint8), PropertyType.Color3uint8 }, + { typeof(NumberRange), PropertyType.NumberRange }, + { typeof(SharedString), PropertyType.SharedString }, + { typeof(Vector3int16), PropertyType.Vector3int16 }, - { typeof(ColorSequence), PropertyType.ColorSequence }, - { typeof(NumberSequence), PropertyType.NumberSequence }, - { typeof(Optional), PropertyType.OptionalCFrame }, + { typeof(ColorSequence), PropertyType.ColorSequence }, + { typeof(NumberSequence), PropertyType.NumberSequence }, + { typeof(Optional), PropertyType.OptionalCFrame }, - { typeof(ProtectedString), PropertyType.String }, - { typeof(PhysicalProperties), PropertyType.PhysicalProperties }, + { typeof(ProtectedString), PropertyType.String }, + { typeof(PhysicalProperties), PropertyType.PhysicalProperties }, }; private void ImproviseRawBuffer() diff --git a/UnitTest/Files/Binary.rbxl b/UnitTest/Files/Binary.rbxl index ce4f093d444b07f14181f4e1cf0a5c61e79a2c4a..b5437a32d956379c1875bcc3a9b34f0fe667358b 100644 GIT binary patch delta 52075 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

%RqtC>m=) zSX-oF<1IMjF?g$C^{#ZNtAY7rX)Ex*#-b6xd=FlOR)5gy-}M4Ivnn1-u74sgNou^z zjJ33GWAq5TG!91!wEXp@wr}P|@_#%z|3n3ug>oySK47b2Bw&g$%PB^JrWip}jG!q- z&=ezxV$8O?lr~bXfl2ySp9nVbDfi0Sj-=^t6({v!3u0->JsnqIQm;wU#GN4x6 zHW`Tm&H2(Vlr`|lWJf{QDTp6oQ-h$XLGYm|E)i-lUmp0FF3ZECQ_wdcIx$xoCc2g$ zc`fdn);n22c1#wa#Gw`Wm|_G`j05=AQ0^bn4I?NdO zZyZ{wXkAG^XvpXW1v+hd-Rc!m`kdEY-@fq%&G{vd<{&U^DwYo{_yj?T> zJA&qtRF8_2$@Ng5y7fbi?0^he>xEeNmHXCtC7rWlSxl;0S-rMu>NW1vnmm2nGOep! zb!N@t>eZ8~Zr9U~ZE9C@Fk(O>ra7m0H+9XWiRn(0l=&eK{Mt7#U?7cJqIlIb_6qCt zuLkx$h(FRju&FLMLW89nykUmr!BWLFC-DNnx27SV;C(kCCE(Zpg9FLNm%|GJw;$mX zs@r0LyUSgvkCx-qYs`(_P{pTXcz{h}8t(is^7Jib34!~s$Jl^ZJ^2pN{;48)q`Q)a5dclydD2PM$$qf!6MzwL93_?gXsed$@KdXzi}3 z?G9SIgOM9uUU@g6tO?(E6S4~$A3)gJ!TnGuWURY|spLo-^2aYOseXIcB3Z zw%TaWY&3|C9;#t8%b=NM(9AMuW*IcIoaf9kK{d-spY7z)T>soGFSgs219`H14l0El z%p8NQ<`|lF;K4I9$6$*&=C_$+(9AJt<`^`Vfi~6v&B%ggWI-EifHu|uZLFcRCbKpz znYD?gl%#L3Vc-dsYgxn8gZQl)YF6`26UEFb0W+&0X0?AHUluIj=HGnz<^o1RJT>D8 znsEfJ2Krn(K>mf4Rn#U^me>J$#e~h)f_lkMs+dgeCGS`HB|!Q@rh$9ONPu%^wJhhn z@a&O=^mt87xx;&1SZ?KA$>k>YUCtg`#G#Jlx5yvG$kmCweFqzo9n3rO>cd5>nS>;J zF;uWFwb&m4+_Tsp0_ia92i2C#(q)!l%QAcT z`Z9*((KRfth2*Iv_Gr*@=6f5KuxJsI)TRC~VC+&3Lk`K3rT#eJ$1b#YDXJfWtu^ez z*pLjm&FV7yHp^-KZAR1!4vybOCnA2!)EZe$sNuNBkgTlnhXaq*_?H9eD^Iy2@azqaFX~O*nE(I) delta 40484 zcmb5X34Bi1^9P)J?}J#9Ae-z#LXZ%W*tab9Ekdoaqy!r#PEq@=iLEWM zR_v47d91KD_B{T)vT-UgK_y?R%-va<5Rhp*zw<*COfnum8I zuJOhlPri+-*bW_ARl+B9+_>2BROP(pXy<{SZusz3T&W`M_(XGQbCR3#T^G5JnhM;^ z8lSM3VPlf;vBCiOI?bT9@x@nu0@TTd%B|FDcw7C$RnEBWXs#-2i*F`;!eV2_QuF1S zTaX=oG48Oq`1rRIV^W59m=ITjTWiY*d{9{fAHIt1E8~CK`9yQ1td*LzgDXRLFG+%EA0wHxdX}-AHIq!+T;K7_=LqL4ja=gcHAg)pMsIGF+5+z zHV*i|B0hjk9NTWhh}dD{&CmxKvn308u*~PM_z5Wr*u4Z=Z_3cMP{(89tJu+rcCXTE zjJ^6M9%h{2NgO^YJTX2oWn2jwtD-lDQw_i}900dZOc@qyhRtJGOG&y==xWWGVzR&> zSBhV)xjE#&*}WUBSgpBeH>v+>&9ir(Snw%s{3J8lLT=!VPG9kzxu8f$jPDZ@KOxpi z#~rzJr?L#s8d9_5R{Vg}<>R!rQ0BjE#N0 z7k3lm@b|VQVOdd z7@m3Tgb!cER`>NEty%DT-Iwf9ks)6R@I}P>op(e2V7$*O@E-K z9e%nqwOxZ5+m#`_aqrcr1L({3nwz85?{A{5Pmj3A^#4I}1FF42^Kg9ke^doh{|%a_ z!*a%FIh7mI!3~PkKGYe(148u~zngXhfKn{zE zFPV9o5BF>-@n+OvljfbK%T%(|n&#%t;$q?xN1AbXzB#ZK0Aw>9A%Nkd5}`0=aPKz< z+Y+E`=py3AjZaJwC8MHE(3+naHUKsC@Zqc2y%km3tkrS2!!?##*P1$Q);ygba*d@6 zX@i!upckg?*!7xqn#>1F1Kt)8Y;M}6CdDU?gO;1At-;tVEnX<#*mt#$i;pcet@SVl zwRBKn0OM)hJ}%|u`2Ew~gbO#r#mAW0YIUB$EUAnD7*p9EV7=UxYWkF`*hasKUb>L~HqFDK57#gyT+3H+)vh#Xo95}5Duh}xq8nvy)0{`7 zNR_2TyQ3{jv;(^&WvI0TM$W+iPdL7c%lE+l+zKYBA#Qz399b?P^g4I#($x`d1=**{@N1D}huCk=H7aB9I9pe(r7__Btg7r3o zCC0xTk{^RvGUY9RvGR3HOiGGP341vxtFHh%`Zdee2Y~DWI*uQo^qOXDd8rw%!oj`( zJ!JAdXK^fitLbvxYJBCmGhqlMk&>fm{#H#;MH3A4&=3V0wVoL{tniY3e z3pH$X_$qcBiT|nfVY6qBVhBrFj3Td{kVPifSjr-fy6x0zIF1$)7$xgCU&Z#L>4Tk` zx5FH6WU2XMC}*eUL7q8US=w}5v(@71!A?l$W5Hr6(y`>WOLM88#8@nA63`19nr<-( z6Jp}~zA`jg3c2n;NV{#9=26vhs7ZjQ$O7nI-bT&Vj^)t|AHH6glBxA>&C6jpcV%f5 zQYd-1=9ISBT*KVq>kn-l{%7CZEpd2kJSIKcMXhXOnbVfKGagXvSphjAKDO7el(?jq zb9*5pwsiUvULuBLRrV^)N*iyc;FZCe2tYPi-4X%VIKph=k_@D8991%PZH8#8{w zE8kX^5nDmEBYW_)aqq}UoMG3?>ZJ!Ekc%fN6FZT<|g&&OO7f~G zmA}v&9ikbRH!94!QEZn%&A!mw9ky|er73)$;=a(l9rcb}WvQXlXcelQwE7>tS@!|8 z+@n>mIY6d~B}YC)&%CIP95rcN+^}&pbSKvImcp4%8}?{5t7#Hm*8wcgWWI{4&A|Uu zy^-NU-g`A`$7t!m(!hO0t@dhly=DTE1sItK*VL862Qz1;GriQNjN#;6TCV%w9L8)q zxL2$0s9AGWLm+E_4`0RJbLiK-nt$iz|6_!60l?}QnUa_qHx_G9d>Q*{3W~tZ8?$c^HU*sBY%C&qIyDh^1RM^q*@HVsTGy_>mVljZ6sNsIi z zohARkvgQw8kL_3Bf7;d8@T5rxv`S&u8Iz^k`2-L=&7)$+CXSD7H!=2AG$fe{OBcVA zP94xZB5pDsZ?t+f5m(`tjo?W@^ct5ivUlvbmwGEH3`@tnn*0uGjZACMgbD{4Zd7ns zv!?l3T3I_wU0F*@4`LoK6?L^VB~#;mB$BeEH*ZwRH`nFVcBx)gz%Mqj(WMJHgQSwz> z<}>PYM60f4s)2n@8AmktRtrT-EZx!<055}2uTgO+=8;+b%v4yq?mcw<2=Wb9|6_@~ zm&)fN8m`KXEC-cCZF9BiY3sPglArs~rSNmi%f*1+n!zmBG5Y~#Fm+?h2|w))Ls^dD z03c)xV-v@`bmwgwHH?QWjwoY%%Y`ra` zxAZe70nS2|Yyv$yW>hsh487%>(5I;Qm{u!Vl-P1;r-6fQEbyct+u0#DrX)(n>B`&)qU)MBugDZ-sHB1=8RyV z%~M((@;r_J=z~)TTXk+>IiBm3eM)o1_7k^AyMgZ6C-ja@9UqpMY9_Whx3lC>KA>1P z1aiXo@vl}2V$m&UM*#qNb}(?)n76TZ((ud5N^8o9U%4fWzPS8Ns((gvQVVi#0KJmr zE$VkhYtXY0H-(*viDpDr64h9;^ESZP8}?32Nq(6G(q+ACIl1mo-WjcyT6wS{nw?p( z!}s`AMNmu_HmXxX(uCL3XVd?OmA{JyB1ZUkGkv;=2WpA@9^k4n@)QI-@rm@_S6bCj z?I{CVa<2$L!aZyyjKfmJ>^iia3~Ong@6*MvGzW@0s@dy5SkYf!Y4uG%qCE}nZgT5b z!ggI^arWEHF}{i`Jiz~KIp69Oo|uw=te=vQUV;0t6#Y+DH1Did&9M?!S!&bIR&?Mj zT$k;eRliu#15~9|<|=RW^h&M|@rwueR;S3A;lp7QOKl=GcX|`mBfwTFfgc&$HD*%c z1T#-`@r5G)G4V{%vXNez&5)b6WKdR$|aBqoqH9mV>{y60iuza@=w? zzMYYA6v76LuVTk1R`fBDDXCaS?|))5?40JC_PJ=Qr7)kOG4sAp)NA>_sRC@tp1%Od zjPHYWcw$P>YfEvf#8q@+U32IXC5jO7TQThaUrS~Ut^i#hSaiVj|Y{g(L0QW{qD(*>=@ zs68@n%NfWHi<#6ncKFEH(lc-qcV}trb-=Q9DxIR5%3zlAHR$F=Bnl;zu%y>Sc9%4N ztqiriq*c?k&-eDZq&3m(^yx#joH};>5_YBdy|{CA?V7 zri7-(j;ml*E;6b|WF7ou0q|8^tvr2pPiuzUkyexbxTE>d&8{X}s(e?oF5eyd%Ni><^|-HjQsMWSi3WeK#n9#Z2=FV? z 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 diff --git a/UnitTest/Files/Xml.rbxlx b/UnitTest/Files/Xml.rbxlx index 4596101..4fc4f92 100644 --- a/UnitTest/Files/Xml.rbxlx +++ b/UnitTest/Files/Xml.rbxlx @@ -1,14 +1,14 @@ null nil - + false 0 0 Default^0^-1 - RBX3A482CA70FD44861880A3A8DC2E280B0 + RBX14AE6C7228F945B580979619731749BB 0 true -500 @@ -58,7 +58,7 @@ true false - 2c3758b9147ff16b01b8290f00018f3e + 2c3758b9147ff16b01b8290f000271ed 0 @@ -76,135 +76,7 @@ - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -8 - 15.4042997 - 9 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - true - true - false - 0 - 4288914085 - - false - - false - -0.5 - 0.5 - 0 - 0 - false - false - - 1.90382576 - 4.49005699 - 0.858924985 - - - 0 - 0 - 0 - - - -0.5 - 0.5 - 0 - 0 - false - false - 256 - rbxassetid://3186730087 - rbxassetid://3186730087 - Default - wqN+0m4YPEAIF5tOPQwXdA== - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - 1 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - rbxassetid://3186730114 - -0.5 - 0.5 - 0 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a3db - - 0 - 0 - 0 - - - 1.90382576 - 4.49005699 - 0.858924985 - - - - - - - Attributes - -1 - - 2c3758b9147ff16b01b8290f0001a3dc - - - + false @@ -264,6 +136,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186730087 rbxassetid://3186730087 Hull @@ -303,7 +176,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b3 + 2c3758b9147ff16b01b8290f000286cb 0 0 @@ -316,7 +189,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -376,6 +249,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186730087 rbxassetid://3186730087 Box @@ -415,7 +289,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b4 + 2c3758b9147ff16b01b8290f000286cc 0 0 @@ -428,7 +302,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + 0 @@ -457,7 +331,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> null -1 - 2c3758b9147ff16b01b8290f0001a3b5 + 2c3758b9147ff16b01b8290f000286d5 8 @@ -475,7 +349,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -535,6 +409,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186726050 rbxassetid://3186726050 Box @@ -574,7 +449,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b6 + 2c3758b9147ff16b01b8290f000286cd 0 0 @@ -587,7 +462,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -647,6 +522,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186726050 rbxassetid://3186726050 Default @@ -686,7 +562,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b7 + 2c3758b9147ff16b01b8290f000286ce 0 0 @@ -699,7 +575,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -759,6 +635,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186726050 rbxassetid://3186726050 Hull @@ -798,7 +675,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b8 + 2c3758b9147ff16b01b8290f000286cf 0 0 @@ -811,7 +688,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -871,6 +748,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186726050 rbxassetid://3186726050 PreciseConvexDecomposition @@ -910,7 +788,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3b9 + 2c3758b9147ff16b01b8290f000286d0 0 0 @@ -923,7 +801,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + false @@ -983,6 +861,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> false false 256 + rbxassetid://3186726050 rbxassetid://3186726050 LOD @@ -1022,7 +901,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3ba + 2c3758b9147ff16b01b8290f000286d1 0 0 @@ -1036,31 +915,31 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> - + - 95.9516983 - 158.052811 - 226.980164 - 0.939951718 - -0.162711754 - 0.300026149 - -0 - 0.87904948 - 0.476730675 - -0.341307491 - -0.448103815 - 0.826264024 + 32.9383278 + 219.557693 + 236.310623 + 0.929978669 + -0.211403087 + 0.3007465 + 1.49011612e-08 + 0.818105102 + 0.575068772 + -0.367613554 + -0.534801662 + 0.76082021 null 0 70 0 - 95.3516464 - 157.09935 - 225.327637 + 32.3368301 + 218.407547 + 234.788971 1 0 0 @@ -1076,10 +955,10 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> Camera -1 - 2c3758b9147ff16b01b8290f0001a3bb + 2c3758b9147ff16b01b8290f00028683 - + 1 true @@ -1129,6 +1008,7 @@ b3IzEQAAEEEAACBBAAAwQQ==]]> 256 + Terrain 3 0 0 - 2c3758b9147ff16b01b8290f0001a3bc + 2c3758b9147ff16b01b8290f00028736 0 0 @@ -1455,33 +1335,33 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + BoolValue -1 - 2c3758b9147ff16b01b8290f0001a3bd + 2c3758b9147ff16b01b8290f0002867c false - + BrickColorValue -1 - 2c3758b9147ff16b01b8290f0001a3be + 2c3758b9147ff16b01b8290f0002867f 194 - + Color3Value -1 - 2c3758b9147ff16b01b8290f0001a3bf + 2c3758b9147ff16b01b8290f00028689 1 0.498039246 @@ -1489,13 +1369,13 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + CFrameValue -1 - 2c3758b9147ff16b01b8290f0001a3c0 + 2c3758b9147ff16b01b8290f00028681 0 0 @@ -1512,43 +1392,43 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + IntValue -1 - 2c3758b9147ff16b01b8290f0001a3c1 + 2c3758b9147ff16b01b8290f000286bf 1234 - + NumberValue -1 - 2c3758b9147ff16b01b8290f0001a3c2 + 2c3758b9147ff16b01b8290f000286df 9.0000999999999997669 - + ObjectValue -1 - 2c3758b9147ff16b01b8290f0001a3c3 - RBX5440245BA17340CFA5B3B3B0A58C0598 + 2c3758b9147ff16b01b8290f000286e1 + RBXC8BE375880894BB19728E94D7F5BD673 - + RayValue -1 - 2c3758b9147ff16b01b8290f0001a3c4 + 2c3758b9147ff16b01b8290f000286f3 1 @@ -1563,17 +1443,17 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + StringValue -1 - 2c3758b9147ff16b01b8290f0001a3c5 + 2c3758b9147ff16b01b8290f0002872b TestingLol - + true @@ -1624,6 +1504,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false false 288 + Adornee 0 @@ -1657,7 +1538,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 0 0 0 - 2c3758b9147ff16b01b8290f0001a3c6 + 2c3758b9147ff16b01b8290f000286e5 0 0 @@ -1671,9 +1552,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 - + - RBXE99549CBA437433983F6F1CF98398AB5 + RBXF53875E3E93C4F2CAE5B33F12FAA7B38 0 @@ -1687,13 +1568,13 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A -1 0 - 2c3758b9147ff16b01b8290f0001a3c7 + 2c3758b9147ff16b01b8290f00028668 false - + - RBXE99549CBA437433983F6F1CF98398AB5 + RBXF53875E3E93C4F2CAE5B33F12FAA7B38 1 @@ -1708,11 +1589,11 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 0 - 2c3758b9147ff16b01b8290f0001a3c8 + 2c3758b9147ff16b01b8290f000286b0 false - + 0 @@ -1755,11 +1636,11 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A rbxasset://textures/particles/sparkles_main.dds 1 0 1 0 0.0526316 0.972909 0.027091 0.105263 0.89457 0.10543 0.157895 0.773474 0.226526 0.210526 0.622743 0.377257 0.263158 0.45871 0.45871 0.315789 0.299152 0.299152 0.368421 0.161359 0.161359 0.421053 0.0602631 0.0602631 0.473684 0.00681935 0.00681935 0.526316 0.00681935 0.00681935 0.578947 0.0602631 0.0602631 0.631579 0.161359 0.161359 0.684211 0.299152 0.299152 0.736842 0.45871 0.45871 0.789474 0.622743 0.377257 0.842105 0.773474 0.226526 0.894737 0.89457 0.10543 0.947368 0.972909 0.027091 1 1 0 - 2c3758b9147ff16b01b8290f0001a3c9 + 2c3758b9147ff16b01b8290f000286eb 1 0 - + false @@ -1782,10 +1663,10 @@ table.insert(keyPoints, lastPoint) script.Parent.Color = ColorSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3ca + 2c3758b9147ff16b01b8290f0002870d - + false @@ -1809,10 +1690,10 @@ table.insert(keyPoints, lastPoint) script.Parent.Size = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3cb + 2c3758b9147ff16b01b8290f0002870e - + false @@ -1836,18 +1717,18 @@ table.insert(keyPoints, lastPoint) script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3cc + 2c3758b9147ff16b01b8290f0002870f - + Vector3Value -1 - 2c3758b9147ff16b01b8290f0001a3d4 + 2c3758b9147ff16b01b8290f00028754 1 2 @@ -1855,7 +1736,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1906,11 +1787,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a3d5 + 2c3758b9147ff16b01b8290f000286ab true 1 - + UDimTest @@ -1932,11 +1813,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3d6 + 2c3758b9147ff16b01b8290f00028749 - + 0 @@ -1965,7 +1846,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a3d7 + 2c3758b9147ff16b01b8290f000286d6 0 @@ -1983,7 +1864,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2029,6 +1910,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + WithPivot 32.25 @@ -2062,7 +1944,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3d8 + 2c3758b9147ff16b01b8290f000286e6 0 0 @@ -2077,7 +1959,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2123,6 +2005,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + NoPivot 0 @@ -2156,7 +2039,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a3d9 + 2c3758b9147ff16b01b8290f000286e7 0 0 @@ -2172,7 +2055,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + INF @@ -2180,12 +2063,141 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> DoubleValue -1 - 2c3758b9147ff16b01b8290f0001a3da + 2c3758b9147ff16b01b8290f0002869b 1.3337000000000001076 + + + false + + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + + -8 + 15.4042997 + 9 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + false + true + true + false + 0 + 4288914085 + + false + + false + -0.5 + 0.5 + 0 + 0 + false + false + + 1.90382576 + 4.49005699 + 0.858924985 + + + 0 + 0 + 0 + + + -0.5 + 0.5 + 0 + 0 + false + false + 256 + + rbxassetid://3186730087 + rbxassetid://3186730087 + Default + wqN+0m4YPEAIF5tOPQwXdA== + + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + 0 + 1 + -0.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + -1 + + rbxassetid://3186730114 + -0.5 + 0.5 + 0 + 0 + 0 + 2c3758b9147ff16b01b8290f000286d2 + + 0 + 0 + 0 + + + 1.90382576 + 4.49005699 + 0.858924985 + + + + + + + Attributes + -1 + + 2c3758b9147ff16b01b8290f000286a7 + + - + 0 @@ -2196,28 +2208,28 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 -1 - 2c3758b9147ff16b01b8290f0001a2e9 + 2c3758b9147ff16b01b8290f00028598 - + NonReplicatedCSGDictionaryService -1 - 2c3758b9147ff16b01b8290f0001a2f5 + 2c3758b9147ff16b01b8290f000285a4 - + CSGDictionaryService -1 - 2c3758b9147ff16b01b8290f0001a2f6 + 2c3758b9147ff16b01b8290f000285a5 - + false @@ -2225,19 +2237,19 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Chat -1 - 2c3758b9147ff16b01b8290f0001a2fb + 2c3758b9147ff16b01b8290f000285aa - + TimerService -1 - 2c3758b9147ff16b01b8290f0001a2fc + 2c3758b9147ff16b01b8290f000285ab - + true @@ -2247,48 +2259,78 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 -1 - 2c3758b9147ff16b01b8290f0001a2fe + 2c3758b9147ff16b01b8290f000285ad - + ReplicatedFirst -1 - 2c3758b9147ff16b01b8290f0001a302 + 2c3758b9147ff16b01b8290f000285b1 - + TweenService -1 - 2c3758b9147ff16b01b8290f0001a304 + 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 @@ -2312,22 +2354,57 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null null null - 2c3758b9147ff16b01b8290f0001a305 + 2c3758b9147ff16b01b8290f000285b4 false null + Wood null + WoodPlanks - + + + + 0 + true + true + TextChatService + -1 + + 7a17f39c2cd995540269f61800149fc0 + + + + + true + ChatWindowConfiguration + -1 + + 7a17f39c2cd995540269f6180014a183 + + + + + + true + ChatInputBarConfiguration + -1 + + null + 7a17f39c2cd995540269f6180014a184 + + + + PermissionsService -1 - 2c3758b9147ff16b01b8290f0001a309 + 2c3758b9147ff16b01b8290f000285b8 - + false @@ -2338,26 +2415,25 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a30b + 2c3758b9147ff16b01b8290f000285ba - + 0 0 false - false StudioData -1 0 0 - 2c3758b9147ff16b01b8290f0001a30d + 2c3758b9147ff16b01b8290f000285bc - + true @@ -2400,38 +2476,38 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 100 -1 - 2c3758b9147ff16b01b8290f0001a30e + 2c3758b9147ff16b01b8290f000285bd true - + StarterPlayerScripts -1 - 2c3758b9147ff16b01b8290f0001a3dd + 2c3758b9147ff16b01b8290f0002872a - + StarterCharacterScripts -1 - 2c3758b9147ff16b01b8290f0001a3de + 2c3758b9147ff16b01b8290f00028728 - + StarterPack -1 - 2c3758b9147ff16b01b8290f0001a30f + 2c3758b9147ff16b01b8290f000285be - + StarterGui @@ -2440,56 +2516,56 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true -1 - 2c3758b9147ff16b01b8290f0001a310 + 2c3758b9147ff16b01b8290f000285bf 0 - + LocalizationService -1 - 2c3758b9147ff16b01b8290f0001a312 + 2c3758b9147ff16b01b8290f000285c1 - + TeleportService -1 - 2c3758b9147ff16b01b8290f0001a316 + 2c3758b9147ff16b01b8290f000285c5 - + CollectionService -1 - 2c3758b9147ff16b01b8290f0001a318 + 2c3758b9147ff16b01b8290f000285c7 - + PhysicsService -1 - 2c3758b9147ff16b01b8290f0001a319 + 2c3758b9147ff16b01b8290f000285c8 - + Geometry -1 - 2c3758b9147ff16b01b8290f0001a31b + 2c3758b9147ff16b01b8290f000285ca - + false false @@ -2497,176 +2573,167 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> InsertService -1 - 2c3758b9147ff16b01b8290f0001a31d + 2c3758b9147ff16b01b8290f000285cc - + InsertionHash -1 - 2c3758b9147ff16b01b8290f0001a3df + 2c3758b9147ff16b01b8290f0002872c {13812C15-10FD-484C-84A8-A73EEF4CA830} - + GamePassService -1 - 2c3758b9147ff16b01b8290f0001a31e + 2c3758b9147ff16b01b8290f000285cd - + 1000 Debris -1 - 2c3758b9147ff16b01b8290f0001a31f + 2c3758b9147ff16b01b8290f000285ce - + CookiesService -1 - 2c3758b9147ff16b01b8290f0001a320 + 2c3758b9147ff16b01b8290f000285cf - + VRService -1 - 2c3758b9147ff16b01b8290f0001a32a + 2c3758b9147ff16b01b8290f000285d9 - + ContextActionService -1 - 2c3758b9147ff16b01b8290f0001a32b + 2c3758b9147ff16b01b8290f000285da - + ScriptService -1 - 2c3758b9147ff16b01b8290f0001a32d + 2c3758b9147ff16b01b8290f000285dc - + AssetService -1 - 2c3758b9147ff16b01b8290f0001a32e + 2c3758b9147ff16b01b8290f000285dd - + TouchInputService -1 - 2c3758b9147ff16b01b8290f0001a32f + 2c3758b9147ff16b01b8290f000285de - + AnalyticsService -1 - 2c3758b9147ff16b01b8290f0001a332 + 2c3758b9147ff16b01b8290f000285e1 - + Selection -1 - 2c3758b9147ff16b01b8290f0001a335 + 2c3758b9147ff16b01b8290f000285e4 - + false ServerScriptService -1 - 2c3758b9147ff16b01b8290f0001a337 + 2c3758b9147ff16b01b8290f000285e6 - + ServerStorage -1 - 2c3758b9147ff16b01b8290f0001a338 + 2c3758b9147ff16b01b8290f000285e7 - + NodePresets -1 - 2c3758b9147ff16b01b8290f00024702 + 2c3758b9147ff16b01b8290f00034517 - + ReplicatedStorage -1 - 2c3758b9147ff16b01b8290f0001a339 + 2c3758b9147ff16b01b8290f000285e8 - + LuaWebService -1 - 2c3758b9147ff16b01b8290f0001a340 + 2c3758b9147ff16b01b8290f000285ef - + ProcessInstancePhysicsService -1 - 2c3758b9147ff16b01b8290f0001a343 + 2c3758b9147ff16b01b8290f000285f2 - - - - LanguageService - -1 - - 2c3758b9147ff16b01b8290f0001a34a - - - + 0 @@ -2709,19 +2776,28 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 00:00:00 - 2c3758b9147ff16b01b8290f0001a383 + 2c3758b9147ff16b01b8290f00028631 - + Instance -1 - 2c3758b9147ff16b01b8290f0001a385 + 2c3758b9147ff16b01b8290f00028633 - + + + + AnimationFromVideoCreatorService + -1 + + 7a17f39c2cd995540269f6180015546d + + + true @@ -2729,38 +2805,47 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> DataStoreService -1 - 2c3758b9147ff16b01b8290f0001a3e0 + 2c3758b9147ff16b01b8290f00028695 - + FlyweightService -1 - 2c3758b9147ff16b01b8290f0001a3e1 + 2c3758b9147ff16b01b8290f000286a6 - + true HttpService -1 - 2c3758b9147ff16b01b8290f0001a3e2 + 2c3758b9147ff16b01b8290f000286b7 - + + + + LanguageService + -1 + + 2c3758b9147ff16b01b8290f000285f9 + + + MemoryStoreService -1 - 2c3758b9147ff16b01b8290f0001a3e3 + 2c3758b9147ff16b01b8290f000286ca - + true @@ -2768,28 +2853,28 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ProximityPromptService -1 - 2c3758b9147ff16b01b8290f0001a3e4 + 2c3758b9147ff16b01b8290f000286f2 - + ReplicatedScriptService -1 - 2c3758b9147ff16b01b8290f0001a3e5 + 2c3758b9147ff16b01b8290f00028704 - + Teams -1 - 2c3758b9147ff16b01b8290f0001a3e6 + 2c3758b9147ff16b01b8290f00028734 - + true @@ -2804,62 +2889,103 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 10 - 2c3758b9147ff16b01b8290f0001a3e7 + 2c3758b9147ff16b01b8290f00028738 - + {"lastSaveTime":0,"lastKnownPublishRequest":0,"users":[]} UnvalidatedAssetService -1 - 2c3758b9147ff16b01b8290f0001a3e8 + 2c3758b9147ff16b01b8290f00028753 - + + + false + + + VideoCaptureService + -1 + + 7a17f39c2cd995540269f61800155571 + + + VirtualInputManager -1 - 2c3758b9147ff16b01b8290f0001a3e9 + 2c3758b9147ff16b01b8290f0002875c - + + + + VoiceChatInternal + -1 + + 7a17f39c2cd995540269f61800155575 + + + + + + true + VoiceChatService + -1 + + 7a17f39c2cd995540269f61800155576 + + + DumpFolder -1 - 2c3758b9147ff16b01b8290f0001a3ea + 2c3758b9147ff16b01b8290f000286a8 - + - 100 - 1 - UITextSizeConstraint - -1 - - 2c3758b9147ff16b01b8290f0001a3eb - - - - - - Vector3Value - -1 - - 2c3758b9147ff16b01b8290f0001a3ec - + + INF + INF + + 0 0 - 0 - + + UISizeConstraint + -1 + + 7a17f39c2cd995540269f61800155556 - + + + + StringValue + -1 + + 7a17f39c2cd995540269f6180015556d + + + + + + + Vector3Curve + -1 + + 7a17f39c2cd995540269f6180015556f + + + 0 @@ -2879,10 +3005,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Accoutrement -1 - 2c3758b9147ff16b01b8290f0001a3ed + 7a17f39c2cd995540269f61800155465 - + 0 @@ -2903,42 +3029,40 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Accessory -1 - 2c3758b9147ff16b01b8290f0001a3ee + 7a17f39c2cd995540269f61800155466 - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - Hat - -1 - - 2c3758b9147ff16b01b8290f0001a3ef - - - + - AnimationController + 2 + true + KeyframeSequence + 2 -1 - 2c3758b9147ff16b01b8290f0001a3f0 + 7a17f39c2cd995540269f6180015546b - + + + + AnimationRigData + -1 + + 7a17f39c2cd995540269f6180015546f + AQAAAAEAAAAAAAAA + AQAAAAEAAAAAAAAA + AQAAAAEAAAAAAA== + + + + + + @@ -2958,19 +3082,19 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a3f1 + 7a17f39c2cd995540269f61800155472 - + Backpack -1 - 2c3758b9147ff16b01b8290f0001a3f2 + 7a17f39c2cd995540269f61800155476 - + false @@ -2979,10 +3103,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3f3 + 7a17f39c2cd995540269f61800155477 - + true @@ -3008,10 +3132,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - 2c3758b9147ff16b01b8290f0001a3f4 + 7a17f39c2cd995540269f61800155478 - + true @@ -3038,10 +3162,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 194 - 2c3758b9147ff16b01b8290f0001a3f5 + 7a17f39c2cd995540269f61800155479 - + null null @@ -3063,31 +3187,31 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 1 0 0.5 0 1 0.5 0 - 2c3758b9147ff16b01b8290f0001a3f6 + 7a17f39c2cd995540269f6180015547c 1 1 0 - + BindableEvent -1 - 2c3758b9147ff16b01b8290f0001a3f7 + 7a17f39c2cd995540269f6180015547d - + BindableFunction -1 - 2c3758b9147ff16b01b8290f0001a3f8 + 7a17f39c2cd995540269f6180015547e - + 0 @@ -3104,10 +3228,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1250 -1 - 2c3758b9147ff16b01b8290f0001a3f9 + 7a17f39c2cd995540269f6180015547f - + @@ -3118,10 +3242,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BodyForce -1 - 2c3758b9147ff16b01b8290f0001a3fa + 7a17f39c2cd995540269f61800155480 - + @@ -3148,10 +3272,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3000 -1 - 2c3758b9147ff16b01b8290f0001a3fb + 7a17f39c2cd995540269f61800155481 - + 1250 @@ -3169,10 +3293,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a3fc + 7a17f39c2cd995540269f61800155482 - + @@ -3188,10 +3312,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BodyThrust -1 - 2c3758b9147ff16b01b8290f0001a3fd + 7a17f39c2cd995540269f61800155483 - + @@ -3203,7 +3327,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1250 -1 - 2c3758b9147ff16b01b8290f0001a3fe + 7a17f39c2cd995540269f61800155484 0 2 @@ -3211,7 +3335,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0.699999988 @@ -3236,10 +3360,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 500 3000 - 2c3758b9147ff16b01b8290f0001a3ff + 7a17f39c2cd995540269f61800155485 - + @@ -3279,10 +3403,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Camera -1 - 2c3758b9147ff16b01b8290f0001a400 + 7a17f39c2cd995540269f61800155487 - + @@ -3318,10 +3442,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.498039246 0.278431386 - 2c3758b9147ff16b01b8290f0001a401 + 7a17f39c2cd995540269f61800155488 - + 0 @@ -3331,10 +3455,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a402 + 7a17f39c2cd995540269f61800155489 - + @@ -3346,10 +3470,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a403 + 7a17f39c2cd995540269f6180015548a - + @@ -3361,25 +3485,20 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a404 + 7a17f39c2cd995540269f6180015548b - + - - 1 - 1 - 1 - - - ShirtGraphic + Skin + 226 -1 - 2c3758b9147ff16b01b8290f0001a405 + 7a17f39c2cd995540269f6180015548d - + @@ -3387,10 +3506,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ClickDetector -1 - 2c3758b9147ff16b01b8290f0001a406 + 7a17f39c2cd995540269f6180015548e - + @@ -3404,19 +3523,19 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Clouds -1 - 2c3758b9147ff16b01b8290f0001a407 + 7a17f39c2cd995540269f6180015548f - + Configuration -1 - 2c3758b9147ff16b01b8290f0001a408 + 7a17f39c2cd995540269f61800155490 - + 0 null @@ -3458,11 +3577,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a409 + 7a17f39c2cd995540269f61800155491 false - + false null @@ -3484,11 +3603,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false -1 - 2c3758b9147ff16b01b8290f0001a40a + 7a17f39c2cd995540269f61800155492 false - + 0 @@ -3506,11 +3625,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 -1 - 2c3758b9147ff16b01b8290f0001a40b + 7a17f39c2cd995540269f61800155493 false - + null null @@ -3527,12 +3646,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false -45 45 - 2c3758b9147ff16b01b8290f0001a40c + 7a17f39c2cd995540269f61800155494 45 false - + 0 45 @@ -3554,31 +3673,29 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a40d + 7a17f39c2cd995540269f61800155495 45 false - + - false null null - 23 + 194 + false + INF + INF true - false - 1000 - INF - LineForce - false + RigidConstraint -1 - 2c3758b9147ff16b01b8290f0001a40e + 7a17f39c2cd995540269f61800155499 false - + null null @@ -3593,11 +3710,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0.100000001 - 2c3758b9147ff16b01b8290f0001a40f + 7a17f39c2cd995540269f6180015549a false - + null null @@ -3610,7 +3727,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0.100000001 - 2c3758b9147ff16b01b8290f0001a410 + 7a17f39c2cd995540269f6180015549b false false 10000 @@ -3619,7 +3736,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 - + 0 0 @@ -3653,41 +3770,34 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 2c3758b9147ff16b01b8290f0001a411 + 7a17f39c2cd995540269f6180015549c 45 5 0 false - + - 0 null null - 1009 + 23 true - false - 45 - 0 - INF - 0 - PrismaticConstraint - 0 - 0 - 0.150000006 + Torque + 0 -1 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a412 - 5 - 0 + + 0 + 0 + 0 + + 7a17f39c2cd995540269f6180015549f false - + null null @@ -3706,11 +3816,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 100 - 2c3758b9147ff16b01b8290f0001a413 + 7a17f39c2cd995540269f618001554a0 false - + null null @@ -3724,11 +3834,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a414 + 7a17f39c2cd995540269f618001554a1 false - + false null @@ -3745,58 +3855,58 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a415 + 7a17f39c2cd995540269f618001554a2 false - + HumanoidController -1 - 2c3758b9147ff16b01b8290f0001a416 + 7a17f39c2cd995540269f618001554a3 - + SkateboardController -1 - 2c3758b9147ff16b01b8290f0001a417 + 7a17f39c2cd995540269f618001554a4 - + VehicleController -1 - 2c3758b9147ff16b01b8290f0001a418 + 7a17f39c2cd995540269f618001554a5 - + CustomEvent 0 -1 - 2c3758b9147ff16b01b8290f0001a419 + 7a17f39c2cd995540269f618001554a6 - + CustomEventReceiver null -1 - 2c3758b9147ff16b01b8290f0001a41a + 7a17f39c2cd995540269f618001554a7 - + 0 @@ -3817,7 +3927,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a41b + 7a17f39c2cd995540269f618001554a8 1 1 @@ -3825,36 +3935,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - - - - 0 - 0 - 0 - 2 - 2 - CylinderMesh - - 0 - 0 - 0 - - - 1 - 1 - 1 - - -1 - - 2c3758b9147ff16b01b8290f0001a41c - - 1 - 1 - 1 - - - - + 0 @@ -3873,43 +3954,29 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 2c3758b9147ff16b01b8290f0001a41d + 7a17f39c2cd995540269f618001554b1 - + - true - - DialogChoice - + EulerRotationCurve + 0 -1 - 2c3758b9147ff16b01b8290f0001a41e - + 7a17f39c2cd995540269f618001554b4 - + - 500000 - 4 - 1 - 1 - Explosion - - 0 - 0 - 0 - + FaceControls -1 - 1 - 2c3758b9147ff16b01b8290f0001a41f - true + 7a17f39c2cd995540269f618001554b7 - + @@ -3923,11 +3990,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - 2c3758b9147ff16b01b8290f0001a420 + 7a17f39c2cd995540269f618001554b8 1 - + @@ -3945,11 +4012,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - 2c3758b9147ff16b01b8290f0001a421 + 7a17f39c2cd995540269f618001554b9 1 - + 0 @@ -3959,10 +4026,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 1 - 2c3758b9147ff16b01b8290f0001a422 + 7a17f39c2cd995540269f618001554ba - + 0 @@ -3972,42 +4039,81 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 1 - 2c3758b9147ff16b01b8290f0001a423 + 7a17f39c2cd995540269f618001554bb - + - - 0.92549026 - 0.545098066 - 0.274509817 - - true - Fire - - 0.545098066 - 0.313725501 - 0.215686291 - + FloatCurve -1 - 1 - 2c3758b9147ff16b01b8290f0001a424 - 9 - 5 + 7a17f39c2cd995540269f618001554bd + AQAAAAAAAAAAAAAAAAAWRQAAAAA= - + + false + + 0 + 0 + - Folder + true + 0 + + 0.639215708 + 0.635294139 + 0.647058845 + + 0 + + 0.105882362 + 0.164705887 + 0.207843155 + + 0 + 1 + false + false + + 1 + 1 + 1 + + 0 + 0 + CanvasGroup + null + null + null + null + + 0 + 0 + 0 + 0 + + null + 0 + false + null + + 0 + 0 + 0 + 0 + + 0 -1 - 2c3758b9147ff16b01b8290f0001a425 + 7a17f39c2cd995540269f618001554c1 + true + 1 - + false @@ -4058,12 +4164,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a426 + 7a17f39c2cd995540269f618001554c2 true 1 - + true @@ -4153,12 +4259,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 0 - 2c3758b9147ff16b01b8290f0001a427 + 7a17f39c2cd995540269f618001554c3 true 1 - + true @@ -4185,6 +4291,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 0 + + rbxasset://fonts/families/LegacyArial.json + 400 + + rbxasset://fonts/arial.ttf + 0 1 -1 @@ -4235,12 +4347,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 2 1 - 2c3758b9147ff16b01b8290f0001a428 + 7a17f39c2cd995540269f618001554c4 true 1 - + false @@ -4324,12 +4436,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 0 - 2c3758b9147ff16b01b8290f0001a429 + 7a17f39c2cd995540269f618001554c5 true 1 - + false @@ -4338,6 +4450,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 0 0.639215708 @@ -4352,13 +4465,24 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 1 - false + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 2 + 0 + + true false - 0 + 0 + 0 0 - 1 - -1 - TextLabel + rbxasset://textures/ui/Scroll/scroll-middle.png + ScrollingFrame null null null @@ -4369,10 +4493,18 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - false null 0 - false + + 1 + 1 + 1 + + 0 + 12 + 4 + true + true null 0 @@ -4383,31 +4515,15 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - Label - - 0.105882362 - 0.164705887 - 0.207843155 - - false - 8 - - 0 - 0 - 0 - - 1 - 0 - 0 - false - 2 - 1 - 2c3758b9147ff16b01b8290f0001a42a + rbxasset://textures/ui/Scroll/scroll-top.png + 7a17f39c2cd995540269f618001554c7 + 0 + 0 true 1 - + true @@ -4434,6 +4550,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 0 + + rbxasset://fonts/families/LegacyArial.json + 400 + + rbxasset://fonts/arial.ttf + 0 1 -1 @@ -4490,12 +4612,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 2 1 - 2c3758b9147ff16b01b8290f0001a42b + 7a17f39c2cd995540269f618001554c8 true 1 - + false @@ -4548,14 +4670,14 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a42c + 7a17f39c2cd995540269f618001554c9 true 1 1 - + false @@ -4641,12 +4763,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a42d + 7a17f39c2cd995540269f618001554ca true 1 - + false null @@ -4697,11 +4819,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - 2c3758b9147ff16b01b8290f0001a42e + 7a17f39c2cd995540269f618001554cb 0 - + true @@ -4713,27 +4835,40 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a42f + 7a17f39c2cd995540269f618001554cc 0 - + + true + null + false true - 0 + 1 + + 800 + 600 + + false true - false - GuiMain + 5 + 0 + SurfaceGui + 50 true null + 0 -1 - 2c3758b9147ff16b01b8290f0001a430 + 0 + 7a17f39c2cd995540269f618001554ce 0 + 0 - + @@ -4754,13 +4889,13 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null 0 - 2c3758b9147ff16b01b8290f0001a431 + 7a17f39c2cd995540269f618001554cf 2 true 0.0625 - + null @@ -4780,11 +4915,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 0 - 2c3758b9147ff16b01b8290f0001a432 + 7a17f39c2cd995540269f618001554d0 true - + 0 null @@ -4823,12 +4958,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a433 + 7a17f39c2cd995540269f618001554d1 true -1 - + 0 null @@ -4864,12 +4999,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a434 + 7a17f39c2cd995540269f618001554d2 true -1 - + 0 null @@ -4907,12 +5042,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a435 + 7a17f39c2cd995540269f618001554d3 true -1 - + 0 null @@ -4951,12 +5086,45 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a436 + 7a17f39c2cd995540269f618001554d4 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 @@ -4992,58 +5160,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 0 - 2c3758b9147ff16b01b8290f0001a437 + 7a17f39c2cd995540269f618001554d5 true -1 - - - true - null - false - - true - 1 - - 800 - 600 - - false - true - 5 - 0 - SurfaceGui - 50 - true - null - 0 - -1 - - 0 - 2c3758b9147ff16b01b8290f0001a438 - 0 - 0 - - - - - null - - - 0.94901967 - 0.952941239 - 0.952941239 - - ParabolaAdornment - -1 - - 0 - 2c3758b9147ff16b01b8290f0001a439 - true - - - + 0 null @@ -5078,12 +5200,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a43a + 7a17f39c2cd995540269f618001554d6 true -1 - + null @@ -5102,11 +5224,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 0 - 2c3758b9147ff16b01b8290f0001a43b + 7a17f39c2cd995540269f618001554d8 true - + null @@ -5122,11 +5244,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a43c + 7a17f39c2cd995540269f618001554d9 true - + null @@ -5143,11 +5265,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 2c3758b9147ff16b01b8290f0001a43d + 7a17f39c2cd995540269f618001554da true - + null @@ -5161,11 +5283,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 2c3758b9147ff16b01b8290f0001a43e + 7a17f39c2cd995540269f618001554db true - + @@ -5179,33 +5301,35 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 0 - 2c3758b9147ff16b01b8290f0001a43f + 7a17f39c2cd995540269f618001554dc true - + + null - - 0.0509803966 - 0.411764741 - 0.674509823 + 0 + true + + 1 + 0 + 0 - null - SelectionPointLasso - - 0 - 0 - 0 - + 0.5 + Highlight + + 1 + 1 + 1 + + 0 -1 - 0 - 2c3758b9147ff16b01b8290f0001a440 - true + 7a17f39c2cd995540269f618001554e0 - + true @@ -5236,12 +5360,12 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 -1 - 2c3758b9147ff16b01b8290f0001a441 + 7a17f39c2cd995540269f618001554e1 true 16 - + [] @@ -5308,13 +5432,13 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - 2c3758b9147ff16b01b8290f0001a442 + 7a17f39c2cd995540269f618001554e2 0 1 - + 0 @@ -5352,10 +5476,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a443 + 7a17f39c2cd995540269f618001554e4 - + 0 @@ -5393,10 +5517,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a444 + 7a17f39c2cd995540269f618001554e5 - + @@ -5453,10 +5577,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a445 + 7a17f39c2cd995540269f618001554e6 - + @@ -5493,10 +5617,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a446 + 7a17f39c2cd995540269f618001554e7 - + @@ -5533,10 +5657,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a447 + 7a17f39c2cd995540269f618001554e8 - + @@ -5575,10 +5699,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a448 + 7a17f39c2cd995540269f618001554e9 - + @@ -5617,10 +5741,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a449 + 7a17f39c2cd995540269f618001554ea - + @@ -5657,10 +5781,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a44a + 7a17f39c2cd995540269f618001554eb - + @@ -5697,10 +5821,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a44b + 7a17f39c2cd995540269f618001554ec - + @@ -5741,10 +5865,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a44c + 7a17f39c2cd995540269f618001554ed - + @@ -5781,42 +5905,41 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a44d + 7a17f39c2cd995540269f618001554ee - + Keyframe -1 0 - 2c3758b9147ff16b01b8290f0001a44e + 7a17f39c2cd995540269f618001554ef - + + + + true + CurveAnimation + 2 + -1 + + 7a17f39c2cd995540269f6180015546a + + + KeyframeMarker -1 - 2c3758b9147ff16b01b8290f0001a44f + 7a17f39c2cd995540269f618001554f0 - - - - 2 - true - KeyframeSequence - 2 - -1 - - 2c3758b9147ff16b01b8290f0001a450 - - - + 1 @@ -5831,10 +5954,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false -1 - 2c3758b9147ff16b01b8290f0001a451 + 7a17f39c2cd995540269f618001554f1 - + 90 @@ -5851,10 +5974,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false -1 - 2c3758b9147ff16b01b8290f0001a452 + 7a17f39c2cd995540269f618001554f2 - + 90 @@ -5871,10 +5994,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false -1 - 2c3758b9147ff16b01b8290f0001a453 + 7a17f39c2cd995540269f618001554f3 - + [] @@ -5882,68 +6005,74 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 en-us - 2c3758b9147ff16b01b8290f0001a454 + 7a17f39c2cd995540269f618001554f4 - + false Script - {7A7656A4-A0FA-40C9-BA11-2257FCD00851} + {0DA76407-E724-4B17-981A-2CE9FB3AE48E} -1 - 2c3758b9147ff16b01b8290f0001a455 + 7a17f39c2cd995540269f618001554f5 - + false LocalScript - {44C5B96A-BF4E-4DDD-960B-AE336DEF41B3} + {571930D4-D133-4EEA-A230-22EED83107A1} -1 - 2c3758b9147ff16b01b8290f0001a456 + 7a17f39c2cd995540269f618001554f7 - + - - ModuleScript - {53029FFB-A2CF-488C-ADC1-62E1EE6E52F6} - + 256 + + 0 + + MaterialVariant + + -1 + 10 - 2c3758b9147ff16b01b8290f0001a457 + + + 7a17f39c2cd995540269f618001554fc - + Message -1 - 2c3758b9147ff16b01b8290f0001a458 + 7a17f39c2cd995540269f618001554fd - + Hint -1 - 2c3758b9147ff16b01b8290f0001a459 + 7a17f39c2cd995540269f618001554fe - + true @@ -5952,10 +6081,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a45a + 7a17f39c2cd995540269f61800155501 - + false @@ -6001,6 +6130,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + CornerWedgePart 0 @@ -6034,7 +6164,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a45b + 7a17f39c2cd995540269f61800155502 0 0 @@ -6047,7 +6177,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6093,6 +6223,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + Part 0 @@ -6126,7 +6257,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3 0 0 - 2c3758b9147ff16b01b8290f0001a45c + 7a17f39c2cd995540269f61800155503 0 0 @@ -6141,7 +6272,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6187,6 +6318,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + FlagStand 0 @@ -6221,7 +6353,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3 0 0 - 2c3758b9147ff16b01b8290f0001a45d + 7a17f39c2cd995540269f61800155504 0 0 @@ -6236,7 +6368,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6283,6 +6415,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + Seat 0 @@ -6316,7 +6449,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3 0 0 - 2c3758b9147ff16b01b8290f0001a45e + 7a17f39c2cd995540269f61800155506 0 0 @@ -6331,7 +6464,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6377,6 +6510,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + SkateboardPlatform 0 @@ -6413,7 +6547,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3 0 0 - 2c3758b9147ff16b01b8290f0001a45f + 7a17f39c2cd995540269f61800155507 0 0 @@ -6428,7 +6562,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false false @@ -6477,6 +6611,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + SpawnLocation true @@ -6512,7 +6647,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3 0 0 - 2c3758b9147ff16b01b8290f0001a460 + 7a17f39c2cd995540269f61800155508 0 0 @@ -6527,7 +6662,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6573,6 +6708,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + WedgePart 0 @@ -6606,7 +6742,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a461 + 7a17f39c2cd995540269f61800155509 0 0 @@ -6620,7 +6756,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6680,6 +6816,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + MeshPart @@ -6719,7 +6856,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a462 + 7a17f39c2cd995540269f6180015550a 0 0 @@ -6732,7 +6869,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6788,6 +6925,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + yuZpQdnvvUBOTYh1jqZ2cA== PartOperation @@ -6827,7 +6965,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a463 + 7a17f39c2cd995540269f6180015550b false 0 @@ -6841,7 +6979,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -6897,6 +7035,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + yuZpQdnvvUBOTYh1jqZ2cA== NegateOperation @@ -6936,7 +7075,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0.100000001 - 2c3758b9147ff16b01b8290f0001a464 + 7a17f39c2cd995540269f6180015550c false 0 @@ -6950,7 +7089,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -7006,6 +7145,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + yuZpQdnvvUBOTYh1jqZ2cA== UnionOperation @@ -7045,7 +7185,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0 - 2c3758b9147ff16b01b8290f0001a465 + 7a17f39c2cd995540269f6180015550d false 0 @@ -7059,1267 +7199,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - - - 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 - 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 - 2c3758b9147ff16b01b8290f0001a466 - - 0 - 0 - 0 - - - 2 - 2 - 2 - - 0 - - - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - Actor - false - null - -1 - - 2c3758b9147ff16b01b8290f0001a467 - - - - - - - 0 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - yuZpQdnvvUBOTYh1jqZ2cA== - - 0 - 0 - 0 - - WorldModel - false - null - -1 - - 2c3758b9147ff16b01b8290f0001a468 - - - - - - - 0 - 0 - 0 - - - 1 - 0 1 1 1 0 1 1 1 1 0 - 0 - 1 - true - 1 1 - Particle texture must be 1024 by 1024 to use flipbooks. - 0 - 0 - false - 5 10 - 0 - 0 - false - ParticleEmitter - 0 - 20 - 0 0 - 0 0 - 0 - 0 - 1 - 0 - 0 1 0 1 1 0 - -1 - 5 5 - - 0 - 0 - - 0 0 0 1 0 0 - - rbxasset://textures/particles/sparkles_main.dds - 1 - 0 0 0 1 0 0 - 2c3758b9147ff16b01b8290f0001a469 - 0 - 0 - - - - - - 0 - 0 - NumberPose - -1 - - 2c3758b9147ff16b01b8290f0001a46a - 0 - 1 - - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - 0 - Pose - -1 - - 2c3758b9147ff16b01b8290f0001a46b - 1 - - - - - - true - 0.400000006 - BloomEffect - 24 - -1 - - 0.949999988 - 2c3758b9147ff16b01b8290f0001a46c - - - - - - 0 - 0 - true - ColorCorrectionEffect - 0 - -1 - - - 1 - 1 - 1 - - 2c3758b9147ff16b01b8290f0001a46d - - - - - - true - 0.25 - SunRaysEffect - -1 - 1 - - 2c3758b9147ff16b01b8290f0001a46e - - - - - Interact - - true - true - true - 0 - 1000 - 0 - 101 - 10 - ProximityPrompt - - true - null - -1 - 0 - - - 0 - 0 - - 2c3758b9147ff16b01b8290f0001a46f - - - - - - - ReflectionMetadataCallbacks - -1 - - 2c3758b9147ff16b01b8290f0001a471 - - - - - - ReflectionMetadataClasses - -1 - - 2c3758b9147ff16b01b8290f0001a472 - - - - - - ReflectionMetadataEnums - -1 - - 2c3758b9147ff16b01b8290f0001a473 - - - - - - ReflectionMetadataEvents - -1 - - 2c3758b9147ff16b01b8290f0001a474 - - - - - - ReflectionMetadataFunctions - -1 - - 2c3758b9147ff16b01b8290f0001a475 - - - - - - true - - false - - false - false - - 0 - 2147483647 - - true - false - ReflectionMetadataClass - - 5000 - - false - -1 - - 0 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a476 - - - - - - true - - false - - false - false - - - false - ReflectionMetadataEnum - 5000 - - false - -1 - - 0 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a477 - - - - - - true - - false - - false - false - - - false - ReflectionMetadataEnumItem - 5000 - - false - -1 - - 0 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a478 - - - - - - true - - false - - false - false - - - false - ReflectionMetadataMember - 5000 - - false - -1 - - 0 - 0 - 0 - 2c3758b9147ff16b01b8290f0001a479 - - - - - - ReflectionMetadataProperties - -1 - - 2c3758b9147ff16b01b8290f0001a47a - - - - - - ReflectionMetadataYieldFunctions - -1 - - 2c3758b9147ff16b01b8290f0001a47b - - - - - - RemoteEvent - -1 - - 2c3758b9147ff16b01b8290f0001a47c - - - - - - RemoteFunction - -1 - - 2c3758b9147ff16b01b8290f0001a47d - - - - - - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 10 - 0 - 50 - - 70 - RenderingTest - 21 - false - -1 - - - 2c3758b9147ff16b01b8290f0001a47e - - - - - - 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 - - 2c3758b9147ff16b01b8290f0001a47f - - - - - - - 1 - 1 - 1 - - true - Smoke - -1 - - 1 - 2c3758b9147ff16b01b8290f0001a480 - 0.5 - 1 - 1 - - - - - - 10 - false - Sound - false - 1 - false - 0 - null - - -1 - - 0 - 2c3758b9147ff16b01b8290f0001a481 - 0.5 - 10000 - - - - - - 0.150000006 - true - 0.5 - ChorusSoundEffect - 0 - 0.5 - -1 - - 2c3758b9147ff16b01b8290f0001a482 - - - - - 0.100000001 - - true - 0 - CompressorSoundEffect - 0 - 40 - 0.100000001 - null - -1 - - -40 - 2c3758b9147ff16b01b8290f0001a483 - - - - - - true - 0.75 - DistortionSoundEffect - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a484 - - - - - - 1 - 0 - true - 0.5 - EchoSoundEffect - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a485 - 0 - - - - - - true - 0 - -20 - -10 - EqualizerSoundEffect - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a486 - - - - - - 0.449999988 - true - 0.850000024 - FlangeSoundEffect - 0 - 5 - -1 - - 2c3758b9147ff16b01b8290f0001a487 - - - - - - true - PitchShiftSoundEffect - 1.25 - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a488 - - - - - - 1.5 - 1 - 1 - -6 - true - ReverbSoundEffect - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a489 - 0 - - - - - - 1 - 0.5 - true - 5 - TremoloSoundEffect - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a48a - - - - - - true - Sparkles - -1 - - 0.564705908 - 0.0980392247 - 1 - - - 1 - 2c3758b9147ff16b01b8290f0001a48b - - - - - - StarterGear - -1 - - 2c3758b9147ff16b01b8290f0001a48c - - - - - - true - Team - -1 - - 1 - 2c3758b9147ff16b01b8290f0001a48d - - - - - - TeleportOptions - - - false - -1 - - 2c3758b9147ff16b01b8290f0001a48e - - - - - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - TerrainRegion - AQU= - -1 - - 2c3758b9147ff16b01b8290f0001a48f - - - - - 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 - 2c3758b9147ff16b01b8290f0001a490 - 0 1 0 1 1 0 - - - - - - Tween - -1 - - 2c3758b9147ff16b01b8290f0001a491 - - - - - 1 - 0 - - 0 - UIAspectRatioConstraint - -1 - - 2c3758b9147ff16b01b8290f0001a492 - - - - - - - 0 - 8 - - UICorner - -1 - - 2c3758b9147ff16b01b8290f0001a493 - - - - - - 0 1 1 1 0 1 1 1 1 0 - true - UIGradient - - 0 - 0 - - 0 - -1 - - 0 0 0 1 0 0 - 2c3758b9147ff16b01b8290f0001a494 - - - - - - - 0 - 5 - 0 - 5 - - - 0 - 100 - 0 - 100 - - 0 - 0 - 1 - UIGridLayout - 0 - -1 - 0 - - 2c3758b9147ff16b01b8290f0001a495 - 1 - - - - - - 1 - 1 - UIListLayout - - 0 - 0 - - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a496 - 1 - - - - - true - - false - 1 - 2 - 0 - true - 1 - UIPageLayout - - 0 - 0 - - true - 0 - -1 - - true - 1 - 2c3758b9147ff16b01b8290f0001a497 - 1 - - - - - - 1 - false - false - 1 - 0 - UITableLayout - - 0 - 0 - 0 - 0 - - 0 - -1 - - 2c3758b9147ff16b01b8290f0001a498 - 1 - - - - - - UIScale - 1 - -1 - - 2c3758b9147ff16b01b8290f0001a499 - - - - - 0 - - - 0 - 0 - 0 - - true - 0 - UIStroke - -1 - - 1 - 0 - 2c3758b9147ff16b01b8290f0001a49a - - - - - - BinaryStringValue - -1 - - 2c3758b9147ff16b01b8290f0001a49b - - - - - - - BoolValue - -1 - - 2c3758b9147ff16b01b8290f0001a49c - false - - - - - - BrickColorValue - -1 - - 2c3758b9147ff16b01b8290f0001a49d - 194 - - - - - - CFrameValue - -1 - - 2c3758b9147ff16b01b8290f0001a49e - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - - - - - - Color3Value - -1 - - 2c3758b9147ff16b01b8290f0001a49f - - 0 - 0 - 0 - - - - - - - 1 - 0 - DoubleConstrainedValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a0 - 0 - - - - - - 10 - 0 - IntConstrainedValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a1 - 0 - - - - - - IntValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a2 - 0 - - - - - - NumberValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a3 - 0 - - - - - - ObjectValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a4 - null - - - - - - RayValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a5 - - - 0 - 0 - 0 - - - 0 - 0 - 0 - - - - - - - - StringValue - -1 - - 2c3758b9147ff16b01b8290f0001a4a6 - - - - - - - - INF - INF - - - 0 - 0 - - UISizeConstraint - -1 - - 2c3758b9147ff16b01b8290f0001a4a7 - - - - - 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 - 2c3758b9147ff16b01b8290f0001a4a8 - 0 - 0 - true - 1 - - - - - - - Animation - -1 - - 2c3758b9147ff16b01b8290f0001a4a9 - - - - - - true - BlurEffect - 24 - -1 - - 2c3758b9147ff16b01b8290f0001a4aa - - - + 0 @@ -8348,92 +7228,1085 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null -1 - 2c3758b9147ff16b01b8290f0001a4ab + 7a17f39c2cd995540269f61800155510 - + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + Actor + false + null + -1 + + 7a17f39c2cd995540269f61800155511 + + + + + + + + + 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 + BlurEffect + 24 + -1 + + 7a17f39c2cd995540269f6180015551d + + + + + + 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 + 1 + 1 + -6 + true + ReverbSoundEffect + 0 + -1 + + 7a17f39c2cd995540269f61800155540 + 0 + + + + + + SoundGroup + -1 + + 7a17f39c2cd995540269f61800155542 + 0.5 + + + StandalonePluginScripts -1 - 2c3758b9147ff16b01b8290f0001a4ac + 7a17f39c2cd995540269f61800155545 - + + 0 - Skin - 226 + + + SurfaceAppearance + + -1 - 2c3758b9147ff16b01b8290f0001a4ad + + 7a17f39c2cd995540269f61800155549 - + + + + true + Team + -1 + + 1 + 7a17f39c2cd995540269f6180015554a + + + + + + + 1 + 0 + + TerrainDetail + + + -1 + 10 + + + 7a17f39c2cd995540269f6180015554c + + + + + + TextChatMessageProperties + -1 + + 7a17f39c2cd995540269f61800155551 + + + null null - 3 - 200 - 0 + 1 + 0 1 1 1 0 1 1 1 1 0 true - 1 - false - INF - 5 - 0 - SpringConstraint - 0.400000006 + false + 2 + 0 + 0 + 0 + 0.100000001 + Trail -1 - 0 - 0.100000001 - 2c3758b9147ff16b01b8290f0001a4ae - false + + 1 + 0 + 0 0.5 0 1 0.5 0 + 7a17f39c2cd995540269f61800155553 + 0 1 0 1 1 0 - + - 2 - 2 - - FileMesh - + 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 + + false + 1 + 2 + 0 + true + 1 + UIPageLayout + + 0 + 0 + + true + 0 + -1 + + true + 1 + 7a17f39c2cd995540269f6180015555c + 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 - 1 - 1 - - -1 - - - 2c3758b9147ff16b01b8290f0001a4af - - 1 - 1 - 1 - + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + - + - ForceField + Color3Value -1 - 2c3758b9147ff16b01b8290f0001a4b0 - true + 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 @@ -8481,6 +8354,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false 256 + 25 VehicleSeat @@ -8521,7 +8395,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 10 0 1 - 2c3758b9147ff16b01b8290f0001a4b1 + 7a17f39c2cd995540269f6180015550f 0 0 @@ -8534,102 +8408,449 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - - - - - - PartOperationAsset - -1 - - 2c3758b9147ff16b01b8290f0001a4b2 - - - + true - 0.75 - 0.0500000007 - 10 - DepthOfFieldEffect - 0.75 + Sparkles -1 + + 0.564705908 + 0.0980392247 + 1 + - 2c3758b9147ff16b01b8290f0001a4b3 + 1 + 7a17f39c2cd995540269f61800155543 - + - SoundGroup + + 1 + 1 + 1 + + + ShirtGraphic -1 - 2c3758b9147ff16b01b8290f0001a4b4 - 0.5 + 7a17f39c2cd995540269f6180015548c - + - 0 + 0 + null + null - - - SurfaceAppearance - - + 1009 + true + false + 45 + 0 + INF + 0 + PrismaticConstraint + 0 + 0 + 0.150000006 -1 + 0 - - 2c3758b9147ff16b01b8290f0001a4b5 + 0 + 7a17f39c2cd995540269f6180015549d + 5 + 0 + false - + - UIPadding - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 0 - 0 - + 0 + 0 + 0 + 2 + 2 + CylinderMesh + + 0 + 0 + 0 + + + 1 + 1 + 1 + -1 - 2c3758b9147ff16b01b8290f0001a4b6 + 7a17f39c2cd995540269f618001554a9 + + 1 + 1 + 1 + - + + + Folder + -1 + + 7a17f39c2cd995540269f618001554be + + + + + 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 + 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 + 7a17f39c2cd995540269f6180015550e + + 0 + 0 + 0 + + + 2 + 2 + 2 + + 0 + + + + + + 0 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + + WorldModel + false + null + -1 + + 7a17f39c2cd995540269f61800155512 + + + + + + + 0 + 0 + true + ColorCorrectionEffect + 0 + -1 + + + 1 + 1 + 1 + + 7a17f39c2cd995540269f6180015551e + + + + + + 1 + 0.5 + true + 5 + TremoloSoundEffect + 0 + -1 + + 7a17f39c2cd995540269f61800155541 + + + + + + StarterGear + -1 + + 7a17f39c2cd995540269f61800155546 + + + + + + 1 + false + false + 1 + 0 + UITableLayout + + 0 + 0 + 0 + 0 + + 0 + -1 + + 7a17f39c2cd995540269f6180015555d + 1 + + + + + null + null + + 3 + 200 + 0 + true + 1 + false + INF + 5 + 0 + SpringConstraint + 0.400000006 + -1 + 0 + + 0.100000001 + 7a17f39c2cd995540269f6180015549e + false + + + + + + 2 + 2 + + FileMesh + + 0 + 0 + 0 + + + 1 + 1 + 1 + + -1 + + + 7a17f39c2cd995540269f618001554aa + + 1 + 1 + 1 + + + + + + + ForceField + -1 + + 7a17f39c2cd995540269f618001554bf + true + + + + + + + Animation + -1 + + 7a17f39c2cd995540269f61800155469 + + + + + + AnimationController + -1 + + 7a17f39c2cd995540269f6180015546c + + + + + false null null 23 true - Torque - 0 + 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 - 2c3758b9147ff16b01b8290f0001a4b7 + 2 false - + + + null + null + + 194 + true + Plane + -1 + + 7a17f39c2cd995540269f61800155498 + false + + + 2 @@ -8650,7 +8871,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - 2c3758b9147ff16b01b8290f0001a4b8 + 7a17f39c2cd995540269f618001554ab 1 1 @@ -8658,7 +8879,63 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + + + + true + + DialogChoice + + -1 + + 7a17f39c2cd995540269f618001554b2 + + + + + + + 500000 + 4 + 1 + 1 + Explosion + + 0 + 0 + 0 + + -1 + + 1 + 7a17f39c2cd995540269f618001554b6 + true + + + + + + + 0.92549026 + 0.545098066 + 0.274509817 + + true + Fire + + 0.545098066 + 0.313725501 + 0.215686291 + + -1 + + 1 + 7a17f39c2cd995540269f618001554bc + 9 + 5 + + + ? @@ -8666,10 +8943,224 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> FunctionalTest -1 - 2c3758b9147ff16b01b8290f0001a4b9 + 7a17f39c2cd995540269f618001554c0 - + + + + + 0.0509803966 + 0.411764741 + 0.674509823 + + null + SelectionPointLasso + + 0 + 0 + 0 + + -1 + + 0 + 7a17f39c2cd995540269f618001554dd + true + + + + + + + + HiddenSurfaceRemovalAsset + -1 + + 7a17f39c2cd995540269f618001554df + + + + + + + ModuleScript + {F699FCFF-4C9B-45AB-8F48-701C0C20BAB5} + + -1 + + 7a17f39c2cd995540269f618001554f9 + + + + + + MarkerCurve + -1 + + 7a17f39c2cd995540269f618001554fb + AAAAAAEAAAAKAAAAAAAAFkUAAAAA + + + + + + 0 + 0 + 0 + + + 1 + 0 1 1 1 0 1 1 1 1 0 + 0 + 1 + true + 1 1 + Particle texture must be 1024 by 1024 to use flipbooks. + 0 + 0 + false + 5 10 + 0 + 0 + false + ParticleEmitter + 0 + 20 + 0 0 + 0 0 + 0 + 0 + 1 + 0 + 0 1 0 1 1 0 + -1 + 5 5 + + 0 + 0 + + 0 0 0 1 0 0 + + rbxasset://textures/particles/sparkles_main.dds + 1 + 0 0 0 1 0 0 + 7a17f39c2cd995540269f61800155514 + 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 + -1 + + + 7a17f39c2cd995540269f61800155530 + + + + + + TeleportOptions + + + false + -1 + + 7a17f39c2cd995540269f6180015554b + + + + + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + TerrainRegion + AQU= + -1 + + 7a17f39c2cd995540269f6180015554d + + + + + + TextChannel + -1 + + 7a17f39c2cd995540269f6180015554f + + + + + + true + TextChatCommand + + + -1 + + 7a17f39c2cd995540269f61800155550 + + + + + + Vector3Value + -1 + + 7a17f39c2cd995540269f6180015556e + + 0 + 0 + 0 + + + + @@ -8692,7 +9183,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 3 - 2c3758b9147ff16b01b8290f0001a4ba + 7a17f39c2cd995540269f61800155577 diff --git a/XmlFormat/XmlFileWriter.cs b/XmlFormat/XmlFileWriter.cs index 30c71b3..cb9333c 100644 --- a/XmlFormat/XmlFileWriter.cs +++ b/XmlFormat/XmlFileWriter.cs @@ -66,6 +66,11 @@ namespace RobloxFiles.XmlFormat switch (prop.Type) { + case PropertyType.Ref: + { + propType = "Ref"; + break; + } case PropertyType.CFrame: case PropertyType.Quaternion: { @@ -106,6 +111,9 @@ namespace RobloxFiles.XmlFormat } } } + + if (prop.Type == PropertyType.Ref) + propType = "Ref"; IXmlPropertyToken handler = XmlPropertyTokens.GetHandler(propType);