diff --git a/BinaryFormat/Chunks/INST.cs b/BinaryFormat/Chunks/INST.cs index c23b7e9..5b53b03 100644 --- a/BinaryFormat/Chunks/INST.cs +++ b/BinaryFormat/Chunks/INST.cs @@ -28,6 +28,17 @@ namespace RobloxFiles.BinaryFormat.Chunks NumInstances = reader.ReadInt32(); InstanceIds = reader.ReadInstanceIds(NumInstances); + Type instType = Type.GetType($"RobloxFiles.{ClassName}"); + file.Classes[ClassIndex] = this; + + if (instType == null) + { + if (RobloxFile.LogErrors) + Console.Error.WriteLine($"INST - Unknown class: {ClassName} while reading INST chunk."); + + return; + } + if (IsService) { RootedServices = new List(); @@ -42,8 +53,7 @@ namespace RobloxFiles.BinaryFormat.Chunks for (int i = 0; i < NumInstances; i++) { int instId = InstanceIds[i]; - Type instType = Type.GetType($"RobloxFiles.{ClassName}") ?? typeof(Instance); - + var inst = Activator.CreateInstance(instType) as Instance; inst.Referent = instId.ToString(); inst.IsService = IsService; @@ -56,8 +66,6 @@ namespace RobloxFiles.BinaryFormat.Chunks file.Instances[instId] = inst; } - - file.Classes[ClassIndex] = this; } public void Save(BinaryRobloxFileWriter writer) diff --git a/BinaryFormat/Chunks/PRNT.cs b/BinaryFormat/Chunks/PRNT.cs index 8667576..ce2e244 100644 --- a/BinaryFormat/Chunks/PRNT.cs +++ b/BinaryFormat/Chunks/PRNT.cs @@ -29,6 +29,24 @@ namespace RobloxFiles.BinaryFormat.Chunks int parentId = parentIds[i]; Instance child = file.Instances[childId]; + Instance parent = (parentId >= 0 ? file.Instances[parentId] : file); + + if (child == null) + { + if (RobloxFile.LogErrors) + Console.Error.WriteLine($"PRNT: could not parent {childId} to {parentId} because child {childId} was null."); + + continue; + } + + if (parentId >= 0 && parent == null) + { + if (RobloxFile.LogErrors) + Console.Error.WriteLine($"PRNT: could not parent {childId} to {parentId} because parent {parentId} was null."); + + continue; + } + child.Parent = (parentId >= 0 ? file.Instances[parentId] : file); } } diff --git a/BinaryFormat/Chunks/PROP.cs b/BinaryFormat/Chunks/PROP.cs index 8e8cbc3..e7d5e13 100644 --- a/BinaryFormat/Chunks/PROP.cs +++ b/BinaryFormat/Chunks/PROP.cs @@ -56,6 +56,14 @@ namespace RobloxFiles.BinaryFormat.Chunks int id = ids[i]; Instance instance = file.Instances[id]; + if (instance == null) + { + if (RobloxFile.LogErrors) + Console.Error.WriteLine($"PROP: No instance @{id} for property {ClassName}.{Name}"); + + continue; + } + Property prop = new Property(instance, this); props[i] = prop; @@ -71,6 +79,10 @@ namespace RobloxFiles.BinaryFormat.Chunks for (int i = 0; i < instCount; i++) { var prop = props[i]; + + if (prop == null) + continue; + prop.Value = read(i); } }); @@ -593,9 +605,9 @@ namespace RobloxFiles.BinaryFormat.Chunks foreach (int instId in inst.InstanceIds) { Instance instance = file.Instances[instId]; - Property prop = instance.Properties[Name]; + var instProps = instance.Properties; - if (prop == null) + if (!instProps.TryGetValue(Name, out Property prop)) throw new Exception($"Property {Name} must be defined in {instance.GetFullName()}!"); else if (prop.Type != Type) throw new Exception($"Property {Name} is not using the correct type in {instance.GetFullName()}!"); diff --git a/Generated/Classes.cs b/Generated/Classes.cs index 9ee0a62..743a351 100644 --- a/Generated/Classes.cs +++ b/Generated/Classes.cs @@ -1,5 +1,5 @@ // Auto-generated list of creatable Roblox classes. -// Updated as of 0.450.0.411923 +// Updated as of 0.454.0.413308 using System; @@ -410,13 +410,11 @@ namespace RobloxFiles set => CFrame = value; } - public float DiagonalFieldOfView; public float FieldOfView = 70; public FieldOfViewMode FieldOfViewMode = FieldOfViewMode.Vertical; public CFrame Focus = new CFrame(0, 0, -5); public bool HeadLocked = true; public float HeadScale = 1; - public float MaxAxisFieldOfView; [Obsolete] public CFrame focus @@ -1471,6 +1469,7 @@ namespace RobloxFiles public abstract class HandleAdornment : PVAdornment { + public AdornCullingMode AdornCullingMode = AdornCullingMode.Automatic; public bool AlwaysOnTop; public CFrame CFrame = new CFrame(); public Vector3 SizeRelativeOffset = new Vector3(); @@ -1693,6 +1692,22 @@ namespace RobloxFiles public float WidthScale = 1; } + public abstract class ILegacyStudioBridge : Instance + { + public ILegacyStudioBridge() + { + IsService = true; + } + } + + public class LegacyStudioBridge : ILegacyStudioBridge + { + public LegacyStudioBridge() + { + IsService = true; + } + } + public class InsertService : Instance { public InsertService() @@ -2497,6 +2512,33 @@ namespace RobloxFiles public float Spread = 1; } + public class ProximityPrompt : Instance + { + public string ActionText = "Interact"; + public bool ClickablePrompt = true; + public bool Enabled = true; + public ProximityPromptExclusivity Exclusivity = ProximityPromptExclusivity.OnePerButton; + public KeyCode GamepadKeyCode = KeyCode.ButtonX; + public float HoldDuration; + public KeyCode KeyboardKeyCode = KeyCode.E; + public float MaxActivationDistance = 10; + public string ObjectText = ""; + public bool RequiresLineOfSight = true; + public ProximityPromptStyle Style = ProximityPromptStyle.Default; + public Vector2 UIOffset = new Vector2(); + } + + public class ProximityPromptService : Instance + { + public ProximityPromptService() + { + IsService = true; + } + + public bool Enabled = true; + public int MaxPromptsVisible = 16; + } + public class RbxAnalyticsService : Instance { public RbxAnalyticsService() @@ -3092,6 +3134,14 @@ namespace RobloxFiles } } + public class TracerService : Instance + { + public TracerService() + { + IsService = true; + } + } + public class Trail : Instance { public Attachment Attachment0; @@ -3434,5 +3484,6 @@ namespace RobloxFiles } public BasePart Part1Internal; + public int State = 3; } } diff --git a/Generated/Enums.cs b/Generated/Enums.cs index 2d27933..580d1d8 100644 --- a/Generated/Enums.cs +++ b/Generated/Enums.cs @@ -1,5 +1,5 @@ // Auto-generated list of Roblox enums. -// Updated as of 0.450.0.411923 +// Updated as of 0.454.0.413308 namespace RobloxFiles.Enums { @@ -17,6 +17,12 @@ namespace RobloxFiles.Enums Servo } + public enum AdornCullingMode + { + Automatic, + Never + } + public enum AlignType { Parallel, @@ -383,6 +389,264 @@ namespace RobloxFiles.Enums Enabled } + public enum KeyCode + { + Unknown, + Backspace = 8, + Tab, + Clear = 12, + Return, + Pause = 19, + Escape = 27, + Space = 32, + QuotedDouble = 34, + Hash, + Dollar, + Percent, + Ampersand, + Quote, + LeftParenthesis, + RightParenthesis, + Asterisk, + Plus, + Comma, + Minus, + Period, + Slash, + Zero, + One, + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + Colon, + Semicolon, + LessThan, + Equals, + GreaterThan, + Question, + At, + LeftBracket = 91, + BackSlash, + RightBracket, + Caret, + Underscore, + Backquote, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + LeftCurly, + Pipe, + RightCurly, + Tilde, + Delete, + World0 = 160, + World1, + World2, + World3, + World4, + World5, + World6, + World7, + World8, + World9, + World10, + World11, + World12, + World13, + World14, + World15, + World16, + World17, + World18, + World19, + World20, + World21, + World22, + World23, + World24, + World25, + World26, + World27, + World28, + World29, + World30, + World31, + World32, + World33, + World34, + World35, + World36, + World37, + World38, + World39, + World40, + World41, + World42, + World43, + World44, + World45, + World46, + World47, + World48, + World49, + World50, + World51, + World52, + World53, + World54, + World55, + World56, + World57, + World58, + World59, + World60, + World61, + World62, + World63, + World64, + World65, + World66, + World67, + World68, + World69, + World70, + World71, + World72, + World73, + World74, + World75, + World76, + World77, + World78, + World79, + World80, + World81, + World82, + World83, + World84, + World85, + World86, + World87, + World88, + World89, + World90, + World91, + World92, + World93, + World94, + World95, + KeypadZero, + KeypadOne, + KeypadTwo, + KeypadThree, + KeypadFour, + KeypadFive, + KeypadSix, + KeypadSeven, + KeypadEight, + KeypadNine, + KeypadPeriod, + KeypadDivide, + KeypadMultiply, + KeypadMinus, + KeypadPlus, + KeypadEnter, + KeypadEquals, + Up, + Down, + Right, + Left, + Insert, + Home, + End, + PageUp, + PageDown, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + F13, + F14, + F15, + NumLock = 300, + CapsLock, + ScrollLock, + RightShift, + LeftShift, + RightControl, + LeftControl, + RightAlt, + LeftAlt, + RightMeta, + LeftMeta, + LeftSuper, + RightSuper, + Mode, + Compose, + Help, + Print, + SysReq, + Break, + Menu, + Power, + Euro, + Undo, + ButtonX = 1000, + ButtonY, + ButtonA, + ButtonB, + ButtonR1, + ButtonL1, + ButtonR2, + ButtonL2, + ButtonR3, + ButtonL3, + ButtonStart, + ButtonSelect, + DPadLeft, + DPadRight, + DPadUp, + DPadDown, + Thumbstick1, + Thumbstick2 + } + public enum LeftRight { Left, @@ -515,6 +779,19 @@ namespace RobloxFiles.Enums Bounce } + public enum ProximityPromptExclusivity + { + OnePerButton, + OneGlobally, + AlwaysShow + } + + public enum ProximityPromptStyle + { + Default, + Custom + } + public enum R15CollisionType { OuterBox, diff --git a/Plugins/GenerateApiDump.rbxm b/Plugins/GenerateApiDump.rbxm index f902d97..14b478a 100644 Binary files a/Plugins/GenerateApiDump.rbxm and b/Plugins/GenerateApiDump.rbxm differ diff --git a/Plugins/GenerateApiDump/PropertyPatches.lua b/Plugins/GenerateApiDump/PropertyPatches.lua index f6170fe..b5b2d29 100644 --- a/Plugins/GenerateApiDump/PropertyPatches.lua +++ b/Plugins/GenerateApiDump/PropertyPatches.lua @@ -612,8 +612,10 @@ return { Part0Internal = "Class:BasePart"; Part1Internal = "Class:BasePart"; + EnabledInternal = "bool"; - + State = "int"; + CFrame0 = "CFrame"; CFrame1 = "CFrame"; }; @@ -622,7 +624,9 @@ return { CFrame0 = CFrame.new(); CFrame1 = CFrame.new(); + EnabledInternal = true; + State = 3; Part0 = Instance.new("Part"); Part1 = Instance.new("Part"); diff --git a/RobloxFileFormat.dll b/RobloxFileFormat.dll index 1bbb559..0b921fe 100644 Binary files a/RobloxFileFormat.dll and b/RobloxFileFormat.dll differ diff --git a/Tree/Property.cs b/Tree/Property.cs index 6baa80e..6e406fa 100644 --- a/Tree/Property.cs +++ b/Tree/Property.cs @@ -214,7 +214,7 @@ namespace RobloxFiles if (!RobloxFile.LogErrors) return false; - Console.Error.WriteLine($"RobloxFiles.Property - No defined member for {Instance.ClassName}.{Name}"); + Console.Error.WriteLine($"RobloxFiles.Property - Property {Instance.ClassName}.{Name} does not exist!"); } } } diff --git a/UnitTest/Files/Binary.rbxl b/UnitTest/Files/Binary.rbxl index 7e57d44..5253e58 100644 Binary files a/UnitTest/Files/Binary.rbxl and b/UnitTest/Files/Binary.rbxl differ diff --git a/UnitTest/Files/Xml.rbxlx b/UnitTest/Files/Xml.rbxlx index d841e5d..40ef1a1 100644 --- a/UnitTest/Files/Xml.rbxlx +++ b/UnitTest/Files/Xml.rbxlx @@ -12,6 +12,9 @@ -500 true 196.199997 + 0 + 0 + 0 0 0 @@ -26,19 +29,135 @@ 0 1 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + Workspace null + -1 false 64 0 1024 - false true + + + false + + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 15.4042997 + 9 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + false + 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 + Box + +qv2o0HSW+htH+ALwYQpiw== + + 0 + 1 + -0.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + -1 + + rbxassetid://3186730114 + -0.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + + 1.90382576 + 4.49005699 + 0.858924985 + + + + 0 0 0 @@ -53,8 +172,29 @@ 0 1 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + Car null + -1 @@ -90,16 +230,23 @@ false + false -0.5 0.5 0 0 + false false 4.72215939 3.58347774 9.56809998 + + 0 + 0 + 0 + -0.5 0.5 @@ -111,7 +258,7 @@ rbxassetid://3186726050 rbxassetid://3186726050 Box - +KXn2PVkmG8K5+S8Au8qxA== + +qv2o0HSW+htH+ALwYQpiw== 0 1 @@ -125,6 +272,7 @@ 0 0 + -1 -0.5 @@ -177,16 +325,23 @@ false + false -0.5 0.5 0 0 + false false 4.72215939 3.58347774 9.56809998 + + 0 + 0 + 0 + -0.5 0.5 @@ -198,7 +353,7 @@ rbxassetid://3186726050 rbxassetid://3186726050 Default - p5XjaPTg1Nj3G83dgQnxnQ== + h8IPxf7q0MVs4uyaKSOhVA== 0 1 @@ -212,6 +367,7 @@ 0 0 + -1 -0.5 @@ -264,16 +420,23 @@ false + false -0.5 0.5 0 0 + false false 4.72215939 3.58347774 9.56809998 + + 0 + 0 + 0 + -0.5 0.5 @@ -285,7 +448,7 @@ rbxassetid://3186726050 rbxassetid://3186726050 Hull - Mx7Ko9ySR/gOoyA4uo08sQ== + yk4/m1d5tPD+2SapafAV9A== 0 1 @@ -299,6 +462,7 @@ 0 0 + -1 -0.5 @@ -351,16 +515,23 @@ false + false -0.5 0.5 0 0 + false false 4.72215939 3.58347774 9.56809998 + + 0 + 0 + 0 + -0.5 0.5 @@ -372,7 +543,7 @@ rbxassetid://3186726050 rbxassetid://3186726050 PreciseConvexDecomposition - R5+LhZFmUtVbZb2bGVv+Hw== + ezvavG8GMWP28xfkKnsm/w== 0 1 @@ -386,6 +557,7 @@ 0 0 + -1 -0.5 @@ -438,16 +610,23 @@ false + false -0.5 0.5 0 0 + false false 4.72215939 3.58347774 9.56809998 + + 0 + 0 + 0 + -0.5 0.5 @@ -459,7 +638,7 @@ rbxassetid://3186726050 rbxassetid://3186726050 LOD - R5+LhZFmUtVbZb2bGVv+Hw== + ezvavG8GMWP28xfkKnsm/w== 0 0 @@ -473,6 +652,7 @@ 0 0 + -1 -0.5 @@ -513,6 +693,7 @@ null 0 70 + 0 -147.404663 309.432617 @@ -530,6 +711,7 @@ true 1 Camera + -1 @@ -863,6 +1045,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A /4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A /4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A/4D/gP+A /4D/gP+A/4D+]]> + -1 -0.5 0.5 @@ -894,6 +1077,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A BoolValue + -1 false @@ -902,6 +1086,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A BrickColorValue + -1 194 @@ -910,6 +1095,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A Color3Value + -1 1 @@ -922,6 +1108,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A CFrameValue + -1 0 @@ -943,6 +1130,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A IntValue + -1 1234 @@ -951,6 +1139,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A NumberValue + -1 9.0000999999999997669 @@ -959,6 +1148,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A ObjectValue + -1 RBXFAF4D42BBBF64D22A501EA7C72732DF2 @@ -967,6 +1157,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A RayValue + -1 @@ -986,6 +1177,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A StringValue + -1 TestingLol @@ -1051,6 +1243,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 0 0 + -1 -0.5 0.5 @@ -1083,6 +1276,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 0.674509823 ArcHandles + -1 0 false @@ -1101,6 +1295,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A 0 Handles + -1 1 0 @@ -1128,6 +1323,7 @@ SIdI3ghI3oAbSM5I/kjxSKWAGkiISO5I/Ei/gBxIzUjWSISA/4C7RqiAHkaogP+A/4D/gP+A -360 360 0 360 0 0 0 0.0526316 1.0543 1.0543 0.105263 3.77257 3.11371 0.157895 7.00848 1.49576 0.210526 9.39737 0.301316 0.263158 9.93181 0.0340967 0.315789 8.38641 0.806796 0.368421 5.4129 2.29355 0.421053 2.26526 2.26526 0.473684 0.270914 0.270914 0.526316 0.270914 0.270914 0.578947 2.26526 2.26526 0.631579 5.4129 2.29355 0.684211 8.38641 0.806796 0.736842 9.93181 0.0340967 0.789474 9.39737 0.301316 0.842105 7.00848 1.49576 0.894737 3.77257 3.11371 0.947368 1.0543 1.0543 1 0 0 + -1 5 10 360 @@ -1160,6 +1356,7 @@ local lastPoint = ColorSequenceKeypoint.new(1, keyPoints[1].Value) table.insert(keyPoints, lastPoint) script.Parent.Color = ColorSequence.new(keyPoints)]]> + -1 @@ -1185,6 +1382,7 @@ local lastPoint = NumberSequenceKeypoint.new(1, keyPoints[1].Value) table.insert(keyPoints, lastPoint) script.Parent.Size = NumberSequence.new(keyPoints)]]> + -1 @@ -1210,6 +1408,7 @@ local lastPoint = NumberSequenceKeypoint.new(1, keyPoints[1].Value) table.insert(keyPoints, lastPoint) script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + -1 @@ -1219,6 +1418,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Vector3Value + -1 1 @@ -1236,6 +1436,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 1 1 @@ -1274,6 +1475,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -50 0 + -1 0 true @@ -1299,6 +1501,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -0.400000006 16 + -1 @@ -1306,6 +1509,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 0 0 @@ -1320,8 +1524,29 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 1 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + StuffModel null + -1 @@ -1380,6 +1605,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1417,6 +1643,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.5 0.5 + -1 @@ -1483,6 +1710,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1520,6 +1748,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1.95000005 1 + -1 rbxasset://textures/SwordTexture.png @@ -1586,6 +1815,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1623,6 +1853,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.150000006 0.200000003 + -1 @@ -1689,6 +1920,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1726,6 +1958,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.0500000007 0.100000001 + -1 @@ -1792,6 +2025,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1829,6 +2063,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.5 0.5 + -1 @@ -1895,6 +2130,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -1932,6 +2168,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.0199999996 0.0199999996 + -1 @@ -1998,6 +2235,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -2035,6 +2273,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.100000001 0.100000001 + -1 @@ -2101,6 +2340,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -2138,6 +2378,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.600000024 0.600000024 + -1 rbxasset://textures/hammertex128.png @@ -2204,6 +2445,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -2241,6 +2483,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> -0.230000004 -0.200000003 + -1 @@ -2307,6 +2550,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 -0.5 0.5 @@ -2338,6 +2582,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 null + -1 0 1 @@ -2352,6 +2597,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> INF 0 DoubleValue + -1 1.3337000000000001076 @@ -2389,16 +2635,23 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false + false -0.5 0.5 0 0 + false false 1.90382576 4.49005699 0.858924985 + + 0 + 0 + 0 + -0.5 0.5 @@ -2410,7 +2663,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> rbxassetid://3186730087 rbxassetid://3186730087 Default - 0173GmJSl63YNkwRLsdzHw== + wqN+0m4YPEAIF5tOPQwXdA== 0 1 @@ -2424,6 +2677,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 rbxassetid://3186730114 -0.5 @@ -2476,16 +2730,23 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false + false -0.5 0.5 0 0 + false false 1.90382576 4.49005699 0.858924985 + + 0 + 0 + 0 + -0.5 0.5 @@ -2497,94 +2758,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> rbxassetid://3186730087 rbxassetid://3186730087 Hull - Uw2UbsRgWAvbuVwbpaHTJg== - - 0 - 1 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - rbxassetid://3186730114 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - 1.90382576 - 4.49005699 - 0.858924985 - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - 0 - 15.4042997 - 9 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - false - false - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - false - - 1.90382576 - 4.49005699 - 0.858924985 - - - -0.5 - 0.5 - 0 - 0 - false - false - 256 - rbxassetid://3186730087 - rbxassetid://3186730087 - Box - +KXn2PVkmG8K5+S8Au8qxA== + qKQHnbGqNyW9YBYUZo8CWQ== 0 1 @@ -2598,6 +2772,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 rbxassetid://3186730114 -0.5 @@ -2627,6 +2802,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> SoundService false 1 + -1 @@ -2634,6 +2810,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> NonReplicatedCSGDictionaryService + -1 @@ -2641,6 +2818,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> CSGDictionaryService + -1 @@ -2650,6 +2828,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false true Chat + -1 @@ -2657,6 +2836,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> TimerService + -1 @@ -2668,6 +2848,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Players 56832 5 + -1 @@ -2675,6 +2856,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ReplicatedFirst + -1 @@ -2682,6 +2864,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> TweenService + -1 @@ -2689,6 +2872,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> PermissionsService + -1 @@ -2702,6 +2886,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false false StudioData + -1 0 0 @@ -2747,6 +2932,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true StarterPlayer 100 + -1 true @@ -2754,6 +2940,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> StarterPlayerScripts + -1 @@ -2761,6 +2948,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> StarterCharacterScripts + -1 @@ -2769,6 +2957,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> StarterPack + -1 @@ -2779,6 +2968,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true 2 true + -1 @@ -2786,6 +2976,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> LocalizationService + -1 @@ -2793,6 +2984,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> TeleportService + -1 @@ -2800,6 +2992,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> CollectionService + -1 @@ -2807,6 +3000,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> PhysicsService + -1 @@ -2814,6 +3008,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Geometry + -1 @@ -2823,6 +3018,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false InsertService + -1 @@ -2830,6 +3026,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> GamePassService + -1 @@ -2838,6 +3035,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1000 Debris + -1 @@ -2845,6 +3043,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> CookiesService + -1 @@ -2852,6 +3051,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> VRService + -1 @@ -2859,6 +3059,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ContextActionService + -1 @@ -2866,6 +3067,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ScriptService + -1 @@ -2873,6 +3075,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> AssetService + -1 @@ -2880,6 +3083,16 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> TouchInputService + -1 + + + + + + + + AnalyticsService + -1 @@ -2887,6 +3100,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Selection + -1 @@ -2895,6 +3109,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false ServerScriptService + -1 @@ -2902,12 +3117,14 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ServerStorage + -1 DumpFolder + -1 @@ -2928,6 +3145,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Accoutrement + -1 @@ -2949,6 +3167,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Accessory + -1 @@ -2970,6 +3189,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Hat + -1 @@ -2978,6 +3198,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Animation + -1 @@ -2985,6 +3206,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> AnimationController + -1 @@ -2992,6 +3214,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Backpack + -1 @@ -3001,6 +3224,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 HopperBin + -1 @@ -3027,6 +3251,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false Tool true + -1 @@ -3054,6 +3279,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false Flag true + -1 194 @@ -3074,6 +3300,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 Beam 10 + -1 1 @@ -3089,6 +3316,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BindableEvent + -1 @@ -3096,6 +3324,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BindableFunction + -1 @@ -3114,6 +3343,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BodyAngularVelocity 1250 + -1 @@ -3126,6 +3356,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 BodyForce + -1 @@ -3154,6 +3385,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BodyGyro 3000 + -1 @@ -3173,6 +3405,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 50 0 + -1 @@ -3190,6 +3423,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 BodyThrust + -1 @@ -3203,6 +3437,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BodyVelocity 1250 + -1 0 @@ -3223,6 +3458,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 RocketPropulsion + -1 null @@ -3257,6 +3493,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null 0 70 + 0 0 0 @@ -3274,6 +3511,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 1 Camera + -1 @@ -3306,6 +3544,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.411764741 0.674509823 + -1 0.156862751 @@ -3322,6 +3561,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 CharacterMesh 0 + -1 @@ -3335,6 +3575,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Pants + -1 @@ -3348,6 +3589,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Shirt + -1 @@ -3361,6 +3603,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ShirtGraphic + -1 @@ -3369,6 +3612,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Skin 226 + -1 @@ -3378,6 +3622,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 32 ClickDetector + -1 @@ -3385,6 +3630,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Configuration + -1 @@ -3403,6 +3649,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 10 false + -1 false @@ -3421,6 +3668,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false 10 false + -1 false @@ -3441,6 +3689,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> AngularVelocity false 2 + -1 false @@ -3457,6 +3706,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> BallSocketConstraint 0.150000006 0 + -1 false -45 @@ -3483,6 +3733,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.150000006 0 0 + -1 0 45 @@ -3502,6 +3753,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> INF LineForce false + -1 false @@ -3515,6 +3767,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true 5 RodConstraint + -1 0.100000001 false @@ -3530,6 +3783,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 RopeConstraint 0 + -1 0.100000001 false @@ -3562,6 +3816,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0.150000006 + -1 0 0 @@ -3588,6 +3843,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 0.150000006 + -1 0 0 @@ -3612,6 +3868,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 SpringConstraint 0.400000006 + -1 0 0.100000001 @@ -3627,6 +3884,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true Torque 0 + -1 0 @@ -3651,6 +3909,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> VectorForce 0 + -1 false @@ -3659,6 +3918,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> HumanoidController + -1 @@ -3666,6 +3926,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> SkateboardController + -1 @@ -3673,6 +3934,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> VehicleController + -1 @@ -3681,6 +3943,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> CustomEvent 0 + -1 @@ -3689,6 +3952,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> CustomEventReceiver null + -1 @@ -3711,6 +3975,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 1 + -1 1 @@ -3738,6 +4003,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 1 + -1 1 @@ -3763,6 +4029,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 1 + -1 @@ -3790,6 +4057,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 1 + -1 @@ -3809,6 +4077,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Dialog 1 + -1 0 0 @@ -3826,6 +4095,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> DialogChoice + -1 @@ -3843,6 +4113,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 true @@ -3857,6 +4128,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 5 Decal + -1 0 @@ -3874,6 +4146,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Texture 0 0 + -1 2 2 @@ -3888,6 +4161,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 1 Hole + -1 1 @@ -3899,6 +4173,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 1 MotorFeature + -1 1 @@ -3918,6 +4193,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.313725501 0.215686291 + -1 9 5 @@ -3927,6 +4203,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Folder + -1 @@ -3934,6 +4211,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ForceField + -1 true @@ -3944,6 +4222,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ? false FunctionalTest + -1 @@ -3956,6 +4235,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> false + 0 0.639215708 0.635294139 @@ -3994,6 +4274,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 false @@ -4010,6 +4291,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true true + 0 0.639215708 0.635294139 @@ -4079,6 +4361,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 + -1 0 @@ -4101,6 +4384,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true true + 0 0.639215708 0.635294139 @@ -4131,6 +4415,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + false null 0 true @@ -4143,6 +4428,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 Button @@ -4177,6 +4463,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 0.639215708 0.635294139 @@ -4242,6 +4529,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 + -1 1 @@ -4262,6 +4550,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 0.639215708 0.635294139 @@ -4291,6 +4580,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + false null 0 false @@ -4302,6 +4592,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 Label @@ -4335,6 +4626,8 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 + 0 0.639215708 0.635294139 @@ -4396,6 +4689,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 rbxasset://textures/ui/Scroll/scroll-top.png 0 @@ -4413,6 +4707,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 0.639215708 0.635294139 @@ -4450,6 +4745,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + false null 0 true @@ -4462,6 +4758,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 TextBox @@ -4501,6 +4798,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true + 0 0.639215708 0.635294139 @@ -4570,6 +4868,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 true 1 @@ -4613,6 +4912,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 0 @@ -4637,6 +4937,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> ScreenGui true null + -1 0 @@ -4651,6 +4952,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> GuiMain true null + -1 0 @@ -4675,6 +4977,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true null 0 + -1 0 0 @@ -4692,6 +4995,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 null FloorWire + -1 4 @@ -4708,6 +5012,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false @@ -4741,6 +5046,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -4749,6 +5055,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false @@ -4779,6 +5086,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -4787,8 +5095,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false + 360 0 @@ -4810,6 +5120,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.674509823 1 + 0 CylinderHandleAdornment 1 @@ -4817,6 +5128,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -4825,6 +5137,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false @@ -4858,6 +5171,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -4866,6 +5180,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false @@ -4895,6 +5210,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 1 0 @@ -4904,6 +5220,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> + 0 null false @@ -4933,6 +5250,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -4949,6 +5267,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.952941239 ParabolaAdornment + -1 0 true @@ -4965,6 +5284,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.150000006 SelectionBox + -1 0.0509803966 0.411764741 @@ -4986,6 +5306,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.674509823 SelectionSphere + -1 0.0509803966 0.411764741 @@ -5010,6 +5331,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.674509823 ArcHandles + -1 0 false @@ -5028,6 +5350,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 Handles + -1 0 0 @@ -5044,6 +5367,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0.674509823 SurfaceSelection + -1 0 0 @@ -5061,6 +5385,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> null SelectionPartLasso null + -1 0 true @@ -5081,6 +5406,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 true @@ -5115,6 +5441,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 2 true 0 + -1 true 16 @@ -5177,6 +5504,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 + -1 0 0 @@ -5223,10 +5551,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false RotateP null null + -1 @@ -5263,10 +5591,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false RotateV null null + -1 @@ -5322,10 +5650,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 0 - false Glue null null + -1 @@ -5361,10 +5689,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false ManualGlue null null + -1 -1 -1 @@ -5402,10 +5730,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false ManualWeld null null + -1 -1 -1 @@ -5444,11 +5772,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 true - false 0 Motor null null + -1 @@ -5485,11 +5813,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 true - false 0 Motor6D null null + -1 @@ -5525,10 +5853,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false Rotate null null + -1 @@ -5564,10 +5892,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false Snap null null + -1 @@ -5606,11 +5934,11 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 0 true null - false 0 VelocityMotor null null + -1 @@ -5646,10 +5974,10 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> 1 true - false Weld null null + -1 @@ -5657,6 +5985,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Keyframe + -1 0 @@ -5665,6 +5994,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> KeyframeMarker + -1 @@ -5676,6 +6006,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> true KeyframeSequence 2 + -1 @@ -5692,6 +6023,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> PointLight 8 false + -1 @@ -5710,6 +6042,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> SpotLight 16 false + -1 @@ -5728,6 +6061,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> SurfaceLight 16 false + -1 @@ -5736,6 +6070,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> [] LocalizationTable + -1 en-us @@ -5748,6 +6083,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> Script + -1 @@ -5759,6 +6095,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> LocalScript + -1 @@ -5772,6 +6109,7 @@ script.Parent.Transparency = NumberSequence.new(keyPoints)]]> return module ]]> + -1 @@ -5780,6 +6118,7 @@ return module true PackageLink rbxassetid://2380072357 + -1 3 @@ -5789,6 +6128,7 @@ return module Message + -1 @@ -5797,6 +6137,7 @@ return module Hint + -1 @@ -5808,6 +6149,7 @@ return module NoCollisionConstraint null null + -1 @@ -5867,6 +6209,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -5941,6 +6284,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -5978,6 +6322,7 @@ return module 1 Attachment + -1 false @@ -6000,6 +6345,7 @@ return module 1 Bone + -1 false @@ -6061,6 +6407,7 @@ return module 0 0 + -1 194 -0.5 @@ -6139,6 +6486,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6215,6 +6563,7 @@ return module 0 0 + -1 0 true @@ -6298,6 +6647,7 @@ return module 0 0 + -1 194 -0.5 @@ -6375,6 +6725,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6427,16 +6778,23 @@ return module false + false -0.5 0.5 0 0 + false false 0 0 0 + + 0 + 0 + 0 + -0.5 0.5 @@ -6448,7 +6806,7 @@ return module MeshPart - 1B2M2Y8AsgTpgAmY7PhCfg== + yuZpQdnvvUBOTYh1jqZ2cA== 0 1 @@ -6462,6 +6820,7 @@ return module 0 0 + -1 -0.5 @@ -6536,7 +6895,7 @@ return module 256 PartOperation - 1B2M2Y8AsgTpgAmY7PhCfg== + yuZpQdnvvUBOTYh1jqZ2cA== 0 1 @@ -6551,6 +6910,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6625,7 +6985,7 @@ return module 256 NegateOperation - 1B2M2Y8AsgTpgAmY7PhCfg== + yuZpQdnvvUBOTYh1jqZ2cA== 0 1 @@ -6640,6 +7000,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6714,7 +7075,7 @@ return module 256 UnionOperation - 1B2M2Y8AsgTpgAmY7PhCfg== + yuZpQdnvvUBOTYh1jqZ2cA== 0 1 @@ -6729,6 +7090,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6804,6 +7166,7 @@ return module 0 0 + -1 -0.5 0.5 @@ -6882,6 +7245,7 @@ return module 0 0 + -1 0 0 @@ -6909,6 +7273,7 @@ return module + 0 0 0 @@ -6923,8 +7288,29 @@ return module 0 1 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + Model null + -1 @@ -6934,6 +7320,7 @@ return module PartOperationAsset + -1 @@ -6958,6 +7345,7 @@ return module 0 0 0 0 0 1 0 1 1 0 + -1 5 5 0 @@ -6990,6 +7378,7 @@ return module 0 0 Pose + -1 1 @@ -7001,6 +7390,7 @@ return module 0.400000006 BloomEffect 24 + -1 0.949999988 @@ -7011,6 +7401,7 @@ return module true BlurEffect 24 + -1 @@ -7022,6 +7413,7 @@ return module true ColorCorrectionEffect 0 + -1 1 @@ -7036,6 +7428,7 @@ return module true 0.25 SunRaysEffect + -1 1 @@ -7044,6 +7437,7 @@ return module ReflectionMetadata + -1 @@ -7051,6 +7445,7 @@ return module ReflectionMetadataCallbacks + -1 @@ -7058,6 +7453,7 @@ return module ReflectionMetadataClasses + -1 @@ -7065,6 +7461,7 @@ return module ReflectionMetadataEnums + -1 @@ -7072,6 +7469,7 @@ return module ReflectionMetadataEvents + -1 @@ -7079,6 +7477,7 @@ return module ReflectionMetadataFunctions + -1 @@ -7099,6 +7498,7 @@ return module false + -1 0 0 @@ -7119,6 +7519,7 @@ return module ReflectionMetadataEnum false + -1 0 0 @@ -7139,6 +7540,7 @@ return module ReflectionMetadataEnumItem false + -1 0 0 @@ -7159,6 +7561,7 @@ return module ReflectionMetadataMember false + -1 0 0 @@ -7170,6 +7573,7 @@ return module ReflectionMetadataProperties + -1 @@ -7177,6 +7581,7 @@ return module ReflectionMetadataYieldFunctions + -1 @@ -7184,6 +7589,7 @@ return module RemoteEvent + -1 @@ -7191,6 +7597,7 @@ return module RemoteFunction + -1 @@ -7219,6 +7626,7 @@ return module RenderingTest 21 false + -1 @@ -7236,6 +7644,7 @@ return module 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 @@ -7252,6 +7661,7 @@ return module true Smoke + -1 0.5 1 @@ -7270,6 +7680,7 @@ return module 0 null + -1 0 0.5 @@ -7285,6 +7696,7 @@ return module ChorusSoundEffect 0 0.5 + -1 @@ -7299,6 +7711,7 @@ return module 40 0.100000001 null + -1 -40 @@ -7310,6 +7723,7 @@ return module 0.75 DistortionSoundEffect 0 + -1 @@ -7322,6 +7736,7 @@ return module 0.5 EchoSoundEffect 0 + -1 0 @@ -7335,6 +7750,7 @@ return module -10 EqualizerSoundEffect 0 + -1 @@ -7347,6 +7763,7 @@ return module FlangeSoundEffect 0 5 + -1 @@ -7357,6 +7774,7 @@ return module PitchShiftSoundEffect 1.25 0 + -1 @@ -7370,6 +7788,7 @@ return module true ReverbSoundEffect 0 + -1 0 @@ -7383,6 +7802,7 @@ return module 5 TremoloSoundEffect 0 + -1 @@ -7390,6 +7810,7 @@ return module SoundGroup + -1 0.5 @@ -7399,6 +7820,7 @@ return module true Sparkles + -1 0.564705908 0.0980392247 @@ -7411,6 +7833,7 @@ return module StarterGear + -1 @@ -7419,6 +7842,7 @@ return module true Team + -1 194 @@ -7438,6 +7862,7 @@ return module TerrainRegion AQU= + -1 @@ -7455,6 +7880,7 @@ return module 0 0.100000001 Trail + -1 1 @@ -7467,6 +7893,7 @@ return module Tween + -1 @@ -7477,6 +7904,7 @@ return module 0 UIAspectRatioConstraint + -1 @@ -7492,6 +7920,7 @@ return module 0 UISizeConstraint + -1 @@ -7501,6 +7930,7 @@ return module 100 1 UITextSizeConstraint + -1 @@ -7524,29 +7954,12 @@ return module 1 UIGridLayout 0 + -1 0 1 - - - - 0 - 1 - 1 - - 0 - 0 - 0 - 0 - - UIInlineLayout - 0 - - 1 - - @@ -7558,6 +7971,7 @@ return module 0 0 + -1 1 @@ -7579,6 +7993,7 @@ return module true 0 + -1 true 1 @@ -7601,6 +8016,7 @@ return module 0 0 + -1 1 @@ -7625,6 +8041,7 @@ return module 0 0 + -1 @@ -7633,6 +8050,7 @@ return module UIScale 1 + -1 @@ -7640,6 +8058,7 @@ return module BinaryStringValue + -1 @@ -7648,6 +8067,7 @@ return module BoolValue + -1 false @@ -7656,6 +8076,7 @@ return module BrickColorValue + -1 194 @@ -7664,6 +8085,7 @@ return module CFrameValue + -1 0 @@ -7685,6 +8107,7 @@ return module Color3Value + -1 0 @@ -7699,6 +8122,7 @@ return module 1 0 DoubleConstrainedValue + -1 0 @@ -7709,6 +8133,7 @@ return module 10 0 IntConstrainedValue + -1 0 @@ -7717,6 +8142,7 @@ return module IntValue + -1 0 @@ -7725,6 +8151,7 @@ return module NumberValue + -1 0 @@ -7733,6 +8160,7 @@ return module ObjectValue + -1 null @@ -7741,6 +8169,7 @@ return module RayValue + -1 @@ -7760,6 +8189,7 @@ return module StringValue + -1 @@ -7768,6 +8198,7 @@ return module Vector3Value + -1 0 @@ -7793,24 +8224,12 @@ return module 0 1 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - true WeldConstraint null null + -1 + 3 @@ -7822,6 +8241,7 @@ return module 8 UICorner + -1 @@ -7834,6 +8254,7 @@ return module true + 0 1 1 @@ -7874,6 +8295,7 @@ return module 100 0 + -1 0 @@ -7900,6 +8322,7 @@ return module 0 Atmosphere 0 + -1 @@ -7912,12 +8335,14 @@ return module 10 DepthOfField 0.75 + -1 + 0 0 0 @@ -7932,8 +8357,29 @@ return module 0 1 + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + yuZpQdnvvUBOTYh1jqZ2cA== + + 0 + 0 + 0 + WorldModel null + -1 @@ -7946,6 +8392,7 @@ return module SurfaceAppearance + -1 @@ -7961,6 +8408,7 @@ return module 0 0 + -1 0 0 0 1 0 0 @@ -7971,6 +8419,7 @@ return module ReplicatedStorage + -1 @@ -7978,6 +8427,7 @@ return module LuaWebService + -1 @@ -8020,50 +8470,12 @@ return module false 0.5 + -1 1 00:00:00 - - - - - AnalyticsService - - - - - - - true - false - DataStoreService - - - - - - - FlyweightService - - - - - - - true - HttpService - - - - - - - Teams - - - @@ -8076,14 +8488,51 @@ return module TestService 0 0 + -1 10 + + + + true + false + DataStoreService + -1 + + + + + + + FlyweightService + -1 + + + + + + + true + HttpService + -1 + + + + + + + Teams + -1 + + + VirtualInputManager + -1 @@ -8091,6 +8540,7 @@ return module ReplicatedScriptService + -1 @@ -8098,11 +8548,12 @@ return module LanguageService + -1 - Q1NHUEhTBwAAAANxenpBq3RavVrWxL3W0ls9BipCQyiCLz9FsibAiDtQQzU4HkEiYwdDEAAA + Q1NHUEhTBwAAAANxenpBq3RavVrWxL3W0ls9BipCQyiCLz9FsibAiDtQQzU4HkEiYwdDEAAA AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAACAPxUAAAAEAAAA+dYAQK5wBr+S t5fATAn2PwRx+z3U6pjA+1j6P0A8e7xIppjAca/sP25qEb/shpLAqoLsP34aCL8YuJfAfcHu PzjCTT7mCpnA9G/pP6AiqLy0ppjAHgAAAAIAAAABAAAAAwAAAAAAAAADAAAABAAAAAAAAAAC @@ -10354,7 +10805,7 @@ AAAAAAAAAAQAAAADAAAAAAAAAAIAAAABAAAAAAAAAAMAAAADAAAAAgAAAAQAAAAQAAAAAAAA AAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIA/DAAAAAQAAADMs/U/OPWWv0p2jsBW ZfM/Uw9xv7zEj8CgnA5AQnKUvw5NjsDqfQ1Ay/tsvxChj8AMAAAAAgAAAAEAAAAAAAAAAQAA AAIAAAADAAAAAgAAAAAAAAADAAAAAAAAAAEAAAADAAAA - Q1NHUEhTBgAAAJXewkJ+3gC9Gx01vr4/m75NjCdEyFxIwAipl8B7qTpE+Y45Qh/2WUMQAAAA + Q1NHUEhTBgAAAJXewkJ+3gC9Gx01vr4/m75NjCdEyFxIwAipl8B7qTpE+Y45Qh/2WUMQAAAA AAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIA/OQAAAAQAAAAAKRM8RMLLPWmi ZUAAKRM86GmoPh46b0BtzAM/qoDAPmmiZUAiEXM+Gx2yvmmiZUAAKRM8fo+OvmAZlEAAKRM8 rAihPvzEcUDJc5c/YsKIPisZh0DJc5c/DTalPh6YaUCwNYc/lN6sPmmiZUDQqmg/7NQMv2mi @@ -11590,7 +12041,7 @@ AAAYAAAAEAAAABgAAAARAAAAEQAAABgAAAAcAAAAEQAAABwAAAAbAAAAEQAAABsAAAAZAAAA EQAAABkAAAAUAAAAEQAAABQAAAASAAAAEwAAABQAAAAZAAAAEwAAABkAAAAaAAAAFQAAABsA AAAcAAAAFQAAABwAAAAWAAAAFgAAABwAAAAXAAAAFwAAABwAAAAYAAAAGQAAABsAAAAaAAAA - Q1NHUEhTBgAAAE1JUEAHR9a7EkFXvmXbsrwJK4tAZcq7vENWDDp/bfo+haEYPtPKkkAQAAAA + Q1NHUEhTBgAAAE1JUEAHR9a7EkFXvmXbsrwJK4tAZcq7vENWDDp/bfo+haEYPtPKkkAQAAAA AAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIA/qwAAAAQAAADQ0Oa+jK4PwINC 0j4g50+/ADXSvpezT70wNeu+jK4PwC6Da76nN4U+jK4PwBLh2z4AJIQ9TBYJQPRQXT7Qyju+ WBL5Pxpyiz4v4j8+WBL5Pxpyiz4fWtA+jK4PwNP80T6Ays06TBYJQIZPr74wPyK+MKCgP4Li @@ -11630,7 +12081,7 @@ AAAnAAAANQAAACkAAAAKAAAANgAAABAAAAAyAAAANgAAADIAAAAmAAAANgAAACYAAAAlAAAA NgAAACUAAAAQAAAANwAAABkAAAAzAAAANwAAADMAAAABAAAANwAAAAEAAAAqAAAANwAAACoA AAAZAAAAOAAAABoAAAA1AAAAOAAAADUAAAAnAAAAOAAAABsAAAAaAAAAOAAAACcAAAAbAAAA - Q1NHUEhTBgAAAGL3bT+fOYy87Wx8PvwFXL2AXoA/ZNScOrnF6bp5APU9ws2DvPwijD8QAAAA + Q1NHUEhTBgAAAGL3bT+fOYy87Wx8PvwFXL2AXoA/ZNScOrnF6bp5APU9ws2DvPwijD8QAAAA AAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIA/DwAAAAQAAACa/0m+yF60v7RB uj0UNl6+0oXXv/EnHT2QV8C9yF60vxBbtL3KmYy+0oXXv/EnHT1TOgW+0oXXv/LL5b0SAAAA AAAAAAEAAAACAAAAAAAAAAIAAAADAAAAAAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAQAAAAQA @@ -12178,7 +12629,7 @@ AAAWAAAADQAAABYAAAAOAAAADgAAABcAAAAPAAAADgAAABYAAAAXAAAADwAAABcAAAAYAAAA EQAAABMAAAAZAAAAEQAAABkAAAAaAAAAEQAAABoAAAAUAAAAEgAAABgAAAAbAAAAEgAAABsA AAATAAAAEwAAABsAAAAZAAAAFAAAABoAAAAVAAAAFQAAABoAAAAbAAAAFQAAABsAAAAXAAAA FQAAABcAAAAWAAAAFwAAABsAAAAYAAAAGQAAABsAAAAaAAAA - Q1NHUEhTBgAAACbd8ULAvKu8NqGAvnuGF77pSVxE/jNzvTu9JsCTjnFEUD82QqNTjUMQAAAA + Q1NHUEhTBgAAACbd8ULAvKu8NqGAvnuGF77pSVxE/jNzvTu9JsCTjnFEUD82QqNTjUMQAAAA AAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIA/HQEAAAQAAABrIAdAeRXhv4sz O8BRygVAdEnfv6e1dEDcLQPAs1flv387dEBsUgbA4yXkv8ekOsC53BJAEh+Nv05MlkBw7QhA QTYkvrRtkEBNnABAz4zyPEQOmEBTmhJArj72voqKF8Ch4BZA5PCjv+x/iUDuGxdAZKTHv3BV @@ -12243,7 +12694,7 @@ XAAAAAUAAAA5AAAAXAAAADkAAAAMAAAAXAAAAAwAAAAsAAAAXAAAACwAAAAGAAAAXQAAADgA AAA3AAAAXQAAADcAAAA/AAAAXQAAACEAAAAgAAAAXQAAAD8AAAAhAAAAXQAAACAAAAAuAAAA XQAAAC4AAAA4AAAAXgAAABAAAAA2AAAAXgAAADYAAAA4AAAAXgAAADgAAAAuAAAAXgAAAC4A AAABAAAAXgAAAAEAAAAQAAAA - - Q1NHUEhTAAAAAEJMT0NL + + Q1NHUEhTAAAAAEJMT0NL \ No newline at end of file diff --git a/UnitTest/Program.cs b/UnitTest/Program.cs index 5bc14ab..4edf99e 100644 --- a/UnitTest/Program.cs +++ b/UnitTest/Program.cs @@ -108,6 +108,8 @@ namespace RobloxFiles.UnitTest [STAThread] static void Main(string[] args) { + RobloxFile.LogErrors = true; + if (args.Length > 0) { string path = args[0]; diff --git a/XmlFormat/IO/XmlFileReader.cs b/XmlFormat/IO/XmlFileReader.cs index fef434f..74f8119 100644 --- a/XmlFormat/IO/XmlFileReader.cs +++ b/XmlFormat/IO/XmlFileReader.cs @@ -11,7 +11,7 @@ namespace RobloxFiles.XmlFormat { var errorHandler = new Func((message) => { - string contents = $"XmlRobloxFileReader.{label}: {message}"; + string contents = $"{nameof(XmlRobloxFileReader)}.{label} - {message}"; return new Exception(contents); }); @@ -20,10 +20,10 @@ namespace RobloxFiles.XmlFormat public static void ReadSharedStrings(XmlNode sharedStrings, XmlRobloxFile file) { - var error = CreateErrorHandler("ReadSharedStrings"); + var error = CreateErrorHandler(nameof(ReadSharedStrings)); if (sharedStrings.Name != "SharedStrings") - throw error("Provided XmlNode's class should be 'SharedStrings'!"); + throw error("Provided XmlNode's class must be 'SharedStrings'!"); foreach (XmlNode sharedString in sharedStrings) { @@ -41,7 +41,7 @@ namespace RobloxFiles.XmlFormat var record = SharedString.FromBase64(value); if (hash.Length != 16) - throw error($"SharedString base64 key '{key}' must decode to byte[16]!"); + throw error($"SharedString base64 key '{key}' must align to byte[16]!"); if (key != record.Key) { @@ -56,7 +56,7 @@ namespace RobloxFiles.XmlFormat public static void ReadMetadata(XmlNode meta, XmlRobloxFile file) { - var error = CreateErrorHandler("ReadMetadata"); + var error = CreateErrorHandler(nameof(ReadMetadata)); if (meta.Name != "Meta") throw error("Provided XmlNode's class should be 'Meta'!"); @@ -74,7 +74,7 @@ namespace RobloxFiles.XmlFormat public static void ReadProperties(Instance instance, XmlNode propsNode) { - var error = CreateErrorHandler("ReadProperties"); + var error = CreateErrorHandler(nameof(ReadProperties)); if (propsNode.Name != "Properties") throw error("Provided XmlNode's class should be 'Properties'!"); @@ -106,35 +106,48 @@ namespace RobloxFiles.XmlFormat XmlToken = propType }; - if (!tokenHandler.ReadProperty(prop, propNode)) - if (RobloxFile.LogErrors) - Console.Error.WriteLine("Could not read property: " + prop.GetFullName() + '!'); - + if (!tokenHandler.ReadProperty(prop, propNode) && RobloxFile.LogErrors) + { + var readError = error($"Could not read property: {prop.GetFullName()}!"); + Console.Error.WriteLine(readError.Message); + } + instance.AddProperty(ref prop); } else if (RobloxFile.LogErrors) { - Console.Error.WriteLine("No IXmlPropertyToken found for property type: " + propType + '!'); + var tokenError = error($"No {nameof(IXmlPropertyToken)} found for property type: {propType}!"); + Console.Error.WriteLine(tokenError.Message); } } } - public static Instance ReadInstance(XmlNode instNode, XmlRobloxFile file) { - var error = CreateErrorHandler("ReadInstance"); + var error = CreateErrorHandler(nameof(ReadInstance)); // Process the instance itself if (instNode.Name != "Item") throw error("Provided XmlNode's name should be 'Item'!"); XmlNode classToken = instNode.Attributes.GetNamedItem("class"); + if (classToken == null) throw error("Got an Item without a defined 'class' attribute!"); - string className = classToken.InnerText; + Type instType = Type.GetType($"RobloxFiles.{className}"); + + if (instType == null) + { + if (RobloxFile.LogErrors) + { + var typeError = error($"Unknown class {className} while reading Item."); + Console.Error.WriteLine(typeError.Message); + } + + return null; + } - Type instType = Type.GetType($"RobloxFiles.{className}") ?? typeof(Instance); Instance inst = Activator.CreateInstance(instType) as Instance; // The 'referent' attribute is optional, but should be defined if a Ref property needs to link to this Instance. @@ -154,14 +167,19 @@ namespace RobloxFiles.XmlFormat // Process the child nodes of this instance. foreach (XmlNode childNode in instNode.ChildNodes) { - if (childNode.Name == "Properties") + switch (childNode.Name) { - ReadProperties(inst, childNode); - } - else if (childNode.Name == "Item") - { - Instance child = ReadInstance(childNode, file); - child.Parent = inst; + case "Item": + Instance child = ReadInstance(childNode, file); + + if (child != null) + child.Parent = inst; + + break; + case "Properties": + ReadProperties(inst, childNode); + break; + default: break; } }