From 878b80bc2727111dab0debbea9a40ec766824b07 Mon Sep 17 00:00:00 2001 From: phoriah <95628489+phoriah@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:49:52 +0200 Subject: [PATCH] Updated Dumps & Dumpers --- .../Content DataType Properties Dumper.py | 69 +++++++++++++++++++ Tools/Content DataType Properties/Dump | 65 +++++++++++++++++ Tools/DataType Dumper/DataType Dumper.py | 9 +-- Tools/DataType Dumper/Dump | 2 + .../Doesn't Inherit from Class Dumper.py | 5 +- Tools/Doesn't Inherit from Class Dumper/Dump | 1 + .../ExpectedClassDumper for NotCreatable/Dump | 1 + .../Expected Class for NotCreatable Dumper.py | 5 +- Tools/Interesting Properties Behavior/Dump | 2 + .../Interesting Properties Behavior.py | 5 +- Tools/NotCreatable Dumper/Dump | 1 + .../NotCreatable Dumper.py | 17 +++-- .../NotScriptable Dumper/Dump | 5 ++ .../NotScriptable Dumper.py | 5 +- 14 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 Tools/Content DataType Properties/Content DataType Properties Dumper.py create mode 100644 Tools/Content DataType Properties/Dump diff --git a/Tools/Content DataType Properties/Content DataType Properties Dumper.py b/Tools/Content DataType Properties/Content DataType Properties Dumper.py new file mode 100644 index 0000000..dd6bb8b --- /dev/null +++ b/Tools/Content DataType Properties/Content DataType Properties Dumper.py @@ -0,0 +1,69 @@ +import requests +import os +import re + + +def api(): + deploy_history_url = "https://setup.rbxcdn.com/DeployHistory.txt" + deploy_history = requests.get(deploy_history_url).text + + lines = deploy_history.splitlines() + + for line in reversed(lines): + match = re.search(r"(version-[^\s]+)", line) + + if match: + version_hash = match.group(1) + api_dump_url = f"https://setup.rbxcdn.com/{version_hash}-Full-API-Dump.json" + + try: + response = requests.get(api_dump_url) + response.raise_for_status() + return response, version_hash + + except requests.RequestException as e: + print(f"Error fetching API dump for {version_hash}: {e}") + + +def fetch_api(): + response, version_hash = api() + api_classes = response.json()["Classes"] + + output = version_hash + "\n\n" + + for api_class in api_classes: + class_name = api_class["Name"] + class_members = api_class["Members"] + prev_len = len(output) + for member in class_members: + member_name = member["Name"] + member_type = member["MemberType"] + + if member_type == "Property": + serialization = member["Serialization"] + value_type = member["ValueType"]["Name"] + + # Check if ValueType is "Content" and both CanSave and CanLoad are true + if ( + value_type == "Content" + and serialization["CanLoad"] + and serialization["CanSave"] + ): + + output += f"{class_name}.{member_name}\n" + + if len(output) != prev_len: + output += "\n" + + return output + + +try: + result = fetch_api() + print(result) + 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: + file.write(result) +except Exception as e: + print(f"Error: {e}") diff --git a/Tools/Content DataType Properties/Dump b/Tools/Content DataType Properties/Dump new file mode 100644 index 0000000..12f4f0c --- /dev/null +++ b/Tools/Content DataType Properties/Dump @@ -0,0 +1,65 @@ +version-874602c66c70451a + +AudioPlayer.AudioContent + +BaseWrap.CageMeshContent + +WrapLayer.ReferenceMeshContent + +ClickDetector.CursorIconContent + +DragDetector.ActivatedCursorIconContent + +Decal.MetalnessMapContent +Decal.NormalMapContent +Decal.RoughnessMapContent +Decal.TextureContent + +ImageButton.HoverImageContent +ImageButton.ImageContent +ImageButton.PressedImageContent + +ImageLabel.ImageContent + +ScrollingFrame.BottomImageContent +ScrollingFrame.MidImageContent +ScrollingFrame.TopImageContent + +VideoFrame.VideoContent + +MaterialVariant.ColorMapContent +MaterialVariant.EmissiveMaskContent +MaterialVariant.MetalnessMapContent +MaterialVariant.NormalMapContent +MaterialVariant.RoughnessMapContent + +Mouse.IconContent + +MeshPart.MeshContent +MeshPart.TextureContent + +BackpackItem.TextureContent + +Sound.AudioContent + +SurfaceAppearance.ColorMapContent +SurfaceAppearance.EmissiveMaskContent +SurfaceAppearance.MetalnessMapContent +SurfaceAppearance.NormalMapContent +SurfaceAppearance.RoughnessMapContent + +TerrainDetail.ColorMapContent +TerrainDetail.EmissiveMaskContent +TerrainDetail.MetalnessMapContent +TerrainDetail.NormalMapContent +TerrainDetail.RoughnessMapContent + +UIDragDetector.ActivatedCursorIconContent +UIDragDetector.CursorIconContent + +UserInputService.MouseIconContent + +VideoPlayer.VideoContent + +WrapTextureTransfer.ReferenceCageMeshContent + diff --git a/Tools/DataType Dumper/DataType Dumper.py b/Tools/DataType Dumper/DataType Dumper.py index ba1d380..13cb219 100644 --- a/Tools/DataType Dumper/DataType Dumper.py +++ b/Tools/DataType Dumper/DataType Dumper.py @@ -55,13 +55,13 @@ def api(version_hash=None): try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") def fetch_api(version_hash=None): - response = api(version_hash) + response, version_hash = api(version_hash) api_classes = response.json()["Classes"] global datatypes @@ -105,6 +105,7 @@ def fetch_api(version_hash=None): if value_type_name not in datatypes_set: datatypes_set.add(value_type_name) datatypes.append(value_type_name) + return version_hash if __name__ == "__main__": @@ -112,7 +113,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: version_hash = sys.argv[1] try: - fetch_api(version_hash) + version_hash = fetch_api(version_hash) datatypes.sort() output_lines = [] @@ -136,7 +137,7 @@ if __name__ == "__main__": s = "\n".join(output_lines) + "\n" print(s) - + s = version_hash + "\n\n" + 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 bac5c54..0209b66 100644 --- a/Tools/DataType Dumper/Dump +++ b/Tools/DataType Dumper/Dump @@ -1,3 +1,5 @@ +version-874602c66c70451a + Axes {CanSave} {CanLoad} BinaryString {CanSave} {CanLoad} BrickColor {CanSave} {CanLoad} diff --git a/Tools/Doesn't Inherit from Class Dumper/Doesn't Inherit from Class Dumper.py b/Tools/Doesn't Inherit from Class Dumper/Doesn't Inherit from Class Dumper.py index 4a25fa5..f2eeb1b 100644 --- a/Tools/Doesn't Inherit from Class Dumper/Doesn't Inherit from Class Dumper.py +++ b/Tools/Doesn't Inherit from Class Dumper/Doesn't Inherit from Class Dumper.py @@ -61,18 +61,19 @@ def api(): try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") def fetch_api(): - response = api() + response, version_hash = api() api_classes = response.json()["Classes"] class_list = {cls["Name"]: cls for cls in api_classes} global s + s = version_hash + "\n\n" for api_class in api_classes: class_name = api_class["Name"] diff --git a/Tools/Doesn't Inherit from Class Dumper/Dump b/Tools/Doesn't Inherit from Class Dumper/Dump index 379745b..6343554 100644 --- a/Tools/Doesn't Inherit from Class Dumper/Dump +++ b/Tools/Doesn't Inherit from Class Dumper/Dump @@ -1,3 +1,4 @@ +version-874602c66c70451a Object does not inherit from Instance AnimationNode does not inherit from Instance diff --git a/Tools/ExpectedClassDumper for NotCreatable/Dump b/Tools/ExpectedClassDumper for NotCreatable/Dump index 273ee8d..d47aade 100644 --- a/Tools/ExpectedClassDumper for NotCreatable/Dump +++ b/Tools/ExpectedClassDumper for NotCreatable/Dump @@ -1,3 +1,4 @@ +version-874602c66c70451a AudioDeviceInput.Player {Player} diff --git a/Tools/ExpectedClassDumper for NotCreatable/Expected Class for NotCreatable Dumper.py b/Tools/ExpectedClassDumper for NotCreatable/Expected Class for NotCreatable Dumper.py index 4efc63c..5e74942 100644 --- a/Tools/ExpectedClassDumper for NotCreatable/Expected Class for NotCreatable Dumper.py +++ b/Tools/ExpectedClassDumper for NotCreatable/Expected Class for NotCreatable Dumper.py @@ -40,17 +40,18 @@ def api(): try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") def fetch_api(): - response = api() + response, version_hash = api() api_classes = response.json()["Classes"] global s + s = version_hash + "\n\n" for api_class in api_classes: class_name = api_class["Name"] class_members = api_class["Members"] diff --git a/Tools/Interesting Properties Behavior/Dump b/Tools/Interesting Properties Behavior/Dump index 18365bc..09b97d9 100644 --- a/Tools/Interesting Properties Behavior/Dump +++ b/Tools/Interesting Properties Behavior/Dump @@ -1,3 +1,4 @@ +version-874602c66c70451a Capture.CaptureTime {CanSave Only} Capture.CaptureType {CanSave Only} @@ -592,6 +593,7 @@ TextChatService is NotCreatable but TextChatService.ChatTranslationEnabled has a TextSource is NotCreatable but TextSource.CanSend has a default value: true ThirdPartyUserService.FriendCommunicationRestrictionStatus {CanSave Only} +ThirdPartyUserService.HasActiveUser {CanSave Only} Translator.LocaleId {CanSave Only} diff --git a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py b/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py index a2058de..0c62cae 100644 --- a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py +++ b/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py @@ -42,17 +42,18 @@ def api(): try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") def fetch_api(): - response = api() + response, version_hash = api() api_classes = response.json()["Classes"] global s + s = version_hash + "\n\n" class_list = {} for api_class in api_classes: diff --git a/Tools/NotCreatable Dumper/Dump b/Tools/NotCreatable Dumper/Dump index 1647844..ec5bc8b 100644 --- a/Tools/NotCreatable Dumper/Dump +++ b/Tools/NotCreatable Dumper/Dump @@ -1,3 +1,4 @@ +version-874602c66c70451a Object diff --git a/Tools/NotCreatable Dumper/NotCreatable Dumper.py b/Tools/NotCreatable Dumper/NotCreatable Dumper.py index f29e245..43b30b9 100644 --- a/Tools/NotCreatable Dumper/NotCreatable Dumper.py +++ b/Tools/NotCreatable Dumper/NotCreatable Dumper.py @@ -3,6 +3,7 @@ import os import re import sys + def array_to_dictionary(table, hybrid_mode=None): tmp = {} if hybrid_mode == "adjust": @@ -22,6 +23,7 @@ def array_to_dictionary(table, hybrid_mode=None): s = "\n" + def api(version_hash=None): if version_hash: # Use the provided version hash @@ -44,19 +46,23 @@ def api(version_hash=None): match = re.search(r"(version-[^\s]+)", line) if match: version_hash = match.group(1) - api_dump_url = f"https://setup.rbxcdn.com/{version_hash}-Full-API-Dump.json" + api_dump_url = ( + f"https://setup.rbxcdn.com/{version_hash}-Full-API-Dump.json" + ) try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") + def fetch_api(version_hash=None): - response = api(version_hash) + response, version_hash = api(version_hash) api_classes = response.json()["Classes"] global s + s = version_hash + "\n\n" class_list = {} for api_class in api_classes: @@ -97,12 +103,13 @@ def fetch_api(version_hash=None): return class_list + if __name__ == "__main__": # Check if version hash was passed as a command line argument version_hash = None if len(sys.argv) > 1: version_hash = sys.argv[1] - + try: fetch_api(version_hash) print(s) @@ -111,4 +118,4 @@ if __name__ == "__main__": with open(output_file_path, "w") as file: file.write(s) except Exception as e: - print(f"Error: {e}") \ No newline at end of file + print(f"Error: {e}") diff --git a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump index 9cfae8f..7089321 100644 --- a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump +++ b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump @@ -1,3 +1,4 @@ +version-874602c66c70451a EditableImage.ImageData {BinaryString} @@ -232,6 +233,7 @@ Smoke.size_xml {float} SoundService.VolumetricAudio {VolumetricAudio} StarterPlayer.AvatarJointUpgrade_SerializedRollout {RolloutState} +StarterPlayer.CreateDefaultPlayerModule {bool} StarterPlayer.EnableDynamicHeads {LoadDynamicHeads} StarterPlayer.LoadCharacterLayeredClothing {LoadCharacterLayeredClothing} AvatarJointUpgrade_SerializedRollout -> AvatarJointUpgrade {POTENTIAL PROXY} @@ -239,6 +241,8 @@ LoadCharacterLayeredClothing -> LoadCharacterLayeredClothing {POTENTIAL PROXY} StyleRule.PropertiesSerialize {BinaryString} +StyleQuery.ConditionsSerialize {BinaryString} + TerrainDetail.TexturePack {ContentId} TerrainRegion.ExtentsMax {Vector3int16} @@ -335,6 +339,7 @@ Studio.Enable Internal Beta Features {Scriptable} Studio.Enable Internal Features {Scriptable} Studio.LoadInternalPlugins {Scriptable} StyleRule.PropertiesSerialize +StyleQuery.ConditionsSerialize TextSource.UserIdReplicated {Serialize: False} VideoPlayer.PlayingReplicating {Serialize: False} WeldConstraint.Part0Internal diff --git a/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py b/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py index a0458ad..370e4f7 100644 --- a/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py +++ b/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py @@ -43,17 +43,18 @@ def api(): try: response = requests.get(api_dump_url) response.raise_for_status() - return response + return response, version_hash except requests.RequestException as e: print(f"Error fetching API dump for {version_hash}: {e}") def fetch_api(): - response = api() + response, version_hash = api() api_classes = response.json()["Classes"] global s, filtered_properties + s = version_hash + "\n\n" for api_class in api_classes: class_name = api_class["Name"] class_members = api_class["Members"]