From 1cbdfb72b00d2d83935aa82ba22bbef93c06fe86 Mon Sep 17 00:00:00 2001 From: phoriah <95628489+phoriah@users.noreply.github.com> Date: Tue, 31 Dec 2024 06:49:42 +0200 Subject: [PATCH] Update Dumpers; +Auto Dumper Runner --- Tools/Interesting Properties Behavior/Dump | 9 ++ .../Interesting Properties Behavior.luau | 132 ------------------ .../NotScriptable Dumper/Dump | 45 +++++- .../NotScriptable Dumper.py | 21 ++- .../NotScriptable Proxy Dumper.luau | 41 +++--- Tools/Run Dumpers.py | 29 ++++ 6 files changed, 120 insertions(+), 157 deletions(-) delete mode 100644 Tools/Interesting Properties Behavior/Interesting Properties Behavior.luau create mode 100644 Tools/Run Dumpers.py diff --git a/Tools/Interesting Properties Behavior/Dump b/Tools/Interesting Properties Behavior/Dump index f2bab78..471ddb4 100644 --- a/Tools/Interesting Properties Behavior/Dump +++ b/Tools/Interesting Properties Behavior/Dump @@ -165,6 +165,7 @@ DebugSettings.InstanceCount {CanSave Only} DebugSettings.JobCount {CanSave Only} DebugSettings.PlayerCount {CanSave Only} DebugSettings.RobloxVersion {CanSave Only} +DebugSettings is NotCreatable but DebugSettings.DataModel has a default value: __api_dump_skipped_class__ DebuggerBreakpoint is NotCreatable but DebuggerBreakpoint.Condition has a default value: __api_dump_skipped_class__ @@ -200,6 +201,7 @@ FunctionalTest.PhysicsEnvironmentalThrottle {CanLoad Only} FunctionalTest.Timeout {CanLoad Only} GameSettings.VideoRecording {CanLoad Only} +GameSettings is NotCreatable but GameSettings.VideoCaptureEnabled has a default value: __api_dump_skipped_class__ GamepadService is NotCreatable but GamepadService.GamepadCursorEnabled has a default value: false @@ -334,6 +336,8 @@ Mouse.ViewSizeY {CanSave Only} Mouse.X {CanSave Only} Mouse.Y {CanSave Only} +NetworkSettings is NotCreatable but NetworkSettings.EmulatedTotalMemoryInMB has a default value: __api_dump_skipped_class__ + NotificationService.SelectedTheme {CanLoad Only} BasePart.AssemblyAngularVelocity {CanLoad Only} @@ -411,6 +415,8 @@ Path.Status {CanSave Only} PathfindingService.EmptyCutoff {CanLoad Only} {Deprecated} PathfindingService is NotCreatable but PathfindingService.EmptyCutoff has a default value: 0 +PhysicsSettings is NotCreatable but PhysicsSettings.AllowSleep has a default value: __api_dump_skipped_class__ + Player.CharacterAppearance {Deprecated} {CanSave} Player.FollowUserId {CanSave Only} @@ -430,6 +436,7 @@ PolicyService is NotCreatable but PolicyService.IsLuobuServer has a default valu Pose.MaskWeight {CanLoad Only} {Deprecated} RenderSettings.EnableFRM {CanLoad Only} +RenderSettings is NotCreatable but RenderSettings.AutoFRMLevel has a default value: __api_dump_skipped_class__ RobloxSerializableInstance is NotCreatable but RobloxSerializableInstance.Data has a default value: @@ -486,6 +493,7 @@ Sparkles.Color {CanLoad Only} StarterPlayer is NotCreatable but StarterPlayer.AllowCustomAnimations has a default value: true Studio.UI Theme {CanSave Only} {Deprecated} {CanSave} +Studio is NotCreatable but Studio."TODO" Color has a default value: __api_dump_skipped_class__ StudioData is NotCreatable but StudioData.EnableScriptCollabByDefaultOnLoad has a default value: false @@ -504,6 +512,7 @@ StyleRule.Index {CanLoad Only} TaskScheduler.SchedulerDutyCycle {CanSave Only} TaskScheduler.SchedulerRate {CanSave Only} TaskScheduler.ThreadPoolSize {CanSave Only} +TaskScheduler is NotCreatable but TaskScheduler.SchedulerDutyCycle has a default value: __api_dump_skipped_class__ Team.AutoColorCharacters {CanLoad Only} {Deprecated} Team.Score {CanLoad Only} {Deprecated} diff --git a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.luau b/Tools/Interesting Properties Behavior/Interesting Properties Behavior.luau deleted file mode 100644 index 2244c2c..0000000 --- a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.luau +++ /dev/null @@ -1,132 +0,0 @@ -local GlobalSettings, GlobalBasicSettings = settings(), UserSettings() -local service = setmetatable({}, { - __index = function(Self, Name) - local Service = game:GetService(Name) or GlobalSettings:GetService(Name) or GlobalBasicSettings:GetService(Name) - Self[Name] = Service - return Service - end, -}) -service.HttpService.HttpEnabled = true -local function ArrayToDictionary(Table, HybridMode) - local tmp = table.create(#Table) - - if HybridMode == "adjust" then - for Some1, Some2 in Table do - if type(Some1) == "number" then - tmp[Some2] = true - elseif type(Some2) == "table" then - tmp[Some1] = ArrayToDictionary(Some2, "adjust") -- Some1 is Class, Some2 is Name - else - tmp[Some1] = Some2 - end - end - else - for _, Key in Table do - tmp[Key] = true - end - end - - return tmp -end -local s = "\n" - -do - -- TODO: More @ https://github.com/Dekkonot/rbx-instance-serializer/blob/23f772f6f78af879a21faa9fea3e6c4f93d1cdee/src/API.lua#L19 - - local function FetchAPI() - local API_Dump_Url = - "https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/roblox/Mini-API-Dump.json" - local API_Dump = service.HttpService:GetAsync(API_Dump_Url, true) - local API_Classes = service.HttpService:JSONDecode(API_Dump).Classes - - local classList = {} - - for _index_0 = 1, #API_Classes do - local API_Class = API_Classes[_index_0] - local ClassMembers = API_Class.Members - - local Class = {} - - local ClassName = API_Class.Name - - local ClassTags = API_Class.Tags - - if ClassTags then - ClassTags = ArrayToDictionary(ClassTags) - end - - -- ClassInfo.Name = ClassName - Class.Tags = ClassTags -- or {} - Class.Superclass = API_Class.Superclass - - local ClassProperties = {} - local prevsiz = #s - for _index_1 = 1, #ClassMembers do - local Member = ClassMembers[_index_1] - if Member.MemberType == "Property" then - local PropertyName = Member.Name - - -- ? We avoid this as some Instances like services may have this property locked and thus make file unable to open and it's not even used by Roblox anyways as Parent-Child relationship is done by embedding/nesting - - local Ignored = false - if not (Ignored and Ignored[PropertyName]) then - local MemberTags = Member.Tags - - local Special - - if MemberTags then - MemberTags = ArrayToDictionary(MemberTags) - - Special = MemberTags.NotScriptable - end - local Serialization = Member.Serialization - if Serialization.CanLoad then - if Serialization.CanSave == false then - s ..= ClassName .. "." .. PropertyName .. " {CanLoad Only}" .. "\n" - end - if MemberTags and MemberTags.Deprecated then - s ..= ClassName .. "." .. PropertyName .. " {Deprecated} " .. (Serialization.CanSave and " {CanSave}" or "") .. "\n" - end - elseif Serialization.CanSave then - s ..= ClassName .. "." .. PropertyName .. " {CanSave Only}\n" - end - local ValueType = Member.ValueType - - local Property = { - Name = PropertyName, - Category = ValueType.Category, - Default = Member.Default, - -- Tags = MemberTags, - ValueType = ValueType.Name, - } - - if Special then - Property.Special = true - end - - ClassProperties[PropertyName] = Property - end - end - end - - Class.Properties = ClassProperties - if #s ~= prevsiz then - s ..= "\n" - end - classList[ClassName] = Class - end - - -- classList.Instance.Properties.Parent = nil -- ? Not sure if this is a better option than filtering throguh properties to remove this - - return classList - end - - local ok, result = pcall(FetchAPI) - print(s) - if ok then - ClassList = result - else - warn(result) - return - end -end diff --git a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump index 529fcff..c987a94 100644 --- a/Tools/NotScriptable-Related/NotScriptable Dumper/Dump +++ b/Tools/NotScriptable-Related/NotScriptable Dumper/Dump @@ -64,8 +64,8 @@ HumanoidDescription.EquippedEmotesDataInternal InsertService.AllowClientInsertModels -Lighting.Intent -Lighting.Quality +Lighting.LightingStyle +Lighting.PrioritizeLightingQuality LocalizationTable.Contents @@ -168,7 +168,6 @@ Model.ScaleFactor Model.WorldPivotData Workspace.AvatarUnificationMode -Workspace.CSGAsyncDynamicCollision Workspace.CollisionGroupData {BinaryString} Workspace.ExplicitAutoJoints Workspace.FluidForces @@ -257,3 +256,43 @@ WeldConstraint.Part0Internal WeldConstraint.Part1Internal WeldConstraint.State + +Potential Proxy Properties: +Instance.AttributesSerialize +BallSocketConstraint.MaxFrictionTorqueXml +Fire.heat_xml +Fire.size_xml +Path2D.PropertiesSerialize +Humanoid.Health_XML +Humanoid.InternalBodyScale +Humanoid.InternalDisplayName {Scriptable} {Serialize: False} +Humanoid.InternalHeadScale +Humanoid.InternalOriginalHipHeight {Serialize: False} +Humanoid.MoveDirectionInternal {Serialize: False} +HumanoidDescription.EmotesDataInternal +HumanoidDescription.EquippedEmotesDataInternal +IncrementalPatchBuilder.SerializePatch {Scriptable} +MaterialService.Use2022MaterialsXml +MetaBreakpointContext.ContextDataInternal +BasePart.MaterialVariantSerialized +TriangleMeshPart.FluidFidelityInternal +PartOperation.SerializedCSGTree {Serialize: False} +PartOperation.SerializedOperationGraph {Serialize: False} +PackageLink.PackageIdSerialize +PackageLink.SerializedDefaultAttributes {Scriptable} +PackageLink.VersionIdSerialize +Player.InternalCharacterAppearanceLoaded {Serialize: False} +PlayerEmulatorService.SerializedEmulatedPolicyInfo {Scriptable} +Players.MaxPlayersInternal {Scriptable} +Players.PreferredPlayersInternal {Scriptable} +Smoke.opacity_xml +Smoke.riseVelocity_xml +Smoke.size_xml +Sound.xmlRead_MaxDistance_3 {Serialize: False} +Sound.xmlRead_MinDistance_3 {Serialize: False} +StarterPlayer.AvatarJointUpgrade_SerializedRollout +Studio.Enable Internal Beta Features {Scriptable} +Studio.Enable Internal Features {Scriptable} +StyleRule.PropertiesSerialize +WeldConstraint.Part0Internal +WeldConstraint.Part1Internal diff --git a/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py b/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py index 529bf14..5609747 100644 --- a/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py +++ b/Tools/NotScriptable-Related/NotScriptable Dumper/NotScriptable Dumper.py @@ -28,6 +28,7 @@ def find_first_table(array): s = "\n" +filtered_properties = [] def api(): @@ -59,7 +60,7 @@ def fetch_api(): response = api() api_classes = response.json()["Classes"] - global s + global s, filtered_properties for api_class in api_classes: class_name = api_class["Name"] class_members = api_class["Members"] @@ -89,6 +90,20 @@ def fetch_api(): if table_found: s += f"{'{PreferredDescriptorName: '+table_found.get('PreferredDescriptorName')+'}'}" s += "\n" + + if re.search(r"xml|internal|serial", member_name, re.IGNORECASE): + + str = f"{class_name}.{member_name}" + if not special: + str += " {Scriptable}" + if not ( + serialization.get("CanLoad", True) + and serialization.get("CanSave", True) + ): + str += " {Serialize: False}" + + filtered_properties.append(str) + for enum_type, real_member_name in enum_members.items(): for member in class_members: member_name = member["Name"] @@ -103,6 +118,10 @@ def fetch_api(): if len(s) != prev_len: s += "\n" + if filtered_properties: + s += "\nPotential Proxy Properties:\n" + s += "\n".join(filtered_properties) + "\n" + try: fetch_api() diff --git a/Tools/NotScriptable-Related/NotScriptable Proxy Dumper/NotScriptable Proxy Dumper.luau b/Tools/NotScriptable-Related/NotScriptable Proxy Dumper/NotScriptable Proxy Dumper.luau index 1a0cb95..2389fd2 100644 --- a/Tools/NotScriptable-Related/NotScriptable Proxy Dumper/NotScriptable Proxy Dumper.luau +++ b/Tools/NotScriptable-Related/NotScriptable Proxy Dumper/NotScriptable Proxy Dumper.luau @@ -47,7 +47,9 @@ do local Class = {} local ClassName = API_Class.Name - + -- if ClassName == "GuiService" then + -- continue + -- end local ClassTags = API_Class.Tags if ClassTags then @@ -74,7 +76,7 @@ do if Member.MemberType == "Property" then local PropertyName = Member.Name - local Ignored = false + local Ignored = { NextSelectionUp = true, CoreEffectFolder = true } if not (Ignored and Ignored[PropertyName]) then local MemberTags = Member.Tags @@ -86,23 +88,22 @@ do Special = MemberTags.NotScriptable end local Serialization = Member.Serialization - if Serialization.CanLoad and Serialization.CanSave and Special then - local ValueType = Member.ValueType - local Property = { - Name = PropertyName, - Category = ValueType.Category, - Default = Member.Default, - -- Tags = MemberTags, - ValueType = ValueType.Name, - } + local ValueType = Member.ValueType - if Special then - Property.Special = true - end + local Property = { + Name = PropertyName, + Category = ValueType.Category, + Default = Member.Default, + -- Tags = MemberTags, + ValueType = ValueType.Name, + } - ClassProperties[PropertyName] = Property + if Special then + Property.Special = true end + + ClassProperties[PropertyName] = Property end end end @@ -176,11 +177,6 @@ do pcall(function() instance = game:GetService(ClassName) end) - if not instance then - pcall(function() - instance = game:GetService(ClassName) - end) - end end if not instance then instance = game:FindFirstChild(ClassName, true) @@ -204,6 +200,7 @@ do -- print(ClassName) for _, PropertyInfo in ClassInfo.Properties do local PropertyName = PropertyInfo.Name + local not_Special = not PropertyInfo.Special if instance then writefile("crasher.txt", ClassName .. "." .. PropertyName) @@ -222,7 +219,9 @@ do if descriptor == PropertyName or alreadynoted[descriptor] then return end - + if not_Special and isscriptable(instance, descriptor) then + return + end alreadynoted[descriptor] = true local str = ClassName .. "." .. PropertyName .. " - " .. descriptor s ..= str .. "\n" diff --git a/Tools/Run Dumpers.py b/Tools/Run Dumpers.py new file mode 100644 index 0000000..b3461be --- /dev/null +++ b/Tools/Run Dumpers.py @@ -0,0 +1,29 @@ +import os +import subprocess + + +def run_python_files_in_directories(directory, script_name): + + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".py"): + file_path = os.path.join(root, file) + + if os.path.abspath(file_path) == script_name: + continue + print(f"Found Python file: {file_path}") + try: + + subprocess.run(["python", file_path], check=True) + print(f"Executed: {file_path}") + except subprocess.CalledProcessError as e: + print(f"Error running {file_path}: {e}") + + +current_directory = os.path.dirname(os.path.abspath(__file__)) + + +script_name = os.path.abspath(__file__) + + +run_python_files_in_directories(current_directory, script_name)