diff --git a/Tools/Interesting Properties Behavior/Dump b/Tools/Interesting Properties Behavior/Dump index e5507de..12311d1 100644 --- a/Tools/Interesting Properties Behavior/Dump +++ b/Tools/Interesting Properties Behavior/Dump @@ -1,9 +1,7 @@ EditableImage.Size {CanSave Only} -EditableImage is NotCreatable but EditableImage.ImageData has a default value: __api_dump_failed_to_create_class__ EditableMesh.FixedSize {CanSave Only} -EditableMesh is NotCreatable but EditableMesh.FixedSize has a default value: __api_dump_failed_to_create_class__ Instance.Parent {CanLoad Only} Instance.archivable {CanLoad Only} {Deprecated} @@ -112,7 +110,7 @@ DragDetector.SecondaryAxis {CanLoad Only} DragDetector.WorldAxis {CanLoad Only} DragDetector.WorldSecondaryAxis {CanLoad Only} -Collaborator is NotCreatable but Collaborator.CFrame has a default value: __api_dump_no_string_value__ +Collaborator is NotCreatable but Collaborator.CollaboratorColor has a default value: 0 CommandInstance.Checked {CanLoad Only} CommandInstance.DisplayName {CanLoad Only} @@ -169,14 +167,9 @@ 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__ DebuggerManager.DebuggingEnabled {CanSave Only} -DraggerService is NotCreatable but DraggerService.AlignDraggedObjects has a default value: __api_dump_skipped_class__ - EditableService is NotCreatable but EditableService.EditableStatus has a default value: Unknown ExperienceStateCaptureService is NotCreatable but ExperienceStateCaptureService.HiddenSelectionEnabled has a default value: false @@ -189,8 +182,6 @@ FaceAnimatorService is NotCreatable but FaceAnimatorService.AudioAnimationEnable Decal.Shiny {CanLoad Only} {Deprecated} Decal.Specular {CanLoad Only} {Deprecated} -FacialAnimationRecordingService is NotCreatable but FacialAnimationRecordingService.BiometricDataConsent has a default value: __api_dump_skipped_class__ - FacialAnimationStreamingServiceV2 is NotCreatable but FacialAnimationStreamingServiceV2.ServiceState has a default value: 0 Fire.Heat {CanLoad Only} @@ -205,7 +196,6 @@ 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 @@ -309,11 +299,14 @@ Lighting is NotCreatable but Lighting.Ambient has a default value: 0.5, 0.5, 0.5 LiveScriptingService is NotCreatable but LiveScriptingService.ServerLiveEditingMode has a default value: Uninitialized +LiveSyncService.HasSyncedInstances {CanSave Only} +LiveSyncService is NotCreatable but LiveSyncService.HasSyncedInstances has a default value: false + LocalizationService is NotCreatable but LocalizationService.ForcePlayModeGameLocaleId has a default value: LocalizationTable.DevelopmentLanguage {CanLoad Only} {Deprecated} -LodDataEntity is NotCreatable but LodDataEntity.EntityData has a default value: __api_dump_no_string_value__ +LodDataEntity is NotCreatable but LodDataEntity.EntityLodEnabled has a default value: true BaseScript.LinkedSource {Deprecated} {CanSave} @@ -340,8 +333,6 @@ 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} @@ -419,8 +410,6 @@ 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} @@ -440,7 +429,6 @@ 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: @@ -497,16 +485,12 @@ 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 -StudioDeviceEmulatorService is NotCreatable but StudioDeviceEmulatorService.HasMultiTouchStarted has a default value: __api_dump_skipped_class__ - StudioPublishService is NotCreatable but StudioPublishService.PublishLocked has a default value: false StudioService.UseLocalSpace {CanLoad Only} -StudioService is NotCreatable but StudioService.ActiveScript has a default value: __api_dump_skipped_class__ StudioUserService.IsLoggedIn {CanSave Only} StudioUserService is NotCreatable but StudioUserService.IsLoggedIn has a default value: false @@ -516,13 +500,10 @@ 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} -TeamCreateData is NotCreatable but TeamCreateData.InitialCameraCFrame has a default value: __api_dump_no_string_value__ - TeleportAsyncResult.PrivateServerId {CanSave Only} TeleportAsyncResult.ReservedServerAccessCode {CanSave Only} @@ -544,9 +525,9 @@ ChatInputBarConfiguration is NotCreatable but ChatInputBarConfiguration.Absolute ChatWindowConfiguration is NotCreatable but ChatWindowConfiguration.AbsolutePosition has a default value: 0, 0 -TextChatMessage is NotCreatable but TextChatMessage.BubbleChatMessageProperties has a default value: __api_dump_no_string_value__ +TextChatMessage is NotCreatable but TextChatMessage.MessageId has a default value: -ChatWindowMessageProperties is NotCreatable but ChatWindowMessageProperties.FontFace has a default value: __api_dump_no_string_value__ +ChatWindowMessageProperties is NotCreatable but ChatWindowMessageProperties.TextColor3 has a default value: 1, 1, 1 TextChatService is NotCreatable but TextChatService.ChatTranslationEnabled has a default value: true @@ -577,7 +558,6 @@ UserInputService.MouseDeltaSensitivity {CanLoad Only} UserInputService.MouseEnabled {CanSave Only} UserInputService.TouchEnabled {CanSave Only} UserInputService.VREnabled {CanSave Only} -UserInputService is NotCreatable but UserInputService.AccelerometerEnabled has a default value: __api_dump_skipped_class__ VRService is NotCreatable but VRService.AutomaticScaling has a default value: World diff --git a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py b/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py index 456c647..a2058de 100644 --- a/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py +++ b/Tools/Interesting Properties Behavior/Interesting Properties Behavior.py @@ -119,7 +119,10 @@ def fetch_api(): if class_tags and class_tags.get("NotCreatable"): for property_name, property_info in class_info["Properties"].items(): value = property_info.get("Default") - if value != "__api_dump_class_not_creatable__": + if ( + value != "__api_dump_class_not_creatable__" + and "__api_dump_" not in value + ): s += f"{class_name} is NotCreatable but {class_name}.{property_name} has a default value: {value}\n" break diff --git a/saveinstance.luau b/saveinstance.luau index 0aa465d..891100e 100644 --- a/saveinstance.luau +++ b/saveinstance.luau @@ -7,7 +7,7 @@ local function string_find(s, pattern) return string.find(s, pattern, nil, true) end -local function ArrayToDictionary(t, hydridMode, valueOverride, typeStrict) +local function ArrayToDict(t, hydridMode, valueOverride, typeStrict) local tmp = {} if hydridMode then @@ -15,7 +15,7 @@ local function ArrayToDictionary(t, hydridMode, valueOverride, typeStrict) if type(some1) == "number" then tmp[some2] = valueOverride or true elseif type(some2) == "table" then - tmp[some1] = ArrayToDictionary(some2, hydridMode) -- Some1 is Class, Some2 is Name + tmp[some1] = ArrayToDict(some2, hydridMode) -- Some1 is Class, Some2 is Name else tmp[some1] = some2 end @@ -261,7 +261,7 @@ end local CLIENT_VERSION = tonumber(string.split(version(), ".")[2]) -local Type_IDs = { +local attr_Type_IDs = { string = 0x02, boolean = 0x03, -- int32 = 0x04, @@ -765,12 +765,12 @@ XML_Descriptors = { end, Color3uint8 = function(raw) -- https://github.com/rojo-rbx/rbx-dom/blob/master/docs/xml.md#color3uint8 + -- ? It is recommended that Color3uint8 is encoded with text instead of elements. return 0xFF000000 + (math.floor(raw.R * 255) * 0x10000) + (math.floor(raw.G * 255) * 0x100) - + math.floor(raw.B * 255) -- ? It is recommended that Color3uint8 is encoded with text instead of elements. - + + math.floor(raw.B * 255) -- return bit32.bor( -- bit32.bor(bit32.bor(bit32.lshift(0xFF, 24), bit32.lshift(0xFF * raw.R, 16)), bit32.lshift(0xFF * raw.G, 8)), -- 0xFF * raw.B @@ -840,7 +840,7 @@ XML_Descriptors = { -- The value is the text content, formatted as a space-separated list of floating point numbers. local __EXTREME_RANGE = XML_Descriptors.__EXTREME_RANGE - return __EXTREME_RANGE(raw.Min) .. " " .. __EXTREME_RANGE(raw.Max) --[[.. " "]] -- ! This might be required to bypass detections as thats how its formatted usually; __EXTREME_RANGE is not needed here but it fixes the issue where "nan 10" value would reset to "0 0" + return __EXTREME_RANGE(raw.Min) .. " " .. __EXTREME_RANGE(raw.Max) --[[.. " "]] -- ! This might be required for compatibility; __EXTREME_RANGE is not needed here but it fixes the issue where "nan 10" value would reset to "0 0" end, NumberSequence = nil, -- NumberSequence = Descriptors.__SEQUENCE, @@ -1061,10 +1061,10 @@ local ClassList do local ClassPropertyExceptions = { - Whitelist = { TriangleMeshPart = ArrayToDictionary({ "CollisionFidelity" }) }, + Whitelist = { TriangleMeshPart = ArrayToDict({ "CollisionFidelity" }) }, Blacklist = { - LuaSourceContainer = ArrayToDictionary({ "ScriptGuid" }), - Instance = ArrayToDictionary({ "UniqueId", "HistoryId" }), + LuaSourceContainer = ArrayToDict({ "ScriptGuid" }), + Instance = ArrayToDict({ "UniqueId", "HistoryId" }), }, } @@ -1123,7 +1123,7 @@ do buffer.copy(b, offset, b_Name) offset += Name_size - buffer.writeu8(b, offset, Type_IDs[typeof(attrs[attr])]) + buffer.writeu8(b, offset, attr_Type_IDs[typeof(attrs[attr])]) offset += 1 local bb = attrs_formatted[attr] @@ -1250,7 +1250,6 @@ do return instance:GetScale() end, WorldPivotData = "WorldPivot", -- TODO This doesn't accurately represent whether optional type property is present or not (it's never nil), gethiddenproperty or gethiddenproperty_fallback is preferred - -- ModelMeshCFrame = "Pivot Offset", -- * Both are NotScriptable }, PackageLink = { PackageIdSerialize = "PackageId", VersionIdSerialize = "VersionNumber" }, Players = { MaxPlayersInternal = "MaxPlayers", PreferredPlayersInternal = "PreferredPlayers" }, -- ? Only needed for execs that lack LocalUserSecurity (Level 2, 5, 9), even so, it's a pretty useless information as it can be viewed elsewhere @@ -1416,7 +1415,7 @@ do local ClassName = API_Class.Name if ClassTags then - Class.Tags = ArrayToDictionary(ClassTags, nil, nil, "string") -- or {} + Class.Tags = ArrayToDict(ClassTags, nil, nil, "string") -- or {} end local NotScriptableFixClass = NotScriptableFixes[ClassName] @@ -1547,7 +1546,7 @@ local GLOBAL_ENV = getgenv and getgenv() or _G or shared --- @interface CustomOptions table --- * Structure of the main CustomOptions table. ---- * Note: Aliases take priority over parent option name. +--- * Note: Options are case-insensitive, meaning you could type `NilInstances` option as `nilInStaNces` and it would still be valid. --- @within SynSaveInstance --- @field __DEBUG_MODE boolean -- Recommended to enable if you wish to help us improve our products and find bugs / issues with it! ___Default:___ false --- @field ReadMe boolean --___Default:___ true @@ -1687,7 +1686,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) IgnoreDefaultProperties = true, IgnoreNotArchivable = true, IgnorePropertiesOfNotScriptsOnScriptsMode = false, - IgnoreSpecialProperties = ArrayToDictionary({ "Fluxus", "Delta", "Solara" })[EXECUTOR_NAME] or false, -- ! Please submit more Executors that crash on gethiddenproperty (with this disabled basically) + IgnoreSpecialProperties = ArrayToDict({ "Fluxus", "Delta", "Solara" })[EXECUTOR_NAME] or false, -- ! Please submit more Executors that crash on gethiddenproperty (with this disabled basically) IsolateLocalPlayer = false, -- #service.StarterGui:GetChildren() == 0 IsolateLocalPlayerCharacter = false, @@ -1719,7 +1718,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) IgnoreSharedStrings = EXECUTOR_NAME ~= "Wave" and true, SharedStringOverwrite = false, TreatUnionsAsParts = EXECUTOR_NAME == "Solara", -- TODO Temporary true (once removed, remove Note from docs too) - AlternativeWritefile = not ArrayToDictionary({ "WRD", "Xeno", "Zorara" })[EXECUTOR_NAME], + AlternativeWritefile = not ArrayToDict({ "WRD", "Xeno", "Zorara" })[EXECUTOR_NAME], OptionsAliases = { -- You can't really modify these as a user DecompileTimeout = "timeout", @@ -1870,10 +1869,10 @@ local function synsaveinstance(CustomOptions, CustomOptions2) local InstancesOverrides = {} local DecompileIgnore, IgnoreList, IgnoreProperties, NotCreatableFixes = - ArrayToDictionary(OPTIONS.DecompileIgnore, true), - ArrayToDictionary(OPTIONS.IgnoreList, true), - ArrayToDictionary(OPTIONS.IgnoreProperties), - ArrayToDictionary(OPTIONS.NotCreatableFixes, true, "Folder") + ArrayToDict(OPTIONS.DecompileIgnore, true), + ArrayToDict(OPTIONS.IgnoreList, true), + ArrayToDict(OPTIONS.IgnoreProperties), + ArrayToDict(OPTIONS.NotCreatableFixes, true, "Folder") local __DEBUG_MODE = OPTIONS.__DEBUG_MODE @@ -1997,7 +1996,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) if not ToSaveInstance then local Children = TempRoot:GetChildren() if 0 < #Children then - local tmp_dict = ArrayToDictionary(tmp) + local tmp_dict = ArrayToDict(tmp) for _, child in Children do if not tmp_dict[child] then table.insert(tmp, child) @@ -2009,7 +2008,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) -- if IsolatePlayers then -- table.insert(_list_0, "Players") -- end - local tmp_dict = ArrayToDictionary(tmp) + local tmp_dict = ArrayToDict(tmp) for _, serviceName in { @@ -2028,13 +2027,13 @@ local function synsaveinstance(CustomOptions, CustomOptions2) "StarterPlayer", "Teams", "SoundService", - "TextChatService", "Chat", + "TextChatService", + "LocalizationService", -- For LocalizationTables -- "InsertService", "JointsService", - "LocalizationService", -- For LocalizationTables -- "TestService", -- "VoiceChatService", } @@ -2159,7 +2158,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) local function construct_TimeoutHandler(timeout, f, timeout_ret) return timeout < 0 and function(script) - return pcall(f, script) + return pcall(f, script) end or function(script) -- TODO Ideally use ... (vararg) instead of `script` in case this is reused for something other than `decompile` & `getscriptbytecode` local thread = coroutine.running() local timeoutThread, isCancelled @@ -2865,8 +2864,8 @@ local function synsaveinstance(CustomOptions, CustomOptions2) local header = '' - if IsModel then - --[[ + if IsModel then + --[[ -- ? Roblox encodes the following additional attributes. These are not required. Moreover, any defined schemas are ignored, and not required for a file to be valid: xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.roblox.com/roblox.xsd" Also http can be converted to https but not sure if Roblox cares -- ? nullnil - is a legacy concept that is no longer used. @@ -2992,7 +2991,7 @@ local function synsaveinstance(CustomOptions, CustomOptions2) Or Destroy the Camera. This file was generated with the following settings: - ]] + ]] .. service.HttpService:JSONEncode(OPTIONS) .. "\n\n\t\tElapsed time: " .. os.clock() - elapse_t @@ -3000,6 +2999,8 @@ local function synsaveinstance(CustomOptions, CustomOptions2) .. game.PlaceId .. " PlaceVersion: " .. game.PlaceVersion + .. " Client Version: " + .. version() .. " Executor: " .. (identify_executor and table.concat({ identify_executor() }, " ") or "Unknown") .. "\n]]"