From 280d2c084f6ce675df291e784cf8874b5342d199 Mon Sep 17 00:00:00 2001 From: phoriah <95628489+phoriah@users.noreply.github.com> Date: Thu, 6 Nov 2025 07:58:23 +0200 Subject: [PATCH] Updated Dumps & Dumpers --- Tools/DataType Dumper/DataType Dumper.py | 60 ++++++++++++--- Tools/DataType Dumper/Dump | 75 +++++++++---------- Tools/Doesn't Inherit from Class Dumper/Dump | 2 + Tools/Interesting Properties Behavior/Dump | 3 + Tools/NotCreatable Dumper/Dump | 4 + .../NotScriptable Dumper/Dump | 3 +- Tools/Run Dumpers.py | 24 +++++- 7 files changed, 117 insertions(+), 54 deletions(-) diff --git a/Tools/DataType Dumper/DataType Dumper.py b/Tools/DataType Dumper/DataType Dumper.py index 78d2acd..ba1d380 100644 --- a/Tools/DataType Dumper/DataType Dumper.py +++ b/Tools/DataType Dumper/DataType Dumper.py @@ -23,6 +23,8 @@ def array_to_dictionary(table, hybrid_mode=None): datatypes = [] datatypes_set = set() +can_save_tracker = {} +can_load_tracker = {} def api(version_hash=None): @@ -64,6 +66,8 @@ def fetch_api(version_hash=None): global datatypes global datatypes_set + global can_save_tracker + global can_load_tracker for api_class in api_classes: class_members = api_class["Members"] @@ -79,17 +83,28 @@ def fetch_api(version_hash=None): member_tags = array_to_dictionary(member_tags) serialization = member["Serialization"] - if True: - value_type = member["ValueType"] - value_type_name = value_type["Name"] - value_type_cat = value_type["Category"] - if value_type_cat == "Enum": - value_type_name = "" - if value_type_cat == "Class": - value_type_name = "" - if value_type_name not in datatypes_set: - datatypes_set.add(value_type_name) - datatypes.append(value_type_name) + + value_type = member["ValueType"] + value_type_name = value_type["Name"] + value_type_cat = value_type["Category"] + if value_type_cat == "Enum" or value_type_cat == "Class": + continue + + if serialization["CanSave"] == True: + can_save_tracker[value_type_name] = True + else: + if value_type_name not in can_save_tracker: + can_save_tracker[value_type_name] = False + + if serialization["CanLoad"] == True: + can_load_tracker[value_type_name] = True + else: + if value_type_name not in can_load_tracker: + can_load_tracker[value_type_name] = False + + if value_type_name not in datatypes_set: + datatypes_set.add(value_type_name) + datatypes.append(value_type_name) if __name__ == "__main__": @@ -99,8 +114,29 @@ if __name__ == "__main__": try: fetch_api(version_hash) datatypes.sort() - s = "\n".join(datatypes) + "\n" + + output_lines = [] + for value_type in datatypes: + can_save_status = can_save_tracker.get(value_type, False) + can_load_status = can_load_tracker.get(value_type, False) + + verdict_text = "" + if (can_save_status and not can_load_status) or ( + can_load_status and not can_save_status + ): + verdict_text = "-> Probably has a descriptor" + + parts = [value_type] + if can_save_status: + parts.append("{CanSave}") + if can_load_status: + parts.append("{CanLoad}") + parts.append(verdict_text) + output_lines.append(" ".join(parts).strip()) + + s = "\n".join(output_lines) + "\n" print(s) + script_dir = os.path.dirname(os.path.realpath(__file__)) output_file_path = os.path.join(script_dir, "Dump") with open(output_file_path, "w") as file: diff --git a/Tools/DataType Dumper/Dump b/Tools/DataType Dumper/Dump index d87045e..bac5c54 100644 --- a/Tools/DataType Dumper/Dump +++ b/Tools/DataType Dumper/Dump @@ -1,44 +1,43 @@ - -Axes -BinaryString -BrickColor -CFrame +Axes {CanSave} {CanLoad} +BinaryString {CanSave} {CanLoad} +BrickColor {CanSave} {CanLoad} +CFrame {CanSave} {CanLoad} CSGPropertyData -Color3 -Color3uint8 -ColorSequence -Content -ContentId -DateTime -Faces +Color3 {CanSave} {CanLoad} +Color3uint8 {CanSave} {CanLoad} +ColorSequence {CanSave} {CanLoad} +Content {CanSave} {CanLoad} +ContentId {CanSave} {CanLoad} +DateTime {CanSave} -> Probably has a descriptor +Faces {CanSave} {CanLoad} FacsReplicationData -Font -NetAssetRef -NumberRange -NumberSequence -OptionalCoordinateFrame -Path2DControlPoint -PhysicalProperties -ProtectedString -QDir -QFont -Ray -Rect +Font {CanSave} {CanLoad} +NetAssetRef {CanSave} {CanLoad} +NumberRange {CanSave} {CanLoad} +NumberSequence {CanSave} {CanLoad} +OptionalCoordinateFrame {CanSave} {CanLoad} +Path2DControlPoint {CanLoad} -> Probably has a descriptor +PhysicalProperties {CanSave} {CanLoad} +ProtectedString {CanSave} {CanLoad} +QDir {CanSave} {CanLoad} +QFont {CanSave} {CanLoad} +Ray {CanSave} {CanLoad} +Rect {CanSave} {CanLoad} Region3int16 ReplicationPV -SecurityCapabilities -SharedString +SecurityCapabilities {CanSave} {CanLoad} +SharedString {CanSave} {CanLoad} SystemAddress TweenInfo -UDim -UDim2 -UniqueId -Vector2 -Vector3 -Vector3int16 -bool -double -float -int -int64 -string +UDim {CanSave} {CanLoad} +UDim2 {CanSave} {CanLoad} +UniqueId {CanSave} {CanLoad} +Vector2 {CanSave} {CanLoad} +Vector3 {CanSave} {CanLoad} +Vector3int16 {CanSave} {CanLoad} +bool {CanSave} {CanLoad} +double {CanSave} {CanLoad} +float {CanSave} {CanLoad} +int {CanSave} {CanLoad} +int64 {CanSave} {CanLoad} +string {CanSave} {CanLoad} diff --git a/Tools/Doesn't Inherit from Class Dumper/Dump b/Tools/Doesn't Inherit from Class Dumper/Dump index b8344d3..379745b 100644 --- a/Tools/Doesn't Inherit from Class Dumper/Dump +++ b/Tools/Doesn't Inherit from Class Dumper/Dump @@ -1,5 +1,6 @@ Object does not inherit from Instance +AnimationNode does not inherit from Instance Capture does not inherit from Instance ScreenshotCapture does not inherit from Instance VideoCapture does not inherit from Instance @@ -12,4 +13,5 @@ TerrainIterateOperation does not inherit from Instance TerrainModifyOperation does not inherit from Instance TerrainReadOperation does not inherit from Instance TerrainWriteOperation does not inherit from Instance +VideoSampler does not inherit from Instance WebStreamClient does not inherit from Instance diff --git a/Tools/Interesting Properties Behavior/Dump b/Tools/Interesting Properties Behavior/Dump index 822776b..18365bc 100644 --- a/Tools/Interesting Properties Behavior/Dump +++ b/Tools/Interesting Properties Behavior/Dump @@ -652,5 +652,8 @@ WeldConstraint.Part1 {CanLoad Only} Wire.Connected {CanSave Only} +VideoSampler.TimeLength {CanSave Only} +VideoSampler.VideoContent {CanSave Only} + WebStreamClient.ConnectionState {CanSave Only} diff --git a/Tools/NotCreatable Dumper/Dump b/Tools/NotCreatable Dumper/Dump index 6b50b51..1647844 100644 --- a/Tools/NotCreatable Dumper/Dump +++ b/Tools/NotCreatable Dumper/Dump @@ -1,6 +1,8 @@ Object +AnimationNode + Capture ScreenshotCapture @@ -313,5 +315,7 @@ TerrainReadOperation TerrainWriteOperation +VideoSampler + WebStreamClient diff --git a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump index dd4a1e8..9cfae8f 100644 --- a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump +++ b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump @@ -10,6 +10,8 @@ Instance.Tags {BinaryString} AnimationClip.GuidBinaryString {BinaryString} +AnimationNodeDefinition.InputPinData {BinaryString} + AnimationRigData.label {BinaryString} AnimationRigData.name {BinaryString} AnimationRigData.parent {BinaryString} @@ -305,7 +307,6 @@ BasePart.MaterialVariantSerialized BasePart.ReplicationPV {Serialize: False} TriangleMeshPart.FluidFidelityInternal MeshPart.RenderFidelityReplicate {Serialize: False} -PartOperation.SerializedCSGTree {Serialize: False} PartOperation.SerializedOperationGraph {Serialize: False} Workspace.ReplicateInstanceDestroySetting PackageLink.PackageIdSerialize diff --git a/Tools/Run Dumpers.py b/Tools/Run Dumpers.py index 40eb27d..887740e 100644 --- a/Tools/Run Dumpers.py +++ b/Tools/Run Dumpers.py @@ -2,7 +2,10 @@ import os import subprocess import sys + def run_python_files_in_directories(directory, script_name, version_hash=None): + non_python_files = [] + for root, dirs, files in os.walk(directory): for file in files: if file.endswith(".py"): @@ -19,14 +22,29 @@ def run_python_files_in_directories(directory, script_name, version_hash=None): print(f"Executed: {file_path}") except subprocess.CalledProcessError as e: print(f"Error running {file_path}: {e}") + else: + _, ext = os.path.splitext(file) + if ext and ext.lower() != ".py": + file_path = os.path.join(root, file) + if os.path.abspath(file_path) != script_name: + non_python_files.append(file_path) + + if non_python_files: + print("\n" + "=" * 50) + print("Files that couldn't be run (non-Python files):") + print("=" * 50) + for file_path in non_python_files: + print(f"Could not run: {file_path}") + print(f"Total non-Python files: {len(non_python_files)}") + if __name__ == "__main__": current_directory = os.path.dirname(os.path.abspath(__file__)) script_name = os.path.abspath(__file__) - + # Check if version hash was passed as a command line argument version_hash = None if len(sys.argv) > 1: version_hash = sys.argv[1] - - run_python_files_in_directories(current_directory, script_name, version_hash) \ No newline at end of file + + run_python_files_in_directories(current_directory, script_name, version_hash)