Advertisement
Thesxctriper23214

Instance

Jul 8th, 2024 (edited)
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 163.71 KB | None | 0 0
  1. if not game:IsLoaded() then game.Loaded:Wait() end
  2. task.wait(1.5)
  3. print("Taxevaz's saver: Initializing... (Please work!)")
  4.  
  5. -- SERVICES
  6. local Players = game:GetService("Players") -- These are the three locations that can be accessed using this script.
  7. local Lighting = game:GetService("Lighting")
  8. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  9. local ServerStorage = game:GetService("ServerStorage") -- This container stores the four "container imposter" Models for redirection.
  10. local MaterialService = game:GetService("MaterialService")
  11.  
  12. -- REFERENCES (PARTIAL, NOT INCLUDING GUI)
  13. local PlayerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
  14.  
  15. -- VARIABLES
  16.  
  17. -- An array of Instance references, placed within string keys named after their Instance:GetDebugId() values. These are used for links between
  18. -- Instances, allowing links between instances to be maintained after exporting models to JSON data. As this array can become pretty large, it's
  19. -- cleared after conversions and closing the GUI. (This can't be done when switching between containers, as the user may have models selected
  20. -- in an "unloaded" container at that point.
  21. local DebugIDList = {}
  22.  
  23. -- STATIC DATA
  24. local DefaultMessage = "Welcome to taxevaz's scipts!"
  25.  
  26. -- STATIC DATA & FUNCTIONS
  27. -- Arrays of properties shared by multiple classes, used to simplify the main class data array/list below.
  28. -- If any list contains a property starting with "UseCmnList_", the script should iterate through the array named after its value here.
  29. local CommonPropList = {
  30. Instance = {
  31. Name = "string",
  32. Parent = "Instance"
  33. },
  34. Attachment = {
  35. Axis = "Vector3",
  36. SecondaryAxis = "Vector3",
  37. CFrame = "CFrame", -- Set the CFrame last, in case the previous properties are redundant.
  38. Visible = "boolean"
  39. },
  40. Decal = {
  41. Color3 = "Color3",
  42. Face = "EnumItem", -- Inherited from FaceInstance class
  43. LocalTransparencyModifier = "number",
  44. Texture = "string",
  45. Transparency = "number",
  46. ZIndex = "number"
  47. },
  48. Model = {
  49. LevelOfDetail = "EnumItem",
  50. ModelStreamingMode = "EnumItem",
  51. PrimaryPart = "Instance"
  52. },
  53. BasePart = {
  54. Anchored = "boolean",
  55. BackSurface = "EnumItem",
  56. BottomSurface = "EnumItem",
  57. CFrame = "CFrame",
  58. CanCollide = "boolean",
  59. CanQuery = "boolean",
  60. CanTouch = "boolean",
  61. CastShadow = "boolean",
  62. CollisionGroup = "string",
  63. Color = "Color3",
  64. EnableFluidForces = "boolean",
  65. FrontSurface = "EnumItem",
  66. LeftSurface = "EnumItem",
  67. LocalTransparencyModifier = "number",
  68. Locked = "boolean",
  69. Massless = "boolean",
  70. Material = "EnumItem",
  71. MaterialVariant = "string",
  72. PivotOffset = "CFrame",
  73. Reflectance = "number",
  74. RightSurface = "EnumItem",
  75. RootPriority = "number",
  76. Size = "Vector3",
  77. TopSurface = "EnumItem",
  78. Transparency = "number"
  79. },
  80. Constraint = {
  81. Attachment0 = "Instance",
  82. Attachment1 = "Instance",
  83. Color = "BrickColor",
  84. Enabled = "boolean",
  85. Visible = "boolean"
  86. },
  87. JointInstance = {
  88. C0 = "CFrame",
  89. C1 = "CFrame",
  90. Enabled = "boolean",
  91. Part0 = "Instance",
  92. Part1 = "Instance"
  93. },
  94. Light = {
  95. Brightness = "number",
  96. Color = "Color3",
  97. Enabled = "boolean",
  98. Shadows = "boolean"
  99. },
  100. Motor = {
  101. CurrentAngle = "number",
  102. DesiredAngle = "number",
  103. MaxVelocity = "number"
  104. },
  105. SpotAndSurfaceLight = {
  106. Angle = "number",
  107. Face = "EnumItem",
  108. Range = "number"
  109. },
  110. SurfaceGuiBase = {
  111. Active = "boolean",
  112. Adornee = "Instance",
  113. Face = "EnumItem",
  114. },
  115. BaseWrap = {
  116. CageMeshId = "string",
  117. CageOrigin = "CFrame",
  118. ImportOrigin = "CFrame"
  119. },
  120. PBRMapSet = {
  121. ColorMap = "string",
  122. MetalnessMap = "string",
  123. NormalMap = "string",
  124. RoughnessMap = "string"
  125. },
  126. LayerCollector = { -- Used by ScreenGui's and possibly moe classes.
  127. Enabled = "boolean",
  128. ResetOnSpawn = "boolean",
  129. ZIndexBehavior = "EnumItem"
  130. },
  131. GuiButton = {
  132. AutoButtonColor = "boolean",
  133. Modal = "boolean",
  134. Selected = "boolean",
  135. Style = "EnumItem"
  136. },
  137. GuiObject = {
  138. Active = "boolean",
  139. AnchorPoint = "Vector2",
  140. AutomaticSize = "EnumItem",
  141. BackgroundColor3 = "Color3",
  142. BackgroundTransparency = "number",
  143. BorderColor3 = "Color3",
  144. BorderMode = "EnumItem",
  145. BorderSizePixel = "number",
  146. ClipsDescendants = "boolean",
  147. -- Draggable = "boolean",
  148. Interactable = "boolean",
  149. LayoutOrder = "number",
  150. Position = "UDim2",
  151. Rotation = "number",
  152. Selectable = "boolean",
  153. SelectionOrder = "number",
  154. Size = "UDim2",
  155. SizeConstraint = "EnumItem",
  156. Visible = "boolean",
  157. ZIndex = "number"
  158. },
  159. GuiBase2d = {
  160. AutoLocalize = "boolean"
  161. },
  162. GuiTextElement = { -- TextButtons and TextLabels have the exact same properties!
  163. FontFace = "Font",
  164. LineHeight = "number",
  165. MaxVisibleGraphemes = "number",
  166. RichText = "boolean",
  167. Text = "string",
  168. TextColor3 = "Color3",
  169. TextDirection = "EnumItem",
  170. TextScaled = "boolean",
  171. TextSize = "number",
  172. TextStrokeColor3 = "Color3",
  173. TextStrokeTransparency = "number",
  174. TextTransparency = "number",
  175. TextTruncate = "EnumItem",
  176. TextWrapped = "boolean",
  177. TextXAlignment = "EnumItem",
  178. TextYAlignment = "EnumItem"
  179. },
  180. GuiImageElement = { -- Properties reused between ImageLabels and ImageButtons.
  181. Image = "string",
  182. ImageColor3 = "Color3",
  183. ImageRectOffset = "Vector2",
  184. ImageRectSize = "Vector2",
  185. ImageTransparency = "number",
  186. ResampleMode = "EnumItem",
  187. ScaleType = "EnumItem",
  188. SliceCenter = "Rect",
  189. SliceScale = "number",
  190. TileSize = "UDim2"
  191. },
  192. UIGridStyleLayout = {
  193. FillDirection = "EnumItem",
  194. HorizontalAlignment = "EnumItem",
  195. SortOrder = "EnumItem",
  196. VerticalAlignment = "EnumItem"
  197. }
  198. }
  199.  
  200. -- A very long, complex array of dictionary entries that specifies what properties should be saved for specific instance classes, and what
  201. -- their types are. This may look almost identical to its plugin counterpart, but there are some differences. For example, MeshParts' MeshId
  202. -- property is included in the script version so it saves its value, but it's commented out in the plugin, since modifying that property
  203. -- directly will cause errors and break its functions.
  204.  
  205. -- When iterating through one of these property lists, make sure it's always done from top to bottom; Sometimes, the properties have to be set
  206. -- out of alphabetical order! Also, Don't use a "UseCmnList_" definition to inherit from the "Instance" list above! The final script will
  207. -- automatically do that to simplify things.
  208.  
  209. -- When ay reference to an Instance is found by the Studio plugin, just silently add each of the properties to an array index named after the
  210. -- instance's "intended debug ID", then go back through that list afte all instances have been "imported" and use the complete "debug ID" array
  211. -- to link each of the properties to their intended "reconstructed" instances.
  212. local ClassData = {
  213. ["AdGui"] = {
  214. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  215. Icon = "πŸ“Š", -- Emoji used to represent this instance when it's unselected.
  216. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  217. CanView = "parent" -- Can the camera focus on this instance?
  218. },
  219. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  220. UseCmnList_1 = "LayerCollector", -- Common properties that this class shares with others.
  221. UseCmnList_2 = "GuiBase2d",
  222. UseCmnList_3 = "SurfaceGuiBase",
  223. AdShape = "EnumItem",
  224. EnableVideoAds = "boolean",
  225. FallbackImage = "string",
  226. }
  227. },
  228. ["Attachment"] = {
  229. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  230. Icon = "πŸ”Œ", -- Emoji used to represent this instance when it's unselected.
  231. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  232. CanView = "no" -- Can the camera focus on this instance?
  233. },
  234. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  235. UseCmnList_1 = "Attachment" -- Common properties that this class shares with others.
  236. }
  237. },
  238. ["Accessory"] = {
  239. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  240. Icon = "πŸ‘š", -- Emoji used to represent this instance when it's unselected.
  241. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  242. CanView = "child" -- Can the camera focus on this instance?
  243. },
  244. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  245. AccessoryType = "EnumItem",
  246. AttachmentPoint = "CFrame" -- Inherited from Accoutrement (What even is that word?)
  247. }
  248. },
  249. ["Animation"] = {
  250. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  251. Icon = "🀺", -- Emoji used to represent this instance when it's unselected.
  252. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  253. CanView = "no" -- Can the camera focus on this instance?
  254. },
  255. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  256. AnimationId = "string"
  257. }
  258. },
  259. ["AnimationController"] = { -- AnimationController instances don't have any properties other than standard Instance ones.
  260. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  261. Icon = "🀺", -- Emoji used to represent this instance when it's unselected.
  262. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  263. CanView = "no" -- Can the camera focus on this instance?
  264. },
  265. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  266. }
  267. },
  268. --[[["Animator"] = {
  269. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  270. Icon = "🀺", -- Emoji used to represent this instance when it's unselected.
  271. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  272. CanView = "no" -- Can the camera focus on this instance?
  273. },
  274. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  275. PreferLodEnabled = "boolean"
  276. }
  277. },]]--
  278. ["Atmosphere"] = {
  279. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  280. Icon = "β›…", -- Emoji used to represent this instance when it's unselected.
  281. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  282. CanView = "no" -- Can the camera focus on this instance?
  283. },
  284. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  285. Color = "Color3",
  286. Decay = "Color3",
  287. Density = "number",
  288. Glare = "number",
  289. Haze = "number",
  290. Offset = "number"
  291. }
  292. },
  293. ["Backpack"] = { -- Backpacks don't have any properties other than standard Instance ones.
  294. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  295. Icon = "πŸŽ’", -- Emoji used to represent this instance when it's unselected.
  296. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  297. CanView = "no" -- Can the camera focus on this instance?
  298. },
  299. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  300. }
  301. },
  302. ["Beam"] = {
  303. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  304. Icon = "⚑", -- Emoji used to represent this instance when it's unselected.
  305. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  306. CanView = "parent" -- Can the camera focus on this instance?
  307. },
  308. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  309. Attachment0 = "Instance",
  310. Attachment1 = "Instance",
  311. LightInfluence = "number", -- Brightness is only used if LightInfluence is set to a low value.
  312. Brightness = "number",
  313. Color = "ColorSequence",
  314. CurveSize0 = "number",
  315. CurveSize1 = "number",
  316. Enabled = "boolean",
  317. FaceCamera = "boolean",
  318. LightEmission = "number",
  319. Segments = "number",
  320. Texture = "string",
  321. TextureLength = "number",
  322. TextureMode = "EnumItem",
  323. TextureSpeed = "number",
  324. Transparency = "NumberSequence",
  325. Width0 = "number",
  326. Width1 = "number",
  327. ZOffset = "number"
  328. }
  329. },
  330. ["BillboardGui"] = {
  331. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  332. Icon = "πŸ›‘", -- Emoji used to represent this instance when it's unselected.
  333. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  334. CanView = "no" -- Can the camera focus on this instance?
  335. },
  336. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  337. UseCmnList_1 = "LayerCollector", -- Common properties that this class shares with others.
  338. UseCmnList_2 = "GuiBase2d",
  339. Active = "boolean",
  340. Adornee = "Instance",
  341. AlwaysOnTop = "boolean",
  342. Brightness = "number",
  343. ClipsDescendants = "boolean",
  344. DistanceLowerLimit = "number",
  345. DistanceStep = "number",
  346. DistanceUpperLimit = "number",
  347. ExtentsOffset = "Vector3",
  348. ExtentsOffsetWorldSpace = "Vector3",
  349. LightInfluence = "number",
  350. MaxDistance = "number",
  351. Size = "UDim2",
  352. SizeOffset = "Vector2",
  353. StudsOffset = "Vector3",
  354. StudsOffsetWorldSpace = "Vector3"
  355. }
  356. },
  357. ["BloomEffect"] = { -- Decals' properties are reused for Textures.
  358. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  359. Icon = "πŸŒ„", -- Emoji used to represent this instance when it's unselected.
  360. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  361. CanView = "no" -- Can the camera focus on this instance?
  362. },
  363. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  364. Enabled = "boolean", -- Inherited from PostEffect class
  365. Intensity = "number",
  366. Size = "number",
  367. Threshold = "number"
  368. }
  369. },
  370. ["BlurEffect"] = { -- Decals' properties are reused for Textures.
  371. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  372. Icon = "πŸŒ„", -- Emoji used to represent this instance when it's unselected.
  373. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  374. CanView = "no" -- Can the camera focus on this instance?
  375. },
  376. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  377. Enabled = "boolean", -- Inherited from PostEffect class
  378. Size = "number",
  379. }
  380. },
  381. ["Bone"] = {
  382. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  383. Icon = "🦴", -- Emoji used to represent this instance when it's unselected.
  384. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  385. CanView = "no" -- Can the camera focus on this instance?
  386. },
  387. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  388. UseCmnList_1 = "Attachment", -- Common properties that this class shares with others.
  389. Transform = "CFrame"
  390. }
  391. },
  392. ["BoolValue"] = {
  393. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  394. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  395. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  396. CanView = "no" -- Can the camera focus on this instance?
  397. },
  398. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  399. Value = "boolean"
  400. }
  401. },
  402. ["BrickColorValue"] = {
  403. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  404. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  405. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  406. CanView = "no" -- Can the camera focus on this instance?
  407. },
  408. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  409. Value = "BrickColor"
  410. }
  411. },
  412. ["Camera"] = {
  413. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  414. Icon = "πŸŽ₯", -- Emoji used to represent this instance when it's unselected.
  415. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  416. CanView = "no" -- Cameras aren't used much outside of ViewportFrames so I don't want to script viewing them.
  417. },
  418. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  419. CameraType = "EnumItem",
  420. CameraSubject = "Instance",
  421. FieldOfViewMode = "EnumItem",
  422. DiagonalFieldOfView = "number",
  423. MaxAxisFieldOfView = "number",
  424. FieldOfView = "number",
  425. Focus = "CFrame",
  426. HeadLocked = "boolean",
  427. HeadScale = "number",
  428. VRTiltAndRollEnabled = "boolean",
  429. CFrame = "CFrame"
  430. }
  431. },
  432. ["CanvasGroup"] = {
  433. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  434. Icon = "🏒", -- Emoji used to represent this instance when it's unselected.
  435. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  436. CanView = "no" -- Can the camera focus on this instance?
  437. },
  438. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  439. UseCmnList_1 = "GuiObject", -- Common properties that this class shares with others.
  440. UseCmnList_2 = "GuiBase2d",
  441. GroupColor3 = "Color3",
  442. GroupTransparency = "number"
  443. }
  444. },
  445. ["CFrameValue"] = {
  446. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  447. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  448. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  449. CanView = "no" -- Can the camera focus on this instance?
  450. },
  451. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  452. Value = "CFrame"
  453. }
  454. },
  455. ["Color3Value"] = {
  456. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  457. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  458. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  459. CanView = "no" -- Can the camera focus on this instance?
  460. },
  461. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  462. Value = "Color3"
  463. }
  464. },
  465. ["ColorCorrectionEffect"] = { -- Decals' properties are reused for Textures.
  466. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  467. Icon = "πŸŒ„", -- Emoji used to represent this instance when it's unselected.
  468. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  469. CanView = "no" -- Can the camera focus on this instance?
  470. },
  471. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  472. Enabled = "boolean", -- Inherited from PostEffect class
  473. Brightness = "number",
  474. Contrast = "number",
  475. Saturation = "number",
  476. TintColor = "Color3"
  477. }
  478. },
  479. ["Configuration"] = { -- Configuration folders don't have any properties other than standard Instance ones.
  480. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  481. Icon = "βš™", -- Emoji used to represent this instance when it's unselected.
  482. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  483. CanView = "no" -- Can the camera focus on this instance?
  484. },
  485. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  486. }
  487. },
  488. ["CornerWedgePart"] = {
  489. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  490. Icon = "🧱", -- Emoji used to represent this instance when it's unselected.
  491. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  492. CanView = "yes" -- Can the camera focus on this instance?
  493. },
  494. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  495. UseCmnList_1 = "BasePart" -- Use all of the properties shared by all BasePart instances.
  496. }
  497. },
  498. ["Decal"] = { -- Decals' properties are reused for Textures.
  499. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  500. Icon = "πŸ“„", -- Emoji used to represent this instance when it's unselected.
  501. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  502. CanView = "no" -- Can the camera focus on this instance?
  503. },
  504. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  505. UseCmnList_1 = "Decal", -- Common properties that this class shares with others.
  506. }
  507. },
  508. ["DepthOfFieldEffect"] = { -- Decals' properties are reused for Textures.
  509. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  510. Icon = "πŸŒ„", -- Emoji used to represent this instance when it's unselected.
  511. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  512. CanView = "no" -- Can the camera focus on this instance?
  513. },
  514. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  515. Enabled = "boolean", -- Inherited from PostEffect class
  516. FarIntensity = "number",
  517. FocusDistance = "number",
  518. InFocusRadius = "number",
  519. NearIntensity = "number"
  520. }
  521. },
  522. ["DoubleConstrainedValue"] = {
  523. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  524. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  525. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  526. CanView = "no" -- Can the camera focus on this instance?
  527. },
  528. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  529. MaxValue = "number",
  530. MinValue = "number"
  531. }
  532. },
  533. ["Fire"] = {
  534. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  535. Icon = "πŸ”₯", -- Emoji used to represent this instance when it's unselected.
  536. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  537. CanView = "parent" -- Can the camera focus on this instance?
  538. },
  539. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  540. Color = "Color3",
  541. Enabled = "boolean",
  542. Heat = "number",
  543. SecondaryColor = "Color3",
  544. Size = "number",
  545. TimeScale = "number"
  546. }
  547. },
  548. ["Folder"] = { -- Folders don't have any properties other than standard Instance ones.
  549. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  550. Icon = "πŸ“", -- Emoji used to represent this instance when it's unselected.
  551. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  552. CanView = "no" -- Can the camera focus on this instance?
  553. },
  554. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  555. }
  556. },
  557. ["Frame"] = {
  558. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  559. Icon = "πŸ–Ό", -- Emoji used to represent this instance when it's unselected.
  560. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  561. CanView = "no" -- Can the camera focus on this instance?
  562. },
  563. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  564. UseCmnList_1 = "GuiObject", -- Common properties that this class shares with others.
  565. UseCmnList_2 = "GuiBase2d",
  566. Style = "EnumItem"
  567. }
  568. },
  569. ["Highlight"] = {
  570. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  571. Icon = "πŸ”³", -- Emoji used to represent this instance when it's unselected.
  572. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  573. CanView = "parent" -- Can the camera focus on this instance?
  574. },
  575. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  576. Adornee = "Instance",
  577. DepthMode = "EnumItem",
  578. Enabled = "boolean",
  579. FillColor = "Color3",
  580. FillTransparency = "number",
  581. OutlineColor = "Color3",
  582. OutlineTransparency = "number"
  583. }
  584. },
  585. ["HingeConstraint"] = {
  586. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  587. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  588. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  589. CanView = "no" -- Can the camera focus on this instance?
  590. },
  591. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  592. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  593. ActuatorType = "EnumItem",
  594. AngularResponsiveness = "number",
  595. AngularVelocity = "number",
  596. LimitsEnabled = "boolean",
  597. LowerAngle = "number",
  598. MotorMaxAcceleration = "number",
  599. MotorMaxTorque = "number",
  600. Radius = "number",
  601. Restitution = "number",
  602. ServoMaxTorque = "number",
  603. TargetAngle = "number",
  604. UpperAngle = "number"
  605. }
  606. },
  607. ["Humanoid"] = {
  608. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  609. Icon = "πŸ™πŸΌβ€", -- Emoji used to represent this instance when it's unselected.
  610. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  611. CanView = "no" -- Can the camera focus on this instance?
  612. },
  613. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  614. AutoJumpEnabled = "boolean",
  615. AutoRotate = "boolean",
  616. AutomaticScalingEnabled = "boolean",
  617. BreakJointsOnDeath = "boolean",
  618. CameraOffset = "Vector3",
  619. DisplayDistanceType = "EnumItem",
  620. DisplayName = "string",
  621. -- EvaluateStateMachine = "boolean",
  622. Health = "number",
  623. HealthDisplayDistance = "number",
  624. HealthDisplayType = "EnumItem",
  625. HipHeight = "number",
  626. JumpHeight = "number",
  627. JumpPower = "number",
  628. MaxHealth = "number",
  629. MaxSlopeAngle = "number",
  630. NameDisplayDistance = "number",
  631. NameOcclusion = "EnumItem",
  632. PlatformStand = "boolean",
  633. RequiresNeck = "boolean",
  634. RigType = "EnumItem", -- Should this property be captured?
  635. UseJumpPower = "boolean",
  636. WalkSpeed = "number"
  637. }
  638. },
  639. ["HumanoidDescription"] = {
  640. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  641. Icon = "πŸ‘€", -- Emoji used to represent this instance when it's unselected.
  642. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  643. CanView = "no" -- Can the camera focus on this instance?
  644. },
  645. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  646. BackAccessory = "string",
  647. BodyTypeScale = "number",
  648. ClimbAnimation = "number",
  649. DepthScale = "number",
  650. Face = "number",
  651. FaceAccessory = "string",
  652. FallAnimation = "number",
  653. FrontAccessory = "string",
  654. GraphicTShirt = "number",
  655. HairAccessory = "string",
  656. HatAccessory = "string",
  657. Head = "number",
  658. HeadColor = "Color3",
  659. HeadScale = "number",
  660. HeightScale = "number",
  661. IdleAnimation = "number",
  662. JumpAnimation = "number",
  663. LeftArm = "number",
  664. LeftArmColor = "Color3",
  665. LeftLeg = "number",
  666. LeftLegColor = "Color3",
  667. MoodAnimation = "number",
  668. NeckAccessory = "string",
  669. Pants = "number",
  670. ProportionScale = "number",
  671. RightArm = "number",
  672. RightArmColor = "Color3",
  673. RightLeg = "number",
  674. RightLegColor = "Color3",
  675. RunAnimation = "number",
  676. Shirt = "number",
  677. ShouldersAccessory = "string",
  678. SwimAnimation = "number",
  679. Torso = "number",
  680. TorsoColor = "Color3",
  681. WaistAccessory = "string",
  682. WalkAnimation = "number",
  683. WidthScale = "number"
  684. }
  685. },
  686. ["ImageButton"] = {
  687. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  688. Icon = "🏞", -- Emoji used to represent this instance when it's unselected.
  689. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  690. CanView = "no" -- Can the camera focus on this instance?
  691. },
  692. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  693. UseCmnList_1 = "GuiImageElement", -- Common properties that this class shares with others.
  694. UseCmnList_2 = "GuiButton",
  695. UseCmnList_3 = "GuiObject",
  696. UseCmnList_4 = "GuiBase2d",
  697. HoverImage = "string",
  698. PressedImage = "string"
  699. }
  700. },
  701. ["ImageLabel"] = {
  702. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  703. Icon = "🏞", -- Emoji used to represent this instance when it's unselected.
  704. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  705. CanView = "no" -- Can the camera focus on this instance?
  706. },
  707. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  708. UseCmnList_1 = "GuiImageElement", -- Common properties that this class shares with others.
  709. UseCmnList_2 = "GuiObject",
  710. UseCmnList_3 = "GuiBase2d"
  711. }
  712. },
  713. ["IntValue"] = {
  714. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  715. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  716. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  717. CanView = "no" -- Can the camera focus on this instance?
  718. },
  719. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  720. Value = "number"
  721. }
  722. },
  723. ["IntConstrainedValue"] = {
  724. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  725. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  726. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  727. CanView = "no" -- Can the camera focus on this instance?
  728. },
  729. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  730. MaxValue = "number",
  731. MinValue = "number"
  732. }
  733. },
  734. ["LineForce"] = {
  735. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  736. Icon = "β†—", -- Emoji used to represent this instance when it's unselected.
  737. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  738. CanView = "no" -- Can the camera focus on this instance?
  739. },
  740. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  741. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  742. ApplyAtCenterOfMass = "boolean",
  743. InverseSquareLaw = "boolean",
  744. Magnitude = "number",
  745. MaxForce = "number",
  746. ReactionForceEnabled = "boolean"
  747. }
  748. },
  749. ["MaterialVariant"] = {
  750. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  751. Icon = "🏁", -- Emoji used to represent this instance when it's unselected.
  752. CreateTest = false,-- Create an Instance of this type when testing the script in Roblox Studio.
  753. CanView = "no" -- Can the camera focus on this instance?
  754. },
  755. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  756. UseCmnList_1 = "PBRMapSet", -- Common properties that this class shares with others.
  757. BaseMaterial = "EnumItem",
  758. CustomPhysicalProperties = "PhysicalProperties",
  759. MaterialPattern = "EnumItem",
  760. StudsPerTile = "number",
  761. }
  762. },
  763. ["MeshPart"] = {
  764. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  765. Icon = "🧭", -- Emoji used to represent this instance when it's unselected.
  766. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  767. CanView = "yes" -- Can the camera focus on this instance?
  768. },
  769. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  770. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  771. DoubleSided = "boolean",
  772. TextureID = "string",
  773. MeshId = "string", -- Comment this line out in the plugin! MeshIds can't be set directly, only used on creation.
  774. RenderFidelity = "EnumItem", -- Comment this out too...
  775. CollisionFidelity = "EnumItem" -- ...and this one! (This inherits from the "TriangleMeshPart" class, also used by unions.)
  776. }
  777. },
  778. ["Model"] = {
  779. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  780. Icon = "πŸ”³", -- Emoji used to represent this instance when it's unselected.
  781. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  782. CanView = "yes" -- Can the camera focus on this instance?
  783. },
  784. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  785. UseCmnList_1 = "Model" -- Other classes inherit from this one.
  786. }
  787. },
  788. ["Motor"] = {
  789. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  790. Icon = "πŸ›΅", -- Emoji used to represent this instance when it's unselected.
  791. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  792. CanView = "no" -- Can the camera focus on this instance?
  793. },
  794. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  795. UseCmnList_1 = "Motor",
  796. UseCmnList_2 = "JointInstance"
  797. }
  798. },
  799. ["Motor6D"] = {
  800. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  801. Icon = "πŸ’ͺ🏼", -- Emoji used to represent this instance when it's unselected.
  802. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  803. CanView = "no" -- Can the camera focus on this instance?
  804. },
  805. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  806. UseCmnList_1 = "Motor",
  807. UseCmnList_2 = "JointInstance",
  808. Transform = "CFrame"
  809. }
  810. },
  811. ["NumberValue"] = {
  812. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  813. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  814. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  815. CanView = "no" -- Can the camera focus on this instance?
  816. },
  817. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  818. Value = "number"
  819. }
  820. },
  821. ["ObjectValue"] = {
  822. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  823. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  824. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  825. CanView = "no" -- Can the camera focus on this instance?
  826. },
  827. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  828. Value = "Instance"
  829. }
  830. },
  831. ["Pants"] = {
  832. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  833. Icon = "πŸ‘•", -- Emoji used to represent this instance when it's unselected.
  834. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  835. CanView = "parent" -- Can the camera focus on this instance?
  836. },
  837. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  838. PantsTemplate = "string",
  839. Color3 = "Color3" -- Inherited from Clothing class
  840. }
  841. },
  842. ["Part"] = {
  843. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  844. Icon = "🧱", -- Emoji used to represent this instance when it's unselected.
  845. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  846. CanView = "yes" -- Can the camera focus on this instance?
  847. },
  848. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  849. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  850. Shape = "EnumItem"
  851. }
  852. },
  853. ["ParticleEmitter"] = {
  854. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  855. Icon = "✨", -- Emoji used to represent this instance when it's unselected.
  856. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  857. CanView = "parent" -- Can the camera focus on this instance?
  858. },
  859. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  860. Acceleration = "Vector3",
  861. LightInfluence = "number", -- Brightness is only used if LightInfluence is set to a low value.
  862. Brightness = "number",
  863. Color = "ColorSequence",
  864. Drag = "number",
  865. EmissionDirection = "EnumItem",
  866. Enabled = "boolean",
  867. FlipbookFramerate = "NumberRange",
  868. FlipbookIncompatible = "string",
  869. FlipbookLayout = "EnumItem",
  870. FlipbookMode = "EnumItem",
  871. FlipbookStartRandom = "boolean",
  872. Lifetime = "NumberRange",
  873. LightEmission = "number",
  874. LockedToPart = "boolean",
  875. Orientation = "EnumItem",
  876. Rate = "number",
  877. RotSpeed = "NumberRange",
  878. Rotation = "NumberRange",
  879. Shape = "EnumItem",
  880. ShapeInOut = "EnumItem",
  881. ShapePartial = "number",
  882. ShapeStyle = "EnumItem",
  883. Size = "NumberSequence",
  884. Speed = "NumberRange",
  885. SpreadAngle = "Vector2",
  886. Squash = "NumberSequence",
  887. Texture = "string",
  888. TimeScale = "number",
  889. Transparency = "NumberSequence",
  890. VelocityInheritance = "number",
  891. WindAffectsDrag = "boolean",
  892. ZOffset = "number"
  893. }
  894. },
  895. ["PlaneConstraint"] = {
  896. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  897. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  898. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  899. CanView = "no" -- Can the camera focus on this instance?
  900. },
  901. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  902. UseCmnList_1 = "Constraint" -- Common properties that this class shares with others.
  903. }
  904. },
  905. ["Player"] = {
  906. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  907. Icon = "πŸ‘€", -- Emoji used to represent this instance when it's unselected.
  908. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  909. CanView = "no" -- Can the camera focus on this instance?
  910. },
  911. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  912. AutoJumpEnabled = "boolean",
  913. CameraMaxZoomDistance = "number",
  914. CameraMinZoomDistance = "number",
  915. CameraMode = "EnumItem",
  916. CanLoadCharacterAppearance = "boolean",
  917. Character = "Instance",
  918. CharacterAppearanceId = "number",
  919. DevCameraOcclusionMode = "EnumItem",
  920. DevComputerCameraMode = "EnumItem",
  921. DevComputerMovementMode = "EnumItem",
  922. DevEnableMouseLock = "boolean",
  923. DevTouchCameraMode = "EnumItem",
  924. DevTouchMovementMode = "EnumItem",
  925. DisplayName = "string",
  926. HealthDisplayDistance = "number",
  927. NameDisplayDistance = "number",
  928. Neutral = "boolean",
  929. -- ReplicationFocus = "Instance",
  930. -- RespawnLocation = "Instance",
  931. -- Team = "Instance",
  932. TeamColor = "BrickColor",
  933. UserId = "number"
  934. }
  935. },
  936. ["PlayerGui"] = {
  937. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  938. Icon = "πŸ“±", -- Emoji used to represent this instance when it's unselected.
  939. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  940. CanView = "no" -- Can the camera focus on this instance?
  941. },
  942. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  943. ScreenOrientation = "EnumItem",
  944. }
  945. },
  946. ["PointLight"] = {
  947. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  948. Icon = "πŸ’‘", -- Emoji used to represent this instance when it's unselected.
  949. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  950. CanView = "parent" -- Can the camera focus on this instance?
  951. },
  952. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  953. UseCmnList_1 = "Light", -- Common properties that this class shares with others.
  954. Range = "number"
  955. }
  956. },
  957. ["PrismaticConstraint"] = {
  958. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  959. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  960. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  961. CanView = "no" -- Can the camera focus on this instance?
  962. },
  963. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  964. UseCmnList_1 = "SlidingBallConstraint", -- Common properties that this class shares with others.
  965. UseCmnList_2 = "Constraint"
  966. }
  967. },
  968. ["RodConstraint"] = {
  969. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  970. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  971. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  972. CanView = "no" -- Can the camera focus on this instance?
  973. },
  974. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  975. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  976. Length = "boolean",
  977. LimitAngle0 = "number",
  978. LimitAngle1 = "number",
  979. LimitsEnabled = "boolean",
  980. Thickness = "number"
  981. }
  982. },
  983. ["RopeConstraint"] = {
  984. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  985. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  986. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  987. CanView = "no" -- Can the camera focus on this instance?
  988. },
  989. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  990. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  991. Length = "number",
  992. Restitution = "number",
  993. Thickness = "number",
  994. WinchEnabled = "boolean",
  995. WinchForce = "number",
  996. WinchResponsiveness = "number",
  997. WinchSpeed = "number",
  998. WinchTarget = "number"
  999. }
  1000. },
  1001. ["ScreenGui"] = {
  1002. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1003. Icon = "πŸ“±", -- Emoji used to represent this instance when it's unselected.
  1004. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1005. CanView = "no" -- Can the camera focus on this instance?
  1006. },
  1007. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1008. UseCmnList_1 = "LayerCollector", -- Common properties that this class shares with others.
  1009. UseCmnList_2 = "GuiBase2d",
  1010. ClipToDeviceSafeArea = "boolean",
  1011. DisplayOrder = "number",
  1012. IgnoreGuiInset = "boolean",
  1013. SafeAreaCompatibility = "EnumItem",
  1014. ScreenInsets = "EnumItem"
  1015. }
  1016. },
  1017. ["ScrollingFrame"] = {
  1018. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1019. Icon = "πŸ–Ό", -- Emoji used to represent this instance when it's unselected.
  1020. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1021. CanView = "no" -- Can the camera focus on this instance?
  1022. },
  1023. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1024. UseCmnList_1 = "GuiObject", -- Common properties that this class shares with others.
  1025. UseCmnList_2 = "GuiBase2d",
  1026. AutomaticCanvasSize = "EnumItem",
  1027. BottomImage = "string",
  1028. CanvasPosition = "Vector2",
  1029. CanvasSize = "UDim2",
  1030. ElasticBehavior = "EnumItem",
  1031. HorizontalScrollBarInset = "EnumItem",
  1032. MidImage = "string",
  1033. ScrollBarImageColor3 = "Color3",
  1034. ScrollBarImageTransparency = "number",
  1035. ScrollBarThickness = "number",
  1036. ScrollingDirection = "EnumItem",
  1037. ScrollingEnabled = "boolean",
  1038. TopImage = "string",
  1039. VerticalScrollBarInset = "EnumItem",
  1040. VerticalScrollBarPosition = "EnumItem"
  1041. }
  1042. },
  1043. ["Seat"] = {
  1044. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1045. Icon = "πŸͺ‘", -- Emoji used to represent this instance when it's unselected.
  1046. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1047. CanView = "yes" -- Can the camera focus on this instance?
  1048. },
  1049. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1050. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  1051. Shape = "EnumItem", -- Inherited from Part class
  1052. Disabled = "boolean"
  1053. }
  1054. },
  1055. ["Shirt"] = {
  1056. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1057. Icon = "πŸ‘•", -- Emoji used to represent this instance when it's unselected.
  1058. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1059. CanView = "parent" -- Can the camera focus on this instance?
  1060. },
  1061. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1062. ShirtTemplate = "string",
  1063. Color3 = "Color3" -- Inherited from Clothing class
  1064. }
  1065. },
  1066. ["ShirtGraphic"] = {
  1067. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1068. Icon = "🎽", -- Emoji used to represent this instance when it's unselected.
  1069. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1070. CanView = "parent" -- Can the camera focus on this instance?
  1071. },
  1072. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1073. Graphic = "string",
  1074. Color3 = "Color3"
  1075. }
  1076. },
  1077. ["Sky"] = {
  1078. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1079. Icon = "πŸŒ„", -- Emoji used to represent this instance when it's unselected.
  1080. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1081. CanView = "no" -- Can the camera focus on this instance?
  1082. },
  1083. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1084. CelestialBodiesShown = "boolean",
  1085. MoonAngularSize = "number",
  1086. MoonTextureId = "string",
  1087. SkyboxBk = "string",
  1088. SkyboxDn = "string",
  1089. SkyboxFt = "string",
  1090. SkyboxLf = "string",
  1091. SkyboxRt = "string",
  1092. SkyboxUp = "string",
  1093. StarCount = "number",
  1094. SunAngularSize = "number",
  1095. SunTextureId = "string"
  1096. }
  1097. },
  1098. ["Smoke"] = {
  1099. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1100. Icon = "☁", -- Emoji used to represent this instance when it's unselected.
  1101. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1102. CanView = "parent" -- Can the camera focus on this instance?
  1103. },
  1104. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1105. Color = "Color3",
  1106. Enabled = "boolean",
  1107. Opacity = "number",
  1108. RiseVelocity = "number",
  1109. Size = "number",
  1110. TimeScale = "number"
  1111. }
  1112. },
  1113. ["Sparkles"] = {
  1114. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1115. Icon = "✨", -- Emoji used to represent this instance when it's unselected.
  1116. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1117. CanView = "parent" -- Can the camera focus on this instance?
  1118. },
  1119. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1120. Color = "Color3",
  1121. Enabled = "boolean",
  1122. SparkleColor = "Color3",
  1123. TimeScale = "number"
  1124. }
  1125. },
  1126. ["SpawnLocation"] = {
  1127. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1128. Icon = "🌌", -- Emoji used to represent this instance when it's unselected.
  1129. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1130. CanView = "yes" -- Can the camera focus on this instance?
  1131. },
  1132. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1133. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  1134. Shape = "EnumItem", -- Inherited from Part class
  1135. AllowTeamChangeOnTouch = "boolean",
  1136. Duration = "number",
  1137. Enabled = "boolean",
  1138. Neutral = "boolean",
  1139. TeamColor = "BrickColor"
  1140. }
  1141. },
  1142. ["SpecialMesh"] = {
  1143. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1144. Icon = "πŸ₯˜", -- Emoji used to represent this instance when it's unselected.
  1145. CreateTest = false, -- Create an Instance of this type when testing the script in Roblox Studio.
  1146. CanView = "parent" -- Can the camera focus on this instance?
  1147. },
  1148. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1149. MeshType = "EnumItem",
  1150. MeshId = "string", -- Inherited from FileMesh
  1151. TextureId = "string", -- Inherited from FileMesh
  1152. Offset = "Vector3", -- Inherited from DataModelMesh
  1153. Scale = "Vector3", -- Inherited from DataModelMesh
  1154. VertexColor = "Vector3" -- Inherited from DataModelMesh
  1155. }
  1156. },
  1157. ["SpotLight"] = {
  1158. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1159. Icon = "πŸ’‘", -- Emoji used to represent this instance when it's unselected.
  1160. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1161. CanView = "parent" -- Can the camera focus on this instance?
  1162. },
  1163. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1164. UseCmnList_1 = "Light", -- Common properties that this class shares with others.
  1165. UseCmnList_2 = "SpotAndSurfaceLight"
  1166. }
  1167. },
  1168. ["SpringConstraint"] = {
  1169. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1170. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  1171. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1172. CanView = "no" -- Can the camera focus on this instance?
  1173. },
  1174. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1175. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  1176. Coils = "number",
  1177. Damping = "number",
  1178. FreeLength = "number",
  1179. LimitsEnabled = "boolean",
  1180. MaxForce = "number",
  1181. MaxLength = "number",
  1182. MinLength = "number",
  1183. Radius = "number",
  1184. Stiffness = "number",
  1185. Thickness = "number"
  1186. }
  1187. },
  1188. ["StringValue"] = {
  1189. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1190. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  1191. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1192. CanView = "no" -- Can the camera focus on this instance?
  1193. },
  1194. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1195. Value = "string"
  1196. }
  1197. },
  1198. ["SunRaysEffect"] = { -- Decals' properties are reused for Textures.
  1199. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1200. Icon = "🌞", -- Emoji used to represent this instance when it's unselected.
  1201. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1202. CanView = "no" -- Can the camera focus on this instance?
  1203. },
  1204. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1205. Enabled = "boolean", -- Inherited from PostEffect class
  1206. Intensity = "number",
  1207. Spread = "number"
  1208. }
  1209. },
  1210. ["SurfaceAppearance"] = {
  1211. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1212. Icon = "🏐", -- Emoji used to represent this instance when it's unselected.
  1213. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1214. CanView = "no" -- Can the camera focus on this instance?
  1215. },
  1216. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1217. UseCmnList_1 = "PBRMapSet", -- Common properties that this class shares with others.
  1218. AlphaMode = "EnumItem",
  1219. }
  1220. },
  1221. ["SurfaceGui"] = {
  1222. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1223. Icon = "🌘", -- Emoji used to represent this instance when it's unselected.
  1224. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1225. CanView = "no" -- Can the camera focus on this instance?
  1226. },
  1227. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1228. UseCmnList_1 = "LayerCollector", -- Common properties that this class shares with others.
  1229. UseCmnList_2 = "GuiBase2d",
  1230. UseCmnList_3 = "SurfaceGuiBase",
  1231. AlwaysOnTop = "boolean",
  1232. Brightness = "number",
  1233. CanvasSize = "Vector2",
  1234. ClipsDescendants = "boolean",
  1235. LightInfluence = "number",
  1236. MaxDistance = "number",
  1237. PixelsPerStud = "number",
  1238. SizingMode = "EnumItem",
  1239. ToolPunchThroughDistance = "number",
  1240. ZOffset = "number"
  1241. }
  1242. },
  1243. ["SurfaceLight"] = {
  1244. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1245. Icon = "πŸ’‘", -- Emoji used to represent this instance when it's unselected.
  1246. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1247. CanView = "parent" -- Can the camera focus on this instance?
  1248. },
  1249. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1250. UseCmnList_1 = "Light", -- Common properties that this class shares with others.
  1251. UseCmnList_2 = "SpotAndSurfaceLight"
  1252. }
  1253. },
  1254. ["TextBox"] = {
  1255. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1256. Icon = "πŸ–Š", -- Emoji used to represent this instance when it's unselected.
  1257. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1258. CanView = "no" -- Can the camera focus on this instance?
  1259. },
  1260. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1261. UseCmnList_1 = "GuiTextElement", -- Common properties that this class shares with others.
  1262. UseCmnList_2 = "GuiObject",
  1263. UseCmnList_3 = "GuiBase2d",
  1264. ClearTextOnFocus = "boolean",
  1265. -- CursorPosition = "number",
  1266. MultiLine = "boolean",
  1267. PlaceholderColor3 = "Color3",
  1268. PlaceholderText = "string",
  1269. -- SelectionStart = "number",
  1270. ShowNativeInput = "boolean",
  1271. TextEditable = "boolean"
  1272. }
  1273. },
  1274. ["TextButton"] = {
  1275. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1276. Icon = "πŸ” ", -- Emoji used to represent this instance when it's unselected.
  1277. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1278. CanView = "no" -- Can the camera focus on this instance?
  1279. },
  1280. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1281. UseCmnList_1 = "GuiTextElement", -- Common properties that this class shares with others.
  1282. UseCmnList_2 = "GuiButton",
  1283. UseCmnList_3 = "GuiObject",
  1284. UseCmnList_4 = "GuiBase2d"
  1285. }
  1286. },
  1287. ["TextLabel"] = {
  1288. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1289. Icon = "πŸ” ", -- Emoji used to represent this instance when it's unselected.
  1290. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1291. CanView = "no" -- Can the camera focus on this instance?
  1292. },
  1293. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1294. UseCmnList_1 = "GuiTextElement", -- Common properties that this class shares with others.
  1295. UseCmnList_2 = "GuiObject",
  1296. UseCmnList_3 = "GuiBase2d"
  1297. }
  1298. },
  1299. ["Texture"] = {
  1300. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1301. Icon = "πŸ“„", -- Emoji used to represent this instance when it's unselected.
  1302. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1303. CanView = "no" -- Can the camera focus on this instance?
  1304. },
  1305. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1306. UseCmnList_1 = "Decal", -- Common properties that this class shares with others.
  1307. OffsetStudsU = "number",
  1308. OffsetStudsV = "number",
  1309. StudsPerTileU = "number",
  1310. StudsPerTileV = "number"
  1311. }
  1312. },
  1313. ["Tool"] = {
  1314. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1315. Icon = "πŸ› ", -- Emoji used to represent this instance when it's unselected.
  1316. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1317. CanView = "child" -- Can the camera focus on this instance?
  1318. },
  1319. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1320. UseCmnList_1 = "Model", -- Common properties that this class shares with others.
  1321. CanBeDropped = "boolean",
  1322. Enabled = "boolean",
  1323. Grip = "CFrame",
  1324. ManualActivationOnly = "boolean",
  1325. RequiresHandle = "boolean",
  1326. ToolTip = "string",
  1327. TextureId = "string" -- Inherited from BackpackItem
  1328. }
  1329. },
  1330. ["Trail"] = {
  1331. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1332. Icon = "πŸŽ—", -- Emoji used to represent this instance when it's unselected.
  1333. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1334. CanView = "parent" -- Can the camera focus on this instance?
  1335. },
  1336. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1337. Attachment0 = "Instance",
  1338. Attachment1 = "Instance",
  1339. LightInfluence = "number", -- Brightness is only used if LightInfluence is set to a low value.
  1340. Brightness = "number",
  1341. Color = "ColorSequence",
  1342. Enabled = "boolean",
  1343. FaceCamera = "boolean",
  1344. Lifetime = "number",
  1345. LightEmission = "number",
  1346. MaxLength = "number",
  1347. MinLength = "number",
  1348. Texture = "string",
  1349. TextureLength = "number",
  1350. TextureMode = "EnumItem",
  1351. Transparency = "number",
  1352. WidthScale = "NumberSequence"
  1353. }
  1354. },
  1355. ["TrussPart"] = {
  1356. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1357. Icon = "πŸ’ˆ", -- Emoji used to represent this instance when it's unselected.
  1358. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1359. CanView = "yes" -- Can the camera focus on this instance?
  1360. },
  1361. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1362. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  1363. Style = "EnumItem"
  1364. }
  1365. },
  1366. ["UIAspectRatioConstraint"] = {
  1367. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1368. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1369. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1370. CanView = "no" -- Can the camera focus on this instance?
  1371. },
  1372. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1373. AspectRatio = "number",
  1374. AspectType = "EnumItem",
  1375. DominantAxis = "EnumItem"
  1376. }
  1377. },
  1378. ["UICorner"] = {
  1379. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1380. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1381. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1382. CanView = "no" -- Can the camera focus on this instance?
  1383. },
  1384. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1385. CornerRadius = "UDim"
  1386. }
  1387. },
  1388. ["UIFlexItem"] = {
  1389. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1390. Icon = "πŸ”›", -- Emoji used to represent this instance when it's unselected.
  1391. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1392. CanView = "no" -- Can the camera focus on this instance?
  1393. },
  1394. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1395. FlexMode = "EnumItem",
  1396. GrowRatio = "number",
  1397. ItemLineAlignment = "EnumItem",
  1398. ShrinkRatio = "number"
  1399. }
  1400. },
  1401. ["UIGradient"] = {
  1402. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1403. Icon = "🎨", -- Emoji used to represent this instance when it's unselected.
  1404. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1405. CanView = "no" -- Can the camera focus on this instance?
  1406. },
  1407. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1408. Color = "ColorSequence",
  1409. Enabled = "boolean",
  1410. Offset = "Vector2",
  1411. Rotation = "number",
  1412. Transparency = "NumberSequence"
  1413. }
  1414. },
  1415. ["UIGridLayout"] = {
  1416. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1417. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1418. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1419. CanView = "no", -- Can the camera focus on this instance?
  1420. },
  1421. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1422. UseCmnList_1 = "UIGridStyleLayout",
  1423. CellPadding = "UDim2",
  1424. CellSize = "UDim2",
  1425. FillDirectionMaxCells = "number",
  1426. StartCorner = "EnumItem"
  1427. }
  1428. },
  1429. ["UIListLayout"] = {
  1430. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1431. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1432. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1433. CanView = "no" -- Can the camera focus on this instance?
  1434. },
  1435. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1436. UseCmnList_1 = "UIGridStyleLayout",
  1437. HorizontalFlex = "EnumItem",
  1438. ItemLineAlignment = "EnumItem",
  1439. Padding = "UDim",
  1440. VerticalFlex = "EnumItem",
  1441. Wraps = "boolean"
  1442. }
  1443. },
  1444. ["UIPadding"] = {
  1445. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1446. Icon = "β—»", -- Emoji used to represent this instance when it's unselected.
  1447. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1448. CanView = "no" -- Can the camera focus on this instance?
  1449. },
  1450. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1451. PaddingBottom = "UDim",
  1452. PaddingLeft = "UDim",
  1453. PaddingRight = "UDim",
  1454. PaddingTop = "UDim"
  1455. }
  1456. },
  1457. ["UIPageLayout"] = {
  1458. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1459. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1460. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1461. CanView = "no", -- Can the camera focus on this instance?
  1462. },
  1463. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1464. UseCmnList_1 = "UIGridStyleLayout",
  1465. Animated = "boolean",
  1466. Circular = "boolean",
  1467. EasingDirection = "EnumItem",
  1468. EasingStyle = "EnumItem",
  1469. GamepadInputEnabled = "boolean",
  1470. Padding = "UDim",
  1471. ScrollWheelInputEnabled = "boolean",
  1472. TouchInputEnabled = "boolean",
  1473. TweenTime = "number"
  1474. }
  1475. },
  1476. ["UIScale"] = {
  1477. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1478. Icon = "β†—", -- Emoji used to represent this instance when it's unselected.
  1479. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1480. CanView = "no" -- Can the camera focus on this instance?
  1481. },
  1482. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1483. Scale = "number"
  1484. }
  1485. },
  1486. ["UISizeConstraint"] = {
  1487. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1488. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1489. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1490. CanView = "no" -- Can the camera focus on this instance?
  1491. },
  1492. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1493. MaxSize = "Vector2",
  1494. MinSize = "Vector2"
  1495. }
  1496. },
  1497. ["UIStroke"] = {
  1498. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1499. Icon = "πŸ–‡", -- Emoji used to represent this instance when it's unselected.
  1500. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1501. CanView = "no" -- Can the camera focus on this instance?
  1502. },
  1503. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1504. ApplyStrokeMode = "EnumItem",
  1505. Color = "Color3",
  1506. Enabled = "boolean",
  1507. LineJoinMode = "EnumItem",
  1508. Thickness = "number",
  1509. Transparency = "number"
  1510. }
  1511. },
  1512. ["UITableLayout"] = {
  1513. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1514. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1515. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1516. CanView = "no", -- Can the camera focus on this instance?
  1517. },
  1518. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1519. UseCmnList_1 = "UIGridStyleLayout",
  1520. FillEmptySpaceColumns = "boolean",
  1521. FillEmptySpaceRows = "boolean",
  1522. MajorAxis = "EnumItem",
  1523. Padding = "UDim2"
  1524. }
  1525. },
  1526. ["UITextSizeConstraint"] = {
  1527. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1528. Icon = "⏹", -- Emoji used to represent this instance when it's unselected.
  1529. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1530. CanView = "no" -- Can the camera focus on this instance?
  1531. },
  1532. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1533. MaxTextSize = "number",
  1534. MinTextSize = "number"
  1535. }
  1536. },
  1537. ["UniversalConstraint"] = {
  1538. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1539. Icon = "🧷", -- Emoji used to represent this instance when it's unselected.
  1540. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1541. CanView = "no" -- Can the camera focus on this instance?
  1542. },
  1543. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1544. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  1545. LimitsEnabled = "boolean",
  1546. MaxAngle = "number",
  1547. Radius = "number",
  1548. Restitution = "number"
  1549. }
  1550. },
  1551. ["Vector3Value"] = {
  1552. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1553. Icon = "πŸ”’", -- Emoji used to represent this instance when it's unselected.
  1554. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1555. CanView = "no" -- Can the camera focus on this instance?
  1556. },
  1557. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1558. Value = "Vector3"
  1559. }
  1560. },
  1561. ["VectorForce"] = {
  1562. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1563. Icon = "β†—", -- Emoji used to represent this instance when it's unselected.
  1564. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1565. CanView = "no" -- Can the camera focus on this instance?
  1566. },
  1567. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1568. UseCmnList_1 = "Constraint", -- Common properties that this class shares with others.
  1569. ApplyAtCenterOfMass = "boolean",
  1570. Force = "Vector3",
  1571. RelativeTo = "EnumItem"
  1572. }
  1573. },
  1574. ["VehicleSeat"] = {
  1575. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1576. Icon = "πŸš—", -- Emoji used to represent this instance when it's unselected.
  1577. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1578. CanView = "yes" -- Can the camera focus on this instance?
  1579. },
  1580. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1581. UseCmnList_1 = "BasePart", -- Use all of the properties shared by all BasePart instances.
  1582. Disabled = "boolean",
  1583. HeadsUpDisplay = "boolean",
  1584. MaxSpeed = "number",
  1585. Torque = "number",
  1586. TurnSpeed = "number"
  1587. }
  1588. },
  1589. ["ViewportFrame"] = {
  1590. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1591. Icon = "πŸ“Š", -- Emoji used to represent this instance when it's unselected.
  1592. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1593. CanView = "no" -- Can the camera focus on this instance?
  1594. },
  1595. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1596. UseCmnList_1 = "GuiObject", -- Common properties that this class shares with others.
  1597. UseCmnList_2 = "GuiBase2d",
  1598. Ambient = "Color3",
  1599. CurrentCamera = "Instance",
  1600. ImageColor3 = "Color3",
  1601. ImageTransparency = "number",
  1602. LightColor = "Color3",
  1603. LightDirection = "Vector3"
  1604. }
  1605. },
  1606. ["WedgePart"] = {
  1607. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1608. Icon = "🧱", -- Emoji used to represent this instance when it's unselected.
  1609. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1610. CanView = "yes" -- Can the camera focus on this instance?
  1611. },
  1612. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1613. UseCmnList_1 = "BasePart" -- Use all of the properties shared by all BasePart instances.
  1614. }
  1615. },
  1616. ["Weld"] = {
  1617. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1618. Icon = "πŸ”—", -- Emoji used to represent this instance when it's unselected.
  1619. CreateTest = true, -- Create an Instance of this type when testing the script in Roblox Studio.
  1620. CanView = "no" -- Can the camera focus on this instance?
  1621. },
  1622. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1623. UseCmnList_1 = "JointInstance"
  1624. }
  1625. },
  1626. ["WorldModel"] = {
  1627. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1628. Icon = "🌎", -- Emoji used to represent this instance when it's unselected.
  1629. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1630. CanView = "no" -- Can the camera focus on this instance?
  1631. },
  1632. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1633. UseCmnList_1 = "Model" -- Common properties that this class shares with others.
  1634. }
  1635. },
  1636. ["WrapLayer"] = {
  1637. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1638. Icon = "↔", -- Emoji used to represent this instance when it's unselected.
  1639. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1640. CanView = "no" -- Can the camera focus on this instance?
  1641. },
  1642. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1643. UseCmnList_1 = "BaseWrap", -- Common properties that this class shares with others.
  1644. AutoSkin = "EnumItem",
  1645. BindOffset = "CFrame",
  1646. Enabled = "boolean",
  1647. Order = "number",
  1648. Puffiness = "number",
  1649. ReferenceMeshId = "string",
  1650. ReferenceOrigin = "CFrame",
  1651. ShrinkFactor = "number"
  1652. }
  1653. },
  1654. ["WrapTarget"] = {
  1655. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1656. Icon = "↔", -- Emoji used to represent this instance when it's unselected.
  1657. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1658. CanView = "no" -- Can the camera focus on this instance?
  1659. },
  1660. Props = { -- List of properties that should be saved or loaded to/from JSON for this instance.
  1661. UseCmnList_1 = "BaseWrap", -- Common properties that this class shares with others.
  1662. Stiffness = "number"
  1663. }
  1664. },
  1665.  
  1666. -- The four Instance classes below are only ever displayed in the list, never exported or imported, so they're intentionally folder-like.
  1667. ["Workspace"] = {
  1668. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1669. Icon = "🌎", -- Emoji used to represent this instance when it's unselected.
  1670. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1671. CanView = "no" -- Can the camera focus on this instance?
  1672. }
  1673. },
  1674. ["Players"] = {
  1675. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1676. Icon = "πŸ‘₯", -- Emoji used to represent this instance when it's unselected.
  1677. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1678. CanView = "no" -- Can the camera focus on this instance?
  1679. }
  1680. },
  1681. ["Lighting"] = {
  1682. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1683. Icon = "🌀", -- Emoji used to represent this instance when it's unselected.
  1684. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1685. CanView = "no" -- Can the camera focus on this instance?
  1686. }
  1687. },
  1688. ["ReplicatedStorage"] = {
  1689. ListView = { -- Properties that customize how this instance is displayed in the list (only used in the script).
  1690. Icon = "πŸ“¦", -- Emoji used to represent this instance when it's unselected.
  1691. CreateTest = false, -- Don't attempt to make an Instance of this type if testing the script in Roblox Studio.
  1692. CanView = "no" -- Can the camera focus on this instance?
  1693. }
  1694. },
  1695. }
  1696.  
  1697. -- StoreValue (takes any and string, returns varied content)
  1698. -- Takes an arbitrary value and tries to convert it to a value which could be stored in a JSON dictionary. For
  1699. -- most variable types, this just takes its components and splits them up into a basic array.
  1700. local function StoreValue(_value , _type )
  1701. -- While the "type" argument is respected in most of this function, if the value provided is nil, it takes priority over everything else.
  1702. --
  1703. if typeof(_value) == "nil" then
  1704. return nil -- JSON supports nil values! It writes "null" instead of "nil".
  1705. end
  1706.  
  1707. -- Basic variables can be used as-is, safely.
  1708. if _type == "boolean" or _type == "number" or _type == "string" then
  1709. return _value
  1710. elseif _type == "Color3" then
  1711. return {_value.R, _value.G, _value.B}
  1712. elseif _type == "BrickColor" then
  1713. return _value.Name -- Store the BrickColor's name, which can be used to recreate it later using BrickColor.new([name]).
  1714. elseif _type == "ColorSequence" or _type == "NumberSequence" then -- Sequences will be stored in their "string" form.
  1715. if _value and tostring(_value):sub(-1,-1) ~= " " then return tostring(_value) -- If the string doesn't end in an erroneous space, save as-is.
  1716. else return tostring(_value):sub(1,-2) -- Does it? If so, don't include the last character!
  1717. end
  1718. elseif _type == "NumberRange" then
  1719. return {_value.Min, _value.Max}
  1720. elseif _type == "UDim" then
  1721. return {_value.Scale, _value.Offset}
  1722. elseif _type == "UDim2" then
  1723. return {_value.Width.Scale, _value.Width.Offset, _value.Height.Scale, _value.Height.Offset}
  1724. elseif _type == "Rect" then -- Rects are stored as the minimum Vector2 XY values followed by their "max" counterparts. Use Rect.new([1],[2],[3],[4])!
  1725. return {_value.Min.X,_value.Min.Y,_value.Max.X,_value.Max.Y}
  1726. elseif _type == "Font" then
  1727. return {_value.Family, _value.Weight.Value, _value.Style.Value} -- Save this font's properties. Reconstruct it using Font.new(family, weight, style).
  1728. elseif _type == "Vector2" then
  1729. return {_value.X, _value.Y}
  1730. elseif _type == "Vector3" then
  1731. return {_value.X, _value.Y, _value.Z}
  1732. elseif _type == "EnumItem" then -- Store the Enum's name, followed by the item within it. Reconstruct using Enum[item 1][item 2].
  1733. return {tostring(_value.EnumType), _value.Name}
  1734. elseif _type == "CFrame" then
  1735. local X,Y,Z,R00,R01,R02,R10,R11,R12,R20,R21,R22 = _value:GetComponents()
  1736. return {X,Y,Z,R00,R01,R02,R10,R11,R12,R20,R21,R22} -- Return all components of this CoordinateFrame.
  1737. elseif _type == "Instance" then
  1738. local DebugIDMatch = nil -- By default, this function will store the equivalent of "nil" if nothing's found.
  1739. for i , v in pairs(DebugIDList) do -- Iterate through the debug ID list and try to find this instance's ID within it.
  1740. if v == _value then
  1741. DebugIDMatch = i -- If a match is found, we'll use that in place of a proper Instance reference.
  1742. break
  1743. end
  1744. end
  1745.  
  1746. return DebugIDMatch -- If this instance's debug ID wasn't found, this will store "nil" instead, which should be fine.
  1747. elseif _type == "PhysicalProperties" then
  1748. return {
  1749. _value.Density,
  1750. _value.Friction,
  1751. _value.Elasticity,
  1752. _value.FrictionWeight,
  1753. _value.ElasticityWeight
  1754. }
  1755. elseif _type == "Faces" then -- Create a list filled with Enum.FaceId values that can be passed to Faces.new() to reconstruct it.
  1756. local __value = nil
  1757. local FaceIdList = {}
  1758. if __value.Top then table.insert(FaceIdList, 1) end
  1759. if __value.Bottom then table.insert(FaceIdList, 4) end
  1760. if __value.Left then table.insert(FaceIdList, 3) end
  1761. if __value.Right then table.insert(FaceIdList, 0) end
  1762. if __value.Back then table.insert(FaceIdList, 2) end
  1763. if __value.Front then table.insert(FaceIdList, 5) end
  1764. return FaceIdList
  1765. end
  1766. end
  1767.  
  1768. --[[
  1769. Roblox2Lua
  1770. ----------
  1771.  
  1772. This code was generated using
  1773. Deluct's Roblox2Lua plugin.
  1774. ]]--
  1775.  
  1776. --// Instances
  1777.  
  1778. local xane_mdlrecreator_gui = Instance.new("ScreenGui")
  1779. xane_mdlrecreator_gui.IgnoreGuiInset = false
  1780. xane_mdlrecreator_gui.ResetOnSpawn = true
  1781. xane_mdlrecreator_gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
  1782. xane_mdlrecreator_gui.Name = "XaneMDLRecreatorGUI"
  1783. xane_mdlrecreator_gui:SetAttribute("XaneProtectedDoNotShowInReconstructorGui",true) -- Hide this instance from the Reconstructor script itself.
  1784. xane_mdlrecreator_gui.Parent = game:GetService("CoreGui")
  1785.  
  1786. -- TOP BUTTONS (HIDE & CANCEL BUTTONS)
  1787. local toggle_frame = Instance.new("Frame")
  1788. toggle_frame.AnchorPoint = Vector2.new(0.5, 0)
  1789. toggle_frame.BackgroundTransparency = 1
  1790. toggle_frame.BorderSizePixel = 0
  1791. toggle_frame.Position = UDim2.new(0.5, 0, 0.0625, 0)
  1792. toggle_frame.Size = UDim2.new(0.25, 0, 0.09375, 0)
  1793. toggle_frame.SizeConstraint = Enum.SizeConstraint.RelativeYY
  1794. toggle_frame.Visible = true
  1795. toggle_frame.Name = "ToggleFrame"
  1796. toggle_frame.Parent = xane_mdlrecreator_gui
  1797.  
  1798. local toggle_list_layout = Instance.new("UIListLayout")
  1799. toggle_list_layout.Name = "ToggleBtnList"
  1800. toggle_list_layout.FillDirection = Enum.FillDirection.Horizontal
  1801. toggle_list_layout.Padding = UDim.new(0.001,0)
  1802. toggle_list_layout.Parent = toggle_frame
  1803.  
  1804. local toggle_button = Instance.new("TextButton")
  1805. toggle_button.Font = Enum.Font.RobotoCondensed
  1806. toggle_button.Text = "Save Instances!"
  1807. toggle_button.TextColor3 = Color3.new(1, 1, 1)
  1808. toggle_button.TextScaled = true
  1809. toggle_button.TextSize = 14
  1810. toggle_button.TextStrokeTransparency = 0
  1811. toggle_button.TextWrapped = true
  1812. -- toggle_button.AnchorPoint = Vector2.new(0.5, 0.5)
  1813. toggle_button.BackgroundColor3 = Color3.new(0.882353, 0.756863, 0.615686)
  1814. toggle_button.BorderColor3 = Color3.new(0, 0, 0)
  1815. toggle_button.BorderSizePixel = 0
  1816. -- toggle_button.Position = UDim2.new(0.5, 0, 0.5, 0)
  1817. toggle_button.Size = UDim2.fromScale(0.5, 1)
  1818. toggle_button.LayoutOrder = 1
  1819. toggle_button.Visible = true
  1820. toggle_button.Name = "ToggleButton"
  1821. toggle_button.Parent = toggle_frame
  1822.  
  1823. local clear_button = Instance.new("TextButton")
  1824. clear_button.Font = Enum.Font.RobotoCondensed
  1825. clear_button.Text = "Clear Selection"
  1826. clear_button.TextColor3 = Color3.new(1, 1, 1)
  1827. clear_button.TextScaled = true
  1828. clear_button.TextSize = 14
  1829. clear_button.TextStrokeTransparency = 0
  1830. clear_button.TextWrapped = true
  1831. -- clear_button.AnchorPoint = Vector2.new(0.5, 0.5)
  1832. clear_button.BackgroundColor3 = Color3.new(0.882353, 0.623529, 0.686275)
  1833. clear_button.BorderColor3 = Color3.new(0, 0, 0)
  1834. clear_button.BorderSizePixel = 0
  1835. -- clear_button.Position = UDim2.new(0.5, 0, 0.5, 0)
  1836. clear_button.Size = UDim2.fromScale(0.5, 1)
  1837. clear_button.LayoutOrder = 2
  1838. clear_button.Visible = false
  1839. clear_button.Name = "ClearButton"
  1840. clear_button.Parent = toggle_frame
  1841.  
  1842. local uicorner = Instance.new("UICorner")
  1843. uicorner.CornerRadius = UDim.new(0.125, 0)
  1844. uicorner.Parent = toggle_button
  1845.  
  1846. -- THE MAIN WINDOW
  1847. local main_frame = Instance.new("Frame")
  1848. main_frame.AnchorPoint = Vector2.one / 2
  1849. main_frame.BackgroundColor3 = Color3.new(0.219608, 0.321569, 0.627451)
  1850. main_frame.BackgroundTransparency = 0.25
  1851. main_frame.BorderColor3 = Color3.new(0, 0, 0)
  1852. main_frame.BorderSizePixel = 0
  1853. main_frame.Position = UDim2.fromScale(0.5, 1.75) -- This Frame starts off-screen, revealed by clicking the toggle button at the top of the screen.
  1854. main_frame.Size = UDim2.fromScale(0.75, 0.725)
  1855. main_frame.Visible = true
  1856. main_frame.ZIndex = 2
  1857. main_frame.Name = "MainFrame"
  1858. main_frame.Parent = xane_mdlrecreator_gui
  1859.  
  1860. local uicorner_2 = Instance.new("UICorner")
  1861. uicorner_2.CornerRadius = UDim.new(0.025, 0)
  1862. uicorner_2.Parent = main_frame
  1863.  
  1864. --- STATUS MESSAGE
  1865. local message = Instance.new("TextLabel")
  1866. message.Font = Enum.Font.Gotham
  1867. message.Text = DefaultMessage
  1868. message.TextColor3 = Color3.new(1, 1, 1)
  1869. message.TextScaled = true
  1870. message.TextSize = 14
  1871. message.TextStrokeTransparency = 0
  1872. message.TextWrapped = true
  1873. message.AutomaticSize = Enum.AutomaticSize.Y
  1874. message.BackgroundColor3 = Color3.new(1, 1, 1)
  1875. message.BackgroundTransparency = 1
  1876. message.BorderColor3 = Color3.new(0, 0, 0)
  1877. message.BorderSizePixel = 0
  1878. message.LayoutOrder = 2
  1879. message.Size = UDim2.new(1, 0, 0.0625, 0)
  1880. message.Visible = true
  1881. message.Name = "Message"
  1882. message.Parent = main_frame
  1883.  
  1884. local uitext_size_constraint = Instance.new("UITextSizeConstraint")
  1885. uitext_size_constraint.MaxTextSize = 24
  1886. uitext_size_constraint.MinTextSize = 8
  1887. uitext_size_constraint.Parent = message
  1888.  
  1889. local top_bar = Instance.new("Frame")
  1890. top_bar.AnchorPoint = Vector2.xAxis / 2
  1891. top_bar.BackgroundTransparency = 1
  1892. top_bar.BorderSizePixel = 0
  1893. top_bar.LayoutOrder = 1
  1894. top_bar.Position = UDim2.new(0.5, 0, 0, 4)
  1895. top_bar.Size = UDim2.new(1,-8, 0.094,0)
  1896. top_bar.Visible = true
  1897. top_bar.Name = "TopBar"
  1898. top_bar.Parent = main_frame
  1899.  
  1900. local topbar_layout = Instance.new("UIListLayout")
  1901. topbar_layout.HorizontalFlex = Enum.UIFlexAlignment.None
  1902. topbar_layout.Padding = UDim.new(0, 4)
  1903. topbar_layout.FillDirection = Enum.FillDirection.Horizontal
  1904. topbar_layout.HorizontalAlignment = Enum.HorizontalAlignment.Right
  1905. topbar_layout.SortOrder = Enum.SortOrder.LayoutOrder
  1906. topbar_layout.Parent = top_bar
  1907.  
  1908. -- CONTAINER BUTTONS
  1909. local container1 = Instance.new("TextButton")
  1910. container1.Font = Enum.Font.RobotoCondensed
  1911. container1.Text = "🌎Workspace"
  1912. container1.TextColor3 = Color3.new(1, 1, 1)
  1913. container1.TextScaled = true
  1914. container1.TextSize = 14
  1915. container1.TextStrokeTransparency = 0
  1916. container1.TextWrapped = true
  1917. container1.Modal = true
  1918. container1.AutomaticSize = Enum.AutomaticSize.X
  1919. container1.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  1920. container1.BorderColor3 = Color3.new(0, 0, 0)
  1921. container1.BorderSizePixel = 0
  1922. container1.LayoutOrder = 1
  1923. container1.Size = UDim2.fromScale(0.125,1)
  1924. container1.SizeConstraint = Enum.SizeConstraint.RelativeXY
  1925. container1.Visible = true
  1926. container1.Name = "Container1"
  1927. container1.Parent = top_bar
  1928.  
  1929. local uitext_size_constraint_2 = Instance.new("UITextSizeConstraint")
  1930. uitext_size_constraint_2.MaxTextSize = 24
  1931. uitext_size_constraint_2.MinTextSize = 6
  1932. uitext_size_constraint_2.Parent = container1
  1933.  
  1934. local container4 = Instance.new("TextButton")
  1935. container4.Font = Enum.Font.RobotoCondensed
  1936. container4.Text = "πŸ“¦ReplicatedStorage"
  1937. container4.TextColor3 = Color3.new(1, 1, 1)
  1938. container4.TextScaled = true
  1939. container4.TextSize = 14
  1940. container4.TextStrokeTransparency = 0
  1941. container4.TextWrapped = true
  1942. container4.Modal = true
  1943. container4.AutomaticSize = Enum.AutomaticSize.X
  1944. container4.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  1945. container4.BorderColor3 = Color3.new(0, 0, 0)
  1946. container4.BorderSizePixel = 0
  1947. container4.LayoutOrder = 4
  1948. container4.Size = UDim2.fromScale(0.125,1)
  1949. container4.SizeConstraint = Enum.SizeConstraint.RelativeXY
  1950. container4.Visible = true
  1951. container4.Name = "Container4"
  1952. container4.Parent = top_bar
  1953.  
  1954. local uitext_size_constraint_3 = Instance.new("UITextSizeConstraint")
  1955. uitext_size_constraint_3.MaxTextSize = 24
  1956. uitext_size_constraint_3.MinTextSize = 6
  1957. uitext_size_constraint_3.Parent = container4
  1958.  
  1959. local container3 = Instance.new("TextButton")
  1960. container3.Font = Enum.Font.RobotoCondensed
  1961. container3.Text = "🌟Lighting"
  1962. container3.TextColor3 = Color3.new(1, 1, 1)
  1963. container3.TextScaled = true
  1964. container3.TextSize = 14
  1965. container3.TextStrokeTransparency = 0
  1966. container3.TextWrapped = true
  1967. container3.Modal = true
  1968. container3.AutomaticSize = Enum.AutomaticSize.X
  1969. container3.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  1970. container3.BorderColor3 = Color3.new(0, 0, 0)
  1971. container3.BorderSizePixel = 0
  1972. container3.LayoutOrder = 3
  1973. container3.Size = UDim2.fromScale(0.125,1)
  1974. container3.SizeConstraint = Enum.SizeConstraint.RelativeXY
  1975. container3.Visible = true
  1976. container3.Name = "Container3"
  1977. container3.Parent = top_bar
  1978.  
  1979. local uitext_size_constraint_4 = Instance.new("UITextSizeConstraint")
  1980. uitext_size_constraint_4.MaxTextSize = 24
  1981. uitext_size_constraint_4.MinTextSize = 6
  1982. uitext_size_constraint_4.Parent = container3
  1983.  
  1984. local container2 = Instance.new("TextButton")
  1985. container2.Font = Enum.Font.RobotoCondensed
  1986. container2.Text = "πŸ‘₯Players"
  1987. container2.TextColor3 = Color3.new(1, 1, 1)
  1988. container2.TextScaled = true
  1989. container2.TextSize = 14
  1990. container2.TextStrokeTransparency = 0
  1991. container2.TextWrapped = true
  1992. container2.Modal = true
  1993. container2.AutomaticSize = Enum.AutomaticSize.X
  1994. container2.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  1995. container2.BorderColor3 = Color3.new(0, 0, 0)
  1996. container2.BorderSizePixel = 0
  1997. container2.LayoutOrder = 2
  1998. container2.Size = UDim2.fromScale(0.125,1)
  1999. container2.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2000. container2.Visible = true
  2001. container2.Name = "Container2"
  2002. container2.Parent = top_bar
  2003.  
  2004. local container5 = Instance.new("TextButton")
  2005. container5.Font = Enum.Font.RobotoCondensed
  2006. container5.Text = "πŸ•ΊπŸΌCharacters"
  2007. container5.TextColor3 = Color3.new(1, 1, 1)
  2008. container5.TextScaled = true
  2009. container5.TextSize = 14
  2010. container5.TextStrokeTransparency = 0
  2011. container5.TextWrapped = true
  2012. container5.Modal = true
  2013. container5.AutomaticSize = Enum.AutomaticSize.X
  2014. container5.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  2015. container5.BorderColor3 = Color3.new(0, 0, 0)
  2016. container5.BorderSizePixel = 0
  2017. container5.LayoutOrder = 0
  2018. container5.Size = UDim2.fromScale(0.1,1)
  2019. container5.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2020. container5.Visible = true
  2021. container5.Name = "Container5"
  2022. container5.Parent = top_bar
  2023.  
  2024. local uitext_size_constraint_5 = Instance.new("UITextSizeConstraint")
  2025. uitext_size_constraint_5.MaxTextSize = 24
  2026. uitext_size_constraint_5.MinTextSize = 6
  2027. uitext_size_constraint_5.Parent = container2
  2028.  
  2029. local uilist_layout_2 = Instance.new("UIListLayout")
  2030. uilist_layout_2.Padding = UDim.new(0, 4)
  2031. uilist_layout_2.VerticalFlex = Enum.UIFlexAlignment.Fill
  2032. uilist_layout_2.HorizontalAlignment = Enum.HorizontalAlignment.Center
  2033. uilist_layout_2.SortOrder = Enum.SortOrder.LayoutOrder
  2034. uilist_layout_2.Parent = main_frame
  2035.  
  2036. local instance_list = Instance.new("ScrollingFrame")
  2037. instance_list.AutomaticCanvasSize = Enum.AutomaticSize.Y
  2038. instance_list.CanvasSize = UDim2.new(0, 0, 0, 0)
  2039. instance_list.BackgroundColor3 = Color3.new(1, 1, 1)
  2040. instance_list.BackgroundTransparency = 1
  2041. instance_list.BorderColor3 = Color3.new(0, 0, 0)
  2042. instance_list.BorderSizePixel = 0
  2043. instance_list.LayoutOrder = 3
  2044. instance_list.Size = UDim2.new(1, 0, 0.675, 0)
  2045. instance_list.Visible = true
  2046. instance_list.Name = "InstanceList"
  2047. instance_list.Parent = main_frame
  2048.  
  2049. local uilist_layout_3 = Instance.new("UIListLayout")
  2050. uilist_layout_3.Padding = UDim.new(0, 8)
  2051. uilist_layout_3.HorizontalAlignment = Enum.HorizontalAlignment.Center
  2052. uilist_layout_3.SortOrder = Enum.SortOrder.LayoutOrder
  2053. uilist_layout_3.Parent = instance_list
  2054.  
  2055. -- "EXPLORER" ROW TEMPLATE
  2056. local template_entry = Instance.new("Frame")
  2057. template_entry.BackgroundColor3 = Color3.new(1, 1, 1)
  2058. template_entry.BackgroundTransparency = 0.875
  2059. template_entry.BorderColor3 = Color3.new(0, 0, 0)
  2060. template_entry.BorderSizePixel = 0
  2061. template_entry.Size = UDim2.new(1, 0, 0.0925, 0)
  2062. template_entry.Visible = false
  2063. template_entry.Name = "TemplateEntry"
  2064. template_entry.Parent = instance_list
  2065.  
  2066. local checkbox_button = Instance.new("TextButton")
  2067. checkbox_button.Font = Enum.Font.SourceSans
  2068. checkbox_button.Text = "❗"
  2069. checkbox_button.TextColor3 = Color3.new(0, 0, 0)
  2070. checkbox_button.TextScaled = true
  2071. checkbox_button.TextSize = 14
  2072. checkbox_button.TextWrapped = true
  2073. checkbox_button.Modal = true
  2074. checkbox_button.BackgroundColor3 = Color3.new(1, 1, 1)
  2075. checkbox_button.BackgroundTransparency = 1
  2076. checkbox_button.BorderColor3 = Color3.new(0, 0, 0)
  2077. checkbox_button.BorderSizePixel = 0
  2078. checkbox_button.LayoutOrder = 2
  2079. checkbox_button.Size = UDim2.new(1, 0, 1, 0)
  2080. checkbox_button.SizeConstraint = Enum.SizeConstraint.RelativeYY
  2081. checkbox_button.Visible = true
  2082. checkbox_button.Name = "SelectButton"
  2083. checkbox_button.Parent = template_entry
  2084.  
  2085. local uilist_layout_4 = Instance.new("UIListLayout")
  2086. uilist_layout_4.HorizontalFlex = Enum.UIFlexAlignment.None
  2087. uilist_layout_4.FillDirection = Enum.FillDirection.Horizontal
  2088. uilist_layout_4.SortOrder = Enum.SortOrder.LayoutOrder
  2089. uilist_layout_4.Parent = template_entry
  2090.  
  2091. local indent = Instance.new("Frame")
  2092. indent.BackgroundColor3 = Color3.new(1, 1, 1)
  2093. indent.BackgroundTransparency = 1
  2094. indent.BorderSizePixel = 0
  2095. indent.LayoutOrder = 1
  2096. indent.Size = UDim2.fromScale(0.01825, 1)
  2097. indent.Visible = false
  2098. indent.Name = "Indent"
  2099. indent.Parent = template_entry
  2100.  
  2101. local indent_outline = Instance.new("UIStroke")
  2102. indent_outline.Color = Color3.new(0.825,0.933,1)
  2103. indent_outline.Transparency = 0.725
  2104. indent_outline.Thickness = 1
  2105. indent_outline.Parent = indent
  2106.  
  2107. local inst_name = Instance.new("TextLabel")
  2108. inst_name.Font = Enum.Font.RobotoCondensed
  2109. inst_name.Text = "Template Row"
  2110. inst_name.TextColor3 = Color3.new(1, 1, 1)
  2111. inst_name.TextScaled = true
  2112. inst_name.TextSize = 14
  2113. inst_name.TextStrokeTransparency = 0
  2114. inst_name.TextWrapped = true
  2115. inst_name.TextXAlignment = Enum.TextXAlignment.Left
  2116. inst_name.BackgroundColor3 = Color3.new(1, 1, 1)
  2117. inst_name.BackgroundTransparency = 1
  2118. inst_name.BorderColor3 = Color3.new(0, 0, 0)
  2119. inst_name.BorderSizePixel = 0
  2120. inst_name.LayoutOrder = 3
  2121. inst_name.Size = UDim2.fromScale(0.75, 1)
  2122. inst_name.Visible = true
  2123. inst_name.Name = "InstName"
  2124. inst_name.Parent = template_entry
  2125.  
  2126. local uitext_size_constraint_6 = Instance.new("UITextSizeConstraint")
  2127. uitext_size_constraint_6.MaxTextSize = 28
  2128. uitext_size_constraint_6.MinTextSize = 6
  2129. uitext_size_constraint_6.Parent = inst_name
  2130.  
  2131. local cam_action_btn = Instance.new("TextButton")
  2132. cam_action_btn.Font = Enum.Font.SourceSans
  2133. cam_action_btn.Text = "πŸ“Έ"
  2134. cam_action_btn.TextColor3 = Color3.new(0, 0, 0)
  2135. cam_action_btn.TextScaled = true
  2136. cam_action_btn.TextSize = 14
  2137. cam_action_btn.TextWrapped = true
  2138. cam_action_btn.Modal = true
  2139. cam_action_btn.BackgroundColor3 = Color3.new(1, 1, 1)
  2140. cam_action_btn.BackgroundTransparency = 1
  2141. cam_action_btn.BorderColor3 = Color3.new(0, 0, 0)
  2142. cam_action_btn.BorderSizePixel = 0
  2143. cam_action_btn.LayoutOrder = 4
  2144. cam_action_btn.Size = UDim2.new(1, 0, 1, 0)
  2145. cam_action_btn.SizeConstraint = Enum.SizeConstraint.RelativeYY
  2146. cam_action_btn.Visible = true
  2147. cam_action_btn.Name = "CamActionButton"
  2148. cam_action_btn.Parent = template_entry
  2149.  
  2150. local cam_revert_btn = Instance.new("TextButton")
  2151. cam_revert_btn.Font = Enum.Font.SourceSans
  2152. cam_revert_btn.Text = "πŸ”"
  2153. cam_revert_btn.TextColor3 = Color3.new(0, 0, 0)
  2154. cam_revert_btn.TextTransparency = 1 -- This button was going to be used, but now its functions are handled by the "camera" button to its left.
  2155. cam_revert_btn.TextScaled = true
  2156. cam_revert_btn.TextSize = 14
  2157. cam_revert_btn.TextWrapped = true
  2158. cam_revert_btn.Modal = true
  2159. cam_revert_btn.BackgroundColor3 = Color3.new(1, 1, 1)
  2160. cam_revert_btn.BackgroundTransparency = 1
  2161. cam_revert_btn.BorderColor3 = Color3.new(0, 0, 0)
  2162. cam_revert_btn.BorderSizePixel = 0
  2163. cam_revert_btn.LayoutOrder = 5
  2164. cam_revert_btn.Size = UDim2.new(1, 0, 1, 0)
  2165. cam_revert_btn.SizeConstraint = Enum.SizeConstraint.RelativeYY
  2166. cam_revert_btn.Visible = true
  2167. cam_revert_btn.Name = "CamRevertButton"
  2168. cam_revert_btn.Parent = template_entry
  2169.  
  2170. -- BOTTOM BAR (PAGINATION BUTTONS, NAME ENTRY, AND SAVE BUTTON)
  2171. local bot_bar = Instance.new("Frame")
  2172. bot_bar.AnchorPoint = Vector2.new(0.5,1)
  2173. bot_bar.BackgroundTransparency = 1
  2174. bot_bar.BorderSizePixel = 0
  2175. bot_bar.LayoutOrder = 4
  2176. bot_bar.Position = UDim2.new(0.5, 0, 0, -4)
  2177. bot_bar.Size = UDim2.new(1,-8, 0.094,0)
  2178. bot_bar.Visible = true
  2179. bot_bar.Name = "BottomBar"
  2180. bot_bar.Parent = main_frame
  2181.  
  2182. local botbar_layout = Instance.new("UIListLayout")
  2183. botbar_layout.HorizontalFlex = Enum.UIFlexAlignment.None
  2184. botbar_layout.Padding = UDim.new(0, 4)
  2185. botbar_layout.FillDirection = Enum.FillDirection.Horizontal
  2186. botbar_layout.HorizontalAlignment = Enum.HorizontalAlignment.Right
  2187. botbar_layout.SortOrder = Enum.SortOrder.LayoutOrder
  2188. botbar_layout.Parent = bot_bar
  2189.  
  2190. local prevPageButton = Instance.new("TextButton")
  2191. prevPageButton.Font = Enum.Font.RobotoCondensed
  2192. prevPageButton.Text = "β—€ Prev"
  2193. prevPageButton.TextColor3 = Color3.new(1, 1, 1)
  2194. prevPageButton.TextScaled = true
  2195. prevPageButton.TextSize = 14
  2196. prevPageButton.TextStrokeTransparency = 0
  2197. prevPageButton.TextWrapped = true
  2198. prevPageButton.Modal = true
  2199. prevPageButton.AutomaticSize = Enum.AutomaticSize.X
  2200. prevPageButton.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  2201. prevPageButton.BorderColor3 = Color3.new(0, 0, 0)
  2202. prevPageButton.BorderSizePixel = 0
  2203. prevPageButton.LayoutOrder = 1
  2204. prevPageButton.Size = UDim2.fromScale(0.1125,1)
  2205. prevPageButton.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2206. prevPageButton.Visible = true
  2207. prevPageButton.Name = "PrevPage"
  2208. prevPageButton.Parent = bot_bar
  2209.  
  2210. local prevPageBtnSizeConstraint = Instance.new("UITextSizeConstraint")
  2211. prevPageBtnSizeConstraint.MaxTextSize = 24
  2212. prevPageBtnSizeConstraint.MinTextSize = 6
  2213. prevPageBtnSizeConstraint.Parent = prevPageButton
  2214.  
  2215. local nextPageButton = Instance.new("TextButton")
  2216. nextPageButton.Font = Enum.Font.RobotoCondensed
  2217. nextPageButton.Text = "Next β–Ά"
  2218. nextPageButton.TextColor3 = Color3.new(1, 1, 1)
  2219. nextPageButton.TextScaled = true
  2220. nextPageButton.TextSize = 14
  2221. nextPageButton.TextStrokeTransparency = 0
  2222. nextPageButton.TextWrapped = true
  2223. nextPageButton.Modal = true
  2224. nextPageButton.AutomaticSize = Enum.AutomaticSize.X
  2225. nextPageButton.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  2226. nextPageButton.BorderColor3 = Color3.new(0, 0, 0)
  2227. nextPageButton.BorderSizePixel = 0
  2228. nextPageButton.LayoutOrder = 2
  2229. nextPageButton.Size = UDim2.fromScale(0.1125,1)
  2230. nextPageButton.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2231. nextPageButton.Visible = true
  2232. nextPageButton.Name = "NextPage"
  2233. nextPageButton.Parent = bot_bar
  2234.  
  2235. local nextPageBtnSizeConstraint = Instance.new("UITextSizeConstraint")
  2236. nextPageBtnSizeConstraint.MaxTextSize = 24
  2237. nextPageBtnSizeConstraint.MinTextSize = 6
  2238. nextPageBtnSizeConstraint.Parent = nextPageButton
  2239.  
  2240. local PoseCharCheckbox = Instance.new("TextButton")
  2241. PoseCharCheckbox.Font = Enum.Font.RobotoCondensed
  2242. PoseCharCheckbox.Text = "πŸ’ƒπŸΌIgnore characters"
  2243. PoseCharCheckbox.TextColor3 = Color3.new(1, 1, 1)
  2244. PoseCharCheckbox.TextScaled = true
  2245. PoseCharCheckbox.TextSize = 14
  2246. PoseCharCheckbox.TextStrokeTransparency = 0
  2247. PoseCharCheckbox.TextWrapped = true
  2248. PoseCharCheckbox.Modal = true
  2249. PoseCharCheckbox.AutomaticSize = Enum.AutomaticSize.X
  2250. PoseCharCheckbox.BackgroundColor3 = Color3.new(0.596078, 0.921569, 0.921569)
  2251. PoseCharCheckbox.BorderColor3 = Color3.new(0, 0, 0)
  2252. PoseCharCheckbox.BorderSizePixel = 0
  2253. PoseCharCheckbox.LayoutOrder = 3
  2254. PoseCharCheckbox.Size = UDim2.fromScale(0.2,1)
  2255. PoseCharCheckbox.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2256. PoseCharCheckbox.Visible = true
  2257. PoseCharCheckbox.Name = "CBox_PoseChars"
  2258. PoseCharCheckbox.Parent = bot_bar
  2259.  
  2260. local pose_chars_size_constraint = Instance.new("UITextSizeConstraint")
  2261. pose_chars_size_constraint.MaxTextSize = 24
  2262. pose_chars_size_constraint.MinTextSize = 6
  2263. pose_chars_size_constraint.Parent = PoseCharCheckbox
  2264.  
  2265. -- JSON MODEL NAME ENTRY FIELD/TEXTBOX
  2266. local filename_box = Instance.new("TextBox")
  2267. filename_box.Font = Enum.Font.Ubuntu
  2268. filename_box.PlaceholderColor3 = Color3.new(0.239216, 0.392157, 0.290196)
  2269. filename_box.PlaceholderText = "What should this be called?"
  2270. filename_box.Text = ""
  2271. filename_box.TextColor3 = Color3.new(0.317647, 0.231373, 0.490196)
  2272. filename_box.TextScaled = true
  2273. filename_box.TextSize = 14
  2274. filename_box.TextStrokeColor3 = Color3.new(0.317647, 0.231373, 0.490196)
  2275. filename_box.TextStrokeTransparency = 0.5
  2276. filename_box.TextWrapped = true
  2277. filename_box.BackgroundColor3 = Color3.new(0.654902, 0.788235, 0.980392)
  2278. filename_box.BorderColor3 = Color3.new(0, 0, 0)
  2279. filename_box.BorderSizePixel = 0
  2280. filename_box.LayoutOrder = 6
  2281. filename_box.Position = UDim2.new(0, 4, 0, 4)
  2282. filename_box.Size = UDim2.fromScale(0.175,1)
  2283. filename_box.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2284. filename_box.Visible = true
  2285. filename_box.ZIndex = 2
  2286. filename_box.Name = "FilenameBox"
  2287. filename_box.Parent = bot_bar
  2288.  
  2289. local uicorner_3 = Instance.new("UICorner")
  2290. uicorner_3.CornerRadius = UDim.new(0.22499999403953552, 0)
  2291. uicorner_3.Parent = filename_box
  2292.  
  2293. local label = Instance.new("TextLabel")
  2294. label.Font = Enum.Font.FredokaOne
  2295. label.Text = "JSON filename:"
  2296. label.TextColor3 = Color3.new(0.811765, 1, 0.431373)
  2297. label.TextScaled = true
  2298. label.TextSize = 14
  2299. label.TextStrokeColor3 = Color3.new(0.266667, 0.364706, 0.411765)
  2300. label.TextStrokeTransparency = 0
  2301. label.TextWrapped = true
  2302. label.TextXAlignment = Enum.TextXAlignment.Left
  2303. label.AnchorPoint = Vector2.new(0.5, 0)
  2304. label.BackgroundColor3 = Color3.new(1, 1, 1)
  2305. label.BackgroundTransparency = 1
  2306. label.BorderColor3 = Color3.new(0, 0, 0)
  2307. label.BorderSizePixel = 0
  2308. label.Position = UDim2.new(0.5, 4, -0.300000012, 0)
  2309. label.Size = UDim2.new(1, 0, 0.532999992, 0)
  2310. label.Visible = true
  2311. label.ZIndex = 2
  2312. label.Name = "Label"
  2313. label.Parent = filename_box
  2314.  
  2315. -- THE RH-ESQUE "3D" SAVE BUTTON
  2316. local save_button = Instance.new("TextButton")
  2317. save_button.Font = Enum.Font.Cartoon
  2318. save_button.Text = ""
  2319. save_button.TextColor3 = Color3.new(1, 1, 1)
  2320. save_button.TextScaled = true
  2321. save_button.TextSize = 14
  2322. save_button.TextWrapped = true
  2323. save_button.AnchorPoint = Vector2.new(1, 0)
  2324. save_button.BorderSizePixel = 0
  2325. save_button.LayoutOrder = 7
  2326. save_button.Position = UDim2.fromScale(0.125,1)
  2327. save_button.Size = UDim2.fromScale(0.125,1)
  2328. save_button.SizeConstraint = Enum.SizeConstraint.RelativeXY
  2329. save_button.Visible = true
  2330. save_button.Name = "SaveButton"
  2331. save_button.Parent = bot_bar
  2332.  
  2333. local uicorner_4 = Instance.new("UICorner")
  2334. uicorner_4.CornerRadius = UDim.new(0.125, 0)
  2335. uicorner_4.Parent = save_button
  2336.  
  2337. local button_top = Instance.new("TextLabel")
  2338. button_top.Font = Enum.Font.Cartoon
  2339. button_top.Text = "Save"
  2340. button_top.TextColor3 = Color3.new(1, 1, 1)
  2341. button_top.TextScaled = true
  2342. button_top.TextSize = 14
  2343. button_top.TextStrokeTransparency = 0
  2344. button_top.TextWrapped = true
  2345. button_top.AnchorPoint = Vector2.new(0.5, 1)
  2346. button_top.BackgroundColor3 = Color3.new(0.647059, 1, 0.678431)
  2347. button_top.BorderColor3 = Color3.new(0, 0, 0)
  2348. button_top.BorderSizePixel = 0
  2349. button_top.Position = UDim2.new(0.5, 0, 0.875, 0)
  2350. button_top.Selectable = true
  2351. button_top.Size = UDim2.new(1, 0, 1, 0)
  2352. button_top.Visible = true
  2353. button_top.ZIndex = 2
  2354. button_top.Name = "FakeTop"
  2355. button_top.Parent = save_button
  2356.  
  2357. local uicorner_5 = Instance.new("UICorner")
  2358. uicorner_5.CornerRadius = UDim.new(0.125, 0)
  2359. uicorner_5.Parent = button_top
  2360.  
  2361. local button_outline = Instance.new("UIStroke")
  2362. button_outline.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
  2363. button_outline.Color = Color3.new(0.388235, 0.705882, 0.627451)
  2364. button_outline.Thickness = 2
  2365. button_outline.Parent = button_top
  2366.  
  2367. local uigradient = Instance.new("UIGradient")
  2368. uigradient.Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.new(0.752941, 0.752941, 0.752941)), ColorSequenceKeypoint.new(0.125, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(0.875, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(1, Color3.new(0.752941, 0.752941, 0.752941))})
  2369. uigradient.Parent = save_button
  2370.  
  2371. -- PROGRESS BOX (USED FOR INDEXING AND SAVING)
  2372. local progress_ui = Instance.new("TextLabel")
  2373. progress_ui.Font = Enum.Font.RobotoCondensed
  2374. progress_ui.Text = "Indexing instance\u{000D}\u{000A}56 / 203"
  2375. progress_ui.TextColor3 = Color3.new(1, 1, 1)
  2376. progress_ui.TextScaled = true
  2377. progress_ui.TextStrokeTransparency = 0
  2378. progress_ui.TextWrapped = true
  2379. progress_ui.AnchorPoint = Vector2.one / 2
  2380. progress_ui.BackgroundColor3 = Color3.new(0.161, 0.353, 0.224)
  2381. progress_ui.BackgroundTransparency = 0.25
  2382. progress_ui.BorderColor3 = Color3.new(0, 0, 0)
  2383. progress_ui.BorderSizePixel = 0
  2384. progress_ui.Position = UDim2.fromScale(0.5, 0.5)
  2385. progress_ui.Size = UDim2.fromScale(0.425, 0.225)
  2386. progress_ui.Visible = false
  2387. progress_ui.ZIndex = 3
  2388. progress_ui.Name = "ProgressUI"
  2389. progress_ui.Parent = xane_mdlrecreator_gui
  2390.  
  2391. local ui_aspectratio_progress = Instance.new("UIAspectRatioConstraint")
  2392. ui_aspectratio_progress.AspectRatio = 3.5
  2393. ui_aspectratio_progress.Parent = progress_ui
  2394.  
  2395. local uitextsize_progress = Instance.new("UITextSizeConstraint")
  2396. uitextsize_progress.MaxTextSize = 50
  2397. uitextsize_progress.MinTextSize = 10
  2398. uitextsize_progress.Parent = progress_ui
  2399.  
  2400. local uicorner_progress = Instance.new("UICorner")
  2401. uicorner_progress.CornerRadius = UDim.new(0.125, 0)
  2402. uicorner_progress.Parent = progress_ui
  2403.  
  2404. local template_selbox = Instance.new("SelectionBox") -- A box that appears around any selected instances that support rendering it around them.
  2405. template_selbox.Name = "XaneSelBoxTemplate"
  2406. template_selbox.LineThickness = 0.03125
  2407. template_selbox.Transparency = 0.25
  2408. template_selbox.SurfaceTransparency = 0.925
  2409. template_selbox:SetAttribute("XaneProtectedDoNotShowInReconstructorGui",true) -- Hide this instance from the Reconstructor script itself.
  2410. template_selbox.Parent = xane_mdlrecreator_gui
  2411.  
  2412. print("UI created!")
  2413.  
  2414. -- DATA FOR THE ANIMATED SAVE BUTTON
  2415. local Position_Raised = UDim2.fromScale(0.5,0.875)
  2416. local Position_Pressed = UDim2.fromScale(0.5,1)
  2417. local BtnColor_Ready = Color3.fromRGB(160,255,224) -- Save button colors.
  2418. local BtnColor_Caution = Color3.fromRGB(212,255,204) -- Used if the selected file already exists.
  2419. local BtnColor_Disabled = Color3.fromRGB(126,128,130) -- Used until a valid model and filename are entered.
  2420.  
  2421. local RowOpacityNormal = 0.875
  2422. local RowOpacitySelected = 0.75
  2423.  
  2424. local CurrentContainer = nil
  2425.  
  2426. type VisibleListEntry = {
  2427. CheckboxClickEvent : RBXScriptConnection, -- Connection which lets the user (de)select this item. (This also updates its icon.)
  2428. CameraFocusEvent : RBXScriptConnection, -- Click event for a button which makes the user's camera focus on this instance.
  2429. CamRevertEvent1 : RBXScriptConnection, -- Right-click event, which brings the camera back to the player.
  2430. CamRevertEvent2 : RBXScriptConnection, -- Alternative camera reverting event, for mobile devices (long tap).
  2431. Instance : Instance, -- Reference to this instance, used to access its properties if needed.
  2432. RowBase : Frame, -- A reference to this row's container Frame.
  2433. Checkbox : TextButton, -- The toggle-box found at the left side of this row/entry.
  2434. SelectBox : SelectionBox, -- This Instance's SelectionBox, which is created and destroyed as needed upon its selection.
  2435. IsSelectAllRow : boolean -- If TRUE, selecting this row will deselect all instances within the selected container.
  2436. }
  2437.  
  2438. -- VARIABLES (SECOND SET)
  2439. local GUIShown = true -- This is set to TRUE when the main window is visible, used by the toggle button at the top of the screen.
  2440. local IsBusy = false -- Marks the main window as busy. This disables all buttons, so the script can execute code in peace.
  2441. local PoseCharacters = nil -- When this is "no", any selected character models will stop their animations before they're captured.
  2442.  
  2443. -- List of Instances' debug IDs that the user has marked for saving. Instance references could've been stored here, but this...seems cooler.
  2444. local Selection
  2445. = {}
  2446.  
  2447. -- An array of dictionary entries which keeps all of the events and references needed by each instance shown in the main UI list.
  2448. -- As creating too many rows will lag the client when the list updates (scrolling, generating, etc), this array should be limited to
  2449. -- 100 or so entries at any time.
  2450.  
  2451. -- The full list (which has less data in each entry) is InternalList below.
  2452. local ListData = {}
  2453.  
  2454. local PageLength = _G.PageLength or 100 -- How many instances should be listed at a time.
  2455. local AntiLagInterval = _G.AntiLagInterval or 15 -- To reduce lag, intensive actions are paused on every Nth processed Instance.
  2456. local SkipPreSaveVerify = _G.SkipPreSaveVerify or false -- Skip the failsafe "last-minute indexing" before saving if something's missing?
  2457. local Offset = 0 -- The current "page" of instances that are being shown to the user.
  2458. type InternalListEntry = {
  2459. Instance : Instance, -- Instance which this entry represents. Its class and name are used when generating the visible list.
  2460. Level : number -- Represents the depth this instance was placed at in the hierarchy during the scan. 0 is the container itself.
  2461. }
  2462.  
  2463. -- The "actual" internal list of instances, which were found during the initial scan after clicking one of the "container" buttons.
  2464. -- To reduce lag, only a subset of this list is used at any time to generate the "visible list" (the ListData array). This array is wiped
  2465. -- when the UI is hidden and when switching between containers.
  2466.  
  2467. -- Entry 1 will always be a special entry which (de)selects the container itself.
  2468. local InternalList = {}
  2469.  
  2470. -- An array of nested dictionary entries which contain any applicable properties of each supported instance. When a model is being
  2471. -- exported, the data gathered during the scan is put into this table. When multiple instances are exported at the same time, each
  2472. -- to-be JSON file's contents is exported from here, then this table is cleared before the next capture starts.
  2473. local OngoingExportData = {}
  2474.  
  2475. -- Roblox doesn't allow multiple copies of a container (workspace, ReplicatedStorage, etc.), so an "imposter" model is created for each of the
  2476. -- four selectable containers, used instead of one of them if an instance was formerly parented to one. This array links the actual containers'
  2477. -- debug IDs to the four fake Models; When an instance is captured, its parent is forcibly changed to one of these dummies if it matches any
  2478. -- of the containers' debug IDs.
  2479. local ContainerRedirections = {}
  2480.  
  2481. -- Speaking of containers' imposters, let's create the four Models now then place them in ServerStorage, which is basically unused on the client.
  2482.  
  2483. -- Class names to treat as the forbidden containers. (Not used here.)
  2484. local ContainerList = { "Workspace", "Players", "Lighting", "ReplicatedStorage"}
  2485. for _,locat in pairs({workspace,Players,Lighting,ReplicatedStorage}) do
  2486. local dummyModel = Instance.new("Model", ServerStorage)
  2487. dummyModel.Name = locat.Name
  2488. ContainerRedirections[locat:GetDebugId()] = dummyModel:GetDebugId()
  2489. end
  2490.  
  2491. -- FUNCTIONS
  2492.  
  2493. --[[
  2494. IsInstanceAllowed (takes Instance reference, returns boolean)
  2495. Checks for some specific instances that shouldn't be saved, either because they cause softlocks/glitches or
  2496. would be useless in the context of saving instances or places within experiences. Here are the reasons:
  2497.  
  2498. Camera within workspace - This conflicts with Studio's editor camera, and isn't particularly useful.
  2499. Character inside Player - Player character links are unstable, and usually lock up this script.
  2500. ]]--
  2501. local function IsInstanceAllowed(_instance )
  2502. if not _instance.Parent then return false
  2503. elseif (_instance.Parent == workspace and _instance:IsA("Camera")) or
  2504. (_instance.Parent:IsA("Player") and _instance.Name == "Character")
  2505. then
  2506. return false
  2507. else return true
  2508. end
  2509. end
  2510.  
  2511. local function ChangeButtonState(_release , _color , _text )
  2512. if _text then button_top.Text = _text end
  2513. if _color then
  2514. button_top.BackgroundColor3 = _color
  2515. local btnH, btnS, btnV = _color:ToHSV()
  2516.  
  2517. button_outline.Color = Color3.fromHSV(btnH, btnS+(btnS/4), btnV-(btnV/6))
  2518. save_button.BackgroundColor3 = Color3.fromHSV(btnH, btnS+(btnS/3), btnV-(btnV/4))
  2519. end
  2520.  
  2521. -- If the button is already in the same state as this command would change it to, stop the function here.
  2522. if _release == save_button.Active then return nil
  2523. else
  2524. save_button.Active = _release -- Immediately update whether the user can click on this button before playing the animation.
  2525. button_top:TweenPosition(
  2526. _release and Position_Raised or Position_Pressed,
  2527. Enum.EasingDirection.InOut,
  2528. Enum.EasingStyle.Quad,
  2529. 0.125,
  2530. true
  2531. )
  2532. return nil
  2533. end
  2534. end
  2535. -- Initially disable the save button.
  2536. ChangeButtonState(false, BtnColor_Disabled, "Can't save")
  2537.  
  2538. local function CheckSavePrerequisites()
  2539. if filename_box.Text:len() > 0 and -- Make sure the TextBox isn't empty and the filename doesn't contain invalid characters.
  2540. not filename_box.Text:find("/") and
  2541. not filename_box.Text:find("\"") and
  2542. not filename_box.Text:find("\\") and
  2543. not filename_box.Text:find(":") and
  2544. not filename_box.Text:find("*") and
  2545. not filename_box.Text:find("?") and
  2546. #Selection > 0 -- Ensure the player has at least one Instance selected before letting them export.
  2547. then
  2548. local FileStatus = nil
  2549. pcall(function()
  2550. FileStatus = readfile(filename_box.Text .. "_header.json")
  2551. end)
  2552. if FileStatus then ChangeButtonState(true, BtnColor_Caution, "Overwrite")
  2553. else ChangeButtonState(true, BtnColor_Ready, "Save!")
  2554. end
  2555. else ChangeButtonState(false, BtnColor_Disabled, "Can't save")
  2556. end
  2557.  
  2558. clear_button.Visible = #Selection > 0 -- A second button will appear at the top of the screen to deselect everything if anything's marked.
  2559. message.Text = DefaultMessage
  2560. end
  2561.  
  2562. -- Looks through the "debug ID to instance" association list, trying to find an index named after the provided ID. If one is found, its associated
  2563. -- instance is returned.
  2564. local function GetInstanceFromDebugID(_id : string)
  2565. local MatchedInst = nil
  2566. for ListID : string, inst in pairs(DebugIDList) do -- Iterate through the debug ID list and try to find this instance's ID within it.
  2567. if ListID == _id then
  2568. MatchedInst = inst
  2569. break
  2570. end
  2571. end
  2572.  
  2573. return MatchedInst
  2574. end
  2575.  
  2576. -- Very simply clears the list of debug IDs, used to get "persistent" instance references that survive exportation.
  2577. local function EmptyDebugIDCache()
  2578. if #DebugIDList > 0 then table.clear(DebugIDList) end
  2579. end
  2580.  
  2581. -- Disconnects all events within the list shown in the main window, then removes all of its rows.
  2582. local function ClearVisibleList()
  2583. if #ListData > 0 then
  2584. for i,entry in ListData do
  2585. -- Disconnect all of the button events' connections before destroying this row.
  2586. if entry.CheckboxClickEvent then
  2587. entry.CheckboxClickEvent:Disconnect()
  2588. ListData[i].CheckboxClickEvent = nil
  2589. end
  2590. if entry.CameraFocusEvent then
  2591. entry.CameraFocusEvent:Disconnect()
  2592. ListData[i].CameraFocusEvent = nil
  2593. end
  2594. if entry.CamRevertEvent1 then
  2595. entry.CamRevertEvent1:Disconnect()
  2596. ListData[i].CamRevertEvent1 = nil
  2597. end
  2598. if entry.CamRevertEvent2 then
  2599. entry.CamRevertEvent2:Disconnect()
  2600. ListData[i].CamRevertEvent2 = nil
  2601. end
  2602.  
  2603. if entry.SelectBox then
  2604. entry.SelectBox:Destroy()
  2605. entry.SelectBox = nil
  2606. end
  2607.  
  2608. entry.Checkbox:Destroy()
  2609. entry.Checkbox = nil
  2610.  
  2611. entry.RowBase:Destroy()
  2612. entry.RowBase = nil
  2613. end
  2614.  
  2615. table.clear(ListData) -- Remove all of the now-useless entries from the array.
  2616. end
  2617. end
  2618.  
  2619. -- Visually updates a given row to make it apppear to be (de)selected.
  2620. local function UpdateRowVisualState(_entry, _select)
  2621. if _select then
  2622. _entry.RowBase.BackgroundTransparency = RowOpacitySelected
  2623. _entry.Checkbox.Text = "βœ…"
  2624. else
  2625. _entry.RowBase.BackgroundTransparency = RowOpacityNormal
  2626. _entry.Checkbox.Text = ClassData[_entry.Instance.ClassName].ListView.Icon -- Revert this checkbox's icon to the class icon.
  2627. end
  2628. end
  2629.  
  2630. -- An important function, responsible for turning an Instance into data, which is later encoded as a JSON array/dictionary.
  2631. -- This function is also responsible for remapping/re-parenting direct children of containers to the fake "Models" found in
  2632. -- ServerStorage at runtime. Though there was a third argument to this function that made it remove the Instance's parent,
  2633. -- it has been removed; If an Instance references a debug ID with no cooresponding Instance, the Studio plugin should just
  2634. -- parent it to that container's "main model" (which is its counterpart to the "imposter" models).
  2635. local function CaptureInstance(_instance , _destination )
  2636. local replacementParent = nil
  2637. local ParentDebugId = nil
  2638.  
  2639. -- Does this instance still have a parent? Usually, every instance should be parented, but as the Instance list is only generated
  2640. -- on request (when the user taps on one of the container buttons), any of the Instances that they've chosen may have been removed
  2641. -- by the game by the time they start trying to capture them! If this instance has a parent, try to get its debug ID for reference.
  2642. if _instance.Parent then
  2643. -- Check to see if this instance's parent is one of the four supported containers. We can't recreate these containers, so let's
  2644. -- try to find a new "imposter" to parent it to.
  2645. for oldId ,newId in pairs(ContainerRedirections) do
  2646. if _instance.Parent:GetDebugId() == oldId then -- Looks like we have a match! Link it to this container's fake counterpart.
  2647. replacementParent = newId -- We'll save this instance with false metadata, linking it to the "wrong" Model.
  2648. break
  2649. end
  2650. end
  2651.  
  2652. -- Also, see if this Instance's parent has had its debug ID stored in that array. If it has, store that in a second variable.
  2653. -- If the parent isn't a known container or a known instance in general, the property will be set to nil/"null" instead.
  2654. for debugId , inst in pairs(DebugIDList) do
  2655. if _instance.Parent:GetDebugId() == debugId then -- If a match is found, return that and stop iterating early.
  2656. ParentDebugId = debugId
  2657. break
  2658. end
  2659. end
  2660. end
  2661. local InstDictionary = { -- Every Instance has references to its name, class, debug ID, and its parent's debug ID.
  2662. Name = _instance.Name,
  2663. ClassName = _instance.ClassName,
  2664. DebugId = _instance:GetDebugId(),
  2665. Parent = -- Assign this instance's parent based on if it has a replacement or has a parent.
  2666. if replacementParent then replacementParent -- Is this parented to a known container? Use the dummy Model's debug ID instead.
  2667. elseif ParentDebugId then ParentDebugId -- If not, has its parent in the debug ID database? Link to that here!
  2668. else StoreValue(nil, "nil") -- Otherwise, the parent's nil, so it'll be imported under this container's model.
  2669. }
  2670. -- print("Wrote basic property set for", _instance.Name, "whose parent is ID", InstDictionary.Parent)
  2671.  
  2672. -- Additional properties specific to this class are added to this dictionary entry next. If a property's name starts
  2673. -- with "UseCmnList_", a secondary list of properties is checked and added to this list.
  2674. for property1 ,type1 in pairs(ClassData[_instance.ClassName].Props) do
  2675. if property1:find("UseCmnList_") then
  2676. -- print("This instance type uses a shared property list,", type1)
  2677. -- print("Does that shared list exist?")
  2678. if CommonPropList[type1] then
  2679. for property2 , type2 in pairs(CommonPropList[type1]) do
  2680. InstDictionary[property2] = StoreValue(_instance[property2], type2)
  2681. end
  2682. end
  2683. else -- If this is a property listed inline for this class, just try to store its value in the dictionary entry.
  2684. InstDictionary[property1] = StoreValue(_instance[property1], type1)
  2685. -- print("Property", property1, "found! Adding value to table as", InstDictionary[property1])
  2686. end
  2687. end
  2688.  
  2689. -- Lastly, see if this Instance has any attributes and/or tags; These will be exported with in the instances' serialized JSON versins.
  2690. local temp_attribList = _instance:GetAttributes()
  2691. local temp_attribcount = 0 -- Figure out how many attributes this instance has.
  2692. for _,_ in pairs(temp_attribList) do temp_attribcount += 1 end
  2693. if temp_attribcount > 0 then
  2694. InstDictionary.Attributes = {} -- It has some? Create an empty dictionary entry, then store all of them in here.
  2695. for name,value in pairs(temp_attribList) do
  2696. InstDictionary.Attributes[name] = StoreValue(value, typeof(value))
  2697. end
  2698. end
  2699.  
  2700. -- Are there any tags on this Instance? If there are, add them to a new sub-array like with attributes. (This time it's a basic array, though!)
  2701. if #_instance:GetTags() > 0 then
  2702. InstDictionary.Tags = {}
  2703. for _,tag in pairs(_instance:GetTags()) do table.insert(InstDictionary.Tags, tag) end
  2704. end
  2705.  
  2706. _destination[#_destination+1] = InstDictionary
  2707. return true
  2708. end
  2709.  
  2710. --[[
  2711. One of the most important functions in the Model Reconstructor script! This function iterates through all of the children of
  2712. an instance, recursively repeating the process as it advances deeper into the hierarchy, performing an action on every
  2713. instance that it finds.
  2714.  
  2715. If _mode is "list", every instance is added to the "explorer" list in the window. With "capture", it creates dictionary entries
  2716. for each instance, adding them to _dest (a table). _level increases on every recursion, and determines where the next call
  2717. will write its data to. Lastly, this just "caches" all instances' debug IDs within the specified Instance in "debug" mode.
  2718. ]]--
  2719. local AntiLagInstCounter = 0 -- A counter, which determines when ApplyChildAction() will wait for a frame to keep the client from completely freezing.
  2720. local ProgressVars = {
  2721. TotalInstances = nil, -- A count of all descendants of the selected container, used for the progress UI while indexing only.
  2722. CurrentInstance = 0, -- When TotalInstances is setup, this represents how many Instances that ApplyChildAction has checked.
  2723. ProcessVerb = "Indexing"
  2724. }
  2725.  
  2726. local function ApplyChildAction(_base , _mode, _level, _dest )
  2727. -- If a capture is just starting, capture the selected Instance itself as level 1, then everything within it as higher levels.
  2728. -- This is pretty hackish, but it's debatably the best way to approach this scenario.
  2729. -- If the base Instance is one of the four containers, it's ignored, only capturing the instances within it.
  2730. if _mode == "capture" and _level <= 1 then
  2731. -- print("Capturing base instance", _base:GetFullName())
  2732. if not table.find(ContainerList, _base.ClassName) then CaptureInstance(_base, _dest) end
  2733. _level += 1
  2734. -- _dest = _dest[#_dest]
  2735. end
  2736.  
  2737. for num,inst in pairs(_base:GetChildren()) do
  2738. AntiLagInstCounter += 1 -- Always count Instances towards the anti-lag code; Lag is annoying (and risky for exploiters), y'know!
  2739. if ProgressVars.TotalInstances then -- If we're tracking all of the instances to show progress (in UI), increment the "current" counter.
  2740. ProgressVars.CurrentInstance += 1
  2741. end
  2742.  
  2743. -- See if this Instance's class is supported by this script. If it isn't, ignore it and advance to the next one in line.
  2744. if ClassData[inst.ClassName] and IsInstanceAllowed(inst) and
  2745. not inst:GetAttribute("XaneProtectedDoNotShowInReconstructorGui")
  2746. then
  2747. -- "Cache" any Instances encountered by this script if they're supported. In "debug" mode, this is all this function does.
  2748. if not table.find(DebugIDList, inst) then DebugIDList[inst:GetDebugId()] = inst end
  2749.  
  2750. if _mode == "list" then -- Log all supported instances to the instance list.
  2751. local newEntry = {
  2752. Instance = inst,
  2753. Level = _level
  2754. }
  2755. table.insert(InternalList, newEntry)
  2756. elseif _mode == "capture" then
  2757. CaptureInstance(inst, _dest)
  2758.  
  2759. -- print("Added instance definition for", inst.Name, "!")
  2760. --table.insert(_dest, InstDictionary) -- Add this Instance's serialized form to the dictionary!
  2761. end
  2762.  
  2763. if AntiLagInstCounter % AntiLagInterval or 25 == 0 then task.wait() end -- Wait a frame every so often.
  2764.  
  2765. -- Does this instance have any child instances? Start a new instance of this function, checking those out for now.
  2766. if #inst:GetChildren() > 0 then
  2767. if _mode == "list" then
  2768. ApplyChildAction(inst, "list", _level+1, nil)
  2769. elseif _mode == "capture" then
  2770. -- print("Destination is",_dest, "and current instance is", inst:GetFullName())
  2771. -- print("It has",#_dest,"entries in it. The next recursion should write tis dictionary entries there.")
  2772. ApplyChildAction(inst, "capture", _level+1, _dest) -- _dest[#_dest])
  2773. else ApplyChildAction(inst, "debug", _level+1, nil)
  2774. end
  2775. end
  2776. elseif ProgressVars.TotalInstances then -- If an Instance's skipped during indexing, still count all of its descendants in the count.
  2777. local temp_descendants = #inst:GetDescendants()
  2778. if temp_descendants > 0 then
  2779. ProgressVars.CurrentInstance += temp_descendants
  2780. end
  2781. end
  2782.  
  2783. -- Lastly, update the progress window's text, if it's currently needed (or relevant).
  2784. if ProgressVars.TotalInstances then
  2785. progress_ui.Text =
  2786. ProgressVars.ProcessVerb.." instances...\u{000D}\u{000A}"..ProgressVars.CurrentInstance.." / "..ProgressVars.TotalInstances
  2787. end
  2788. end
  2789. end
  2790.  
  2791. -- An iffy function that does what ApplyChildAction()'s "list" mode used to do, only now in a for loop. It destroys the
  2792. -- current "visible list" then rebuilds it using data from the full, pre-generated internal instance list.
  2793. local function RedrawVisibleList()
  2794. if #ListData > 0 then
  2795. ClearVisibleList()
  2796. end
  2797.  
  2798. for i = (PageLength*Offset)+1, (PageLength*Offset)+PageLength-1 do
  2799. -- Make sure we haven't reached the end of the list yet. If we have, stop creating entries now.
  2800. if InternalList[i] then
  2801. -- Make sure this Instance isn't a "bad actor" which could cause a softlock or wouldn't assist this export.
  2802. if not IsInstanceAllowed(InternalList[i].Instance) then continue end
  2803.  
  2804. -- If execution reaches this point, this Instance is supported, so let's add it to our temporary list!
  2805. local NewEntry = {
  2806. Instance = InternalList[i].Instance,
  2807. RowBase = template_entry:Clone(),
  2808. Checkbox = nil,
  2809. CheckboxClickEvent = nil,
  2810. CameraFocusEvent = nil,
  2811. CamRevertEvent1 = nil,
  2812. CamRevertEvent2 = nil
  2813. }
  2814. NewEntry.RowBase.Name = "Listing_" .. i -- Name each row's Frame after its ordering, just to make it easier for those sifting through UI instances.
  2815. NewEntry.Checkbox = NewEntry.RowBase:WaitForChild("SelectButton")
  2816.  
  2817. local temp_instName = NewEntry.RowBase:WaitForChild("InstName")
  2818.  
  2819. -- Before continuing, determine how big a row should be in pixels rather than scale. Since executors are behind the times,
  2820. -- they unfortyunately don't support Roblox's new CSS-esque flexible UI containers, so there isn't an easy way to make the
  2821. -- "instance name" label fill the space the icon on the left side and camera button on the right side exactly. It's dumb!
  2822.  
  2823. -- TODO: I just cannot get rows to be just long enough to squeeze the camera button onto the right edge of each row, regardless
  2824. -- of indentation. For some reason, with or without a delay, AbsoluteSize is always 0, 0! I'm sorry for this awful alt. sizing...
  2825. temp_instName.Size = UDim2.fromScale(1 - (indent.Size.X.Scale * InternalList[i].Level) - 0.0825,1)
  2826. NewEntry.RowBase:WaitForChild("CamActionButton").AnchorPoint = Vector2.xAxis
  2827. --[[
  2828. task.wait()
  2829.  
  2830. print("Row X scale was calculated as", 1 - (indent.Size.X.Scale * InternalList[i].Level))
  2831. print("Just the subtracted value is", indent.Size.X.Scale * InternalList[i].Level)
  2832. print("Absolute size is", temp_instName.AbsoluteSize)
  2833. print("Final X size is somehow", temp_instName.AbsoluteSize.X-temp_instName.AbsoluteSize.Y)
  2834.  
  2835. temp_instName.Size = UDim2.fromOffset( -- Take the size determined above and subtract one square icon's size from it.
  2836. temp_instName.AbsoluteSize.X-temp_instName.AbsoluteSize.Y,
  2837. temp_instName.AbsoluteSize.Y
  2838. )
  2839. ]]--
  2840.  
  2841. temp_instName.Text = InternalList[i].Instance.Name
  2842. local temp_newIndent = NewEntry.RowBase:WaitForChild("Indent") -- Hold a reference to the original indent, which will be duplicated based on this instance's "level".
  2843. temp_newIndent.Visible = InternalList[i].Level > 0
  2844. if InternalList[i].Level > 1 then -- If this Instance is at the second level or deeper, duplicate the indent as needed, forming a grid for clarity left of the list.
  2845. for i = 2, InternalList[i].Level do
  2846. local temp_additionalIndent = temp_newIndent:Clone()
  2847. temp_additionalIndent.Parent = temp_newIndent.Parent
  2848. end
  2849. end
  2850.  
  2851. NewEntry.Checkbox.Text = ClassData[InternalList[i].Instance.ClassName].ListView.Icon
  2852.  
  2853. -- If this object has been previously selected, highlight it now.
  2854. if table.find(Selection, InternalList[i].Instance:GetDebugId()) then
  2855. UpdateRowVisualState(NewEntry, true)
  2856. end
  2857.  
  2858. NewEntry.RowBase.Visible = true
  2859.  
  2860. -- Add functionality to the the two buttons found on the ends of this row.
  2861. local temp_camButton = NewEntry.RowBase:WaitForChild("CamActionButton")
  2862. temp_camButton.Visible = ClassData[InternalList[i].Instance.ClassName].ListView.CanView ~= "no"
  2863. if temp_camButton.Visible then
  2864. NewEntry.CameraFocusEvent = temp_camButton.MouseButton1Click:Connect(function()
  2865. if ClassData[InternalList[i].Instance.ClassName].ListView.CanView == "parent" then
  2866. local temp_ancestor = InternalList[i].Instance:FindFirstAncestorWhichIsA("BasePart")
  2867. if temp_ancestor then
  2868. workspace.CurrentCamera.CameraSubject = temp_ancestor
  2869. end
  2870. elseif ClassData[InternalList[i].Instance.ClassName].ListView.CanView == "child" then
  2871. local temp_child = InternalList[i].Instance:FindFirstChildWhichIsA("BasePart")
  2872. if temp_child then
  2873. workspace.CurrentCamera.CameraSubject = InternalList[i].Instance.Parent
  2874. else
  2875. -- Hide the camera button if nothing camera-compatible is found within this instance.
  2876. NewEntry.RowBase:FindFirstChild("CamActionButton").Visible = false
  2877. end
  2878. else
  2879. workspace.CurrentCamera.CameraSubject = InternalList[i].Instance
  2880. end
  2881. end)
  2882. NewEntry.CamRevertEvent1 = temp_camButton.MouseButton2Click:Connect(function()
  2883. workspace.CurrentCamera.CameraSubject = Players.LocalPlayer.Character:WaitForChild("Humanoid")
  2884. end)
  2885. NewEntry.CamRevertEvent2 = temp_camButton.TouchLongPress:Connect(function()
  2886. workspace.CurrentCamera.CameraSubject = Players.LocalPlayer.Character:WaitForChild("Humanoid")
  2887. end)
  2888. end
  2889.  
  2890. NewEntry.CheckboxClickEvent = NewEntry.Checkbox.MouseButton1Click:Connect(function()
  2891. -- If this Instance is currently selected, remove it from the list and undo changes to this row on the list.
  2892. local SelectionIndex = table.find(Selection, InternalList[i].Instance:GetDebugId())
  2893. if SelectionIndex then
  2894. table.remove(Selection, SelectionIndex)
  2895. UpdateRowVisualState(NewEntry, false)
  2896.  
  2897. -- If this Instance is visually selected in-world, remove the box that's around it.
  2898. if NewEntry.SelectBox then
  2899. NewEntry.SelectBox:Destroy()
  2900. NewEntry.SelectBox = nil -- Make sure the other part of this mini-function knows that the box no longer exists.
  2901. end
  2902. else
  2903. table.insert(Selection, InternalList[i].Instance:GetDebugId())
  2904.  
  2905. UpdateRowVisualState(NewEntry, true)
  2906. if InternalList[i].Level > 0 then -- If the container itself was just selected, deselect anything within it.
  2907. local SelectionDelQueue = {} -- Keep track of the array indices that'll be removed after this for loop.
  2908. local Cleared = false -- The selection array will be endlessly checked until this flag is set to TRUE.
  2909. while not Cleared do
  2910. for i1,debugId in ipairs(Selection) do -- For each selected Instance...
  2911. local MatchedInstance = nil -- ...try to to find an Instance with a matching debug ID!
  2912. for i2,entry in pairs(InternalList) do
  2913. if debugId == entry.Instance:GetDebugId() then
  2914. MatchedInstance = entry.Instance
  2915. break
  2916. end
  2917. end
  2918.  
  2919. if MatchedInstance and MatchedInstance:IsDescendantOf(InternalList[i].Instance) then
  2920. table.remove(Selection, i1) -- The table.remove() function messes up arrays' orders, so let's start over...
  2921. break
  2922. elseif i1 >= #Selection and not Cleared then
  2923. Cleared = true -- Without this action, the while loop would force this for loop to completely restart.
  2924. end
  2925. end
  2926. end
  2927. Cleared = false
  2928. end
  2929.  
  2930. -- Also, create a SelectionBox for this instance, to make it easier to tell what has been selected in messy games (like Royale High).
  2931. -- Only do this for child instances within the workspace, and obviously, don't draw a box around the workspace itself.
  2932. if InternalList[i].Level > 0 and InternalList[i].Instance:IsDescendantOf(workspace) and not NewEntry.SelectBox then
  2933. NewEntry.SelectBox = template_selbox:Clone()
  2934. NewEntry.SelectBox.Color3 = Color3.fromHSV(math.random(), 0.125+(math.random()/5), 1-(math.random()/16)) -- Use a random color.
  2935. NewEntry.SelectBox.SurfaceColor3 = NewEntry.SelectBox.Color3
  2936. NewEntry.SelectBox.Adornee = InternalList[i].Instance
  2937. NewEntry.SelectBox.Parent = InternalList[i].Instance
  2938. end
  2939. end
  2940.  
  2941. CheckSavePrerequisites() -- If the user's entered a filename and has at least one instance selected, allow them to start exporting things!
  2942. end)
  2943.  
  2944. NewEntry.RowBase.Parent = instance_list
  2945. table.insert(ListData, NewEntry)
  2946. else break
  2947. end
  2948. end
  2949. end
  2950.  
  2951. -- Slides the main window on/off the screen. Normally, this is prevented when anything important is happening, but _force will bypass restrictions.
  2952. local function ToggleUI(_force )
  2953. if not IsBusy or _force then
  2954. if GUIShown then
  2955. IsBusy = true
  2956. toggle_button.Text = "Save Instances!"
  2957. toggle_button.BackgroundColor3 = BtnColor_Ready
  2958. main_frame:TweenPosition(UDim2.fromScale(0.5, 2.0), Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.333, true)
  2959. task.wait(0.125)
  2960. IsBusy = false
  2961. else
  2962. IsBusy = true
  2963. toggle_button.Text = "Hide GUI"
  2964. toggle_button.BackgroundColor3 = BtnColor_Caution
  2965. main_frame:TweenPosition(UDim2.fromScale(0.5, 0.55), Enum.EasingDirection.Out, Enum.EasingStyle.Back, 0.35, true)
  2966. task.wait(0.35)
  2967. IsBusy = false
  2968. end
  2969.  
  2970. GUIShown = not GUIShown
  2971. end
  2972. end
  2973. toggle_button.MouseButton1Click:Connect(function() ToggleUI(false) end)
  2974. ToggleUI(false)
  2975.  
  2976. local function ChangeListSource(_base )
  2977. if not IsBusy then
  2978. IsBusy = true -- Disable all interface buttons until the list has been updated. (Hopefully, no errors occur!)
  2979. ToggleUI(false)
  2980.  
  2981. if #ListData > 0 then ClearVisibleList() end
  2982. if #InternalList > 0 then table.clear(InternalList) end
  2983.  
  2984. -- Set up and show the "indexing progress" UI, which will be updated by ApplyChildAction(), so the user isn't left in the dark.
  2985. ProgressVars.TotalInstances = #_base:GetDescendants()
  2986. ProgressVars.CurrentInstance = 0
  2987. ProgressVars.ProcessVerb = "Indexing"
  2988. progress_ui.Visible = true -- For now, make the UI pop up rather than sliding in like the other frames would.
  2989.  
  2990. ApplyChildAction(_base, "list", 1, nil) -- Generate the full list of Instances within the new container.
  2991. table.insert(InternalList, 1, { -- Slip a fake entry for the container itself into the start of the list.
  2992. Instance = _base,
  2993. Level = 0
  2994. })
  2995. -- If the new container hasn't had its debug ID added to that list, it could lead to errors when saving Instances to files.
  2996. -- Quickly associate this container with its debug ID if one doesn't already exist.
  2997. if not table.find(DebugIDList, _base) then
  2998. DebugIDList[_base:GetDebugId()] = _base
  2999. end
  3000.  
  3001. progress_ui.Visible = false -- Hide the progress UI; We're about to display the list that was just generated.
  3002. Offset = 0 -- Always start from the beginning of a container's Instance list.
  3003. RedrawVisibleList()
  3004. task.wait(0.425)
  3005.  
  3006. ToggleUI(false)
  3007. IsBusy = false
  3008. end
  3009. end
  3010. container1.MouseButton1Click:Connect(function() ChangeListSource(workspace) end)
  3011. container2.MouseButton1Click:Connect(function() ChangeListSource(Players) end)
  3012. container3.MouseButton1Click:Connect(function() ChangeListSource(Lighting) end)
  3013. container4.MouseButton1Click:Connect(function() ChangeListSource(ReplicatedStorage) end)
  3014.  
  3015. -- "Container 5" is a special case; Rather than indexing every instance within a container, it specifically tries to find each player's
  3016. -- character model and indexes ITS contents. If playing Royale High, its EquippedStorage folder is checked for and also indexed.
  3017. local function IndexCharacters(_includeNPCs)
  3018. if not IsBusy then
  3019. IsBusy = true -- Disable all interface buttons until the list has been updated. (Hopefully, no errors occur!)
  3020. ToggleUI(false)
  3021.  
  3022. -- Clear the full and visible lists if they're already occupied by another container button's instances.
  3023. if #ListData > 0 then ClearVisibleList() end
  3024. if #InternalList > 0 then table.clear(InternalList) end
  3025.  
  3026. for _,player in pairs(Players:GetPlayers()) do
  3027. local PlayerChar = player.Character -- Try to access this player's character model.
  3028. if not PlayerChar then -- If it hasn't been created yet, retry a couple of times, then give up.
  3029. local CharTries = 10
  3030. local success = false
  3031. while CharTries > 0 do
  3032. success, _ = pcall(function()
  3033. PlayerChar = player.Character
  3034. end)
  3035. if success then break end -- Did we find it? Let's move on!
  3036. task.wait(0.25)
  3037. CharTries -= 1
  3038. end
  3039.  
  3040. if not PlayerChar then continue end -- If their character is still inaccessible, just move on to the next player.
  3041. end
  3042.  
  3043. -- If execution reaches this point, we have a player character to index!
  3044.  
  3045. -- Unlike every other "mode", we won't be listing every instance within character models to save time; A player could leave the
  3046. -- server within a minute, after all! Just index the character models directly.
  3047. table.insert(InternalList, {
  3048. Instance = PlayerChar,
  3049. Level = 1
  3050. })
  3051.  
  3052. -- If the new container hasn't had its debug ID added to that list, it could lead to errors when saving Instances to files.
  3053. -- Quickly associate this container with its debug ID if one doesn't already exist.
  3054. if not table.find(DebugIDList, PlayerChar) then
  3055. DebugIDList[PlayerChar:GetDebugId()] = PlayerChar
  3056. end
  3057.  
  3058. -- progress_ui.Visible = false -- Hide the progress UI; We're about to display the list that was just generated.
  3059. end
  3060.  
  3061. -- Check for a folder named "EquippedStorage", which Royale High places clothes that players are wearing inside. This folder should be
  3062. -- listed first, as the user probably doesn't want to save characters with missing body parts or anything weird-looking.
  3063. local RH_EquippedStorage = workspace:FindFirstChild("EquippedStorage")
  3064. if RH_EquippedStorage then
  3065. table.insert(InternalList, 1, {
  3066. Instance = RH_EquippedStorage,
  3067. Level = 1
  3068. })
  3069.  
  3070. -- Like everything, make sure EquippedStorage's debug ID is in the array before continuing, or this script won't "find a reference" later.
  3071. if not table.find(DebugIDList, RH_EquippedStorage) then
  3072. DebugIDList[RH_EquippedStorage:GetDebugId()] = RH_EquippedStorage
  3073. end
  3074. end
  3075.  
  3076. if _includeNPCs then
  3077. for a,v in pairs(workspace:GetDescendants()) do
  3078. if a%AntiLagInterval then task.wait() end
  3079.  
  3080. -- Check if this instance contains a Humanoid, which also has an Animator inside of it. If it isn't linked to a player,
  3081. -- it's an NPC model and will be listed after all of the players' character models.
  3082. local temp_humanoid = v:FindFirstChildOfClass("Humanoid")
  3083. if temp_humanoid then
  3084. local temp_animator = v:FindFirstChildOfClass("Animator")
  3085. if temp_animator then
  3086. if not Players:GetPlayerFromCharacter(v) then
  3087. -- TODO: Consider if this block of code could be turned into some sort of function. This has been used 3 times now!
  3088. table.insert(InternalList, {
  3089. Instance = v,
  3090. Level = 1
  3091. })
  3092. -- Does this NPC have its debug ID cached yet? Add it to the list if it isn't already in there!
  3093. if not table.find(DebugIDList, v) then
  3094. DebugIDList[v:GetDebugId()] = v
  3095. end
  3096. end
  3097. end
  3098. end
  3099. end
  3100. end
  3101.  
  3102. Offset = 0 -- Always start from the beginning of a container's Instance list.
  3103. RedrawVisibleList()
  3104. task.wait(0.425)
  3105.  
  3106. ToggleUI(false)
  3107. IsBusy = false
  3108. end
  3109. end
  3110. container5.MouseButton1Click:Connect(function() IndexCharacters(false) end)
  3111. -- container5.MouseButton2Click:Connect(function() IndexCharacters(true) end)
  3112. -- container5.TouchLongPress:Connect(function() IndexCharacters(true) end)
  3113.  
  3114. prevPageButton.MouseButton1Click:Connect(function()
  3115. -- If advancing to the next page would go beyond the full Instance list's bounds, ignore this action. Otherwise, update the visible list.
  3116. if not IsBusy and Offset > 0 then
  3117. IsBusy = true -- Prevent other actions from occurring until the list has been finalized.
  3118. Offset -= 1
  3119. RedrawVisibleList()
  3120. instance_list.CanvasPosition = Vector2.yAxis * instance_list.AbsoluteCanvasSize.Y -- Jump to the end of the visible list.
  3121. IsBusy = false -- It is now safe to close the main window and export.
  3122. end
  3123. end)
  3124. nextPageButton.MouseButton1Click:Connect(function()
  3125. -- If advancing to the next page would go beyond the full Instance list's bounds, ignore this action. Otherwise, update the visible list.
  3126. if not IsBusy and ((Offset*PageLength)+1)+PageLength <= #InternalList then
  3127. IsBusy = true -- Prevent other actions from occurring until the list has been finalized.
  3128. Offset += 1
  3129. RedrawVisibleList()
  3130. instance_list.CanvasPosition = Vector2.zero -- Jump to the top of the visible list.
  3131. IsBusy = false -- It is now safe to close the main window and export.
  3132. end
  3133. end)
  3134. PoseCharCheckbox.MouseButton1Click:Connect(function()
  3135. if not IsBusy then
  3136.  
  3137. -- Update the value and text. This looks confusing, but each click moves to the next value (nil, "no", then "yes") so the button's text
  3138. -- reflects the NEXT option, the one it becomes within that block. Hopefully this makes sense.
  3139. if PoseCharacters == "yes" then -- TODO: Characters automatically lose their pose if their parts aren't anchored, so the 2nd choice can go!
  3140. PoseCharacters = nil
  3141. PoseCharCheckbox.Text = "πŸ’ƒπŸΌIgnore characters"
  3142. elseif not PoseCharacters then
  3143. PoseCharacters = "no"
  3144. PoseCharCheckbox.Text = "❌ Save char. poses"
  3145. elseif PoseCharacters == "no" then
  3146. PoseCharacters = "yes"
  3147. PoseCharCheckbox.Text = "βœ… Save char. poses"
  3148. end
  3149. end
  3150. end)
  3151.  
  3152. local function ClearSelection()
  3153. EmptyDebugIDCache() -- When the main window is hidden, all debug IDs are forgotten and the instance list is emptied.
  3154. ClearVisibleList()
  3155. table.clear(InternalList)
  3156. table.clear(Selection) -- Deselect all Instances, which comnpletes the main window's reset.
  3157. CheckSavePrerequisites() -- Make the save button check to see if it should allow exporting of the...deselected instances (it won't).
  3158. end
  3159.  
  3160. -- If the clear button is visible, tappping it will deselect everything then redraw whatever page the window was showing.
  3161. clear_button.MouseButton1Click:Connect(function()
  3162. ClearSelection()
  3163. RedrawVisibleList()
  3164. end)
  3165.  
  3166. -- If the user just finished using the model name text box, validate their selection and name to determine if they're allowed to save it now.
  3167. local LastSafeName = ""
  3168. filename_box.FocusLost:Connect(function()
  3169. if not IsBusy then -- As long as saving or something important isn't happening now, save the current file name to a variable. It's used below.
  3170. LastSafeName = filename_box.Text
  3171. CheckSavePrerequisites()
  3172. else -- If something is happening, don't let the user change the save's name!
  3173. filename_box.Text = LastSafeName
  3174. end
  3175. end)
  3176.  
  3177. -- Unfreezes frozen char. parts, shows the GUI, and unsets the "busy" flag, restoring the ability to select instances again.
  3178. -- If _success is set, this function also deselects everything and redraws the list.
  3179. local AnchoredCharParts : {BasePart} = {} -- If character pose saving is on, characters are completely frozen until capturing finishes.
  3180. local function PostSaveCleanup(_success)
  3181. if #AnchoredCharParts > 0 then
  3182. for _,part:BasePart in pairs(AnchoredCharParts) do
  3183. part.Anchored = false
  3184. end
  3185. table.clear(AnchoredCharParts)
  3186. end
  3187.  
  3188. ChangeButtonState(true)
  3189. IsBusy = false
  3190.  
  3191. if _success then
  3192. ClearSelection()
  3193. RedrawVisibleList()
  3194. end
  3195.  
  3196. ToggleUI(false)
  3197. end
  3198.  
  3199. -- The save button, as expected, saves all of the selected Instances. This is one of the moe important functions, though it's ironically last.
  3200. save_button.MouseButton1Click:Connect(function()
  3201. if not save_button.Active or IsBusy then return nil end
  3202. IsBusy = true
  3203.  
  3204. local AnchoredCharParts = {} -- If character pose saving is on, characters are completely frozen until capturing finishes.
  3205. ChangeButtonState(false)
  3206. message.Text = "Preparing to export the selected instances..."
  3207.  
  3208. -- Check to make sure that every selected Instance still exists, cleaning up any "dead" references if they're found in it.
  3209. -- As table.remove() shifts arrays' contents around as it removes things from them, we have to do another one of THESE endless
  3210. -- for loops, restarting every time something has to be removed from the list.
  3211. local OrigSelectionSize = #Selection -- Note how many Instances are selected before cleaning the array up. If that lowers, this is used.
  3212. local SelectionCleanedUp = false
  3213. local Restarting = false -- When this is TRUE, the outer for loop will break immediately, letting the loop start from the beginning.
  3214. while not SelectionCleanedUp do
  3215. for num,id in pairs(Selection) do -- For each selected Instance...
  3216. message.Text = "Checking instance " .. num .. "/" .. #Selection .. "..."
  3217. local MatchedInstance = nil -- ...convert its debug ID into an Instance reference using the debug ID list.
  3218. for debugId , inst in pairs(DebugIDList) do
  3219. if id == debugId then -- If a match is found, grab it and use it to see if it still has a parent.
  3220. MatchedInstance = inst
  3221. break
  3222. end
  3223.  
  3224. -- Does this Instance have a parent? If it doesn't, remove it from the selection then start over.
  3225. if MatchedInstance and not MatchedInstance.Parent then
  3226. table.remove(Selection, num)
  3227. message.Text = "Welp, Instance ID " .. id .. " doesn't exist now, so it isn't included now."
  3228. print("Instance ID", id, "couldn't be found, so it won't be saved.")
  3229. task.wait(1.5) -- Wait one and a half seconds so the message above can be read before it's updated again.
  3230. Restarting = true -- Cut off this process now, to make sure that the entire selectiong gets scanned.
  3231. break
  3232. end
  3233. end
  3234.  
  3235. -- Are we about to start over? If so, unset that flag then let the while loop do the rest.
  3236. if Restarting then break end
  3237. end
  3238.  
  3239. -- If the for loop completed without requesting a do-over, this while loop can safely end now. Otherwise, unset the flag and start over.
  3240. if not Restarting then
  3241. SelectionCleanedUp = true
  3242. else Restarting = false
  3243. end
  3244. end
  3245.  
  3246. -- If any Instances were unparented or removed since they were selected, notify the user before proceeding.
  3247. if #Selection < OrigSelectionSize then
  3248. message.Text = "Unfortunately, only " .. #Selection .. " of " .. OrigSelectionSize .. " instances will be saved."
  3249. task.wait(3)
  3250. end
  3251.  
  3252. -- First, let's write the "header" file, which will tell the Studio plugin where it should place each exported "model", the export's
  3253. -- folder name (its filename), and other information. To get this info, we have to look through the currently-selected instances and
  3254. -- figure out if anything was saved from PlayerGui, ReplicatedStorage, or Lighting.
  3255. local HeaderContents = {
  3256. Metadata = {
  3257. Name = filename_box.Text, -- Place all exported instances from this package into a Model named this (see below).
  3258. PlaceId = game.PlaceId or 0, -- The ID of the place where this rip was done, which will be saved as an IntValue.
  3259. GameId = game.GameId or 0, -- This experience's ID number, for reference, just like the previous ID.
  3260. },
  3261.  
  3262. -- Any MaterialVariants found within MaterialService are stored here, in a format similar to that of pieces' entries.
  3263. MaterialVariants = {},
  3264.  
  3265. -- Lighting properties are always saved, but they aren't used unless "Apply" is set to TRUE.
  3266. LightingProperties = {
  3267. Ambient = StoreValue(Lighting.Ambient, "Color3"),
  3268. Brightness = Lighting.Brightness,
  3269. ColorShift_Top = StoreValue(Lighting.ColorShift_Top, "Color3"),
  3270. ColorShift_Bottom = StoreValue(Lighting.ColorShift_Bottom, "Color3"),
  3271. EnvironmentDiffuseScale = Lighting.EnvironmentDiffuseScale,
  3272. EnvironmentSpecularScale = Lighting.EnvironmentSpecularScale,
  3273. GlobalShadows = Lighting.GlobalShadows,
  3274. OutdoorAmbient = StoreValue(Lighting.OutdoorAmbient, "Color3"),
  3275. ShadowSoftness = Lighting.ShadowSoftness,
  3276. ClockTime = Lighting.ClockTime,
  3277. GeographicLatitude = Lighting.GeographicLatitude,
  3278. FogColor = StoreValue(Lighting.FogColor, "Color3"),
  3279. FogEnd = Lighting.FogEnd,
  3280. FogStart = Lighting.FogStart
  3281. },
  3282.  
  3283. -- Store all four containers' "imposter" debug IDs. Before the Studio plugin starts to "import" instances, it should create four
  3284. -- dummy Models, one in each of the supported containers. As each is created, it must be associated with its respective "debug ID"
  3285. -- in this array, which should be consistent with debug IDs used by captured instances which were direct children of workspace,
  3286. -- ReplicatedStorage, or another container.
  3287.  
  3288. -- When no matches are found for a "debug ID" when they're being linked, the instances should be forcibly parented to the Model
  3289. -- in that piece's container (which can be found in the PieceInfo array within the header). Also, each Model should be named
  3290. -- after the export ([header].Metadata.Name).
  3291. ImposterIds = {
  3292. ContainerRedirections[workspace:GetDebugId()],
  3293. ContainerRedirections[Players:GetDebugId()],
  3294. ContainerRedirections[Lighting:GetDebugId()],
  3295. ContainerRedirections[ReplicatedStorage:GetDebugId()]
  3296. },
  3297.  
  3298. -- Stores info about every part of this export. This is used to validate that enough JSON entries have been provided and where to
  3299. -- place their contents. (Captures within PlayerGui are put in StarterGUI, and every other container adds the models' contents to
  3300. -- a subfolder within that specific location.)
  3301. PieceInfo = {
  3302. }
  3303. }
  3304. for i,debugID in pairs(Selection) do
  3305. message.Text = "Attempting to get a reference to piece " .. i .. "/" .. #Selection .. " (ID " .. debugID .. ")"
  3306. -- Try to find this debug ID in the full list's keys. If a match is gotten, get its cooresponding Instance and use that next.
  3307. local MatchedInst : Instance? = GetInstanceFromDebugID(debugID)
  3308.  
  3309. -- While we're doing things relating to debug IDs, let's make sure this instance's descendants have also been scanned before by
  3310. -- seeing if their IDs are on the list too! This should only be done for targets with at least a couple child instances, though.
  3311. -- Since this is typically triggered when it's unnecessary, this can be skipped using _G.SkipPreSaveVerify.
  3312. if MatchedInst and not SkipPreSaveVerify then
  3313. local temp_descendants = MatchedInst:GetDescendants()
  3314.  
  3315. -- Check if a few instances' debug IDs have been indexed. If any of them haven't, every descendant's debug ID will be cached immediately.
  3316. if #temp_descendants > 0 then
  3317. local FullIndexNeeded = false
  3318. for i = 1, math.min(#temp_descendants, 5) do -- Check up to 5 instances within this target.
  3319. local temp_descendantFound = GetInstanceFromDebugID(temp_descendants[i]:GetDebugId())
  3320. if not temp_descendantFound then FullIndexNeeded = true; break; end
  3321. end
  3322.  
  3323. -- If we need to, we'll account for every single instance within this target!
  3324. if FullIndexNeeded then
  3325. ProgressVars.TotalInstances = #temp_descendants
  3326. ProgressVars.CurrentInstance = 0
  3327. ProgressVars.ProcessVerb = "Last-minute indexing"
  3328. progress_ui.Visible = true -- For now, make the UI pop up rather than sliding in like the other frames would.
  3329. ApplyChildAction(MatchedInst, "debug", 1)
  3330. end
  3331. end
  3332. end
  3333.  
  3334. -- Generate this piece's GUID and set its import location now, so this piece can always be imported, even if its instance isn't checked.
  3335. local PieceEntry = {
  3336. InsertLocation = "workspace",
  3337. BaseInstName = "UnknownBaseInstance",
  3338. GUID = game:GetService("HttpService"):GenerateGUID(false)
  3339. }
  3340. -- Could we find this selected Instance? Figure out its container, then write that down for the plugin.
  3341. if MatchedInst then
  3342. local inWorkspace, inPlayers, inPlayerGui, inLighting, inRepStore =
  3343. MatchedInst:IsDescendantOf(workspace),
  3344. MatchedInst:IsDescendantOf(Players),
  3345. MatchedInst:IsDescendantOf(PlayerGui),
  3346. MatchedInst:IsDescendantOf(Lighting),
  3347. MatchedInst:IsDescendantOf(ReplicatedStorage)
  3348.  
  3349. PieceEntry.BaseInstName = MatchedInst.Name
  3350. PieceEntry.InsertLocation =
  3351. if inPlayers then "players"
  3352. elseif inPlayerGui then "playergui"
  3353. elseif inLighting then "lighting"
  3354. elseif inRepStore then "repstore"
  3355. else "workspace"
  3356.  
  3357. -- If this Instance is inside the workspace, it could contain character models; If any are found, they can be saved in their current
  3358. -- pose or reverted to their "bind pose", allowing anyone to pose or animate any character model in Roblox Studio!
  3359. -- Character models in ReplicatedStorage are either pre-posed or aren't animated, since Roblox doesn't run script code in there.
  3360. -- Because this could greatly slow down big captures, none of this code is ran unless character posing is enabled.
  3361. if PoseCharacters == "yes" or PoseCharacters == "no" then
  3362. for _, descendant in pairs(MatchedInst:GetDescendants()) do
  3363. -- print("Processing", inst.Name)
  3364. if descendant:IsA("Model") and descendant.ClassName ~= "Tool" then -- A Model could be a Character! See if it has a Humanoid and Animator.
  3365. print("Found a model! Is it a character?", descendant:GetFullName())
  3366. local ChildHumanoid = descendant:FindFirstChildOfClass("Humanoid", 1)
  3367. if ChildHumanoid then
  3368. print("It has a Humanoid!")
  3369. local ChildAnimator = ChildHumanoid:FindFirstChildOfClass("Animator", 1)
  3370. if ChildAnimator then
  3371. print("What should we do?")
  3372. if PoseCharacters == "no" then
  3373. print("Trying to stop all ongoing animations/poses for", ChildAnimator:GetFullName())
  3374. for _,anim in pairs(ChildAnimator:GetPlayingAnimationTracks()) do anim:Stop(0) end
  3375. task.wait(0.03125) -- Give the character a split-second to stop animating before proceeding.
  3376. else
  3377. print("Trying to temporarily anchor all of the parts inside", MatchedInst:GetFullName())
  3378. for _, inst1 in pairs(descendant:GetDescendants()) do
  3379. if inst1:IsA("BasePart") and not inst1.Anchored then
  3380. table.insert(AnchoredCharParts, inst1) -- Remember to unanchor this part after capturing every Instance.
  3381. inst1.Anchored = true
  3382. end
  3383. end
  3384. end
  3385. end
  3386. end
  3387. end
  3388. end
  3389. end
  3390. end
  3391.  
  3392. HeaderContents.PieceInfo[i] = PieceEntry -- Add this piece's information to the array, then continue and add the rest of them.
  3393. end
  3394.  
  3395. -- Just before the header is written to file, any material definitions are written down in its MaterialVariants sub-array.
  3396. local MatList = MaterialService:GetDescendants()
  3397. if #MatList > 0 then
  3398. for i,material in pairs(MatList) do
  3399. message.Text = "Grabbing material variants... (" .. (i/#MatList)*100 .. "%)"
  3400. if material:IsA("MaterialVariant") then
  3401. table.insert(HeaderContents.MaterialVariants, {
  3402. Name = material.Name,
  3403. BaseMaterial = StoreValue(material.BaseMaterial, "EnumItem"),
  3404. MaterialPattern = StoreValue(material.MaterialPattern, "EnumItem"),
  3405. ColorMap = material.ColorMap,
  3406. NormalMap = material.NormalMap,
  3407. MetalnessMap = material.MetalnessMap,
  3408. RoughnessMap = material.RoughnessMap,
  3409. StudsPerTile = material.StudsPerTile
  3410. })
  3411. end
  3412. end
  3413. end
  3414.  
  3415. -- Write the header/metadata to this export's "main file".
  3416. writefile(filename_box.Text .. "_header.json", game:GetService("HttpService"):JSONEncode(HeaderContents))
  3417.  
  3418. -- With the header data written to a file, the actual exporting can begin! Hide the main interface, as it's probably disabled at this point.
  3419. ToggleUI(true)
  3420.  
  3421. for i,target in pairs(Selection) do
  3422. -- Set up and show the "indexing progress" UI, which will be updated by ApplyChildAction(), so the user isn't left in the dark.
  3423. ProgressVars.TotalInstances = #DebugIDList[target]:GetDescendants()
  3424. ProgressVars.CurrentInstance = 0
  3425. ProgressVars.ProcessVerb = "Saving selection " .. i .. "'s"
  3426. message.Text = "Saving selection " .. i .. "/" .. #Selection .. " (" .. HeaderContents.PieceInfo[i].BaseInstName .. ")"
  3427. progress_ui.Visible = true -- For now, make the UI pop up rather than sliding in like the other frames would.
  3428.  
  3429. OngoingExportData = {} -- Always ensure the "scrapbook" array is empty before exporting part of this "model".
  3430. local success, msg = pcall(function() ApplyChildAction(DebugIDList[target], "capture", 1, OngoingExportData) end) -- Try to "capture"!
  3431. if not success then
  3432. progress_ui.Visible = false -- Hide the progress UI.
  3433. message.Text = "Oh no! Piece #" .. i .. " couldn't be captured because of this error: \"" .. msg .. "\"."
  3434. PostSaveCleanup(false)
  3435. error("Piece " .. i .. " of export " .. filename_box.Text .. " couldn't be completely captured.")
  3436. end
  3437. if #OngoingExportData > 0 then
  3438. OngoingExportData[1].GUID = HeaderContents.PieceInfo[i].GUID -- Add this piece's GUID to the first instance entry as a "property".
  3439. pcall(function()
  3440. writefile(filename_box.Text .. "_piece" .. i .. ".json", game:GetService("HttpService"):JSONEncode(OngoingExportData))
  3441. end)
  3442.  
  3443. if i == #Selection then -- Was that the last piece? If so, we're done! Clear the user's selection and finish up.
  3444. progress_ui.Visible = false
  3445. message.Text = "Done! Transfer the new JSON files in your workspace folder to your PC, " ..
  3446. "then paste each of them into the Studio plugin's text fields, adding more as needed." ..
  3447. "Make sure the 'header' goes first, followed by each piece IN ORDER!"
  3448. PostSaveCleanup(true)
  3449. end
  3450. else
  3451. progress_ui.Visible = false -- Hide the progress UI; We're about to display the list that was just put generated.
  3452. message.Text = "Uh-oh! Piece #" .. i .. " wasn't saved for some reason!"
  3453. PostSaveCleanup(false)
  3454. error("Piece " .. i .. " of export " .. filename_box.Text .. " wasn't converted to a dictionary correctly.")
  3455. end
  3456. end
  3457. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement