Update Dumpers; +Auto Dumper Runner

This commit is contained in:
phoriah
2024-12-31 06:49:42 +02:00
parent aebac30ea0
commit 1cbdfb72b0
6 changed files with 120 additions and 157 deletions

View File

@@ -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}

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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"

29
Tools/Run Dumpers.py Normal file
View File

@@ -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)