From 83dd0af8d2e391a7af3492e2b0ad3761cbd869c2 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 25 Feb 2021 14:09:54 -0600 Subject: [PATCH] Add support for Attributes! --- DataTypes/CFrame.cs | 52 +- DataTypes/Color3.cs | 7 - DataTypes/ColorSequence.cs | 11 - DataTypes/ColorSequenceKeypoint.cs | 7 - DataTypes/NumberRange.cs | 4 - DataTypes/NumberSequence.cs | 11 - DataTypes/Ray.cs | 6 - DataTypes/Rect.cs | 6 - DataTypes/Region3.cs | 6 - DataTypes/UDim.cs | 6 - DataTypes/UDim2.cs | 6 - DataTypes/Vector2.cs | 28 +- DataTypes/Vector3.cs | 37 +- Interfaces/IAttributeToken.cs | 10 + Interfaces/IXmlPropertyToken.cs | 4 +- RobloxFileFormat.csproj | 63 +- RobloxFileFormat.dll | Bin 366592 -> 371712 bytes {XmlFormat/Tokens => Tokens}/Axes.cs | 8 +- {XmlFormat/Tokens => Tokens}/BinaryString.cs | 4 +- {XmlFormat/Tokens => Tokens}/Boolean.cs | 11 +- {XmlFormat/Tokens => Tokens}/BrickColor.cs | 20 +- {XmlFormat/Tokens => Tokens}/CFrame.cs | 6 +- {XmlFormat/Tokens => Tokens}/Color3.cs | 38 +- {XmlFormat/Tokens => Tokens}/Color3uint8.cs | 6 +- {XmlFormat/Tokens => Tokens}/ColorSequence.cs | 39 +- {XmlFormat/Tokens => Tokens}/Content.cs | 4 +- {XmlFormat/Tokens => Tokens}/Double.cs | 11 +- {XmlFormat/Tokens => Tokens}/Enum.cs | 6 +- {XmlFormat/Tokens => Tokens}/Faces.cs | 8 +- {XmlFormat/Tokens => Tokens}/Float.cs | 11 +- {XmlFormat/Tokens => Tokens}/Int.cs | 5 +- {XmlFormat/Tokens => Tokens}/Int64.cs | 5 +- {XmlFormat/Tokens => Tokens}/NumberRange.cs | 21 +- .../Tokens => Tokens}/NumberSequence.cs | 36 +- .../Tokens => Tokens}/PhysicalProperties.cs | 10 +- .../Tokens => Tokens}/ProtectedString.cs | 8 +- {XmlFormat/Tokens => Tokens}/Ray.cs | 6 +- {XmlFormat/Tokens => Tokens}/Rect.cs | 29 +- {XmlFormat/Tokens => Tokens}/Ref.cs | 4 +- {XmlFormat/Tokens => Tokens}/SharedString.cs | 8 +- {XmlFormat/Tokens => Tokens}/String.cs | 10 +- {XmlFormat/Tokens => Tokens}/UDim.cs | 29 +- {XmlFormat/Tokens => Tokens}/UDim2.cs | 24 +- {XmlFormat/Tokens => Tokens}/Vector2.cs | 28 +- {XmlFormat/Tokens => Tokens}/Vector3.cs | 33 +- {XmlFormat/Tokens => Tokens}/Vector3int16.cs | 6 +- Tree/Attributes.cs | 373 +++++---- Tree/Instance.cs | 62 +- UnitTest/Files/Binary.rbxl | Bin 268894 -> 269183 bytes UnitTest/Files/Xml.rbxlx | 763 +++++++++--------- UnitTest/Program.cs | 2 + XmlFormat/{IO => }/XmlFileReader.cs | 1 + XmlFormat/{IO => }/XmlFileWriter.cs | 2 +- XmlFormat/XmlPropertyTokens.cs | 4 +- 54 files changed, 1053 insertions(+), 852 deletions(-) create mode 100644 Interfaces/IAttributeToken.cs rename {XmlFormat/Tokens => Tokens}/Axes.cs (87%) rename {XmlFormat/Tokens => Tokens}/BinaryString.cs (92%) rename {XmlFormat/Tokens => Tokens}/Boolean.cs (53%) rename {XmlFormat/Tokens => Tokens}/BrickColor.cs (53%) rename {XmlFormat/Tokens => Tokens}/CFrame.cs (86%) rename {XmlFormat/Tokens => Tokens}/Color3.cs (61%) rename {XmlFormat/Tokens => Tokens}/Color3uint8.cs (90%) rename {XmlFormat/Tokens => Tokens}/ColorSequence.cs (53%) rename {XmlFormat/Tokens => Tokens}/Content.cs (95%) rename {XmlFormat/Tokens => Tokens}/Double.cs (50%) rename {XmlFormat/Tokens => Tokens}/Enum.cs (92%) rename {XmlFormat/Tokens => Tokens}/Faces.cs (89%) rename {XmlFormat/Tokens => Tokens}/Float.cs (50%) rename {XmlFormat/Tokens => Tokens}/Int.cs (89%) rename {XmlFormat/Tokens => Tokens}/Int64.cs (80%) rename {XmlFormat/Tokens => Tokens}/NumberRange.cs (61%) rename {XmlFormat/Tokens => Tokens}/NumberSequence.cs (55%) rename {XmlFormat/Tokens => Tokens}/PhysicalProperties.cs (88%) rename {XmlFormat/Tokens => Tokens}/ProtectedString.cs (91%) rename {XmlFormat/Tokens => Tokens}/Ray.cs (89%) rename {XmlFormat/Tokens => Tokens}/Rect.cs (58%) rename {XmlFormat/Tokens => Tokens}/Ref.cs (88%) rename {XmlFormat/Tokens => Tokens}/SharedString.cs (81%) rename {XmlFormat/Tokens => Tokens}/String.cs (64%) rename {XmlFormat/Tokens => Tokens}/UDim.cs (65%) rename {XmlFormat/Tokens => Tokens}/UDim2.cs (56%) rename {XmlFormat/Tokens => Tokens}/Vector2.cs (63%) rename {XmlFormat/Tokens => Tokens}/Vector3.cs (61%) rename {XmlFormat/Tokens => Tokens}/Vector3int16.cs (89%) rename XmlFormat/{IO => }/XmlFileReader.cs (99%) rename XmlFormat/{IO => }/XmlFileWriter.cs (99%) diff --git a/DataTypes/CFrame.cs b/DataTypes/CFrame.cs index c93f867..fb5305a 100644 --- a/DataTypes/CFrame.cs +++ b/DataTypes/CFrame.cs @@ -6,9 +6,11 @@ namespace RobloxFiles.DataTypes { public class CFrame { - private float m11 = 1, m12, m13, m14; - private float m21, m22 = 1, m23, m24; - private float m31, m32, m33 = 1, m34; + private float m14, m24, m34; + + private readonly float m11 = 1, m12, m13; + private readonly float m21, m22 = 1, m23; + private readonly float m31, m32, m33 = 1; private const float m41 = 0, m42 = 0, m43 = 0, m44 = 1; @@ -160,49 +162,17 @@ namespace RobloxFiles.DataTypes m31 = comp[9]; m32 = comp[10]; m33 = comp[11]; } - private void InitFromMatrix(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null) + public CFrame(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null) { + Contract.Requires(pos != null && vX != null && vY != null); + if (vZ == null) vZ = vX.Cross(vY); m14 = pos.X; m24 = pos.Y; m34 = pos.Z; - m11 = vX.X; m12 = vX.Y; m13 = vX.Z; - m21 = vY.X; m22 = vY.Y; m23 = vY.Z; - m31 = vZ.X; m32 = vZ.Y; m33 = vZ.Z; - } - - public CFrame(Vector3 pos, Vector3 vX, Vector3 vY, Vector3 vZ = null) - { - Contract.Requires(pos != null && vX != null && vY != null); - InitFromMatrix(pos, vX, vY, vZ); - } - - internal CFrame(Attribute attr) - { - Vector3 pos = new Vector3(attr); - byte rawOrientId = attr.ReadByte(); - - if (rawOrientId > 0) - { - // Make sure this value is in a safe range. - int orientId = (rawOrientId - 1) % 36; - - NormalId xColumn = (NormalId)(orientId / 6); - Vector3 vX = Vector3.FromNormalId(xColumn); - - NormalId yColumn = (NormalId)(orientId % 6); - Vector3 vY = Vector3.FromNormalId(yColumn); - - InitFromMatrix(pos, vX, vY); - } - else - { - Vector3 vX = new Vector3(attr), - vY = new Vector3(attr), - vZ = new Vector3(attr); - - InitFromMatrix(pos, vX, vY, vZ); - } + m11 = vX.X; m12 = vX.Y; m13 = vX.Z; + m21 = vY.X; m22 = vY.Y; m23 = vY.Z; + m31 = vZ.X; m32 = vZ.Y; m33 = vZ.Z; } public static CFrame operator +(CFrame a, Vector3 b) diff --git a/DataTypes/Color3.cs b/DataTypes/Color3.cs index 8491369..baf2b56 100644 --- a/DataTypes/Color3.cs +++ b/DataTypes/Color3.cs @@ -40,13 +40,6 @@ namespace RobloxFiles.DataTypes return true; } - internal Color3(Attribute attr) - { - R = attr.ReadFloat(); - G = attr.ReadFloat(); - B = attr.ReadFloat(); - } - public static Color3 FromRGB(uint r = 0, uint g = 0, uint b = 0) { return new Color3(r / 255f, g / 255f, b / 255f); diff --git a/DataTypes/ColorSequence.cs b/DataTypes/ColorSequence.cs index 8c0b177..c855b17 100644 --- a/DataTypes/ColorSequence.cs +++ b/DataTypes/ColorSequence.cs @@ -86,16 +86,5 @@ namespace RobloxFiles.DataTypes Keypoints = keypoints; } - - public ColorSequence(Attribute attr) - { - int numKeys = attr.ReadInt(); - var keypoints = new ColorSequenceKeypoint[numKeys]; - - for (int i = 0; i < numKeys; i++) - keypoints[i] = new ColorSequenceKeypoint(attr); - - Keypoints = keypoints; - } } } diff --git a/DataTypes/ColorSequenceKeypoint.cs b/DataTypes/ColorSequenceKeypoint.cs index 857515f..1cf9a70 100644 --- a/DataTypes/ColorSequenceKeypoint.cs +++ b/DataTypes/ColorSequenceKeypoint.cs @@ -19,13 +19,6 @@ Envelope = envelope; } - internal ColorSequenceKeypoint(Attribute attr) - { - Envelope = attr.ReadInt(); - Time = attr.ReadFloat(); - Value = new Color3(attr); - } - public override int GetHashCode() { int hash = Time.GetHashCode() diff --git a/DataTypes/NumberRange.cs b/DataTypes/NumberRange.cs index 0375865..444d65a 100644 --- a/DataTypes/NumberRange.cs +++ b/DataTypes/NumberRange.cs @@ -25,10 +25,6 @@ namespace RobloxFiles.DataTypes Max = max; } - internal NumberRange(Attribute attr) : this(attr.ReadFloat(), attr.ReadFloat()) - { - } - public override int GetHashCode() { return Min.GetHashCode() ^ Max.GetHashCode(); diff --git a/DataTypes/NumberSequence.cs b/DataTypes/NumberSequence.cs index c6f0b7c..b7d81e5 100644 --- a/DataTypes/NumberSequence.cs +++ b/DataTypes/NumberSequence.cs @@ -52,17 +52,6 @@ namespace RobloxFiles.DataTypes Keypoints = keypoints; } - public NumberSequence(Attribute attr) - { - int numKeys = attr.ReadInt(); - var keypoints = new NumberSequenceKeypoint[numKeys]; - - for (int i = 0; i < numKeys; i++) - keypoints[i] = new NumberSequenceKeypoint(attr); - - Keypoints = keypoints; - } - public override int GetHashCode() { int hash = 0; diff --git a/DataTypes/Ray.cs b/DataTypes/Ray.cs index e16559f..087e05c 100644 --- a/DataTypes/Ray.cs +++ b/DataTypes/Ray.cs @@ -28,12 +28,6 @@ Direction = direction ?? new Vector3(); } - internal Ray(Attribute attr) - { - Origin = new Vector3(attr); - Direction = new Vector3(attr); - } - public Vector3 ClosestPoint(Vector3 point) { Vector3 result = Origin; diff --git a/DataTypes/Rect.cs b/DataTypes/Rect.cs index 884c5cd..a43bd90 100644 --- a/DataTypes/Rect.cs +++ b/DataTypes/Rect.cs @@ -22,12 +22,6 @@ Max = new Vector2(maxX, maxY); } - internal Rect(Attribute attr) - { - Min = new Vector2(attr); - Max = new Vector2(attr); - } - public override int GetHashCode() { int hash = Min.GetHashCode() diff --git a/DataTypes/Region3.cs b/DataTypes/Region3.cs index fabb333..79cf59c 100644 --- a/DataTypes/Region3.cs +++ b/DataTypes/Region3.cs @@ -17,12 +17,6 @@ namespace RobloxFiles.DataTypes Max = max; } - internal Region3(Attribute attr) - { - Min = new Vector3(attr); - Max = new Vector3(attr); - } - public Region3 ExpandToGrid(float resolution) { Vector3 emin = new Vector3 diff --git a/DataTypes/UDim.cs b/DataTypes/UDim.cs index f492243..18ad550 100644 --- a/DataTypes/UDim.cs +++ b/DataTypes/UDim.cs @@ -13,12 +13,6 @@ Offset = offset; } - internal UDim(Attribute attr) - { - Scale = attr.ReadFloat(); - Offset = attr.ReadInt(); - } - public static UDim operator+(UDim a, UDim b) { return new UDim(a.Scale + b.Scale, a.Offset + b.Offset); diff --git a/DataTypes/UDim2.cs b/DataTypes/UDim2.cs index ff878f4..12d3764 100644 --- a/DataTypes/UDim2.cs +++ b/DataTypes/UDim2.cs @@ -20,12 +20,6 @@ Y = y; } - internal UDim2(Attribute attr) - { - X = new UDim(attr); - Y = new UDim(attr); - } - public UDim2 Lerp(UDim2 other, float alpha) { float scaleX = X.Scale + ((other.X.Scale - X.Scale) * alpha); diff --git a/DataTypes/Vector2.cs b/DataTypes/Vector2.cs index 72a3c6e..e62068c 100644 --- a/DataTypes/Vector2.cs +++ b/DataTypes/Vector2.cs @@ -29,27 +29,21 @@ namespace RobloxFiles.DataTypes Y = y; } - internal Vector2(float[] coords) + public Vector2(params float[] coords) { X = coords.Length > 0 ? coords[0] : 0; Y = coords.Length > 1 ? coords[1] : 0; } - internal Vector2(Attribute attr) - { - X = attr.ReadFloat(); - Y = attr.ReadFloat(); - } - private delegate Vector2 Operator(Vector2 a, Vector2 b); - private static Vector2 upcastFloatOp(Vector2 vec, float num, Operator upcast) + private static Vector2 UpcastFloatOp(Vector2 vec, float num, Operator upcast) { Vector2 numVec = new Vector2(num, num); return upcast(vec, numVec); } - private static Vector2 upcastFloatOp(float num, Vector2 vec, Operator upcast) + private static Vector2 UpcastFloatOp(float num, Vector2 vec, Operator upcast) { Vector2 numVec = new Vector2(num, num); return upcast(numVec, vec); @@ -61,20 +55,20 @@ namespace RobloxFiles.DataTypes private static readonly Operator div = new Operator((a, b) => new Vector2(a.X / b.X, a.Y / b.Y)); public static Vector2 operator +(Vector2 a, Vector2 b) => add(a, b); - public static Vector2 operator +(Vector2 v, float n) => upcastFloatOp(v, n, add); - public static Vector2 operator +(float n, Vector2 v) => upcastFloatOp(n, v, add); + public static Vector2 operator +(Vector2 v, float n) => UpcastFloatOp(v, n, add); + public static Vector2 operator +(float n, Vector2 v) => UpcastFloatOp(n, v, add); public static Vector2 operator -(Vector2 a, Vector2 b) => sub(a, b); - public static Vector2 operator -(Vector2 v, float n) => upcastFloatOp(v, n, sub); - public static Vector2 operator -(float n, Vector2 v) => upcastFloatOp(n, v, sub); + public static Vector2 operator -(Vector2 v, float n) => UpcastFloatOp(v, n, sub); + public static Vector2 operator -(float n, Vector2 v) => UpcastFloatOp(n, v, sub); public static Vector2 operator *(Vector2 a, Vector2 b) => mul(a, b); - public static Vector2 operator *(Vector2 v, float n) => upcastFloatOp(v, n, mul); - public static Vector2 operator *(float n, Vector2 v) => upcastFloatOp(n, v, mul); + public static Vector2 operator *(Vector2 v, float n) => UpcastFloatOp(v, n, mul); + public static Vector2 operator *(float n, Vector2 v) => UpcastFloatOp(n, v, mul); public static Vector2 operator /(Vector2 a, Vector2 b) => div(a, b); - 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, float n) => UpcastFloatOp(v, n, div); + public static Vector2 operator /(float n, Vector2 v) => UpcastFloatOp(n, v, div); public static Vector2 operator -(Vector2 v) { diff --git a/DataTypes/Vector3.cs b/DataTypes/Vector3.cs index ffb97ad..05cd072 100644 --- a/DataTypes/Vector3.cs +++ b/DataTypes/Vector3.cs @@ -32,20 +32,13 @@ namespace RobloxFiles.DataTypes Z = z; } - public Vector3(float[] coords) + public Vector3(params float[] coords) { X = coords.Length > 0 ? coords[0] : 0; Y = coords.Length > 1 ? coords[1] : 0; Z = coords.Length > 2 ? coords[2] : 0; } - internal Vector3(Attribute attr) - { - X = attr.ReadFloat(); - Y = attr.ReadFloat(); - Z = attr.ReadFloat(); - } - public static Vector3 FromAxis(Axis axis) { float[] coords = new float[3] { 0f, 0f, 0f }; @@ -68,13 +61,13 @@ namespace RobloxFiles.DataTypes private delegate Vector3 Operator(Vector3 a, Vector3 b); - private static Vector3 upcastFloatOp(Vector3 vec, float num, Operator upcast) + private static Vector3 UpcastFloatOp(Vector3 vec, float num, Operator upcast) { Vector3 numVec = new Vector3(num, num, num); return upcast(vec, numVec); } - private static Vector3 upcastFloatOp(float num, Vector3 vec, Operator upcast) + private static Vector3 UpcastFloatOp(float num, Vector3 vec, Operator upcast) { Vector3 numVec = new Vector3(num, num, num); return upcast(numVec, vec); @@ -86,30 +79,30 @@ namespace RobloxFiles.DataTypes private static readonly Operator div = new Operator((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 Zero => new Vector3(0, 0, 0); - public static Vector3 Right => new Vector3(1, 0, 0); - public static Vector3 Up => new Vector3(0, 1, 0); - public static Vector3 Back => new Vector3(0, 0, 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 float Dot(Vector3 other) { diff --git a/Interfaces/IAttributeToken.cs b/Interfaces/IAttributeToken.cs new file mode 100644 index 0000000..3956ac5 --- /dev/null +++ b/Interfaces/IAttributeToken.cs @@ -0,0 +1,10 @@ +namespace RobloxFiles +{ + public interface IAttributeToken + { + AttributeType AttributeType { get; } + + T ReadAttribute(Attribute attribute); + void WriteAttribute(Attribute attribute, T value); + } +} diff --git a/Interfaces/IXmlPropertyToken.cs b/Interfaces/IXmlPropertyToken.cs index 5a53f94..29decb1 100644 --- a/Interfaces/IXmlPropertyToken.cs +++ b/Interfaces/IXmlPropertyToken.cs @@ -1,10 +1,10 @@ using System.Xml; -namespace RobloxFiles.XmlFormat +namespace RobloxFiles.Tokens { public interface IXmlPropertyToken { - string Token { get; } + string XmlPropertyToken { get; } bool ReadProperty(Property prop, XmlNode token); void WriteProperty(Property prop, XmlDocument doc, XmlNode node); diff --git a/RobloxFileFormat.csproj b/RobloxFileFormat.csproj index 7a1eb54..153ee32 100644 --- a/RobloxFileFormat.csproj +++ b/RobloxFileFormat.csproj @@ -97,6 +97,7 @@ + @@ -130,39 +131,39 @@ - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RobloxFileFormat.dll b/RobloxFileFormat.dll index 4226d55fb5d1eba5c2e3bdab1d666fd05cd99e78..2c2d0ff5a7c406894a3ccb3f9260dcc76c225dd2 100644 GIT binary patch delta 148932 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 delta 143828 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 Hx~%^JZbbXE diff --git a/XmlFormat/Tokens/Axes.cs b/Tokens/Axes.cs similarity index 87% rename from XmlFormat/Tokens/Axes.cs rename to Tokens/Axes.cs index d5bc2ab..a557b7a 100644 --- a/XmlFormat/Tokens/Axes.cs +++ b/Tokens/Axes.cs @@ -1,11 +1,13 @@ using System.Xml; -using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; + +namespace RobloxFiles.Tokens { public class AxesToken : IXmlPropertyToken { - public string Token => "Axes"; + public string XmlPropertyToken => "Axes"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/BinaryString.cs b/Tokens/BinaryString.cs similarity index 92% rename from XmlFormat/Tokens/BinaryString.cs rename to Tokens/BinaryString.cs index 10194a4..ec55759 100644 --- a/XmlFormat/Tokens/BinaryString.cs +++ b/Tokens/BinaryString.cs @@ -1,11 +1,11 @@ using System; using System.Xml; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class BinaryStringToken : IXmlPropertyToken { - public string Token => "BinaryString"; + public string XmlPropertyToken => "BinaryString"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Boolean.cs b/Tokens/Boolean.cs similarity index 53% rename from XmlFormat/Tokens/Boolean.cs rename to Tokens/Boolean.cs index f353334..36b5456 100644 --- a/XmlFormat/Tokens/Boolean.cs +++ b/Tokens/Boolean.cs @@ -1,10 +1,15 @@ using System.Xml; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class BoolToken : IXmlPropertyToken + public class BoolToken : IXmlPropertyToken, IAttributeToken { - public string Token => "bool"; + public string XmlPropertyToken => "bool"; + public AttributeType AttributeType => AttributeType.Bool; + + public bool ReadAttribute(Attribute attr) => attr.ReadBool(); + public void WriteAttribute(Attribute attr, bool value) => attr.WriteBool(value); public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/BrickColor.cs b/Tokens/BrickColor.cs similarity index 53% rename from XmlFormat/Tokens/BrickColor.cs rename to Tokens/BrickColor.cs index 2f6ff9d..1c91428 100644 --- a/XmlFormat/Tokens/BrickColor.cs +++ b/Tokens/BrickColor.cs @@ -1,16 +1,20 @@ -using System; -using System.Xml; +using System.Xml; using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class BrickColorToken : IXmlPropertyToken + public class BrickColorToken : IXmlPropertyToken, IAttributeToken { - public string Token => "BrickColor"; - // ^ This is a lie: The token is actually int, but that would cause a name collision. - // Since BrickColors are written as ints, the IntToken class will try to redirect - // to this handler if it believes that its representing a BrickColor. + // This is a lie: The token is actually int, but that would cause a name collision. + // Since BrickColors are written as ints, the IntToken class will try to redirect + // to this handler if it believes that its representing a BrickColor. + public string XmlPropertyToken => "BrickColor"; + public AttributeType AttributeType => AttributeType.BrickColor; + public BrickColor ReadAttribute(Attribute attr) => attr.ReadInt(); + public void WriteAttribute(Attribute attr, BrickColor value) => attr.WriteInt(value.Number); + public bool ReadProperty(Property prop, XmlNode token) { if (XmlPropertyTokens.ReadPropertyGeneric(token, out int value)) diff --git a/XmlFormat/Tokens/CFrame.cs b/Tokens/CFrame.cs similarity index 86% rename from XmlFormat/Tokens/CFrame.cs rename to Tokens/CFrame.cs index 416c7f4..31e0702 100644 --- a/XmlFormat/Tokens/CFrame.cs +++ b/Tokens/CFrame.cs @@ -1,12 +1,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class CFrameToken : IXmlPropertyToken { - public string Token => "CoordinateFrame; CFrame"; - private static string[] Coords = new string[12] { "X", "Y", "Z", "R00", "R01", "R02", "R10", "R11", "R12", "R20", "R21", "R22"}; + public string XmlPropertyToken => "CoordinateFrame; CFrame"; + private static readonly string[] Coords = new string[12] { "X", "Y", "Z", "R00", "R01", "R02", "R10", "R11", "R12", "R20", "R21", "R22"}; public static CFrame ReadCFrame(XmlNode token) { diff --git a/XmlFormat/Tokens/Color3.cs b/Tokens/Color3.cs similarity index 61% rename from XmlFormat/Tokens/Color3.cs rename to Tokens/Color3.cs index 64ce450..6a18b9a 100644 --- a/XmlFormat/Tokens/Color3.cs +++ b/Tokens/Color3.cs @@ -1,22 +1,42 @@ -using System; -using System.Xml; +using System.Xml; using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class Color3Token : IXmlPropertyToken + public class Color3Token : IXmlPropertyToken, IAttributeToken { - public string Token => "Color3"; - private readonly string[] Fields = new string[3] { "R", "G", "B" }; + public string XmlPropertyToken => "Color3"; + private readonly string[] XmlFields = new string[3] { "R", "G", "B" }; + + public AttributeType AttributeType => AttributeType.Color3; + public Color3 ReadAttribute(Attribute attr) => ReadColor3(attr); + public void WriteAttribute(Attribute attr, Color3 value) => WriteColor3(attr, value); + + public static Color3 ReadColor3(Attribute attr) + { + float r = attr.ReadFloat(), + g = attr.ReadFloat(), + b = attr.ReadFloat(); + + return new Color3(r, g, b); + } + + public static void WriteColor3(Attribute attr, Color3 value) + { + attr.WriteFloat(value.R); + attr.WriteFloat(value.G); + attr.WriteFloat(value.B); + } public bool ReadProperty(Property prop, XmlNode token) { bool success = true; - float[] fields = new float[Fields.Length]; + float[] fields = new float[XmlFields.Length]; for (int i = 0; i < fields.Length; i++) { - string key = Fields[i]; + string key = XmlFields[i]; try { @@ -64,7 +84,7 @@ namespace RobloxFiles.XmlFormat.PropertyTokens for (int i = 0; i < 3; i++) { - string field = Fields[i]; + string field = XmlFields[i]; float value = rgb[i]; XmlElement channel = doc.CreateElement(field); diff --git a/XmlFormat/Tokens/Color3uint8.cs b/Tokens/Color3uint8.cs similarity index 90% rename from XmlFormat/Tokens/Color3uint8.cs rename to Tokens/Color3uint8.cs index 6b736aa..5d6a977 100644 --- a/XmlFormat/Tokens/Color3uint8.cs +++ b/Tokens/Color3uint8.cs @@ -1,13 +1,13 @@ using System.Xml; using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; using System.Diagnostics.Contracts; -using System; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class Color3uint8Token : IXmlPropertyToken { - public string Token => "Color3uint8"; + public string XmlPropertyToken => "Color3uint8"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/ColorSequence.cs b/Tokens/ColorSequence.cs similarity index 53% rename from XmlFormat/Tokens/ColorSequence.cs rename to Tokens/ColorSequence.cs index 424a884..3c0475c 100644 --- a/XmlFormat/Tokens/ColorSequence.cs +++ b/Tokens/ColorSequence.cs @@ -1,11 +1,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class ColorSequenceToken : IXmlPropertyToken + public class ColorSequenceToken : IXmlPropertyToken, IAttributeToken { - public string Token => "ColorSequence"; + public string XmlPropertyToken => "ColorSequence"; + public AttributeType AttributeType => AttributeType.ColorSequence; public bool ReadProperty(Property prop, XmlNode token) { @@ -19,7 +20,7 @@ namespace RobloxFiles.XmlFormat.PropertyTokens { try { - ColorSequenceKeypoint[] keypoints = new ColorSequenceKeypoint[length / 5]; + var keypoints = new ColorSequenceKeypoint[length / 5]; for (int i = 0; i < length; i += 5) { @@ -50,5 +51,35 @@ namespace RobloxFiles.XmlFormat.PropertyTokens ColorSequence value = prop.CastValue(); node.InnerText = value.ToString() + ' '; } + + public ColorSequence ReadAttribute(Attribute attr) + { + int numKeys = attr.ReadInt(); + var keypoints = new ColorSequenceKeypoint[numKeys]; + + for (int i = 0; i < numKeys; i++) + { + int envelope = attr.ReadInt(); + float time = attr.ReadFloat(); + + Color3 value = Color3Token.ReadColor3(attr); + keypoints[i] = new ColorSequenceKeypoint(time, value, envelope); + } + + return new ColorSequence(keypoints); + } + + public void WriteAttribute(Attribute attr, ColorSequence value) + { + attr.WriteInt(value.Keypoints.Length); + + foreach (var keypoint in value.Keypoints) + { + attr.WriteInt(keypoint.Envelope); + attr.WriteFloat(keypoint.Time); + + Color3Token.WriteColor3(attr, keypoint.Value); + } + } } } diff --git a/XmlFormat/Tokens/Content.cs b/Tokens/Content.cs similarity index 95% rename from XmlFormat/Tokens/Content.cs rename to Tokens/Content.cs index df83b82..9bcffff 100644 --- a/XmlFormat/Tokens/Content.cs +++ b/Tokens/Content.cs @@ -3,11 +3,11 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class ContentToken : IXmlPropertyToken { - public string Token => "Content"; + public string XmlPropertyToken => "Content"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Double.cs b/Tokens/Double.cs similarity index 50% rename from XmlFormat/Tokens/Double.cs rename to Tokens/Double.cs index 2eda661..c4c88e3 100644 --- a/XmlFormat/Tokens/Double.cs +++ b/Tokens/Double.cs @@ -1,10 +1,15 @@ using System.Xml; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class DoubleToken : IXmlPropertyToken + public class DoubleToken : IXmlPropertyToken, IAttributeToken { - public string Token => "double"; + public string XmlPropertyToken => "double"; + public AttributeType AttributeType => AttributeType.Double; + + public double ReadAttribute(Attribute attr) => attr.ReadDouble(); + public void WriteAttribute(Attribute attr, double value) => attr.WriteDouble(value); public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Enum.cs b/Tokens/Enum.cs similarity index 92% rename from XmlFormat/Tokens/Enum.cs rename to Tokens/Enum.cs index b237d68..eeaf262 100644 --- a/XmlFormat/Tokens/Enum.cs +++ b/Tokens/Enum.cs @@ -3,11 +3,13 @@ using System.Diagnostics.Contracts; using System.Reflection; using System.Xml; -namespace RobloxFiles.XmlFormat.PropertyTokens +using RobloxFiles.XmlFormat; + +namespace RobloxFiles.Tokens { public class EnumToken : IXmlPropertyToken { - public string Token => "token"; + public string XmlPropertyToken => "token"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Faces.cs b/Tokens/Faces.cs similarity index 89% rename from XmlFormat/Tokens/Faces.cs rename to Tokens/Faces.cs index e1bb4e0..9c3b63a 100644 --- a/XmlFormat/Tokens/Faces.cs +++ b/Tokens/Faces.cs @@ -1,12 +1,14 @@ using System.Diagnostics.Contracts; using System.Xml; -using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; + +namespace RobloxFiles.Tokens { public class FacesToken : IXmlPropertyToken { - public string Token => "Faces"; + public string XmlPropertyToken => "Faces"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Float.cs b/Tokens/Float.cs similarity index 50% rename from XmlFormat/Tokens/Float.cs rename to Tokens/Float.cs index 1899943..b41994c 100644 --- a/XmlFormat/Tokens/Float.cs +++ b/Tokens/Float.cs @@ -1,10 +1,15 @@ using System.Xml; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class FloatToken : IXmlPropertyToken + public class FloatToken : IXmlPropertyToken, IAttributeToken { - public string Token => "float"; + public string XmlPropertyToken => "float"; + public AttributeType AttributeType => AttributeType.Float; + + public float ReadAttribute(Attribute attr) => attr.ReadFloat(); + public void WriteAttribute(Attribute attr, float value) => attr.WriteFloat(value); public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Int.cs b/Tokens/Int.cs similarity index 89% rename from XmlFormat/Tokens/Int.cs rename to Tokens/Int.cs index fcf0637..8f6a760 100644 --- a/XmlFormat/Tokens/Int.cs +++ b/Tokens/Int.cs @@ -1,10 +1,11 @@ using System.Xml; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class IntToken : IXmlPropertyToken { - public string Token => "int"; + public string XmlPropertyToken => "int"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Int64.cs b/Tokens/Int64.cs similarity index 80% rename from XmlFormat/Tokens/Int64.cs rename to Tokens/Int64.cs index 48b6f8b..5ac799b 100644 --- a/XmlFormat/Tokens/Int64.cs +++ b/Tokens/Int64.cs @@ -1,10 +1,11 @@ using System.Xml; +using RobloxFiles.XmlFormat; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class Int64Token : IXmlPropertyToken { - public string Token => "int64"; + public string XmlPropertyToken => "int64"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/NumberRange.cs b/Tokens/NumberRange.cs similarity index 61% rename from XmlFormat/Tokens/NumberRange.cs rename to Tokens/NumberRange.cs index 8198a57..a7951e1 100644 --- a/XmlFormat/Tokens/NumberRange.cs +++ b/Tokens/NumberRange.cs @@ -2,11 +2,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class NumberRangeToken : IXmlPropertyToken + public class NumberRangeToken : IXmlPropertyToken, IAttributeToken { - public string Token => "NumberRange"; + public string XmlPropertyToken => "NumberRange"; + public AttributeType AttributeType => AttributeType.NumberRange; public bool ReadProperty(Property prop, XmlNode token) { @@ -38,5 +39,19 @@ namespace RobloxFiles.XmlFormat.PropertyTokens NumberRange value = prop.CastValue(); node.InnerText = value.ToString() + ' '; } + + public NumberRange ReadAttribute(Attribute attr) + { + float min = attr.ReadFloat(); + float max = attr.ReadFloat(); + + return new NumberRange(min, max); + } + + public void WriteAttribute(Attribute attr, NumberRange value) + { + attr.WriteFloat(value.Min); + attr.WriteFloat(value.Max); + } } } diff --git a/XmlFormat/Tokens/NumberSequence.cs b/Tokens/NumberSequence.cs similarity index 55% rename from XmlFormat/Tokens/NumberSequence.cs rename to Tokens/NumberSequence.cs index af7a1d5..3fd3eba 100644 --- a/XmlFormat/Tokens/NumberSequence.cs +++ b/Tokens/NumberSequence.cs @@ -1,11 +1,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class NumberSequenceToken : IXmlPropertyToken + public class NumberSequenceToken : IXmlPropertyToken, IAttributeToken { - public string Token => "NumberSequence"; + public string XmlPropertyToken => "NumberSequence"; + public AttributeType AttributeType => AttributeType.NumberSequence; public bool ReadProperty(Property prop, XmlNode token) { @@ -47,5 +48,34 @@ namespace RobloxFiles.XmlFormat.PropertyTokens NumberSequence value = prop.CastValue(); node.InnerText = value.ToString() + ' '; } + + public NumberSequence ReadAttribute(Attribute attr) + { + int numKeys = attr.ReadInt(); + var keypoints = new NumberSequenceKeypoint[numKeys]; + + for (int i = 0; i < numKeys; i++) + { + float envelope = attr.ReadInt(), + time = attr.ReadFloat(), + value = attr.ReadFloat(); + + keypoints[i] = new NumberSequenceKeypoint(time, value, envelope); + } + + return new NumberSequence(keypoints); + } + + public void WriteAttribute(Attribute attr, NumberSequence value) + { + attr.WriteInt(value.Keypoints.Length); + + foreach (var keypoint in value.Keypoints) + { + attr.WriteFloat(keypoint.Envelope); + attr.WriteFloat(keypoint.Time); + attr.WriteFloat(keypoint.Value); + } + } } } diff --git a/XmlFormat/Tokens/PhysicalProperties.cs b/Tokens/PhysicalProperties.cs similarity index 88% rename from XmlFormat/Tokens/PhysicalProperties.cs rename to Tokens/PhysicalProperties.cs index 3b6ef1e..2bc4e6e 100644 --- a/XmlFormat/Tokens/PhysicalProperties.cs +++ b/Tokens/PhysicalProperties.cs @@ -3,13 +3,13 @@ using System.Collections.Generic; using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class PhysicalPropertiesToken : IXmlPropertyToken { - public string Token => "PhysicalProperties"; + public string XmlPropertyToken => "PhysicalProperties"; - private Func createReader(Func parse, XmlNode token) where T : struct + private static Func CreateReader(Func parse, XmlNode token) where T : struct { return new Func(key => { @@ -20,8 +20,8 @@ namespace RobloxFiles.XmlFormat.PropertyTokens public bool ReadProperty(Property prop, XmlNode token) { - var readBool = createReader(bool.Parse, token); - var readFloat = createReader(Formatting.ParseFloat, token); + var readBool = CreateReader(bool.Parse, token); + var readFloat = CreateReader(Formatting.ParseFloat, token); try { diff --git a/XmlFormat/Tokens/ProtectedString.cs b/Tokens/ProtectedString.cs similarity index 91% rename from XmlFormat/Tokens/ProtectedString.cs rename to Tokens/ProtectedString.cs index 662c423..5ede316 100644 --- a/XmlFormat/Tokens/ProtectedString.cs +++ b/Tokens/ProtectedString.cs @@ -1,12 +1,14 @@ using System.Text; using System.Xml; -using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +using RobloxFiles.DataTypes; +using RobloxFiles.XmlFormat; + +namespace RobloxFiles.Tokens { public class ProtectedStringToken : IXmlPropertyToken { - public string Token => "ProtectedString"; + public string XmlPropertyToken => "ProtectedString"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Ray.cs b/Tokens/Ray.cs similarity index 89% rename from XmlFormat/Tokens/Ray.cs rename to Tokens/Ray.cs index b861b0a..f899c10 100644 --- a/XmlFormat/Tokens/Ray.cs +++ b/Tokens/Ray.cs @@ -2,12 +2,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class RayToken : IXmlPropertyToken { - public string Token => "Ray"; - private static string[] Fields = new string[2] { "origin", "direction" }; + public string XmlPropertyToken => "Ray"; + private static readonly string[] Fields = new string[2] { "origin", "direction" }; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/Rect.cs b/Tokens/Rect.cs similarity index 58% rename from XmlFormat/Tokens/Rect.cs rename to Tokens/Rect.cs index 6b9b6f9..2af4868 100644 --- a/XmlFormat/Tokens/Rect.cs +++ b/Tokens/Rect.cs @@ -2,22 +2,23 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class RectToken : IXmlPropertyToken + public class RectToken : IXmlPropertyToken, IAttributeToken { - public string Token => "Rect2D"; - private static string[] Fields = new string[2] { "min", "max" }; - + public string XmlPropertyToken => "Rect2D"; + public AttributeType AttributeType => AttributeType.Rect; + private static readonly string[] XmlFields = new string[2] { "min", "max" }; + public bool ReadProperty(Property prop, XmlNode token) { try { - Vector2[] read = new Vector2[Fields.Length]; + Vector2[] read = new Vector2[XmlFields.Length]; for (int i = 0; i < read.Length; i++) { - string field = Fields[i]; + string field = XmlFields[i]; var fieldToken = token[field]; read[i] = Vector2Token.ReadVector2(fieldToken); } @@ -49,5 +50,19 @@ namespace RobloxFiles.XmlFormat.PropertyTokens Vector2Token.WriteVector2(doc, max, rect.Max); node.AppendChild(max); } + + public Rect ReadAttribute(Attribute attr) + { + Vector2 min = Vector2Token.ReadVector2(attr); + Vector2 max = Vector2Token.ReadVector2(attr); + + return new Rect(min, max); + } + + public void WriteAttribute(Attribute attr, Rect value) + { + Vector2Token.WriteVector2(attr, value.Min); + Vector2Token.WriteVector2(attr, value.Max); + } } } diff --git a/XmlFormat/Tokens/Ref.cs b/Tokens/Ref.cs similarity index 88% rename from XmlFormat/Tokens/Ref.cs rename to Tokens/Ref.cs index d15a68f..2fa5099 100644 --- a/XmlFormat/Tokens/Ref.cs +++ b/Tokens/Ref.cs @@ -1,10 +1,10 @@ using System.Xml; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class RefToken : IXmlPropertyToken { - public string Token => "Ref"; + public string XmlPropertyToken => "Ref"; public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/SharedString.cs b/Tokens/SharedString.cs similarity index 81% rename from XmlFormat/Tokens/SharedString.cs rename to Tokens/SharedString.cs index 8c2415e..caa574d 100644 --- a/XmlFormat/Tokens/SharedString.cs +++ b/Tokens/SharedString.cs @@ -1,11 +1,11 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class SharedStringToken : IXmlPropertyToken { - public string Token => "SharedString"; + public string XmlPropertyToken => "SharedString"; public bool ReadProperty(Property prop, XmlNode token) { @@ -18,9 +18,7 @@ namespace RobloxFiles.XmlFormat.PropertyTokens public void WriteProperty(Property prop, XmlDocument doc, XmlNode node) { - var value = prop.Value as SharedString; - - if (value != null) + if (prop.Value is SharedString value) { string key = value.Key; diff --git a/XmlFormat/Tokens/String.cs b/Tokens/String.cs similarity index 64% rename from XmlFormat/Tokens/String.cs rename to Tokens/String.cs index 12ea8f2..82a8c3d 100644 --- a/XmlFormat/Tokens/String.cs +++ b/Tokens/String.cs @@ -1,10 +1,14 @@ using System.Xml; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class StringToken : IXmlPropertyToken + public class StringToken : IXmlPropertyToken, IAttributeToken { - public string Token => "string"; + public string XmlPropertyToken => "string"; + public AttributeType AttributeType => AttributeType.String; + + public string ReadAttribute(Attribute attr) => attr.ReadString(); + public void WriteAttribute(Attribute attr, string value) => attr.WriteString(value); public bool ReadProperty(Property prop, XmlNode token) { diff --git a/XmlFormat/Tokens/UDim.cs b/Tokens/UDim.cs similarity index 65% rename from XmlFormat/Tokens/UDim.cs rename to Tokens/UDim.cs index 2316ad4..e56f35f 100644 --- a/XmlFormat/Tokens/UDim.cs +++ b/Tokens/UDim.cs @@ -2,12 +2,16 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class UDimToken : IXmlPropertyToken + public class UDimToken : IXmlPropertyToken, IAttributeToken { - public string Token => "UDim"; - + public string XmlPropertyToken => "UDim"; + public AttributeType AttributeType => AttributeType.UDim; + + public UDim ReadAttribute(Attribute attr) => ReadUDim(attr); + public void WriteAttribute(Attribute attr, UDim value) => WriteUDim(attr, value); + public static UDim ReadUDim(XmlNode token, string prefix = "") { try @@ -37,6 +41,23 @@ namespace RobloxFiles.XmlFormat.PropertyTokens node.AppendChild(offset); } + public static UDim ReadUDim(Attribute attr) + { + float scale = attr.ReadFloat(); + int offset = attr.ReadInt(); + + return new UDim(scale, offset); + } + + public static void WriteUDim(Attribute attr, UDim value) + { + float scale = value.Scale; + attr.WriteFloat(scale); + + int offset = value.Offset; + attr.WriteInt(offset); + } + public bool ReadProperty(Property property, XmlNode token) { UDim result = ReadUDim(token); diff --git a/XmlFormat/Tokens/UDim2.cs b/Tokens/UDim2.cs similarity index 56% rename from XmlFormat/Tokens/UDim2.cs rename to Tokens/UDim2.cs index 2fc10cc..7f350fc 100644 --- a/XmlFormat/Tokens/UDim2.cs +++ b/Tokens/UDim2.cs @@ -1,12 +1,26 @@ -using System; -using System.Xml; +using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class UDim2Token : IXmlPropertyToken + public class UDim2Token : IXmlPropertyToken, IAttributeToken { - public string Token => "UDim2"; + public string XmlPropertyToken => "UDim2"; + public AttributeType AttributeType => AttributeType.UDim2; + + public UDim2 ReadAttribute(Attribute attr) + { + UDim x = UDimToken.ReadUDim(attr); + UDim y = UDimToken.ReadUDim(attr); + + return new UDim2(x, y); + } + + public void WriteAttribute(Attribute attr, UDim2 value) + { + UDimToken.WriteUDim(attr, value.X); + UDimToken.WriteUDim(attr, value.Y); + } public bool ReadProperty(Property property, XmlNode token) { diff --git a/XmlFormat/Tokens/Vector2.cs b/Tokens/Vector2.cs similarity index 63% rename from XmlFormat/Tokens/Vector2.cs rename to Tokens/Vector2.cs index 26ed07b..572a679 100644 --- a/XmlFormat/Tokens/Vector2.cs +++ b/Tokens/Vector2.cs @@ -1,12 +1,16 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class Vector2Token : IXmlPropertyToken + public class Vector2Token : IXmlPropertyToken, IAttributeToken { - public string Token => "Vector2"; - private static string[] Coords = new string[2] { "X", "Y" }; + public string XmlPropertyToken => "Vector2"; + private static readonly string[] XmlCoords = new string[2] { "X", "Y" }; + + public AttributeType AttributeType => AttributeType.Vector2; + public Vector2 ReadAttribute(Attribute attr) => ReadVector2(attr); + public void WriteAttribute(Attribute attr, Vector2 value) => WriteVector2(attr, value); public static Vector2 ReadVector2(XmlNode token) { @@ -14,7 +18,7 @@ namespace RobloxFiles.XmlFormat.PropertyTokens for (int i = 0; i < 2; i++) { - string key = Coords[i]; + string key = XmlCoords[i]; try { @@ -42,6 +46,20 @@ namespace RobloxFiles.XmlFormat.PropertyTokens node.AppendChild(y); } + public static Vector2 ReadVector2(Attribute attr) + { + float x = attr.ReadFloat(), + y = attr.ReadFloat(); + + return new Vector2(x, y); + } + + public static void WriteVector2(Attribute attr, Vector2 value) + { + attr.WriteFloat(value.X); + attr.WriteFloat(value.Y); + } + public bool ReadProperty(Property property, XmlNode token) { Vector2 result = ReadVector2(token); diff --git a/XmlFormat/Tokens/Vector3.cs b/Tokens/Vector3.cs similarity index 61% rename from XmlFormat/Tokens/Vector3.cs rename to Tokens/Vector3.cs index fcd4b52..c3f179a 100644 --- a/XmlFormat/Tokens/Vector3.cs +++ b/Tokens/Vector3.cs @@ -1,13 +1,16 @@ -using System; -using System.Xml; +using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { - public class Vector3Token : IXmlPropertyToken + public class Vector3Token : IXmlPropertyToken, IAttributeToken { - public string Token => "Vector3"; - private static string[] Coords = new string[3] { "X", "Y", "Z" }; + public string XmlPropertyToken => "Vector3"; + private static readonly string[] XmlCoords = new string[3] { "X", "Y", "Z" }; + + public AttributeType AttributeType => AttributeType.Vector3; + public Vector3 ReadAttribute(Attribute attr) => ReadVector3(attr); + public void WriteAttribute(Attribute attr, Vector3 value) => WriteVector3(attr, value); public static Vector3 ReadVector3(XmlNode token) { @@ -15,7 +18,7 @@ namespace RobloxFiles.XmlFormat.PropertyTokens for (int i = 0; i < 3; i++) { - string key = Coords[i]; + string key = XmlCoords[i]; try { @@ -46,6 +49,22 @@ namespace RobloxFiles.XmlFormat.PropertyTokens node.AppendChild(z); } + public static Vector3 ReadVector3(Attribute attr) + { + float x = attr.ReadFloat(), + y = attr.ReadFloat(), + z = attr.ReadFloat(); + + return new Vector3(x, y, z); + } + + public static void WriteVector3(Attribute attr, Vector3 value) + { + attr.WriteFloat(value.X); + attr.WriteFloat(value.Y); + attr.WriteFloat(value.Z); + } + public bool ReadProperty(Property property, XmlNode token) { Vector3 result = ReadVector3(token); diff --git a/XmlFormat/Tokens/Vector3int16.cs b/Tokens/Vector3int16.cs similarity index 89% rename from XmlFormat/Tokens/Vector3int16.cs rename to Tokens/Vector3int16.cs index 1bf7f8a..8a877fb 100644 --- a/XmlFormat/Tokens/Vector3int16.cs +++ b/Tokens/Vector3int16.cs @@ -1,12 +1,12 @@ using System.Xml; using RobloxFiles.DataTypes; -namespace RobloxFiles.XmlFormat.PropertyTokens +namespace RobloxFiles.Tokens { public class Vector3int16Token : IXmlPropertyToken { - public string Token => "Vector3int16"; - private static string[] Coords = new string[3] { "X", "Y", "Z" }; + public string XmlPropertyToken => "Vector3int16"; + private static readonly string[] Coords = new string[3] { "X", "Y", "Z" }; public bool ReadProperty(Property property, XmlNode token) { diff --git a/Tree/Attributes.cs b/Tree/Attributes.cs index 6e926ff..dd0cda2 100644 --- a/Tree/Attributes.cs +++ b/Tree/Attributes.cs @@ -2,221 +2,221 @@ using System.Collections.Generic; using System.IO; using System.Linq; - -using RobloxFiles.DataTypes; +using System.Reflection; +using System.Text; namespace RobloxFiles { + // This enum defines existing attributes + // Commented out values are known types + // which are unsupported at this time. + public enum AttributeType { - Null = 1, - String, - Bool, - Int, - Float, - Double, - Array, - Dictionary, - UDim, - UDim2, - Ray, - Faces, - Axes, - BrickColor, - Color3, - Vector2, - Vector3, - Vector2int16, - Vector3int16, - CFrame, - Enum, + // Null = 1, + String = 2, + Bool = 3, + // Int = 4, + Float = 5, + Double = 6, + // Array = 7, + // Dictionary = 8, + UDim = 9, + UDim2 = 10, + // Ray = 11, + // Faces = 12, + // Axes = 13 + BrickColor = 14, + Color3 = 15, + Vector2 = 16, + Vector3 = 17, + // Vector2int16 = 18, + // Vector3int16 = 19, + // CFrame = 20, + // Enum = 21, NumberSequence = 23, - NumberSequenceKeypoint, - ColorSequence, - ColorSequenceKeypoint, - NumberRange, - Rect, - PhysicalProperties, - Region3 = 31, - Region3int16, + // NumberSequenceKeypoint = 24, + ColorSequence = 25, + // ColorSequenceKeypoint = 26, + NumberRange = 27, + Rect = 28, + // PhysicalProperties = 29 + // Region3 = 31, + // Region3int16 = 32 } public class Attribute : IDisposable { + private static readonly IReadOnlyDictionary AttributeSupport; + private static readonly IReadOnlyDictionary SupportedTypes; + public AttributeType DataType { get; private set; } public object Value { get; private set; } + private struct Tokenizer + { + public readonly Type Support; + public readonly object Token; + + public readonly MethodInfo Reader; + public readonly MethodInfo Writer; + + public Tokenizer(Type tokenType, Type support) + { + Support = support; + Token = Activator.CreateInstance(tokenType); + + Reader = support.GetMethod("ReadAttribute"); + Writer = support.GetMethod("WriteAttribute"); + } + + public object ReadAttribute(Attribute attr) + { + var args = new object[1] { attr }; + return Reader.Invoke(Token, args); + } + + public void WriteAttribute(Attribute attr, object value) + { + var args = new object[2] { attr, value }; + Writer.Invoke(Token, args); + } + } + + static Attribute() + { + var attributeSupport = new Dictionary(); + var supportedTypes = new Dictionary(); + + var assembly = Assembly.GetExecutingAssembly(); + + var handlerTypes = + from type in assembly.GetTypes() + let typeInfo = type.GetTypeInfo() + let support = typeInfo.GetInterface("IAttributeToken`1") + where (support != null) + select new Tokenizer(typeInfo, support); + + foreach (var tokenizer in handlerTypes) + { + var token = tokenizer.Token; + var support = tokenizer.Support; + + var genericType = support.GenericTypeArguments.FirstOrDefault(); + var getAttributeType = support.GetMethod("get_AttributeType"); + var attributeType = (AttributeType)getAttributeType.Invoke(token, null); + + attributeSupport.Add(attributeType, tokenizer); + supportedTypes.Add(genericType, attributeType); + } + + AttributeSupport = attributeSupport; + SupportedTypes = supportedTypes; + } + + ///

+ /// Returns true if the provided type is supported by attributes. + /// + /// + /// + public static bool SupportsType(Type type) + { + return SupportedTypes.ContainsKey(type); + } + + /// + /// Returns true if the provided type is supported by attributes. + /// + /// + /// + public static bool SupportsType() + { + Type type = typeof(T); + return SupportsType(type); + } + public override string ToString() { - string type = Enum.GetName(typeof(AttributeType), DataType); string value = Value?.ToString() ?? "null"; - return $"[{type}: {value}]"; + return $"[{DataType}: {value}]"; } - internal BinaryReader reader; - // internal BinaryWriter writer; + internal BinaryReader Reader; + internal BinaryWriter Writer; - internal int ReadInt() => reader.ReadInt32(); - internal byte ReadByte() => reader.ReadByte(); - internal bool ReadBool() => reader.ReadBoolean(); - internal short ReadShort() => reader.ReadInt16(); - internal float ReadFloat() => reader.ReadSingle(); - internal double ReadDouble() => reader.ReadDouble(); - internal string ReadString() => reader.ReadString(true); + internal int ReadInt() => Reader.ReadInt32(); + internal byte ReadByte() => Reader.ReadByte(); + internal bool ReadBool() => Reader.ReadBoolean(); + internal short ReadShort() => Reader.ReadInt16(); + internal float ReadFloat() => Reader.ReadSingle(); + internal double ReadDouble() => Reader.ReadDouble(); + internal string ReadString() => Reader.ReadString(true); - internal Attribute[] ReadArray() + internal void WriteInt(int value) => Writer.Write(value); + internal void WriteBool(bool value) => Writer.Write(value); + internal void WriteFloat(float value) => Writer.Write(value); + internal void WriteDouble(double value) => Writer.Write(value); + + internal void WriteString(string value) { - int count = ReadInt(); - var result = new Attribute[count]; + int length = value.Length; + Writer.Write(length); - for (int i = 0; i < count; i++) - result[i] = new Attribute(reader); - - return result; + byte[] utf8 = Encoding.UTF8.GetBytes(value); + Writer.Write(utf8); } - internal object readEnum() + internal void Read() { - string name = ReadString(); - int value = ReadInt(); - - try - { - Type enumType = Type.GetType($"RobloxFiles.Enums.{name}"); - return Enum.ToObject(enumType, value); - } - catch - { - if (RobloxFile.LogErrors) - Console.Error.WriteLine($"RobloxFile - Got unknown Enum {name} in Attribute."); - - return null; - } - } - - private void readData() - { - if (reader == null) + if (Reader == null) return; - DataType = (AttributeType)reader.ReadByte(); + var dataType = Reader.ReadByte(); + DataType = (AttributeType)dataType; - switch (DataType) - { - case AttributeType.Null: - break; - case AttributeType.String: - Value = ReadString(); - break; - case AttributeType.Bool: - Value = ReadBool(); - break; - case AttributeType.Int: - Value = ReadInt(); - break; - case AttributeType.Float: - Value = ReadFloat(); - break; - case AttributeType.Double: - Value = ReadDouble(); - break; - case AttributeType.Array: - Value = ReadArray(); - break; - case AttributeType.Dictionary: - Value = new Attributes(reader); - break; - case AttributeType.UDim: - Value = new UDim(this); - break; - case AttributeType.UDim2: - Value = new UDim2(this); - break; - case AttributeType.Ray: - Value = new Ray(this); - break; - case AttributeType.Faces: - Value = (Faces)ReadInt(); - break; - case AttributeType.Axes: - Value = (Axes)ReadInt(); - break; - case AttributeType.BrickColor: - Value = (BrickColor)ReadInt(); - break; - case AttributeType.Color3: - Value = new Color3(this); - break; - case AttributeType.Vector2: - Value = new Vector2(this); - break; - case AttributeType.Vector3: - Value = new Vector3(this); - break; - case AttributeType.Vector2int16: - Value = new Vector2int16(this); - break; - case AttributeType.Vector3int16: - Value = new Vector3int16(this); - break; - case AttributeType.CFrame: - Value = new CFrame(this); - break; - case AttributeType.Enum: - Value = readEnum(); - break; - case AttributeType.NumberSequence: - Value = new NumberSequence(this); - break; - case AttributeType.NumberSequenceKeypoint: - Value = new NumberSequenceKeypoint(this); - break; - case AttributeType.ColorSequence: - Value = new ColorSequence(this); - break; - case AttributeType.ColorSequenceKeypoint: - Value = new ColorSequenceKeypoint(this); - break; - case AttributeType.NumberRange: - Value = new NumberRange(this); - break; - case AttributeType.Rect: - Value = new Rect(this); - break; - case AttributeType.PhysicalProperties: - bool custom = ReadBool(); + var tokenizer = AttributeSupport[DataType]; + Value = tokenizer.ReadAttribute(this); - if (custom) - Value = new PhysicalProperties(this); - - break; - case AttributeType.Region3: - Value = new Region3(this); - break; - case AttributeType.Region3int16: - Value = new Region3int16(this); - break; - default: throw new InvalidDataException($"Cannot handle AttributeType {DataType}!"); - } - - reader = null; + Reader = null; } public void Dispose() { - reader.Dispose(); + Reader?.Dispose(); + } + + internal void Write(BinaryWriter writer) + { + var tokenizer = AttributeSupport[DataType]; + Writer = writer; + + writer.Write((byte)DataType); + tokenizer.WriteAttribute(this, Value); + + Writer = null; } internal Attribute(BinaryReader reader) { - this.reader = reader; - readData(); + Reader = reader; + Read(); } internal Attribute(MemoryStream stream) { - reader = new BinaryReader(stream); - readData(); + Reader = new BinaryReader(stream); + Read(); + } + + internal Attribute(object value) + { + Type type = value.GetType(); + + if (SupportedTypes.TryGetValue(type, out AttributeType dataType)) + { + DataType = dataType; + Value = value; + } } } @@ -248,15 +248,32 @@ namespace RobloxFiles internal Attributes(MemoryStream stream) { using (BinaryReader reader = new BinaryReader(stream)) - { Initialize(reader); - } + + stream.Dispose(); } internal byte[] Serialize() { - // TODO - return Array.Empty(); + if (Count == 0) + return Array.Empty(); + + using (var output = new MemoryStream()) + using (var writer = new BinaryWriter(output)) + { + writer.Write(Count); + + foreach (string key in Keys) + { + var attribute = this[key]; + attribute.Writer = writer; + + attribute.WriteString(key); + attribute.Write(writer); + } + + return output.ToArray(); + } } } } diff --git a/Tree/Instance.cs b/Tree/Instance.cs index 567bcb4..904f440 100644 --- a/Tree/Instance.cs +++ b/Tree/Instance.cs @@ -64,19 +64,22 @@ namespace RobloxFiles public HashSet Tags { get; } = new HashSet(); /// The attributes defined for this Instance. - public Attributes Attributes { get; private set; } + private Attributes AttributesImpl; + + /// The public readonly access point of the attributes on this Instance. + public IReadOnlyDictionary Attributes => AttributesImpl; /// The internal serialized data of this Instance's attributes internal byte[] AttributesSerialize { get { - return Attributes?.Serialize() ?? Array.Empty(); + return AttributesImpl?.Serialize() ?? Array.Empty(); } set { - MemoryStream data = new MemoryStream(value); - Attributes = new Attributes(data); + var data = new MemoryStream(value); + AttributesImpl = new Attributes(data); } } @@ -122,6 +125,55 @@ namespace RobloxFiles } } + /// + /// Attempts to get the value of an attribute whose type is T. + /// Returns false if no attribute was found with that type. + /// + /// The expected type of the attribute. + /// The name of the attribute. + /// The out value to set. + /// True if the attribute could be read and the out value was set, false otherwise. + public bool GetAttribute(string key, out T value) + { + if (AttributesImpl.TryGetValue(key, out Attribute attr)) + { + object result = attr.Value; + + if (result is T) + { + value = (T)result; + return true; + } + } + + value = default; + return false; + } + + /// + /// Attempts to set an attribute to the provided value. The provided key must be no longer than 100 characters. + /// Returns false if the key is too long or the provided type is not supported by Roblox. + /// If an attribute with the provide key already exists, it will be overwritten. + /// + /// + /// The name of the attribute. + /// The value to be assigned to the attribute. + /// True if the attribute was set, false otherwise. + public bool SetAttribute(string key, T value) + { + if (key.Length > 100) + return false; + + if (!Attribute.SupportsType()) + return false; + + var attr = new Attribute(value); + AttributesImpl[key] = attr; + + return true; + } + + /// Returns true if this Instance is an ancestor to the provided Instance. /// The instance whose descendance will be tested against this Instance. public bool IsAncestorOf(Instance descendant) @@ -432,7 +484,7 @@ namespace RobloxFiles ParentLocked = true; Tags?.Clear(); - Attributes?.Clear(); + AttributesImpl?.Clear(); while (Children.Any()) { diff --git a/UnitTest/Files/Binary.rbxl b/UnitTest/Files/Binary.rbxl index 2cdfe9a4e69975deffb44e8883426d658b179199..2fa7d9787bb7a6fc664fe55fbd42e335dbf6219e 100644 GIT binary patch delta 1086 zcmYLIeMnnZ6hFWFp0BaiBsN-Wwe4Dvt*)4~Sy|bnCVtJa5mR*^OdR#&(Z$6iK4U2z ztC^EdIw_?{Z#UZ#TVbM05w$*1r&;HU8)Ixxm@wHFltI}_inDcpZ0%d~OViJ~x2p zfGGd_8V=yH{`7UU0Jr$XLF~iFdVCO%*!~5)=&7mAC8FH|hOM$nF)9KTL4UKVkwhRb zQH!77{RFeP#1F(^<2Q$}9ew(@L+Au<>z-k}j!hRgvhCxs5$sKq5`2szQD2)PVU=hq-|VUfREezMG4vhe#9x=^Cf;}+&du{=OUiORlRNzXMj5!|3qK? z3e%@7g&-OeFl?=`k~b_NxAUwZ(gm?qpjK@UdpcShRjo#C>rewtYBm$svo}&~CNhyT zQfzY4%BE_yDV#@i%uN&$hzRt!Gj>vWY0w|6qFp&v#9kuPYb0lqEve66XRXr64T4x%h-JGfcoa>)*=h`JQ=5c|j|u2z(nDDI=a zl3>uUHUuP`pioU%Yw-n+vr?kdhzP}od8@0uhlJ;RyiRN}T2>bDG_B$`qYre*g zu-a~>L`qplYbe>x|M#_#WRFl53K;gUsgh^>DdqBt0hWbIZoR`Yd1!!b)4R%<=LLQ~ zA(^vVgwP~V8VrQhK)4-DEb8h%Sm|Z@O0N{_&ABRwyQyLjRz*b+x3j*!eti^tDo5V+ zd}DqAV?KWY5hIt(B*jD)Mi%&tNw;5#K9CK$OGGOQSyNI-Vq|^FMr&qn-XZ55qGgk_ no8CWc=+k#E?V)txToUh-exPzsnV5+lA5TSgE!gM}o;>m&0N6FA delta 757 zcmXX^TS$~q5I*1W-)+79t?8C&A_``j*h-Osp@Ov;#AcU=$P5f6TGUmO5UorxlTfh; zr*aK7Nl`4(&10+KmL>*1R9H!Lk$NzK%7?u4w4Hx#V9pt4zWMmh%<&8xKRb=hAxNn< zJvJe%6%WYVia+QSF%BG3$T5Hry4sEs6w^vOo}o!R=|CEAkN$Qd33tWz`>+9%)Y64G z+!pRGtnkDs9JC%g9>Ew3m#*1jK&CwP(k=Fay!=wewXE0P(YJ1lp@owA5lllp2*ph? z(}OBtS{&-d39P&2<%^}hK1BN}^F0dZJU|h1eMkUhIiaWB{ZJ{iU-ph^JX5$%tNqA> zOXNI68b^U>8^CX%f*J>rp8z$0euGOA-=HUtRbGrU`qoWwlJh4lr#aLiKTw0y5aWKW|G zc;%g!Sb7Op1wBgODl#c|4zX0ZSy6+uX)DsLxrO=glL3WU_!j@I-ib4|Y{;Y=3*1a4 z7H*>Sw_KsXM6L>lgg3Ev$i-U_n)qCAH9LCml&MW zE)m)GQ_(og@~7ySQKw@*vbZgntp@61*`DN7=yiU+YT$;TjV4M9SNwO)8g|yO>SV23 hjhu^Sstj7PG*R#OTlaaz{g=r0?kKgNDX^EP{sVdd;gtXY diff --git a/UnitTest/Files/Xml.rbxlx b/UnitTest/Files/Xml.rbxlx index e34f3c4..813f2c7 100644 --- a/UnitTest/Files/Xml.rbxlx +++ b/UnitTest/Files/Xml.rbxlx @@ -1,12 +1,12 @@ null nil - + false Default^0^1 - RBX13AE292CAA514434A884BD688FFBC5B1 + RBXB6729B4B8E0F4D3398108C05AFD9B65E 0 true -500 @@ -61,7 +61,7 @@ true false - + false @@ -157,7 +157,7 @@ - + false @@ -253,7 +253,7 @@ - + 0 @@ -296,7 +296,7 @@ -1 - + false @@ -392,7 +392,7 @@ - + false @@ -488,7 +488,7 @@ - + false @@ -584,7 +584,7 @@ - + false @@ -680,7 +680,7 @@ - + false @@ -777,7 +777,7 @@ - + @@ -819,7 +819,7 @@ - + 0 true @@ -1179,7 +1179,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + BoolValue @@ -1188,7 +1188,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + BrickColorValue @@ -1197,7 +1197,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 194 - + Color3Value @@ -1210,7 +1210,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + CFrameValue @@ -1232,7 +1232,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + IntValue @@ -1241,7 +1241,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1234 - + NumberValue @@ -1250,16 +1250,16 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 9.0000999999999997669 - + ObjectValue -1 - RBXD040B9F5E34F416EA31C5CB930F42CBB + RBX473F017243BF4D4CBB814CA63559A93A - + RayValue @@ -1279,7 +1279,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A - + StringValue @@ -1288,7 +1288,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A TestingLol - + true @@ -1370,9 +1370,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 - + - RBX6125755126B1409EB37AE2D8CA726D10 + RBX31EFCF342C8F4FEBA9CBF3E1E39463CB 0 @@ -1389,9 +1389,9 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + - RBX6125755126B1409EB37AE2D8CA726D10 + RBX31EFCF342C8F4FEBA9CBF3E1E39463CB 1 @@ -1409,7 +1409,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A false - + 0 @@ -1444,7 +1444,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 1 0 - + false @@ -1469,7 +1469,7 @@ script.Parent.Color = ColorSequence.new(keyPoints)]]> - + false @@ -1495,7 +1495,7 @@ script.Parent.Size = NumberSequence.new(keyPoints)]]> - + false @@ -1523,7 +1523,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Vector3Value @@ -1536,7 +1536,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1590,7 +1590,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true 1 - + UDimTest @@ -1615,7 +1615,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -1658,7 +1658,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + false @@ -1735,7 +1735,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 - + 2 @@ -1764,7 +1764,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1841,7 +1841,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 - + 2 @@ -1870,7 +1870,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -1947,7 +1947,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 2 @@ -1976,7 +1976,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2053,7 +2053,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 2 @@ -2082,7 +2082,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2159,7 +2159,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 - + 2 @@ -2188,7 +2188,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2265,7 +2265,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 2 @@ -2294,7 +2294,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2371,7 +2371,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 - + 2 @@ -2400,7 +2400,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2477,7 +2477,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 2 @@ -2506,7 +2506,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2583,7 +2583,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 2 @@ -2612,7 +2612,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2689,7 +2689,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 - + 10 @@ -2710,7 +2710,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + INF @@ -2721,7 +2721,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1.3337000000000001076 - + false @@ -2817,8 +2817,23 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + + + + Attributes + -1 + + + - + 0 @@ -2831,7 +2846,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + NonReplicatedCSGDictionaryService @@ -2839,7 +2854,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + CSGDictionaryService @@ -2847,7 +2862,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -2857,7 +2872,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + TimerService @@ -2865,7 +2880,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -2877,7 +2892,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ReplicatedFirst @@ -2885,7 +2900,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + TweenService @@ -2893,7 +2908,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + PermissionsService @@ -2901,7 +2916,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -2913,7 +2928,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -2928,7 +2943,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -2972,7 +2987,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + StarterPlayerScripts @@ -2980,7 +2995,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + StarterCharacterScripts @@ -2989,7 +3004,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + StarterPack @@ -2997,7 +3012,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + StarterGui @@ -3008,7 +3023,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + LocalizationService @@ -3016,7 +3031,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + TeleportService @@ -3024,7 +3039,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + CollectionService @@ -3032,7 +3047,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + PhysicsService @@ -3040,7 +3055,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Geometry @@ -3048,7 +3063,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false false @@ -3058,7 +3073,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + GamePassService @@ -3066,7 +3081,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 1000 @@ -3075,7 +3090,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + CookiesService @@ -3083,7 +3098,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + VRService @@ -3091,7 +3106,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ContextActionService @@ -3099,7 +3114,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ScriptService @@ -3107,7 +3122,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + AssetService @@ -3115,7 +3130,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + TouchInputService @@ -3123,7 +3138,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3132,7 +3147,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Selection @@ -3140,7 +3155,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -3149,7 +3164,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ServerStorage @@ -3157,7 +3172,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ReplicatedStorage @@ -3165,7 +3180,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + LuaWebService @@ -3173,7 +3188,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3218,7 +3233,68 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 00:00:00 - + + + + true + false + DataStoreService + -1 + + + + + + + FlyweightService + -1 + + + + + + + true + HttpService + -1 + + + + + + + LanguageService + -1 + + + + + + + true + 16 + ProximityPromptService + -1 + + + + + + + ReplicatedScriptService + -1 + + + + + + + Teams + -1 + + + + true @@ -3235,76 +3311,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 10 - - - - true - false - DataStoreService - -1 - - - - - - - FlyweightService - -1 - - - - - - - true - HttpService - -1 - - - - - - - LanguageService - -1 - - - - - - - ReplicatedScriptService - -1 - - - - - - - Teams - -1 - - - - - - - VirtualInputManager - -1 - - - - - - - true - 16 - ProximityPromptService - -1 - - - - + {"lastSaveTime":0,"lastKnownPublishRequest":0,"users":[]} @@ -3313,14 +3320,22 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + + + + VirtualInputManager + -1 + + + + DumpFolder -1 - + @@ -3332,7 +3347,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3354,7 +3369,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3376,7 +3391,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3398,7 +3413,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3407,7 +3422,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3429,7 +3444,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Backpack @@ -3437,7 +3452,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -3448,7 +3463,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -3476,7 +3491,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -3505,7 +3520,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + null null @@ -3531,7 +3546,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + BindableEvent @@ -3539,7 +3554,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + BindableFunction @@ -3547,7 +3562,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3566,7 +3581,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3579,7 +3594,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3608,7 +3623,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 1250 @@ -3628,7 +3643,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3646,7 +3661,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3665,7 +3680,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0.699999988 @@ -3692,7 +3707,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 3000 - + @@ -3734,7 +3749,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3772,7 +3787,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -3784,7 +3799,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3798,7 +3813,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3812,7 +3827,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -3826,7 +3841,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Skin @@ -3835,7 +3850,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0.5 @@ -3845,7 +3860,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Configuration @@ -3853,7 +3868,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 null @@ -3873,7 +3888,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + false null @@ -3892,7 +3907,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + 0 @@ -3913,7 +3928,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + null null @@ -3934,7 +3949,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + 0 0 @@ -3959,7 +3974,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + false null @@ -3977,7 +3992,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + null null @@ -3992,7 +4007,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + null null @@ -4008,7 +4023,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + 0 0 @@ -4046,7 +4061,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + 0 null @@ -4071,7 +4086,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + null null @@ -4094,7 +4109,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + null null @@ -4111,7 +4126,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + false null @@ -4131,7 +4146,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false - + HumanoidController @@ -4139,7 +4154,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + SkateboardController @@ -4147,7 +4162,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + VehicleController @@ -4155,7 +4170,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + CustomEvent @@ -4164,7 +4179,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + CustomEventReceiver @@ -4173,7 +4188,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -4201,7 +4216,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -4229,7 +4244,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 2 @@ -4256,7 +4271,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -4277,7 +4292,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -4289,7 +4304,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 500000 @@ -4307,7 +4322,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + @@ -4323,7 +4338,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + @@ -4343,7 +4358,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + 0 @@ -4355,7 +4370,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 0 @@ -4367,7 +4382,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + @@ -4388,7 +4403,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 - + Folder @@ -4396,7 +4411,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + ForceField @@ -4405,7 +4420,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + false @@ -4460,7 +4475,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + true @@ -4553,7 +4568,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + true @@ -4633,7 +4648,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false @@ -4720,7 +4735,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false @@ -4796,7 +4811,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false @@ -4877,7 +4892,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false @@ -4936,7 +4951,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false @@ -5026,7 +5041,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + false null @@ -5079,7 +5094,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + true @@ -5094,7 +5109,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + true @@ -5109,7 +5124,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + true null @@ -5136,7 +5151,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + null @@ -5159,7 +5174,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + 0 null @@ -5202,7 +5217,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + 0 null @@ -5242,7 +5257,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + 0 null @@ -5284,7 +5299,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + 0 null @@ -5327,7 +5342,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + 0 null @@ -5367,7 +5382,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + 0 null @@ -5406,7 +5421,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -1 - + @@ -5432,7 +5447,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.0625 - + null @@ -5448,7 +5463,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + null @@ -5470,7 +5485,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + null @@ -5489,7 +5504,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + null @@ -5509,7 +5524,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + null @@ -5526,7 +5541,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + @@ -5543,7 +5558,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + @@ -5564,7 +5579,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true - + true @@ -5599,7 +5614,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 16 - + @@ -5670,7 +5685,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + 0 @@ -5710,7 +5725,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -5750,7 +5765,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -5809,7 +5824,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -5850,7 +5865,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -5891,7 +5906,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -5932,7 +5947,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -5973,7 +5988,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -6012,7 +6027,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -6051,7 +6066,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -6094,7 +6109,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -6133,7 +6148,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Keyframe @@ -6142,7 +6157,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + KeyframeMarker @@ -6151,7 +6166,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 2 @@ -6162,7 +6177,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 1 @@ -6179,7 +6194,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 90 @@ -6198,7 +6213,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 90 @@ -6217,17 +6232,17 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + - + [] LocalizationTable -1 en-us - + false @@ -6239,7 +6254,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6251,7 +6266,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -6262,7 +6277,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Message @@ -6271,7 +6286,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Hint @@ -6280,7 +6295,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -6291,7 +6306,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6367,7 +6382,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6445,7 +6460,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6524,7 +6539,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6603,7 +6618,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6684,7 +6699,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false false @@ -6767,7 +6782,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6844,7 +6859,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -6940,7 +6955,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -7033,7 +7048,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -7126,7 +7141,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -7219,7 +7234,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + false @@ -7296,7 +7311,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 - + false @@ -7381,7 +7396,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -7425,7 +7440,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + @@ -7435,7 +7450,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + 0 @@ -7447,7 +7462,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + @@ -7472,7 +7487,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 - + true @@ -7484,7 +7499,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.949999988 - + true @@ -7494,7 +7509,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + true @@ -7507,7 +7522,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> - + Interact @@ -7532,7 +7547,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -