mirror of
https://github.com/luau/UniversalSynSaveInstance.git
synced 2026-02-04 14:43:14 +02:00
Update Dumpers; +Auto Dumper Runner
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
29
Tools/Run Dumpers.py
Normal 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)
|
||||
Reference in New Issue
Block a user