0.454.0.413308
This commit is contained in:
parent
c4a3145007
commit
988469ac04
@ -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<bool>();
|
||||
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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()}!");
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
Binary file not shown.
@ -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");
|
||||
|
Binary file not shown.
@ -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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -108,6 +108,8 @@ namespace RobloxFiles.UnitTest
|
||||
[STAThread]
|
||||
static void Main(string[] args)
|
||||
{
|
||||
RobloxFile.LogErrors = true;
|
||||
|
||||
if (args.Length > 0)
|
||||
{
|
||||
string path = args[0];
|
||||
|
@ -11,7 +11,7 @@ namespace RobloxFiles.XmlFormat
|
||||
{
|
||||
var errorHandler = new Func<string, Exception>((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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user