Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- initial states
- local Option = {
- -- can modify object parents in the hierarchy
- Modifiable = false;
- -- can select objects
- Selectable = true;
- }
- print = function(...)
- -- lol
- end
- local fullListCustom = {
- ["Vector3Value"] = "rbxassetid://8425127573",
- ["BevelMesh"] = "rbxassetid://8425128737",
- ["ImporterGroupSettings"] = "rbxassetid://8425128737",
- ["PluginGuiService"] = "rbxassetid://8425128737",
- ["NetworkSettings"] = "rbxassetid://8425128737",
- ["StarterGui"] = "rbxassetid://8425118169",
- ["Accoutrement"] = "rbxassetid://8425128737",
- ["Vector3Curve"] = "rbxassetid://8425128737",
- ["LuaSourceContainer"] = "rbxassetid://8425128737",
- ["GuiMain"] = "rbxassetid://8425128737",
- ["VectorForce"] = "rbxassetid://8425243159",
- ["HumanoidController"] = "rbxassetid://8425128737",
- ["MeshContentProvider"] = "rbxassetid://8425128737",
- ["Handles"] = "rbxassetid://8425200671",
- ["ReflectionMetadataClasses"] = "rbxassetid://8425128737",
- ["ValueBase"] = "rbxassetid://8425127573",
- ["Hole"] = "rbxassetid://8425128737",
- ["CSGDictionaryService"] = "rbxassetid://8425128737",
- ["UIScale"] = "rbxassetid://8425122723",
- ["CFrameValue"] = "rbxassetid://8425127573",
- ["ImageLabel"] = "rbxassetid://8425201557",
- ["StarterPlayer"] = "rbxassetid://8425195182",
- ["DebuggerConnectionManager"] = "rbxassetid://8425128737",
- ["PluginManagerInterface"] = "rbxassetid://8425128737",
- ["UIListLayout"] = "rbxassetid://8425122723",
- ["SessionService"] = "rbxassetid://8425128737",
- ["CoreGui"] = "rbxassetid://8425118169",
- ["ReflectionMetadataEvents"] = "rbxassetid://8425128737",
- ["BindableEvent"] = "rbxassetid://8425197545",
- ["SelectionPartLasso"] = "rbxassetid://8425128737",
- ["DataModel"] = "rbxassetid://8425128737",
- ["TouchInputService"] = "rbxassetid://8425128737",
- ["PhysicsSettings"] = "rbxassetid://8425128737",
- ["CSGCacheService"] = "rbxassetid://8425128737",
- ["TextSource"] = "rbxassetid://8425128737",
- ["OrderedDataStore"] = "rbxassetid://8425128737",
- ["SocialService"] = "rbxassetid://8425128737",
- ["RenderingTest"] = "rbxassetid://8425128737",
- ["RunService"] = "rbxassetid://8425128737",
- ["TemporaryCageMeshProvider"] = "rbxassetid://8425128737",
- ["HumanoidDescription"] = "rbxassetid://8425242662",
- ["KeyframeSequence"] = "rbxassetid://8425128737",
- ["MessageBusService"] = "rbxassetid://8425128737",
- ["ServerScriptService"] = "rbxassetid://8425196793",
- ["BillboardGui"] = "rbxassetid://8425198318",
- ["Feature"] = "rbxassetid://8425128737",
- ["CustomDspSoundEffect"] = "rbxassetid://8425247111",
- ["MarketplaceService"] = "rbxassetid://8425128737",
- ["Team"] = "rbxassetid://8425123006",
- ["AppStorageService"] = "rbxassetid://8425128737",
- ["FlangeSoundEffect"] = "rbxassetid://8425247111",
- ["EchoSoundEffect"] = "rbxassetid://8425247111",
- ["MemoryStoreSortedMap"] = "rbxassetid://8425128737",
- ["NetworkPeer"] = "rbxassetid://8425128737",
- ["AdvancedDragger"] = "rbxassetid://8425128737",
- ["Teams"] = "rbxassetid://8425123177",
- ["PointsService"] = "rbxassetid://8425128737",
- ["GuiBase"] = "rbxassetid://8425128737",
- ["BodyGyro"] = "rbxassetid://8425125550",
- ["WrapLayer"] = "rbxassetid://8425262027",
- ["Path"] = "rbxassetid://8425128737",
- ["GuiLabel"] = "rbxassetid://8425128737",
- ["ReflectionMetadataFunctions"] = "rbxassetid://8425128737",
- ["WeldConstraint"] = "rbxassetid://8425245086",
- ["Folder"] = "rbxassetid://8425195649",
- ["TriangleMeshPart"] = "rbxassetid://8425128556",
- ["LuaSettings"] = "rbxassetid://8425128737",
- ["FlagStand"] = "rbxassetid://8425119830",
- ["PartOperationAsset"] = "rbxassetid://8425128737",
- ["ABTestService"] = "rbxassetid://8425128737",
- ["Explosion"] = "rbxassetid://8425120522",
- ["BlockMesh"] = "rbxassetid://8425126746",
- ["SkateboardController"] = "rbxassetid://8425128737",
- ["TextLabel"] = "rbxassetid://8425201387",
- ["Constraint"] = "rbxassetid://8425128737",
- ["BindableFunction"] = "rbxassetid://8425197788",
- ["ReflectionMetadataCallbacks"] = "rbxassetid://8425128737",
- ["ImageHandleAdornment"] = "rbxassetid://8425241923",
- ["AnalysticsSettings"] = "rbxassetid://8425128737",
- ["RenderSettings"] = "rbxassetid://8425128737",
- ["HSRDataContentProvider"] = "rbxassetid://8425128737",
- ["DataModelSession"] = "rbxassetid://8425128737",
- ["ObjectValue"] = "rbxassetid://8425127573",
- ["AssetCounterService"] = "rbxassetid://8425128737",
- ["VRService"] = "rbxassetid://8425128737",
- ["TotalCountTimeIntervalItem"] = "rbxassetid://8425128737",
- ["ReflectionMetadataEnum"] = "rbxassetid://8425128737",
- ["LegacyStudioBridge"] = "rbxassetid://8425128737",
- ["FaceInstance"] = "rbxassetid://8425128737",
- ["Plane"] = "rbxassetid://8425128737",
- ["ColorCorrectionEffect"] = "rbxassetid://8425194473",
- ["Atmosphere"] = "rbxassetid://8425122290",
- ["CookiesService"] = "rbxassetid://8425128737",
- ["RopeConstraint"] = "rbxassetid://8425246189",
- ["SelectionBox"] = "rbxassetid://8425200469",
- ["PolicyService"] = "rbxassetid://8425128737",
- ["NetworkReplicator"] = "rbxassetid://8425122066",
- ["IncrementalPatchBuilder"] = "rbxassetid://8425128737",
- ["MultipleDocumentInterfaceInstance"] = "rbxassetid://8425128737",
- ["StarterGear"] = "rbxassetid://8425128737",
- ["Controller"] = "rbxassetid://8425128737",
- ["PausedState"] = "rbxassetid://8425128737",
- ["PathfindingService"] = "rbxassetid://8425128737",
- ["LayerCollector"] = "rbxassetid://8425128737",
- ["Geometry"] = "rbxassetid://8425128737",
- ["ManualWeld"] = "rbxassetid://8425128737",
- ["PackageUIService"] = "rbxassetid://8425128737",
- ["TremoloSoundEffect"] = "rbxassetid://8425247111",
- ["PoseBase"] = "rbxassetid://8425128737",
- ["Status"] = "rbxassetid://8425128737",
- ["Pose"] = "rbxassetid://8425128737",
- ["Hat"] = "rbxassetid://8425118446",
- ["KeyboardService"] = "rbxassetid://8425128737",
- ["WrapTarget"] = "rbxassetid://8425261894",
- ["HingeConstraint"] = "rbxassetid://8425246580",
- ["WorldRoot"] = "rbxassetid://8425128737",
- ["ContentProvider"] = "rbxassetid://8425128737",
- ["PathfindingLink"] = "rbxassetid://8425128737",
- ["BadgeService"] = "rbxassetid://8425128737",
- ["Humanoid"] = "rbxassetid://8425126558",
- ["MemStorageConnection"] = "rbxassetid://8425128737",
- ["CylinderHandleAdornment"] = "rbxassetid://8425241717",
- ["RunningAverageItemDouble"] = "rbxassetid://8425128737",
- ["EulerRotationCurve"] = "rbxassetid://8425128737",
- ["Attachment"] = "rbxassetid://8425194873",
- ["MetaBreakpoint"] = "rbxassetid://8425128737",
- ["BodyMover"] = "rbxassetid://8425125550",
- ["AssetService"] = "rbxassetid://8425128737",
- ["LocalStorageService"] = "rbxassetid://8425128737",
- ["RobloxPluginGuiService"] = "rbxassetid://8425128737",
- ["ImageButton"] = "rbxassetid://8425200895",
- ["GuiBase2d"] = "rbxassetid://8425128737",
- ["NumberValue"] = "rbxassetid://8425127573",
- ["CylindricalConstraint"] = "rbxassetid://8425244860",
- ["PluginMenu"] = "rbxassetid://8425128737",
- ["CollectionService"] = "rbxassetid://8425128737",
- ["Configuration"] = "rbxassetid://8425199604",
- ["Accessory"] = "rbxassetid://8425121531",
- ["LineForce"] = "rbxassetid://8425243522",
- ["KeyframeMarker"] = "rbxassetid://8425128737",
- ["ReflectionMetadataMember"] = "rbxassetid://8425128737",
- ["HopperBin"] = "rbxassetid://8425123549",
- ["FlyweightService"] = "rbxassetid://8425128737",
- ["MotorFeature"] = "rbxassetid://8425128737",
- ["DataStoreSetOptions"] = "rbxassetid://8425128737",
- ["ReflectionMetadataYieldFunctions"] = "rbxassetid://8425128737",
- ["ReplicatedStorage"] = "rbxassetid://8425197003",
- ["SurfaceSelection"] = "rbxassetid://8425200291",
- ["FriendPages"] = "rbxassetid://8425128737",
- ["StarterPack"] = "rbxassetid://8425128737",
- ["ImporterMeshSettings"] = "rbxassetid://8425128737",
- ["DynamicRotate"] = "rbxassetid://8425128737",
- ["ArcHandles"] = "rbxassetid://8425200106",
- ["Players"] = "rbxassetid://8425538254",
- ["DataStore"] = "rbxassetid://8425128737",
- ["BaseScript"] = "rbxassetid://8425128737",
- ["UserStorageService"] = "rbxassetid://8425128737",
- ["VehicleController"] = "rbxassetid://8425128737",
- ["AssetImportService"] = "rbxassetid://8425128737",
- ["RunningAverageTimeIntervalItem"] = "rbxassetid://8425128737",
- ["PlayerEmulatorService"] = "rbxassetid://8425128737",
- ["BasePart"] = "rbxassetid://8425128556",
- ["ToastNotificationService"] = "rbxassetid://8425128737",
- ["DataStoreKeyInfo"] = "rbxassetid://8425128737",
- ["PartAdornment"] = "rbxassetid://8425128737",
- ["TextButton"] = "rbxassetid://8425201165",
- ["PluginToolbar"] = "rbxassetid://8425128737",
- ["ViewportFrame"] = "rbxassetid://8425128737",
- ["ScriptContext"] = "rbxassetid://8425128737",
- ["GenericSettings"] = "rbxassetid://8425128737",
- ["StarterCharacterScripts"] = "rbxassetid://8425128737",
- ["MaterialService"] = "rbxassetid://8425128737",
- ["Dialog"] = "rbxassetid://8425198662",
- ["ThirdPartyUserService"] = "rbxassetid://8425128737",
- ["CacheableContentProvider"] = "rbxassetid://8425128737",
- ["ThreadState"] = "rbxassetid://8425128737",
- ["Dragger"] = "rbxassetid://8425128737",
- ["HeightmapImporterService"] = "rbxassetid://8425128737",
- ["CommandInstance"] = "rbxassetid://8425128737",
- ["Clouds"] = "rbxassetid://8425128737",
- ["ManualGlue"] = "rbxassetid://8425128737",
- ["Seat"] = "rbxassetid://8425120806",
- ["AnimationRigData"] = "rbxassetid://8425199087",
- ["VoiceChatInternal"] = "rbxassetid://8425128737",
- ["Debris"] = "rbxassetid://8425121884",
- ["AvatarImportService"] = "rbxassetid://8425128737",
- ["DebuggerUIService"] = "rbxassetid://8425128737",
- ["LodDataService"] = "rbxassetid://8425128737",
- ["ParticleEmitter"] = "rbxassetid://8425195022",
- ["Flag"] = "rbxassetid://8425120025",
- ["StopWatchReporter"] = "rbxassetid://8425128737",
- ["UserSettings"] = "rbxassetid://8425128737",
- ["MessagingService"] = "rbxassetid://8425128737",
- ["Backpack"] = "rbxassetid://8425124072",
- ["Actor"] = "rbxassetid://8425240974",
- ["NetworkMarker"] = "rbxassetid://8425128737",
- ["LuaWebService"] = "rbxassetid://8425128737",
- ["Sky"] = "rbxassetid://8425122290",
- ["DataStoreKey"] = "rbxassetid://8425128737",
- ["Translator"] = "rbxassetid://8425128737",
- ["UILayout"] = "rbxassetid://8425122723",
- ["FloatCurve"] = "rbxassetid://8425128737",
- ["Chat"] = "rbxassetid://8425128737",
- ["Workspace"] = "rbxassetid://8425124333",
- ["SelectionSphere"] = "rbxassetid://8425200469",
- ["TrussPart"] = "rbxassetid://8425128556",
- ["DataStoreVersionPages"] = "rbxassetid://8425128737",
- ["AssetDeliveryProxy"] = "rbxassetid://8425128737",
- ["RemoteDebuggerServer"] = "rbxassetid://8425128737",
- ["PrismaticConstraint"] = "rbxassetid://8425246405",
- ["TorsionSpringConstraint"] = "rbxassetid://8425128737",
- ["TouchTransmitter"] = "rbxassetid://8425128737",
- ["InventoryPages"] = "rbxassetid://8425128737",
- ["InstanceAdornment"] = "rbxassetid://8425128737",
- ["Fire"] = "rbxassetid://8425198879",
- ["RotationCurve"] = "rbxassetid://8425128737",
- ["ProximityPromptService"] = "rbxassetid://8425128737",
- ["VoiceChannel"] = "rbxassetid://8425128737",
- ["ReplicatedScriptService"] = "rbxassetid://8425128737",
- ["CoreScript"] = "rbxassetid://8425128737",
- ["CylinderMesh"] = "rbxassetid://8425128737",
- ["Weld"] = "rbxassetid://8425128737",
- ["QWidgetPluginGui"] = "rbxassetid://8425128737",
- ["BoolValue"] = "rbxassetid://8425127573",
- ["Pages"] = "rbxassetid://8425128737",
- ["ChangeHistoryService"] = "rbxassetid://8425128737",
- ["ClickDetector"] = "rbxassetid://8425119391",
- ["Instance"] = "rbxassetid://8425128737",
- ["Hopper"] = "rbxassetid://8425128737",
- ["BackpackItem"] = "rbxassetid://8425128737",
- ["SurfaceLight"] = "rbxassetid://8425125743",
- ["Rotate"] = "rbxassetid://8425128737",
- ["Keyframe"] = "rbxassetid://8425128737",
- ["ShirtGraphic"] = "rbxassetid://8425119613",
- ["LocalizationTable"] = "rbxassetid://8425244380",
- ["PublishService"] = "rbxassetid://8425128737",
- ["PluginMouse"] = "rbxassetid://8425128737",
- ["BrickColorValue"] = "rbxassetid://8425127573",
- ["AdService"] = "rbxassetid://8425128737",
- ["WorldModel"] = "rbxassetid://8425128737",
- ["PluginDebugService"] = "rbxassetid://8425128737",
- ["CharacterAppearance"] = "rbxassetid://8425128737",
- ["SelectionLasso"] = "rbxassetid://8425199900",
- ["Stats"] = "rbxassetid://8425128737",
- ["MessageBusConnection"] = "rbxassetid://8425128737",
- ["Smoke"] = "rbxassetid://8425199288",
- ["KeyframeSequenceProvider"] = "rbxassetid://8425128737",
- ["TextBoxService"] = "rbxassetid://8425128737",
- ["InputObject"] = "rbxassetid://8425128737",
- ["NotificationService"] = "rbxassetid://8425128737",
- ["Torque"] = "rbxassetid://8425242864",
- ["BulkImportService"] = "rbxassetid://8425128737",
- ["UniversalConstraint"] = "rbxassetid://8425261741",
- ["PointLight"] = "rbxassetid://8425125743",
- ["TweenBase"] = "rbxassetid://8425128737",
- ["DoubleConstrainedValue"] = "rbxassetid://8425127573",
- ["RocketPropulsion"] = "rbxassetid://8425128737",
- ["CoreScriptSyncService"] = "rbxassetid://8425128737",
- ["CanvasGroup"] = "rbxassetid://8425128737",
- ["ReplicatedFirst"] = "rbxassetid://8425128737",
- ["SpotLight"] = "rbxassetid://8425125743",
- ["NegateOperation"] = "rbxassetid://8425196543",
- ["CommandService"] = "rbxassetid://8425128737",
- ["ChorusSoundEffect"] = "rbxassetid://8425247111",
- ["Tool"] = "rbxassetid://8425124723",
- ["Texture"] = "rbxassetid://8425126339",
- ["Breakpoint"] = "rbxassetid://8425128737",
- ["Script"] = "rbxassetid://8425127126",
- ["Terrain"] = "rbxassetid://8425198124",
- ["DataStoreInfo"] = "rbxassetid://8425128737",
- ["ReflectionMetadataProperties"] = "rbxassetid://8425128737",
- ["TextBox"] = "rbxassetid://8425128737",
- ["DebuggerLuaResponse"] = "rbxassetid://8425128737",
- ["FunctionalTest"] = "rbxassetid://8425128737",
- ["DataModelPatchService"] = "rbxassetid://8425128737",
- ["MouseService"] = "rbxassetid://8425128737",
- ["LodDataEntity"] = "rbxassetid://8425128737",
- ["UITextSizeConstraint"] = "rbxassetid://8425122723",
- ["ReflectionMetadata"] = "rbxassetid://8425128737",
- ["DataStoreKeyPages"] = "rbxassetid://8425128737",
- ["NoCollisionConstraint"] = "rbxassetid://8425242510",
- ["UIAspectRatioConstraint"] = "rbxassetid://8425122723",
- ["RodConstraint"] = "rbxassetid://8425245873",
- ["FileMesh"] = "rbxassetid://8425128737",
- ["Shirt"] = "rbxassetid://8425118944",
- ["SlidingBallConstraint"] = "rbxassetid://8425128737",
- ["VirtualInputManager"] = "rbxassetid://8425128737",
- ["GlobalDataStore"] = "rbxassetid://8425128737",
- ["SolidModelContentProvider"] = "rbxassetid://8425128737",
- ["SkateboardPlatform"] = "rbxassetid://8425128737",
- ["DebuggerWatch"] = "rbxassetid://8425128737",
- ["DataModelMesh"] = "rbxassetid://8425128737",
- ["UGCValidationService"] = "rbxassetid://8425128737",
- ["StudioScriptDebugEventListener"] = "rbxassetid://8425128737",
- ["BaseWrap"] = "rbxassetid://8425128737",
- ["Mouse"] = "rbxassetid://8425128737",
- ["NonReplicatedCSGDictionaryService"] = "rbxassetid://8425128737",
- ["Decal"] = "rbxassetid://8425126929",
- ["ModuleScript"] = "rbxassetid://8425195794",
- ["CharacterMesh"] = "rbxassetid://8425199087",
- ["GuidRegistryService"] = "rbxassetid://8425128737",
- ["GameSettings"] = "rbxassetid://8425128737",
- ["MetaBreakpointContext"] = "rbxassetid://8425128737",
- ["HandlesBase"] = "rbxassetid://8425128737",
- ["PluginManager"] = "rbxassetid://8425128737",
- ["AssetManagerService"] = "rbxassetid://8425128737",
- ["PlayerScripts"] = "rbxassetid://8425195358",
- ["FriendService"] = "rbxassetid://8425128737",
- ["Speaker"] = "rbxassetid://8425128737",
- ["UISizeConstraint"] = "rbxassetid://8425122723",
- ["PVInstance"] = "rbxassetid://8425128737",
- ["ILegacyStudioBridge"] = "rbxassetid://8425128737",
- ["SurfaceAppearance"] = "rbxassetid://8425128737",
- ["VehicleSeat"] = "rbxassetid://8425128737",
- ["DebugSettings"] = "rbxassetid://8425128737",
- ["ServerStorage"] = "rbxassetid://8425197217",
- ["IntValue"] = "rbxassetid://8425127573",
- ["FloorWire"] = "rbxassetid://8425128737",
- ["LuauScriptAnalyzerService"] = "rbxassetid://8425128737",
- ["LanguageService"] = "rbxassetid://8425128737",
- ["CornerWedgePart"] = "rbxassetid://8425128556",
- ["UIGridLayout"] = "rbxassetid://8425122723",
- ["GlobalSettings"] = "rbxassetid://8425128737",
- ["TestService"] = "rbxassetid://8425197356",
- ["SoundGroup"] = "rbxassetid://8425246885",
- ["GuiObject"] = "rbxassetid://8425128737",
- ["SunRaysEffect"] = "rbxassetid://8425194473",
- ["CorePackages"] = "rbxassetid://8425128737",
- ["DraftsService"] = "rbxassetid://8425128737",
- ["RunningAverageItemInt"] = "rbxassetid://8425128737",
- ["PlayerMouse"] = "rbxassetid://8425128737",
- ["AnalyticsService"] = "rbxassetid://8425128737",
- ["PluginAction"] = "rbxassetid://8425128737",
- ["AlignPosition"] = "rbxassetid://8425243989",
- ["InsertService"] = "rbxassetid://8425128737",
- ["Message"] = "rbxassetid://8425128737",
- ["Player"] = "rbxassetid://8425125912",
- ["ImporterJointSettings"] = "rbxassetid://8425128737",
- ["File"] = "rbxassetid://8425128737",
- ["OutfitPages"] = "rbxassetid://8425128737",
- ["ManualSurfaceJointInstance"] = "rbxassetid://8425128737",
- ["Highlight"] = "rbxassetid://8425260140",
- ["MeshPart"] = "rbxassetid://8425128556",
- ["AngularVelocity"] = "rbxassetid://8425128737",
- ["Light"] = "rbxassetid://8425125743",
- ["RobloxReplicatedStorage"] = "rbxassetid://8425128737",
- ["ImporterRootSettings"] = "rbxassetid://8425128737",
- ["ScriptService"] = "rbxassetid://8425128737",
- ["HapticService"] = "rbxassetid://8425128737",
- ["TeleportAsyncResult"] = "rbxassetid://8425128737",
- ["DialogChoice"] = "rbxassetid://8425198503",
- ["PackageService"] = "rbxassetid://8425128737",
- ["EmotesPages"] = "rbxassetid://8425128737",
- ["AnimationController"] = "rbxassetid://8425199087",
- ["AvatarEditorService"] = "rbxassetid://8425128737",
- ["Skin"] = "rbxassetid://8425128737",
- ["Pants"] = "rbxassetid://8425118713",
- ["Animation"] = "rbxassetid://8425199087",
- ["RuntimeScriptService"] = "rbxassetid://8425128737",
- ["HttpService"] = "rbxassetid://8425128737",
- ["ReflectionMetadataClass"] = "rbxassetid://8425128737",
- ["VoiceChatService"] = "rbxassetid://8425128737",
- ["StudioService"] = "rbxassetid://8425128737",
- ["Model"] = "rbxassetid://8425128273",
- ["VirtualUser"] = "rbxassetid://8425128737",
- ["VersionControlService"] = "rbxassetid://8425128737",
- ["Snap"] = "rbxassetid://8425128737",
- ["BodyAngularVelocity"] = "rbxassetid://8425125550",
- ["VelocityMotor"] = "rbxassetid://8425128737",
- ["StringValue"] = "rbxassetid://8425127573",
- ["UIConstraint"] = "rbxassetid://8425122723",
- ["IntConstrainedValue"] = "rbxassetid://8425127573",
- ["Part"] = "rbxassetid://8425128556",
- ["LineHandleAdornment"] = "rbxassetid://8425242061",
- ["BinaryStringValue"] = "rbxassetid://8425127573",
- ["StandardPages"] = "rbxassetid://8425128737",
- ["UserService"] = "rbxassetid://8425128737",
- ["UserInputService"] = "rbxassetid://8425128737",
- ["UserGameSettings"] = "rbxassetid://8425128737",
- ["UnvalidatedAssetService"] = "rbxassetid://8425128737",
- ["DebuggerManager"] = "rbxassetid://8425128737",
- ["TeleportOptions"] = "rbxassetid://8425128737",
- ["TeleportService"] = "rbxassetid://8425128737",
- ["Hint"] = "rbxassetid://8425128737",
- ["DraggerService"] = "rbxassetid://8425128737",
- ["BrowserService"] = "rbxassetid://8425128737",
- ["TweenService"] = "rbxassetid://8425128737",
- ["UIGridStyleLayout"] = "rbxassetid://8425122723",
- ["MemoryStoreQueue"] = "rbxassetid://8425128737",
- ["DataStoreObjectVersionInfo"] = "rbxassetid://8425128737",
- ["RigidConstraint"] = "rbxassetid://8425128737",
- ["RayValue"] = "rbxassetid://8425127573",
- ["RotateP"] = "rbxassetid://8425128737",
- ["PartOperation"] = "rbxassetid://8425128737",
- ["UIComponent"] = "rbxassetid://8425122723",
- ["UIBase"] = "rbxassetid://8425122723",
- ["BodyForce"] = "rbxassetid://8425125550",
- ["UIPageLayout"] = "rbxassetid://8425122723",
- ["MarkerCurve"] = "rbxassetid://8425128737",
- ["GroupService"] = "rbxassetid://8425128737",
- ["Motor6D"] = "rbxassetid://8425242305",
- ["RotateV"] = "rbxassetid://8425128737",
- ["UIPadding"] = "rbxassetid://8425122723",
- ["ToolboxService"] = "rbxassetid://8425128737",
- ["TracerService"] = "rbxassetid://8425128737",
- ["ClusterPacketCache"] = "rbxassetid://8425128737",
- ["ImporterTextureSettings"] = "rbxassetid://8425128737",
- ["EventIngestService"] = "rbxassetid://8425128737",
- ["BallSocketConstraint"] = "rbxassetid://8425246730",
- ["DataStoreService"] = "rbxassetid://8425128737",
- ["StackFrame"] = "rbxassetid://8425128737",
- ["ClientReplicator"] = "rbxassetid://8425128737",
- ["FlagStandService"] = "rbxassetid://8425128737",
- ["UIStroke"] = "rbxassetid://8425122723",
- ["Sound"] = "rbxassetid://8425126142",
- ["PhysicsService"] = "rbxassetid://8425128737",
- ["TimerService"] = "rbxassetid://8425128737",
- ["AnimationTrack"] = "rbxassetid://8425199087",
- ["RemoteEvent"] = "rbxassetid://8425195933",
- ["TextFilterResult"] = "rbxassetid://8425128737",
- ["TextChatService"] = "rbxassetid://8425128737",
- ["TextChannel"] = "rbxassetid://8425128737",
- ["DataStoreIncrementOptions"] = "rbxassetid://8425128737",
- ["BodyPosition"] = "rbxassetid://8425125550",
- ["SurfaceGui"] = "rbxassetid://8425128737",
- ["TemporaryScriptService"] = "rbxassetid://8425128737",
- ["ScreenGui"] = "rbxassetid://8425117892",
- ["DataStoreListingPages"] = "rbxassetid://8425128737",
- ["TerrainRegion"] = "rbxassetid://8425128737",
- ["HandleAdornment"] = "rbxassetid://8425128737",
- ["TaskScheduler"] = "rbxassetid://8425128737",
- ["StudioTheme"] = "rbxassetid://8425128737",
- ["Visit"] = "rbxassetid://8425128737",
- ["ChannelSelectorSoundEffect"] = "rbxassetid://8425247111",
- ["ForceField"] = "rbxassetid://8425120289",
- ["StudioDeviceEmulatorService"] = "rbxassetid://8425128737",
- ["NumberPose"] = "rbxassetid://8425128737",
- ["ControllerService"] = "rbxassetid://8425128737",
- ["DebuggerVariable"] = "rbxassetid://8425128737",
- ["Bone"] = "rbxassetid://8425263479",
- ["StudioData"] = "rbxassetid://8425128737",
- ["BodyVelocity"] = "rbxassetid://8425125550",
- ["CurveAnimation"] = "rbxassetid://8425128737",
- ["InternalContainer"] = "rbxassetid://8425128737",
- ["CatalogPages"] = "rbxassetid://8425128737",
- ["Studio"] = "rbxassetid://8425128737",
- ["Color3Value"] = "rbxassetid://8425127573",
- ["PVAdornment"] = "rbxassetid://8425128737",
- ["PausedStateException"] = "rbxassetid://8425128737",
- ["Platform"] = "rbxassetid://8425128737",
- ["DepthOfFieldEffect"] = "rbxassetid://8425194473",
- ["ScriptRegistrationService"] = "rbxassetid://8425128737",
- ["StatsItem"] = "rbxassetid://8425128737",
- ["PermissionsService"] = "rbxassetid://8425128737",
- ["BodyThrust"] = "rbxassetid://8425125550",
- ["Clothing"] = "rbxassetid://8425128737",
- ["GuiButton"] = "rbxassetid://8425128737",
- ["PlayerGui"] = "rbxassetid://8425118169",
- ["StandalonePluginScripts"] = "rbxassetid://8425128737",
- ["PathfindingModifier"] = "rbxassetid://8425260939",
- ["IXPService"] = "rbxassetid://8425128737",
- ["Frame"] = "rbxassetid://8425201815",
- ["ConfigureServerService"] = "rbxassetid://8425128737",
- ["MaterialVariant"] = "rbxassetid://8425260607",
- ["GoogleAnalyticsConfiguration"] = "rbxassetid://8425128737",
- ["JointsService"] = "rbxassetid://8425128737",
- ["HttpRequest"] = "rbxassetid://8425128737",
- ["SpawnerService"] = "rbxassetid://8425128737",
- ["Sparkles"] = "rbxassetid://8425119133",
- ["AlignOrientation"] = "rbxassetid://8425243741",
- ["SoundService"] = "rbxassetid://8425121749",
- ["SpecialMesh"] = "rbxassetid://8425126746",
- ["GuiBase3d"] = "rbxassetid://8425128737",
- ["SphereHandleAdornment"] = "rbxassetid://8425241156",
- ["Animator"] = "rbxassetid://8425128737",
- ["ReverbSoundEffect"] = "rbxassetid://8425247111",
- ["PitchShiftSoundEffect"] = "rbxassetid://8425247111",
- ["EqualizerSoundEffect"] = "rbxassetid://8425247111",
- ["NetworkServer"] = "rbxassetid://8425125305",
- ["DistortionSoundEffect"] = "rbxassetid://8425247111",
- ["Beam"] = "rbxassetid://8425244609",
- ["StarterPlayerScripts"] = "rbxassetid://8425128737",
- ["Lighting"] = "rbxassetid://8425125743",
- ["CustomEventReceiver"] = "rbxassetid://8425128737",
- ["SoundEffect"] = "rbxassetid://8425247111",
- ["BasePlayerGui"] = "rbxassetid://8425128737",
- ["ParabolaAdornment"] = "rbxassetid://8425128737",
- ["WedgePart"] = "rbxassetid://8425128556",
- ["PausedStateBreakpoint"] = "rbxassetid://8425128737",
- ["Trail"] = "rbxassetid://8425245307",
- ["PluginGui"] = "rbxassetid://8425128737",
- ["UnionOperation"] = "rbxassetid://8425128737",
- ["DockWidgetPluginGui"] = "rbxassetid://8425128737",
- ["AnimationClip"] = "rbxassetid://8425199087",
- ["BodyColors"] = "rbxassetid://8425125550",
- ["ServiceProvider"] = "rbxassetid://8425128737",
- ["DebuggerConnection"] = "rbxassetid://8425128737",
- ["FaceControls"] = "rbxassetid://8425260802",
- ["AnimationClipProvider"] = "rbxassetid://8425199087",
- ["CustomEvent"] = "rbxassetid://8425128737",
- ["MemoryStoreService"] = "rbxassetid://8425128737",
- ["ScriptDebugger"] = "rbxassetid://8425128737",
- ["ScriptChangeService"] = "rbxassetid://8425128737",
- ["VideoFrame"] = "rbxassetid://8425262172",
- ["BloomEffect"] = "rbxassetid://8425194473",
- ["Selection"] = "rbxassetid://8425128737",
- ["Motor"] = "rbxassetid://8425128737",
- ["Glue"] = "rbxassetid://8425128737",
- ["FormFactorPart"] = "rbxassetid://8425128556",
- ["GamepadService"] = "rbxassetid://8425128737",
- ["RemoteFunction"] = "rbxassetid://8425196065",
- ["HttpRbxApiService"] = "rbxassetid://8425128737",
- ["CompressorSoundEffect"] = "rbxassetid://8425247111",
- ["ReflectionMetadataEnumItem"] = "rbxassetid://8425128737",
- ["VoiceSource"] = "rbxassetid://8425128737",
- ["DebuggerBreakpoint"] = "rbxassetid://8425128737",
- ["ReflectionMetadataItem"] = "rbxassetid://8425128737",
- ["LogService"] = "rbxassetid://8425128737",
- ["ReflectionMetadataEnums"] = "rbxassetid://8425128737",
- ["PluginPolicyService"] = "rbxassetid://8425128737",
- ["AppUpdateService"] = "rbxassetid://8425128737",
- ["ScrollingFrame"] = "rbxassetid://8425128737",
- ["RbxAnalyticsService"] = "rbxassetid://8425128737",
- ["GuiService"] = "rbxassetid://8425128737",
- ["SpringConstraint"] = "rbxassetid://8425245639",
- ["ProximityPrompt"] = "rbxassetid://8425261619",
- ["MemStorageService"] = "rbxassetid://8425128737",
- ["HiddenSurfaceRemovalAsset"] = "rbxassetid://8425128737",
- ["Tween"] = "rbxassetid://8425128737",
- ["ProcessInstancePhysicsService"] = "rbxassetid://8425128737",
- ["BlurEffect"] = "rbxassetid://8425194473",
- ["StudioAssetService"] = "rbxassetid://8425128737",
- ["PostEffect"] = "rbxassetid://8425194473",
- ["PluginToolbarButton"] = "rbxassetid://8425128737",
- ["ServerReplicator"] = "rbxassetid://8425128737",
- ["ConeHandleAdornment"] = "rbxassetid://8425241536",
- ["JointInstance"] = "rbxassetid://8425128737",
- ["PluginDragEvent"] = "rbxassetid://8425128737",
- ["SelectionPointLasso"] = "rbxassetid://8425128737",
- ["GamePassService"] = "rbxassetid://8425128737",
- ["Plugin"] = "rbxassetid://8425128737",
- ["TextService"] = "rbxassetid://8425128737",
- ["DataStorePages"] = "rbxassetid://8425128737",
- ["DataStoreOptions"] = "rbxassetid://8425128737",
- ["LoginService"] = "rbxassetid://8425128737",
- ["LocalizationService"] = "rbxassetid://8425245462",
- ["Camera"] = "rbxassetid://8425127348",
- ["LinearVelocity"] = "rbxassetid://8425260294",
- ["UICorner"] = "rbxassetid://8425122723",
- ["SpawnLocation"] = "rbxassetid://8425122855",
- ["NetworkClient"] = "rbxassetid://8425125061",
- ["CalloutService"] = "rbxassetid://8425128737",
- ["UITableLayout"] = "rbxassetid://8425122723",
- ["ImporterBaseSettings"] = "rbxassetid://8425128737",
- ["UIGradient"] = "rbxassetid://8425122723",
- ["ContextActionService"] = "rbxassetid://8425128737",
- ["LocalScript"] = "rbxassetid://8425124511",
- ["BreakpointManager"] = "rbxassetid://8425128737",
- ["BoxHandleAdornment"] = "rbxassetid://8425241336",
- ["PackageLink"] = "rbxassetid://8425244193",
- }
- -- MERELY
- Option.Modifiable = true
- -- END MERELY
- -- general size of GUI objects, in pixels
- local GUI_SIZE = 16
- -- padding between items within each entry
- local ENTRY_PADDING = 1
- -- padding between each entry
- local ENTRY_MARGIN = 1
- local explorerPanel = script.Parent
- local Input = game:GetService("UserInputService")
- local HoldingCtrl = false
- local HoldingShift = false
- local DexOutput = Instance.new("Folder")
- DexOutput.Name = "Output"
- local DexOutputMain = Instance.new("ScreenGui", DexOutput)
- DexOutputMain.Name = "Dex Output"
- if(not game:GetService("RunService"):IsStudio()) then
- function print(...)
- local Obj = Instance.new("Dialog")
- Obj.Parent = DexOutputMain
- Obj.Name = ""
- for i,v in pairs({...}) do
- Obj.Name = Obj.Name .. tostring(v) .. " "
- end
- end
- end
- --[[
- # Explorer Panel
- A GUI panel that displays the game hierarchy.
- ## Selection Bindables
- - `Function GetSelection ( )`
- Returns an array of objects representing the objects currently
- selected in the panel.
- - `Function SetSelection ( Objects selection )`
- Sets the objects that are selected in the panel. `selection` is an array
- of objects.
- - `Event SelectionChanged ( )`
- Fired after the selection changes.
- ## Option Bindables
- - `Function GetOption ( string optionName )`
- If `optionName` is given, returns the value of that option. Otherwise,
- returns a table of options and their current values.
- - `Function SetOption ( string optionName, bool value )`
- Sets `optionName` to `value`.
- Options:
- - Modifiable
- Whether objects can be modified by the panel.
- Note that modifying objects depends on being able to select them. If
- Selectable is false, then Actions will not be available. Reparenting
- is still possible, but only for the dragged object.
- - Selectable
- Whether objects can be selected.
- If Modifiable is false, then left-clicking will perform a drag
- selection.
- ## Updates
- - 2013-09-18
- - Fixed explorer icons to match studio explorer.
- - 2013-09-14
- - Added GetOption and SetOption bindables.
- - Option: Modifiable; sets whether objects can be modified by the panel.
- - Option: Selectable; sets whether objects can be selected.
- - Slight modification to left-click selection behavior.
- - Improved layout and scaling.
- - 2013-09-13
- - Added drag to reparent objects.
- - Left-click to select/deselect object.
- - Left-click and drag unselected object to reparent single object.
- - Left-click and drag selected object to move reparent entire selection.
- - Right-click while dragging to cancel.
- - 2013-09-11
- - Added explorer panel header with actions.
- - Added Cut action.
- - Added Copy action.
- - Added Paste action.
- - Added Delete action.
- - Added drag selection.
- - Left-click: Add to selection on drag.
- - Right-click: Add to or remove from selection on drag.
- - Ensured SelectionChanged fires only when the selection actually changes.
- - Added documentation and change log.
- - Fixed thread issue.
- - 2013-09-09
- - Added basic multi-selection.
- - Left-click to set selection.
- - Right-click to add to or remove from selection.
- - Removed "Selection" ObjectValue.
- - Added GetSelection BindableFunction.
- - Added SetSelection BindableFunction.
- - Added SelectionChanged BindableEvent.
- - Changed font to SourceSans.
- - 2013-08-31
- - Improved GUI sizing based off of `GUI_SIZE` constant.
- - Automatic font size detection.
- - 2013-08-27
- - Initial explorer panel.
- ## Todo
- - Sorting
- - by ExplorerOrder
- - by children
- - by name
- - Drag objects to reparent
- ]]
- local ENTRY_SIZE = GUI_SIZE + ENTRY_PADDING*2
- local ENTRY_BOUND = ENTRY_SIZE + ENTRY_MARGIN
- local HEADER_SIZE = ENTRY_SIZE*2
- local FONT = 'SourceSans'
- local FONT_SIZE do
- local size = {8,9,10,11,12,14,18,24,36,48}
- local s
- local n = math.huge
- for i = 1,#size do
- if size[i] <= GUI_SIZE then
- FONT_SIZE = i - 1
- end
- end
- end
- local GuiColor = {
- Background = Color3.fromRGB(43, 43, 43);
- Border = Color3.fromRGB(20, 20, 20);
- Selected = Color3.fromRGB(5, 102, 141);
- BorderSelected = Color3.fromRGB(2, 128, 144);
- Text = Color3.fromRGB(245, 245, 245);
- TextDisabled = Color3.fromRGB(188, 188, 188);
- TextSelected = Color3.fromRGB(255, 255, 255);
- Button = Color3.fromRGB(33, 33, 33);
- ButtonBorder = Color3.fromRGB(133, 133, 133);
- ButtonSelected = Color3.fromRGB(0, 168, 150);
- Field = Color3.fromRGB(43, 43, 43);
- FieldBorder = Color3.fromRGB(50, 50, 50);
- TitleBackground = Color3.fromRGB(11, 11, 11);
- }
- --[[
- local GuiColor = {
- Background = Color3.new(233/255, 233/255, 233/255);
- Border = Color3.new(149/255, 149/255, 149/255);
- Selected = Color3.new( 96/255, 140/255, 211/255);
- BorderSelected = Color3.new( 86/255, 125/255, 188/255);
- Text = Color3.new( 0/255, 0/255, 0/255);
- TextDisabled = Color3.new(128/255, 128/255, 128/255);
- TextSelected = Color3.new(255/255, 255/255, 255/255);
- Button = Color3.new(221/255, 221/255, 221/255);
- ButtonBorder = Color3.new(149/255, 149/255, 149/255);
- ButtonSelected = Color3.new(255/255, 0/255, 0/255);
- Field = Color3.new(255/255, 255/255, 255/255);
- FieldBorder = Color3.new(191/255, 191/255, 191/255);
- TitleBackground = Color3.new(178/255, 178/255, 178/255);
- }
- ]]
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Icon map constants
- local MAP_ID = 483448923
- -- Indices based on implementation of Icon function.
- local ACTION_CUT = 160
- local ACTION_COPY = 161
- local ACTION_PASTE = 162
- local ACTION_DELETE = 163
- local ACTION_SORT = 164
- local ACTION_CUT_OVER = 174
- local ACTION_COPY_OVER = 175
- local ACTION_PASTE_OVER = 176
- local ACTION_DELETE_OVER = 177
- local ACTION_SORT_OVER = 178
- local ACTION_EDITQUICKACCESS = 190
- local ACTION_FREEZE = 188
- local ACTION_STARRED = 189
- local ACTION_ADDSTAR = 184
- local ACTION_ADDSTAR_OVER = 187
- local NODE_COLLAPSED = 165
- local NODE_EXPANDED = 166
- local NODE_COLLAPSED_OVER = 179
- local NODE_EXPANDED_OVER = 180
- local listOf = {
- ACTION_CUT,ACTION_COPY,ACTION_PASTE,ACTION_DELETE,ACTION_SORT,ACTION_CUT_OVER,ACTION_COPY_OVER,
- ACTION_PASTE_OVER,ACTION_DELETE_OVER,ACTION_SORT_OVER,ACTION_EDITQUICKACCESS,ACTION_FREEZE,ACTION_STARRED,
- ACTION_ADDSTAR,ACTION_ADDSTAR_OVER,NODE_COLLAPSED,NODE_EXPANDED,NODE_COLLAPSED_OVER,NODE_EXPANDED_OVER
- }
- local ExplorerIndex = {
- ["Accessory"] = 32;
- ["Accoutrement"] = 32;
- ["AdService"] = 73;
- ["Animation"] = 60;
- ["AnimationController"] = 60;
- ["AnimationTrack"] = 60;
- ["Animator"] = 60;
- ["ArcHandles"] = 56;
- ["AssetService"] = 72;
- ["Attachment"] = 34;
- ["Backpack"] = 20;
- ["BadgeService"] = 75;
- ["BallSocketConstraint"] = 89;
- ["BillboardGui"] = 64;
- ["BinaryStringValue"] = 4;
- ["BindableEvent"] = 67;
- ["BindableFunction"] = 66;
- ["BlockMesh"] = 8;
- ["BloomEffect"] = 90;
- ["BlurEffect"] = 90;
- ["BodyAngularVelocity"] = 14;
- ["BodyForce"] = 14;
- ["BodyGyro"] = 14;
- ["BodyPosition"] = 14;
- ["BodyThrust"] = 14;
- ["BodyVelocity"] = 14;
- ["BoolValue"] = 4;
- ["BoxHandleAdornment"] = 54;
- ["BrickColorValue"] = 4;
- ["Camera"] = 5;
- ["CFrameValue"] = 4;
- ["CharacterMesh"] = 60;
- ["Chat"] = 33;
- ["ClickDetector"] = 41;
- ["CollectionService"] = 30;
- ["Color3Value"] = 4;
- ["ColorCorrectionEffect"] = 90;
- ["ConeHandleAdornment"] = 54;
- ["Configuration"] = 58;
- ["ContentProvider"] = 72;
- ["ContextActionService"] = 41;
- ["CoreGui"] = 46;
- ["CoreScript"] = 18;
- ["CornerWedgePart"] = 1;
- ["CustomEvent"] = 4;
- ["CustomEventReceiver"] = 4;
- ["CylinderHandleAdornment"] = 54;
- ["CylinderMesh"] = 8;
- ["CylindricalConstraint"] = 89;
- ["Debris"] = 30;
- ["Decal"] = 7;
- ["Dialog"] = 62;
- ["DialogChoice"] = 63;
- ["DoubleConstrainedValue"] = 4;
- ["Explosion"] = 36;
- ["FileMesh"] = 8;
- ["Fire"] = 61;
- ["Flag"] = 38;
- ["FlagStand"] = 39;
- ["FloorWire"] = 4;
- ["Folder"] = 70;
- ["ForceField"] = 37;
- ["Frame"] = 48;
- ["GamePassService"] = 19;
- ["Glue"] = 34;
- ["GuiButton"] = 52;
- ["GuiMain"] = 47;
- ["GuiService"] = 47;
- ["Handles"] = 53;
- ["HapticService"] = 84;
- ["Hat"] = 45;
- ["HingeConstraint"] = 89;
- ["Hint"] = 33;
- ["HopperBin"] = 22;
- ["HttpService"] = 76;
- ["Humanoid"] = 9;
- ["ImageButton"] = 52;
- ["ImageLabel"] = 49;
- ["InsertService"] = 72;
- ["IntConstrainedValue"] = 4;
- ["IntValue"] = 4;
- ["JointInstance"] = 34;
- ["JointsService"] = 34;
- ["Keyframe"] = 60;
- ["KeyframeSequence"] = 60;
- ["KeyframeSequenceProvider"] = 60;
- ["Lighting"] = 13;
- ["LineHandleAdornment"] = 54;
- ["LocalScript"] = 18;
- ["LogService"] = 87;
- ["MarketplaceService"] = 46;
- ["Message"] = 33;
- ["Model"] = 2;
- ["ModuleScript"] = 71;
- ["Motor"] = 34;
- ["Motor6D"] = 34;
- ["MoveToConstraint"] = 89;
- ["NegateOperation"] = 78;
- ["NetworkClient"] = 16;
- ["NetworkReplicator"] = 29;
- ["NetworkServer"] = 15;
- ["NumberValue"] = 4;
- ["ObjectValue"] = 4;
- ["Pants"] = 44;
- ["ParallelRampPart"] = 1;
- ["Part"] = 1;
- ["ParticleEmitter"] = 69;
- ["PartPairLasso"] = 57;
- ["PathfindingService"] = 37;
- ["Platform"] = 35;
- ["Player"] = 12;
- ["PlayerGui"] = 46;
- ["Players"] = 21;
- ["PlayerScripts"] = 82;
- ["PointLight"] = 13;
- ["PointsService"] = 83;
- ["Pose"] = 60;
- ["PrismaticConstraint"] = 89;
- ["PrismPart"] = 1;
- ["PyramidPart"] = 1;
- ["RayValue"] = 4;
- ["ReflectionMetadata"] = 86;
- ["ReflectionMetadataCallbacks"] = 86;
- ["ReflectionMetadataClass"] = 86;
- ["ReflectionMetadataClasses"] = 86;
- ["ReflectionMetadataEnum"] = 86;
- ["ReflectionMetadataEnumItem"] = 86;
- ["ReflectionMetadataEnums"] = 86;
- ["ReflectionMetadataEvents"] = 86;
- ["ReflectionMetadataFunctions"] = 86;
- ["ReflectionMetadataMember"] = 86;
- ["ReflectionMetadataProperties"] = 86;
- ["ReflectionMetadataYieldFunctions"] = 86;
- ["RemoteEvent"] = 80;
- ["RemoteFunction"] = 79;
- ["ReplicatedFirst"] = 72;
- ["ReplicatedStorage"] = 72;
- ["RightAngleRampPart"] = 1;
- ["RocketPropulsion"] = 14;
- ["RodConstraint"] = 89;
- ["RopeConstraint"] = 89;
- ["Rotate"] = 34;
- ["RotateP"] = 34;
- ["RotateV"] = 34;
- ["RunService"] = 66;
- ["ScreenGui"] = 47;
- ["Script"] = 6;
- ["ScrollingFrame"] = 48;
- ["Seat"] = 35;
- ["Selection"] = 55;
- ["SelectionBox"] = 54;
- ["SelectionPartLasso"] = 57;
- ["SelectionPointLasso"] = 57;
- ["SelectionSphere"] = 54;
- ["ServerScriptService"] = 0;
- ["Shirt"] = 43;
- ["ShirtGraphic"] = 40;
- ["SkateboardPlatform"] = 35;
- ["Sky"] = 28;
- ["SlidingBallConstraint"] = 89;
- ["Smoke"] = 59;
- ["Snap"] = 34;
- ["Sound"] = 11;
- ["SoundService"] = 31;
- ["Sparkles"] = 42;
- ["SpawnLocation"] = 25;
- ["SpecialMesh"] = 8;
- ["SphereHandleAdornment"] = 54;
- ["SpotLight"] = 13;
- ["SpringConstraint"] = 89;
- ["StarterCharacterScripts"] = 82;
- ["StarterGear"] = 20;
- ["StarterGui"] = 46;
- ["StarterPack"] = 20;
- ["StarterPlayer"] = 88;
- ["StarterPlayerScripts"] = 82;
- ["Status"] = 2;
- ["StringValue"] = 4;
- ["SunRaysEffect"] = 90;
- ["SurfaceGui"] = 64;
- ["SurfaceLight"] = 13;
- ["SurfaceSelection"] = 55;
- ["Team"] = 24;
- ["Teams"] = 23;
- ["TeleportService"] = 81;
- ["Terrain"] = 65;
- ["TerrainRegion"] = 65;
- ["TestService"] = 68;
- ["TextBox"] = 51;
- ["TextButton"] = 51;
- ["TextLabel"] = 50;
- ["Texture"] = 10;
- ["TextureTrail"] = 4;
- ["Tool"] = 17;
- ["TouchTransmitter"] = 37;
- ["TrussPart"] = 1;
- ["UnionOperation"] = 77;
- ["UserInputService"] = 84;
- ["Vector3Value"] = 4;
- ["VehicleSeat"] = 35;
- ["VelocityMotor"] = 34;
- ["WedgePart"] = 1;
- ["Weld"] = 34;
- ["Workspace"] = 19;
- }
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- function Create(ty,data)
- local obj
- if type(ty) == 'string' then
- obj = Instance.new(ty)
- else
- obj = ty
- end
- for k, v in pairs(data) do
- if type(k) == 'number' then
- v.Parent = obj
- else
- obj[k] = v
- end
- end
- return obj
- end
- local barActive = false
- local activeOptions = {}
- function createDDown(dBut, callback,...)
- if barActive then
- for i,v in pairs(activeOptions) do
- v:Destroy()
- end
- activeOptions = {}
- barActive = false
- return
- else
- barActive = true
- end
- local slots = {...}
- local base = dBut
- for i,v in pairs(slots) do
- local newOption = base:Clone()
- newOption.ZIndex = 5
- newOption.Name = "Option "..tostring(i)
- newOption.Parent = base.Parent.Parent.Parent
- newOption.BackgroundTransparency = 0
- newOption.ZIndex = 2
- table.insert(activeOptions,newOption)
- newOption.Position = UDim2.new(-0.4, dBut.Position.X.Offset, dBut.Position.Y.Scale, dBut.Position.Y.Offset + (#activeOptions * dBut.Size.Y.Offset))
- newOption.Text = slots[i]
- newOption.MouseButton1Down:connect(function()
- dBut.Text = slots[i]
- callback(slots[i])
- for i,v in pairs(activeOptions) do
- v:Destroy()
- end
- activeOptions = {}
- barActive = false
- end)
- end
- end
- -- Connects a function to an event such that it fires asynchronously
- function Connect(event,func)
- return event:connect(function(...)
- local a = {...}
- spawn(function() func(unpack(a)) end)
- end)
- end
- -- returns the ascendant ScreenGui of an object
- function GetScreen(screen)
- if screen == nil then return nil end
- while not screen:IsA("ScreenGui") do
- screen = screen.Parent
- if screen == nil then return nil end
- end
- return screen
- end
- do
- local ZIndexLock = {}
- -- Sets the ZIndex of an object and its descendants. Objects are locked so
- -- that SetZIndexOnChanged doesn't spawn multiple threads that set the
- -- ZIndex of the same object.
- function SetZIndex(object,z)
- if not ZIndexLock[object] then
- ZIndexLock[object] = true
- if object:IsA'GuiObject' then
- object.ZIndex = z
- end
- local children = object:GetChildren()
- for i = 1,#children do
- SetZIndex(children[i],z)
- end
- ZIndexLock[object] = nil
- end
- end
- function SetZIndexOnChanged(object)
- return object.Changed:connect(function(p)
- if p == "ZIndex" then
- SetZIndex(object,object.ZIndex)
- end
- end)
- end
- end
- ---- IconMap ----
- -- Image size: 256px x 256px
- -- Icon size: 16px x 16px
- -- Padding between each icon: 2px
- -- Padding around image edge: 1px
- -- Total icons: 14 x 14 (196)
- local find = function(n)
- for a,i in pairs(ExplorerIndex) do
- if(i == n) then
- return a;
- end
- end
- end
- local Icon do
- local iconMap = 'http://www.roblox.com/asset/?id=' .. MAP_ID
- game:GetService('ContentProvider'):Preload(iconMap)
- local iconDehash do
- -- 14 x 14, 0-based input, 0-based output
- local f=math.floor
- function iconDehash(h)
- return f(h/14%14),f(h%14)
- end
- end
- function Icon(IconFrame,index,obj,zIndex)
- local isNodeThing = table.find(listOf,index) ~= nil;
- local class;
- if(not isNodeThing) then
- class = find(index);
- if(not class) then
- warn(index)
- end
- end
- local row,col = iconDehash(index)
- local mapSize = Vector2.new(256,256)
- local pad,border = 2,1
- local iconSize = 16
- local class = 'Frame'
- if type(IconFrame) == 'string' then
- class = IconFrame
- IconFrame = nil
- end
- if not IconFrame then
- IconFrame = Create(class,{
- Name = "Icon";
- BackgroundTransparency = 1;
- ClipsDescendants = true;
- Create('ImageLabel',{
- Name = "IconMap";
- Active = false;
- BackgroundTransparency = 1;
- Image = iconMap;
- Size = UDim2.new(mapSize.x/iconSize,0,mapSize.y/iconSize,0),
- });
- })
- end
- IconFrame.IconMap.Position = UDim2.new(-col - (pad*(col+1) + border)/iconSize,0,-row - (pad*(row+1) + border)/iconSize,0);
- if(fullListCustom[class or ""] and not isNodeThing) then
- if(obj) then
- class = obj.ClassName;
- end
- IconFrame.IconMap.Position = UDim2.new(0,0,0,0);
- IconFrame.ClipsDescendants = false;
- IconFrame.IconMap.ImageTransparency = 1;
- local f = IconFrame.IconMap:FindFirstChild("CustomIcon") or Create("ImageLabel",{
- Name = "CustomIcon",
- Active = false,
- BackgroundTransparency = 1,
- Size = UDim2.fromOffset(iconSize,iconSize),
- Position = UDim2.new(0,0,0,0),
- })
- if(zIndex) then
- f.ZIndex = zIndex;
- end
- f.Parent = IconFrame.IconMap;
- f.Image = fullListCustom[class]
- f:SetAttribute("Class",class)
- else
- IconFrame.ClipsDescendants = true;
- IconFrame.IconMap.ImageTransparency = 0;
- end
- return IconFrame
- end
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- ScrollBar
- do
- -- AutoButtonColor doesn't always reset properly
- local function ResetButtonColor(button)
- local active = button.Active
- button.Active = not active
- button.Active = active
- end
- local function ArrowGraphic(size,dir,scaled,template)
- local Frame = Create('Frame',{
- Name = "Arrow Graphic";
- BorderSizePixel = 0;
- Size = UDim2.new(0,size,0,size);
- Transparency = 1;
- })
- if not template then
- template = Instance.new("Frame")
- template.BorderSizePixel = 0
- end
- template.BackgroundColor3 = Color3.new(1, 1, 1);
- local transform
- if dir == nil or dir == 'Up' then
- function transform(p,s) return p,s end
- elseif dir == 'Down' then
- function transform(p,s) return UDim2.new(0,p.X.Offset,0,size-p.Y.Offset-1),s end
- elseif dir == 'Left' then
- function transform(p,s) return UDim2.new(0,p.Y.Offset,0,p.X.Offset),UDim2.new(0,s.Y.Offset,0,s.X.Offset) end
- elseif dir == 'Right' then
- function transform(p,s) return UDim2.new(0,size-p.Y.Offset-1,0,p.X.Offset),UDim2.new(0,s.Y.Offset,0,s.X.Offset) end
- end
- local scale
- if scaled then
- function scale(p,s) return UDim2.new(p.X.Offset/size,0,p.Y.Offset/size,0),UDim2.new(s.X.Offset/size,0,s.Y.Offset/size,0) end
- else
- function scale(p,s) return p,s end
- end
- local o = math.floor(size/4)
- if size%2 == 0 then
- local n = size/2-1
- for i = 0,n do
- local t = template:Clone()
- local p,s = scale(transform(
- UDim2.new(0,n-i,0,o+i),
- UDim2.new(0,(i+1)*2,0,1)
- ))
- t.Position = p
- t.Size = s
- t.Parent = Frame
- end
- else
- local n = (size-1)/2
- for i = 0,n do
- local t = template:Clone()
- local p,s = scale(transform(
- UDim2.new(0,n-i,0,o+i),
- UDim2.new(0,i*2+1,0,1)
- ))
- t.Position = p
- t.Size = s
- t.Parent = Frame
- end
- end
- if size%4 > 1 then
- local t = template:Clone()
- local p,s = scale(transform(
- UDim2.new(0,0,0,size-o-1),
- UDim2.new(0,size,0,1)
- ))
- t.Position = p
- t.Size = s
- t.Parent = Frame
- end
- for i,v in pairs(Frame:GetChildren()) do
- v.BackgroundColor3 = Color3.new(1, 1, 1);
- end
- return Frame
- end
- local function GripGraphic(size,dir,spacing,scaled,template)
- local Frame = Create('Frame',{
- Name = "Grip Graphic";
- BorderSizePixel = 0;
- Size = UDim2.new(0,size.x,0,size.y);
- Transparency = 1;
- })
- if not template then
- template = Instance.new("Frame")
- template.BorderSizePixel = 0
- end
- spacing = spacing or 2
- local scale
- if scaled then
- function scale(p) return UDim2.new(p.X.Offset/size.x,0,p.Y.Offset/size.y,0) end
- else
- function scale(p) return p end
- end
- if dir == 'Vertical' then
- for i=0,size.x-1,spacing do
- local t = template:Clone()
- t.Size = scale(UDim2.new(0,1,0,size.y))
- t.Position = scale(UDim2.new(0,i,0,0))
- t.Parent = Frame
- end
- elseif dir == nil or dir == 'Horizontal' then
- for i=0,size.y-1,spacing do
- local t = template:Clone()
- t.Size = scale(UDim2.new(0,size.x,0,1))
- t.Position = scale(UDim2.new(0,0,0,i))
- t.Parent = Frame
- end
- end
- return Frame
- end
- local mt = {
- __index = {
- GetScrollPercent = function(self)
- return self.ScrollIndex/(self.TotalSpace-self.VisibleSpace)
- end;
- CanScrollDown = function(self)
- return self.ScrollIndex + self.VisibleSpace < self.TotalSpace
- end;
- CanScrollUp = function(self)
- return self.ScrollIndex > 0
- end;
- ScrollDown = function(self)
- self.ScrollIndex = self.ScrollIndex + self.PageIncrement
- self:Update()
- end;
- ScrollUp = function(self)
- self.ScrollIndex = self.ScrollIndex - self.PageIncrement
- self:Update()
- end;
- ScrollTo = function(self,index)
- self.ScrollIndex = index
- self:Update()
- end;
- SetScrollPercent = function(self,percent)
- self.ScrollIndex = math.floor((self.TotalSpace - self.VisibleSpace)*percent + 0.5)
- self:Update()
- end;
- };
- }
- mt.__index.CanScrollRight = mt.__index.CanScrollDown
- mt.__index.CanScrollLeft = mt.__index.CanScrollUp
- mt.__index.ScrollLeft = mt.__index.ScrollUp
- mt.__index.ScrollRight = mt.__index.ScrollDown
- function ScrollBar(horizontal)
- -- create row scroll bar
- local ScrollFrame = Create('Frame',{
- Name = "ScrollFrame";
- BorderSizePixel = 0;
- Position = horizontal and UDim2.new(0,0,1,-GUI_SIZE) or UDim2.new(1,-GUI_SIZE,0,0);
- Size = horizontal and UDim2.new(1,0,0,GUI_SIZE) or UDim2.new(0,GUI_SIZE,1,0);
- BackgroundTransparency = 1;
- Create('ImageButton',{
- Name = "ScrollDown";
- Position = horizontal and UDim2.new(1,-GUI_SIZE,0,0) or UDim2.new(0,0,1,-GUI_SIZE);
- Size = UDim2.new(0, GUI_SIZE, 0, GUI_SIZE);
- BackgroundColor3 = GuiColor.Button;
- BorderColor3 = GuiColor.Border;
- --BorderSizePixel = 0;
- });
- Create('ImageButton',{
- Name = "ScrollUp";
- Size = UDim2.new(0, GUI_SIZE, 0, GUI_SIZE);
- BackgroundColor3 = GuiColor.Button;
- BorderColor3 = GuiColor.Border;
- --BorderSizePixel = 0;
- });
- Create('ImageButton',{
- Name = "ScrollBar";
- Size = horizontal and UDim2.new(1,-GUI_SIZE*2,1,0) or UDim2.new(1,0,1,-GUI_SIZE*2);
- Position = horizontal and UDim2.new(0,GUI_SIZE,0,0) or UDim2.new(0,0,0,GUI_SIZE);
- AutoButtonColor = false;
- BackgroundColor3 = Color3.new(1/4, 1/4, 1/4);
- BorderColor3 = GuiColor.Border;
- --BorderSizePixel = 0;
- Create('ImageButton',{
- Name = "ScrollThumb";
- AutoButtonColor = false;
- Size = UDim2.new(0, GUI_SIZE, 0, GUI_SIZE);
- BackgroundColor3 = GuiColor.Button;
- BorderColor3 = GuiColor.Border;
- --BorderSizePixel = 0;
- });
- });
- })
- local graphicTemplate = Create('Frame',{
- Name="Graphic";
- BorderSizePixel = 0;
- BackgroundColor3 = GuiColor.Border;
- })
- local graphicSize = GUI_SIZE/2
- local ScrollDownFrame = ScrollFrame.ScrollDown
- local ScrollDownGraphic = ArrowGraphic(graphicSize,horizontal and 'Right' or 'Down',true,graphicTemplate)
- ScrollDownGraphic.Position = UDim2.new(0.5,-graphicSize/2,0.5,-graphicSize/2)
- ScrollDownGraphic.Parent = ScrollDownFrame
- local ScrollUpFrame = ScrollFrame.ScrollUp
- local ScrollUpGraphic = ArrowGraphic(graphicSize,horizontal and 'Left' or 'Up',true,graphicTemplate)
- ScrollUpGraphic.Position = UDim2.new(0.5,-graphicSize/2,0.5,-graphicSize/2)
- ScrollUpGraphic.Parent = ScrollUpFrame
- local ScrollBarFrame = ScrollFrame.ScrollBar
- local ScrollThumbFrame = ScrollBarFrame.ScrollThumb
- do
- local size = GUI_SIZE*3/8
- local Decal = GripGraphic(Vector2.new(size,size),horizontal and 'Vertical' or 'Horizontal',2,graphicTemplate)
- Decal.Position = UDim2.new(0.5,-size/2,0.5,-size/2)
- Decal.Parent = ScrollThumbFrame
- end
- local Class = setmetatable({
- GUI = ScrollFrame;
- ScrollIndex = 0;
- VisibleSpace = 0;
- TotalSpace = 0;
- PageIncrement = 1;
- },mt)
- local UpdateScrollThumb
- if horizontal then
- function UpdateScrollThumb()
- ScrollThumbFrame.Size = UDim2.new(Class.VisibleSpace/Class.TotalSpace,0,0,GUI_SIZE)
- if ScrollThumbFrame.AbsoluteSize.x < GUI_SIZE then
- ScrollThumbFrame.Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE)
- end
- local barSize = ScrollBarFrame.AbsoluteSize.x
- ScrollThumbFrame.Position = UDim2.new(Class:GetScrollPercent()*(barSize - ScrollThumbFrame.AbsoluteSize.x)/barSize,0,0,0)
- end
- else
- function UpdateScrollThumb()
- ScrollThumbFrame.Size = UDim2.new(0,GUI_SIZE,Class.VisibleSpace/Class.TotalSpace,0)
- if ScrollThumbFrame.AbsoluteSize.y < GUI_SIZE then
- ScrollThumbFrame.Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE)
- end
- local barSize = ScrollBarFrame.AbsoluteSize.y
- ScrollThumbFrame.Position = UDim2.new(0,0,Class:GetScrollPercent()*(barSize - ScrollThumbFrame.AbsoluteSize.y)/barSize,0)
- end
- end
- local lastDown
- local lastUp
- local scrollStyle = {BackgroundColor3=Color3.new(1, 1, 1),BackgroundTransparency=0}
- local scrollStyle_ds = {BackgroundColor3=Color3.new(1, 1, 1),BackgroundTransparency=0.7}
- local function Update()
- local t = Class.TotalSpace
- local v = Class.VisibleSpace
- local s = Class.ScrollIndex
- if v <= t then
- if s > 0 then
- if s + v > t then
- Class.ScrollIndex = t - v
- end
- else
- Class.ScrollIndex = 0
- end
- else
- Class.ScrollIndex = 0
- end
- if Class.UpdateCallback then
- if Class.UpdateCallback(Class) == false then
- return
- end
- end
- local down = Class:CanScrollDown()
- local up = Class:CanScrollUp()
- if down ~= lastDown then
- lastDown = down
- ScrollDownFrame.Active = down
- ScrollDownFrame.AutoButtonColor = down
- local children = ScrollDownGraphic:GetChildren()
- local style = down and scrollStyle or scrollStyle_ds
- for i = 1,#children do
- Create(children[i],style)
- end
- end
- if up ~= lastUp then
- lastUp = up
- ScrollUpFrame.Active = up
- ScrollUpFrame.AutoButtonColor = up
- local children = ScrollUpGraphic:GetChildren()
- local style = up and scrollStyle or scrollStyle_ds
- for i = 1,#children do
- Create(children[i],style)
- end
- end
- ScrollThumbFrame.Visible = down or up
- UpdateScrollThumb()
- end
- Class.Update = Update
- SetZIndexOnChanged(ScrollFrame)
- local MouseDrag = Create('ImageButton',{
- Name = "MouseDrag";
- Position = UDim2.new(-0.25,0,-0.25,0);
- Size = UDim2.new(1.5,0,1.5,0);
- Transparency = 1;
- AutoButtonColor = false;
- Active = true;
- ZIndex = 10;
- })
- local scrollEventID = 0
- ScrollDownFrame.MouseButton1Down:connect(function()
- scrollEventID = tick()
- local current = scrollEventID
- local up_con
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollDownFrame)
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- Class:ScrollDown()
- wait(0.2) -- delay before auto scroll
- while scrollEventID == current do
- Class:ScrollDown()
- if not Class:CanScrollDown() then break end
- wait()
- end
- end)
- ScrollDownFrame.MouseButton1Up:connect(function()
- scrollEventID = tick()
- end)
- ScrollUpFrame.MouseButton1Down:connect(function()
- scrollEventID = tick()
- local current = scrollEventID
- local up_con
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollUpFrame)
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- Class:ScrollUp()
- wait(0.2)
- while scrollEventID == current do
- Class:ScrollUp()
- if not Class:CanScrollUp() then break end
- wait()
- end
- end)
- ScrollUpFrame.MouseButton1Up:connect(function()
- scrollEventID = tick()
- end)
- if horizontal then
- ScrollBarFrame.MouseButton1Down:connect(function(x,y)
- scrollEventID = tick()
- local current = scrollEventID
- local up_con
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollUpFrame)
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- if x > ScrollThumbFrame.AbsolutePosition.x then
- Class:ScrollTo(Class.ScrollIndex + Class.VisibleSpace)
- wait(0.2)
- while scrollEventID == current do
- if x < ScrollThumbFrame.AbsolutePosition.x + ScrollThumbFrame.AbsoluteSize.x then break end
- Class:ScrollTo(Class.ScrollIndex + Class.VisibleSpace)
- wait()
- end
- else
- Class:ScrollTo(Class.ScrollIndex - Class.VisibleSpace)
- wait(0.2)
- while scrollEventID == current do
- if x > ScrollThumbFrame.AbsolutePosition.x then break end
- Class:ScrollTo(Class.ScrollIndex - Class.VisibleSpace)
- wait()
- end
- end
- end)
- else
- ScrollBarFrame.MouseButton1Down:connect(function(x,y)
- scrollEventID = tick()
- local current = scrollEventID
- local up_con
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollUpFrame)
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- if y > ScrollThumbFrame.AbsolutePosition.y then
- Class:ScrollTo(Class.ScrollIndex + Class.VisibleSpace)
- wait(0.2)
- while scrollEventID == current do
- if y < ScrollThumbFrame.AbsolutePosition.y + ScrollThumbFrame.AbsoluteSize.y then break end
- Class:ScrollTo(Class.ScrollIndex + Class.VisibleSpace)
- wait()
- end
- else
- Class:ScrollTo(Class.ScrollIndex - Class.VisibleSpace)
- wait(0.2)
- while scrollEventID == current do
- if y > ScrollThumbFrame.AbsolutePosition.y then break end
- Class:ScrollTo(Class.ScrollIndex - Class.VisibleSpace)
- wait()
- end
- end
- end)
- end
- if horizontal then
- ScrollThumbFrame.MouseButton1Down:connect(function(x,y)
- scrollEventID = tick()
- local mouse_offset = x - ScrollThumbFrame.AbsolutePosition.x
- local drag_con
- local up_con
- drag_con = MouseDrag.MouseMoved:connect(function(x,y)
- local bar_abs_pos = ScrollBarFrame.AbsolutePosition.x
- local bar_drag = ScrollBarFrame.AbsoluteSize.x - ScrollThumbFrame.AbsoluteSize.x
- local bar_abs_one = bar_abs_pos + bar_drag
- x = x - mouse_offset
- x = x < bar_abs_pos and bar_abs_pos or x > bar_abs_one and bar_abs_one or x
- x = x - bar_abs_pos
- Class:SetScrollPercent(x/(bar_drag))
- end)
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollThumbFrame)
- drag_con:disconnect(); drag_con = nil
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- end)
- else
- ScrollThumbFrame.MouseButton1Down:connect(function(x,y)
- scrollEventID = tick()
- local mouse_offset = y - ScrollThumbFrame.AbsolutePosition.y
- local drag_con
- local up_con
- drag_con = MouseDrag.MouseMoved:connect(function(x,y)
- local bar_abs_pos = ScrollBarFrame.AbsolutePosition.y
- local bar_drag = ScrollBarFrame.AbsoluteSize.y - ScrollThumbFrame.AbsoluteSize.y
- local bar_abs_one = bar_abs_pos + bar_drag
- y = y - mouse_offset
- y = y < bar_abs_pos and bar_abs_pos or y > bar_abs_one and bar_abs_one or y
- y = y - bar_abs_pos
- Class:SetScrollPercent(y/(bar_drag))
- end)
- up_con = MouseDrag.MouseButton1Up:connect(function()
- scrollEventID = tick()
- MouseDrag.Parent = nil
- ResetButtonColor(ScrollThumbFrame)
- drag_con:disconnect(); drag_con = nil
- up_con:disconnect(); drag = nil
- end)
- MouseDrag.Parent = GetScreen(ScrollFrame)
- end)
- end
- function Class:Destroy()
- ScrollFrame:Destroy()
- MouseDrag:Destroy()
- for k in pairs(Class) do
- Class[k] = nil
- end
- setmetatable(Class,nil)
- end
- Update()
- return Class
- end
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Explorer panel
- Create(explorerPanel,{
- BackgroundColor3 = GuiColor.Field;
- BorderColor3 = GuiColor.Border;
- Active = true;
- })
- local SettingsRemote = explorerPanel.Parent:WaitForChild("SettingsPanel"):WaitForChild("GetSetting")
- local GetApiRemote = explorerPanel.Parent:WaitForChild("PropertiesFrame"):WaitForChild("GetApi")
- local GetAwaitRemote = explorerPanel.Parent:WaitForChild("PropertiesFrame"):WaitForChild("GetAwaiting")
- local bindSetAwaiting = explorerPanel.Parent:WaitForChild("PropertiesFrame"):WaitForChild("SetAwaiting")
- local SaveInstanceWindow = explorerPanel.Parent:WaitForChild("SaveInstance")
- local ConfirmationWindow = explorerPanel.Parent:WaitForChild("Confirmation")
- local CautionWindow = explorerPanel.Parent:WaitForChild("Caution")
- local TableCautionWindow = explorerPanel.Parent:WaitForChild("TableCaution")
- local RemoteWindow = explorerPanel.Parent:WaitForChild("CallRemote")
- local ScriptEditor = explorerPanel.Parent:WaitForChild("ScriptEditor")
- local ScriptEditorEvent = ScriptEditor:WaitForChild("OpenScript")
- local CurrentSaveInstanceWindow
- local CurrentRemoteWindow
- local lastSelectedNode
- local DexStorage
- local DexStorageMain
- local DexStorageEnabled
- if saveinstance then DexStorageEnabled = true end
- local _decompile = decompile;
- function decompile(s, ...)
- if SettingsRemote:Invoke'UseNewDecompiler' then
- return _decompile(s, 'new');
- else
- return _decompile(s, 'legacy');
- end
- end
- if DexStorageEnabled then
- DexStorage = Instance.new("Folder")
- DexStorage.Name = "Dex"
- DexStorageMain = Instance.new("Folder",DexStorage)
- DexStorageMain.Name = "DexStorage"
- end
- local RunningScriptsStorage
- local RunningScriptsStorageMain
- local RunningScriptsStorageEnabled
- if getscripts then RunningScriptsStorageEnabled = true end
- if RunningScriptsStorageEnabled then
- RunningScriptsStorage = Instance.new("Folder")
- RunningScriptsStorage.Name = "Dex Internal Storage"
- RunningScriptsStorageMain = Instance.new("Folder", RunningScriptsStorage)
- RunningScriptsStorageMain.Name = "Running Scripts"
- end
- local LoadedModulesStorage
- local LoadedModulesStorageMain
- local LoadedModulesStorageEnabled
- if getloadedmodules then LoadedModulesStorageEnabled = true end
- if LoadedModulesStorageEnabled then
- LoadedModulesStorage = Instance.new("Folder")
- LoadedModulesStorage.Name = "Dex Internal Storage"
- LoadedModulesStorageMain = Instance.new("Folder", LoadedModulesStorage)
- LoadedModulesStorageMain.Name = "Loaded Modules"
- end
- local NilStorage
- local NilStorageMain
- local NilStorageEnabled
- if getnilinstances then NilStorageEnabled = true end
- if NilStorageEnabled then
- NilStorage = Instance.new("Folder")
- NilStorage.Name = "Dex Internal Storage"
- NilStorageMain = Instance.new("Folder",NilStorage)
- NilStorageMain.Name = "Nil Instances"
- end
- local listFrame = Create('Frame',{
- Name = "List";
- BorderSizePixel = 0;
- BackgroundTransparency = 1;
- ClipsDescendants = true;
- Position = UDim2.new(0,0,0,HEADER_SIZE);
- Size = UDim2.new(1,-GUI_SIZE,1,-HEADER_SIZE);
- Parent = explorerPanel;
- })
- local scrollBar = ScrollBar(false)
- scrollBar.PageIncrement = 1
- Create(scrollBar.GUI,{
- Position = UDim2.new(1,-GUI_SIZE,0,HEADER_SIZE);
- Size = UDim2.new(0,GUI_SIZE,1,-HEADER_SIZE);
- Parent = explorerPanel;
- })
- local scrollBarH = ScrollBar(true)
- scrollBarH.PageIncrement = GUI_SIZE
- Create(scrollBarH.GUI,{
- Position = UDim2.new(0,0,1,-GUI_SIZE);
- Size = UDim2.new(1,-GUI_SIZE,0,GUI_SIZE);
- Visible = false;
- Parent = explorerPanel;
- })
- local headerFrame = Create('Frame',{
- Name = "Header";
- BorderSizePixel = 0;
- BackgroundColor3 = GuiColor.Background;
- BorderColor3 = GuiColor.Border;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,0,0,HEADER_SIZE);
- Parent = explorerPanel;
- Create('TextLabel',{
- Text = "Explorer";
- BackgroundTransparency = 1;
- TextColor3 = GuiColor.Text;
- TextXAlignment = 'Left';
- Font = FONT;
- FontSize = FONT_SIZE;
- Position = UDim2.new(0,4,0,0);
- Size = UDim2.new(1,-4,0.5,0);
- });
- })
- local explorerFilter = Create('TextBox',{
- Text = "Filter Workspace";
- BackgroundTransparency = 0.8;
- TextColor3 = GuiColor.Text;
- TextXAlignment = 'Left';
- Font = FONT;
- FontSize = FONT_SIZE;
- Position = UDim2.new(0,4,0.5,0);
- Size = UDim2.new(1,-8,0.5,-2);
- });
- explorerFilter.Parent = headerFrame
- SetZIndexOnChanged(explorerPanel)
- local function CreateColor3(r, g, b) return Color3.new(r/255,g/255,b/255) end
- local Styles = {
- Font = Enum.Font.Arial;
- Margin = 5;
- Black = CreateColor3(0,0,0);
- Black2 = CreateColor3(24, 24, 24);
- White = CreateColor3(244,244,244);
- Hover = CreateColor3(2, 128, 144);
- Hover2 = CreateColor3(5, 102, 141);
- }
- local Row = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextXAlignment = Enum.TextXAlignment.Left;
- TextColor = Styles.White;
- TextColorOver = Styles.White;
- TextLockedColor = CreateColor3(155,155,155);
- Height = 24;
- BorderColor = CreateColor3(216/4,216/4,216/4);
- BackgroundColor = Styles.Black2;
- BackgroundColorAlternate = CreateColor3(32, 32, 32);
- BackgroundColorMouseover = CreateColor3(40, 40, 40);
- TitleMarginLeft = 15;
- }
- local DropDown = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextColor = CreateColor3(255,255,255);
- TextColorOver = Styles.White;
- TextXAlignment = Enum.TextXAlignment.Left;
- Height = 20;
- BackColor = Styles.Black2;
- BackColorOver = Styles.Hover2;
- BorderColor = CreateColor3(45,45,45);
- BorderSizePixel = 2;
- ArrowColor = CreateColor3(160/2,160/2,160/2);
- ArrowColorOver = Styles.Hover;
- }
- local BrickColors = {
- BoxSize = 13;
- BorderSizePixel = 1;
- BorderColor = CreateColor3(160/3,160/3,160/3);
- FrameColor = CreateColor3(160/3,160/3,160/3);
- Size = 20;
- Padding = 4;
- ColorsPerRow = 8;
- OuterBorder = 1;
- OuterBorderColor = Styles.Black;
- }
- local currentRightClickMenu
- local CurrentInsertObjectWindow
- local CurrentFunctionCallerWindow
- local RbxApi
- function ClassCanCreate(IName)
- local success,err = pcall(function() Instance.new(IName) end)
- if err then
- return false
- else
- return true
- end
- end
- function GetClasses()
- if RbxApi == nil then return {} end
- local classTable = {}
- for i,v in pairs(RbxApi.Classes) do
- if ClassCanCreate(v.Name) then
- table.insert(classTable,v.Name)
- end
- end
- return classTable
- end
- local function sortAlphabetic(t, property)
- table.sort(t,
- function(x,y) return x[property] < y[property]
- end)
- end
- local function FunctionIsHidden(functionData)
- local tags = functionData["tags"]
- for _,name in pairs(tags) do
- if name == "deprecated"
- or name == "hidden"
- or name == "writeonly" then
- return true
- end
- end
- return false
- end
- local function GetAllFunctions(className)
- local class = RbxApi.Classes[className]
- local functions = {}
- if not class then return functions end
- while class do
- if class.Name == "Instance" then break end
- for _,nextFunction in pairs(class.Functions) do
- if not FunctionIsHidden(nextFunction) then
- table.insert(functions, nextFunction)
- end
- end
- class = RbxApi.Classes[class.Superclass]
- end
- sortAlphabetic(functions, "Name")
- return functions
- end
- function GetFunctions()
- if RbxApi == nil then return {} end
- local List = SelectionVar():Get()
- if #List == 0 then return end
- local MyObject = List[1]
- local functionTable = {}
- for i,v in pairs(GetAllFunctions(MyObject.ClassName)) do
- table.insert(functionTable,v)
- end
- return functionTable
- end
- function CreateInsertObjectMenu(choices, currentChoice, readOnly, onClick)
- local mouse = game:GetService("Players").LocalPlayer:GetMouse()
- local totalSize = explorerPanel.Parent.AbsoluteSize.y
- if #choices == 0 then return end
- table.sort(choices, function(a,b) return a < b end)
- local frame = Instance.new("Frame")
- frame.Name = "InsertObject"
- frame.Size = UDim2.new(0, 200, 1, 0)
- frame.BackgroundTransparency = 1
- frame.Active = true
- local menu = nil
- local arrow = nil
- local expanded = false
- local margin = DropDown.BorderSizePixel;
- --[[
- local button = Instance.new("TextButton")
- button.Font = Row.Font
- button.FontSize = Row.FontSize
- button.TextXAlignment = Row.TextXAlignment
- button.BackgroundTransparency = 1
- button.TextColor3 = Row.TextColor
- if readOnly then
- button.TextColor3 = Row.TextLockedColor
- end
- button.Text = currentChoice
- button.Size = UDim2.new(1, -2 * Styles.Margin, 1, 0)
- button.Position = UDim2.new(0, Styles.Margin, 0, 0)
- button.Parent = frame
- --]]
- local function hideMenu()
- expanded = false
- --showArrow(DropDown.ArrowColor)
- if frame then
- --frame:Destroy()
- CurrentInsertObjectWindow.Visible = false
- end
- end
- local function showMenu()
- expanded = true
- menu = Instance.new("ScrollingFrame")
- menu.Size = UDim2.new(0,200,1,0)
- menu.CanvasSize = UDim2.new(0, 200, 0, #choices * DropDown.Height)
- menu.Position = UDim2.new(0, margin, 0, 0)
- menu.BackgroundTransparency = 0
- menu.BackgroundColor3 = DropDown.BackColor
- menu.BorderColor3 = DropDown.BorderColor
- menu.BorderSizePixel = DropDown.BorderSizePixel
- menu.TopImage = "rbxasset://textures/blackBkg_square.png"
- menu.MidImage = "rbxasset://textures/blackBkg_square.png"
- menu.BottomImage = "rbxasset://textures/blackBkg_square.png"
- menu.Active = true
- menu.ZIndex = 5
- menu.Parent = frame
- --local parentFrameHeight = script.Parent.List.Size.Y.Offset
- --local rowHeight = mouse.Y
- --if (rowHeight + menu.Size.Y.Offset) > parentFrameHeight then
- -- menu.Position = UDim2.new(0, margin, 0, -1 * (#choices * DropDown.Height) - margin)
- --end
- local function choice(name)
- onClick(name)
- hideMenu()
- end
- for i,name in pairs(choices) do
- local option = CreateRightClickMenuItem(name, function()
- choice(name)
- end,1)
- option.Size = UDim2.new(1, 0, 0, 20)
- option.Position = UDim2.new(0, 0, 0, (i - 1) * DropDown.Height)
- option.ZIndex = menu.ZIndex
- option.Parent = menu
- end
- end
- showMenu()
- return frame
- end
- function CreateFunctionCallerMenu(choices, currentChoice, readOnly, onClick)
- local mouse = game:GetService("Players").LocalPlayer:GetMouse()
- local totalSize = explorerPanel.Parent.AbsoluteSize.y
- if #choices == 0 then return end
- table.sort(choices, function(a,b) return a.Name < b.Name end)
- local frame = Instance.new("Frame")
- frame.Name = "InsertObject"
- frame.Size = UDim2.new(0, 200, 1, 0)
- frame.BackgroundTransparency = 1
- frame.Active = true
- local menu = nil
- local arrow = nil
- local expanded = false
- local margin = DropDown.BorderSizePixel;
- local function hideMenu()
- expanded = false
- --showArrow(DropDown.ArrowColor)
- if frame then
- --frame:Destroy()
- CurrentInsertObjectWindow.Visible = false
- end
- end
- local function showMenu()
- expanded = true
- menu = Instance.new("ScrollingFrame")
- menu.Size = UDim2.new(0,300,1,0)
- menu.CanvasSize = UDim2.new(0, 300, 0, #choices * DropDown.Height)
- menu.Position = UDim2.new(0, margin, 0, 0)
- menu.BackgroundTransparency = 0
- menu.BackgroundColor3 = DropDown.BackColor
- menu.BorderColor3 = DropDown.BorderColor
- menu.BorderSizePixel = DropDown.BorderSizePixel
- menu.TopImage = "rbxasset://textures/blackBkg_square.png"
- menu.MidImage = "rbxasset://textures/blackBkg_square.png"
- menu.BottomImage = "rbxasset://textures/blackBkg_square.png"
- menu.Active = true
- menu.ZIndex = 5
- menu.Parent = frame
- --local parentFrameHeight = script.Parent.List.Size.Y.Offset
- --local rowHeight = mouse.Y
- --if (rowHeight + menu.Size.Y.Offset) > parentFrameHeight then
- -- menu.Position = UDim2.new(0, margin, 0, -1 * (#choices * DropDown.Height) - margin)
- --end
- local function GetParameters(functionData)
- local paraString = ""
- paraString = paraString.."("
- for i,v in pairs(functionData.Arguments) do
- paraString = paraString..v.Type.." "..v.Name
- if i < #functionData.Arguments then
- paraString = paraString..", "
- end
- end
- paraString = paraString..")"
- return paraString
- end
- local function choice(name)
- onClick(name)
- hideMenu()
- end
- for i,name in pairs(choices) do
- local option = CreateRightClickMenuItem(name.ReturnType.." "..name.Name..GetParameters(name), function()
- choice(name)
- end,2)
- option.Size = UDim2.new(1, 0, 0, 20)
- option.Position = UDim2.new(0, 0, 0, (i - 1) * DropDown.Height)
- option.ZIndex = menu.ZIndex
- option.Parent = menu
- end
- end
- showMenu()
- return frame
- end
- function CreateInsertObject()
- if not CurrentInsertObjectWindow then return end
- CurrentInsertObjectWindow.Visible = true
- if currentRightClickMenu and CurrentInsertObjectWindow.Visible then
- CurrentInsertObjectWindow.Position = UDim2.new(0,currentRightClickMenu.Position.X.Offset-currentRightClickMenu.Size.X.Offset-2,0,0)
- end
- if CurrentInsertObjectWindow.Visible then
- CurrentInsertObjectWindow.Parent = explorerPanel.Parent
- end
- end
- function CreateFunctionCaller(oh)
- if CurrentFunctionCallerWindow then
- CurrentFunctionCallerWindow:Destroy()
- CurrentFunctionCallerWindow = nil
- end
- CurrentFunctionCallerWindow = CreateFunctionCallerMenu(
- GetFunctions(),
- "",
- false,
- function(option)
- CurrentFunctionCallerWindow:Destroy()
- CurrentFunctionCallerWindow = nil
- local list = SelectionVar():Get()
- for i,v in pairs(list) do
- pcall(function() print("Function called.", pcall(function() v[option.Name](v) end)) end)
- end
- DestroyRightClick()
- end
- )
- if currentRightClickMenu and CurrentFunctionCallerWindow then
- CurrentFunctionCallerWindow.Position = UDim2.new(0,currentRightClickMenu.Position.X.Offset-currentRightClickMenu.Size.X.Offset*1.5-2,0,0)
- end
- if CurrentFunctionCallerWindow then
- CurrentFunctionCallerWindow.Parent = explorerPanel.Parent
- end
- end
- local a = {}
- local n = function(c)
- a[c] = a[c] or {ClassName = c}
- return a[c]
- end
- function CreateRightClickMenuItem(text, onClick, insObj)
- local button = Instance.new("TextButton")
- button.Font = DropDown.Font
- button.FontSize = DropDown.FontSize
- button.TextColor3 = DropDown.TextColor
- button.TextXAlignment = DropDown.TextXAlignment
- button.BackgroundColor3 = DropDown.BackColor
- button.AutoButtonColor = false
- button.BorderSizePixel = 0
- button.Active = true
- button.Text = text
- if insObj == 1 then
- local newIcon = Icon(nil,ExplorerIndex[text] or 0,(n(button.Text)),20)
- newIcon.Position = UDim2.new(0,0,0,2)
- newIcon.Size = UDim2.new(0,16,0,16)
- newIcon.IconMap.ZIndex = 5
- newIcon.Parent = button
- button.Text = " "..button.Text
- elseif insObj == 2 then
- button.FontSize = Enum.FontSize.Size11
- end
- button.MouseEnter:connect(function()
- button.TextColor3 = DropDown.TextColorOver
- button.BackgroundColor3 = DropDown.BackColorOver
- if not insObj and CurrentInsertObjectWindow then
- if CurrentInsertObjectWindow.Visible == false and button.Text == "Insert Object" then
- CreateInsertObject()
- elseif CurrentInsertObjectWindow.Visible and button.Text ~= "Insert Object" then
- CurrentInsertObjectWindow.Visible = false
- end
- end
- if not insObj then
- if CurrentFunctionCallerWindow and button.Text ~= "Call Function" then
- CurrentFunctionCallerWindow:Destroy()
- CurrentFunctionCallerWindow = nil
- elseif button.Text == "Call Function" then
- CreateFunctionCaller()
- end
- end
- end)
- button.MouseLeave:connect(function()
- button.TextColor3 = DropDown.TextColor
- button.BackgroundColor3 = DropDown.BackColor
- end)
- button.MouseButton1Click:connect(function()
- button.TextColor3 = DropDown.TextColor
- button.BackgroundColor3 = DropDown.BackColor
- onClick(text)
- end)
- return button
- end
- function CreateRightClickMenu(choices, currentChoice, readOnly, onClick)
- local mouse = game:GetService("Players").LocalPlayer:GetMouse()
- local frame = Instance.new("Frame")
- frame.Name = "DropDown"
- frame.Size = UDim2.new(0, 200, 1, 0)
- frame.BackgroundTransparency = 1
- frame.Active = true
- local menu = nil
- local arrow = nil
- local expanded = false
- local margin = DropDown.BorderSizePixel;
- --[[
- local button = Instance.new("TextButton")
- button.Font = Row.Font
- button.FontSize = Row.FontSize
- button.TextXAlignment = Row.TextXAlignment
- button.BackgroundTransparency = 1
- button.TextColor3 = Row.TextColor
- if readOnly then
- button.TextColor3 = Row.TextLockedColor
- end
- button.Text = currentChoice
- button.Size = UDim2.new(1, -2 * Styles.Margin, 1, 0)
- button.Position = UDim2.new(0, Styles.Margin, 0, 0)
- button.Parent = frame
- --]]
- local function hideMenu()
- expanded = false
- --showArrow(DropDown.ArrowColor)
- if frame then
- frame:Destroy()
- DestroyRightClick()
- end
- end
- local function showMenu()
- expanded = true
- menu = Instance.new("Frame")
- menu.Size = UDim2.new(0, 200, 0, #choices * DropDown.Height)
- menu.Position = UDim2.new(0, margin, 0, 5)
- menu.BackgroundTransparency = 0
- menu.BackgroundColor3 = DropDown.BackColor
- menu.BorderColor3 = DropDown.BorderColor
- menu.BorderSizePixel = DropDown.BorderSizePixel
- menu.Active = true
- menu.ZIndex = 5
- menu.Parent = frame
- --local parentFrameHeight = script.Parent.List.Size.Y.Offset
- --local rowHeight = mouse.Y
- --if (rowHeight + menu.Size.Y.Offset) > parentFrameHeight then
- -- menu.Position = UDim2.new(0, margin, 0, -1 * (#choices * DropDown.Height) - margin)
- --end
- local function choice(name)
- onClick(name)
- hideMenu()
- end
- for i,name in pairs(choices) do
- local option = CreateRightClickMenuItem(name, function()
- choice(name)
- end)
- option.Size = UDim2.new(1, 0, 0, 20)
- option.Position = UDim2.new(0, 0, 0, (i - 1) * DropDown.Height)
- option.ZIndex = menu.ZIndex
- option.Parent = menu
- end
- end
- showMenu()
- return frame
- end
- function checkMouseInGui(gui)
- if gui == nil then return false end
- local plrMouse = game:GetService("Players").LocalPlayer:GetMouse()
- local guiPosition = gui.AbsolutePosition
- local guiSize = gui.AbsoluteSize
- if plrMouse.X >= guiPosition.x and plrMouse.X <= guiPosition.x + guiSize.x and plrMouse.Y >= guiPosition.y and plrMouse.Y <= guiPosition.y + guiSize.y then
- return true
- else
- return false
- end
- end
- local clipboard = {}
- local function delete(o)
- o.Parent = nil
- end
- local getTextWidth do
- local text = Create('TextLabel',{
- Name = "TextWidth";
- TextXAlignment = 'Left';
- TextYAlignment = 'Center';
- Font = FONT;
- FontSize = FONT_SIZE;
- Text = "";
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,0,1,0);
- Visible = false;
- Parent = explorerPanel;
- })
- function getTextWidth(s)
- text.Text = s
- return text.TextBounds.x
- end
- end
- local nameScanned = false
- -- Holds the game tree converted to a list.
- local TreeList = {}
- -- Matches objects to their tree node representation.
- local NodeLookup = {}
- local nodeWidth = 0
- local QuickButtons = {}
- function filteringWorkspace()
- if explorerFilter.Text ~= "" and explorerFilter.Text ~= "Filter Workspace" then
- return true
- end
- return false
- end
- function lookForAName(obj,name)
- for i,v in pairs(obj:GetChildren()) do
- if string.find(string.lower(v.Name),string.lower(name)) then nameScanned = true end
- lookForAName(v,name)
- end
- end
- function scanName(obj)
- nameScanned = false
- if string.find(string.lower(obj.Name),string.lower(explorerFilter.Text)) then
- nameScanned = true
- else
- lookForAName(obj,explorerFilter.Text)
- end
- return nameScanned
- end
- function updateActions()
- for i,v in pairs(QuickButtons) do
- if v.Cond() then
- v.Toggle(true)
- else
- v.Toggle(false)
- end
- end
- end
- local updateList,rawUpdateList,updateScroll,rawUpdateSize do
- local function r(t)
- for i = 1,#t do
- if not filteringWorkspace() or scanName(t[i].Object) then
- TreeList[#TreeList+1] = t[i]
- local w = (t[i].Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(t[i].Object.Name) + 4
- if w > nodeWidth then
- nodeWidth = w
- end
- if t[i].Expanded or filteringWorkspace() then
- r(t[i])
- end
- end
- end
- end
- function rawUpdateSize()
- scrollBarH.TotalSpace = nodeWidth
- scrollBarH.VisibleSpace = listFrame.AbsoluteSize.x
- scrollBarH:Update()
- local visible = scrollBarH:CanScrollDown() or scrollBarH:CanScrollUp()
- scrollBarH.GUI.Visible = visible
- listFrame.Size = UDim2.new(1,-GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)
- scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
- scrollBar.GUI.Size = UDim2.new(0,GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)
- scrollBar.TotalSpace = #TreeList+1
- scrollBar:Update()
- end
- function rawUpdateList()
- -- Clear then repopulate the entire list. It appears to be fast enough.
- TreeList = {}
- nodeWidth = 0
- r(NodeLookup[workspace.Parent])
- r(NodeLookup[DexOutput])
- if DexStorageEnabled then
- r(NodeLookup[DexStorage])
- end
- if NilStorageEnabled then
- r(NodeLookup[NilStorage])
- end
- if RunningScriptsStorageEnabled then
- r(NodeLookup[RunningScriptsStorage])
- end
- if LoadedModulesStorageEnabled then
- r(NodeLookup[LoadedModulesStorage])
- end
- rawUpdateSize()
- updateActions()
- end
- -- Adding or removing large models will cause many updates to occur. We
- -- can reduce the number of updates by creating a delay, then dropping any
- -- updates that occur during the delay.
- local updatingList = false
- function updateList()
- if updatingList or filteringWorkspace() then return end
- updatingList = true
- task.wait(0.5)
- updatingList = false
- rawUpdateList()
- end
- local updatingScroll = false
- function updateScroll()
- if updatingScroll then return end
- updatingScroll = true
- task.wait(0.5)
- updatingScroll = false
- scrollBar:Update()
- end
- end
- local Selection do
- local bindGetSelection = explorerPanel:FindFirstChild("GetSelection")
- if not bindGetSelection then
- bindGetSelection = Create('BindableFunction',{Name = "GetSelection"})
- bindGetSelection.Parent = explorerPanel
- end
- local bindSetSelection = explorerPanel:FindFirstChild("SetSelection")
- if not bindSetSelection then
- bindSetSelection = Create('BindableFunction',{Name = "SetSelection"})
- bindSetSelection.Parent = explorerPanel
- end
- local bindSelectionChanged = explorerPanel:FindFirstChild("SelectionChanged")
- if not bindSelectionChanged then
- bindSelectionChanged = Create('BindableEvent',{Name = "SelectionChanged"})
- bindSelectionChanged.Parent = explorerPanel
- end
- local SelectionList = {}
- local SelectionSet = {}
- local Updates = true
- Selection = {
- Selected = SelectionSet;
- List = SelectionList;
- }
- local function addObject(object)
- -- list update
- local lupdate = false
- -- scroll update
- local supdate = false
- if not SelectionSet[object] then
- local node = NodeLookup[object]
- if node then
- table.insert(SelectionList,object)
- SelectionSet[object] = true
- node.Selected = true
- -- expand all ancestors so that selected node becomes visible
- node = node.Parent
- while node do
- if not node.Expanded then
- node.Expanded = true
- lupdate = true
- end
- node = node.Parent
- end
- supdate = true
- end
- end
- return lupdate,supdate
- end
- function Selection:Set(objects)
- local lupdate = false
- local supdate = false
- if #SelectionList > 0 then
- for i = 1,#SelectionList do
- local object = SelectionList[i]
- local node = NodeLookup[object]
- if node then
- node.Selected = false
- SelectionSet[object] = nil
- end
- end
- SelectionList = {}
- Selection.List = SelectionList
- supdate = true
- end
- for i = 1,#objects do
- local l,s = addObject(objects[i])
- lupdate = l or lupdate
- supdate = s or supdate
- end
- if lupdate then
- rawUpdateList()
- supdate = true
- elseif supdate then
- scrollBar:Update()
- end
- if supdate then
- bindSelectionChanged:Fire()
- updateActions()
- end
- end
- function Selection:Add(object)
- local l,s = addObject(object)
- if l then
- rawUpdateList()
- if Updates then
- bindSelectionChanged:Fire()
- updateActions()
- end
- elseif s then
- scrollBar:Update()
- if Updates then
- bindSelectionChanged:Fire()
- updateActions()
- end
- end
- end
- function Selection:StopUpdates()
- Updates = false
- end
- function Selection:ResumeUpdates()
- Updates = true
- bindSelectionChanged:Fire()
- updateActions()
- end
- function Selection:Remove(object,noupdate)
- if SelectionSet[object] then
- local node = NodeLookup[object]
- if node then
- node.Selected = false
- SelectionSet[object] = nil
- for i = 1,#SelectionList do
- if SelectionList[i] == object then
- table.remove(SelectionList,i)
- break
- end
- end
- if not noupdate then
- scrollBar:Update()
- end
- bindSelectionChanged:Fire()
- updateActions()
- end
- end
- end
- function Selection:Get()
- local list = {}
- for i = 1,#SelectionList do
- list[i] = SelectionList[i]
- end
- return list
- end
- bindSetSelection.OnInvoke = function(...)
- Selection:Set(...)
- end
- bindGetSelection.OnInvoke = function()
- return Selection:Get()
- end
- end
- function CreateCaution(title,msg)
- local newCaution = CautionWindow
- newCaution.Visible = true
- newCaution.Title.Text = title
- newCaution.MainWindow.Desc.Text = msg
- newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
- newCaution.Visible = false
- end)
- end
- function CreateTableCaution(title,msg)
- if type(msg) ~= "table" then return CreateCaution(title,tostring(msg)) end
- local newCaution = TableCautionWindow:Clone()
- newCaution.Title.Text = title
- local TableList = newCaution.MainWindow.TableResults
- local TableTemplate = newCaution.MainWindow.TableTemplate
- for i,v in pairs(msg) do
- local newResult = TableTemplate:Clone()
- newResult.Type.Text = type(v)
- newResult.Value.Text = tostring(v)
- newResult.Position = UDim2.new(0,0,0,#TableList:GetChildren() * 20)
- newResult.Parent = TableList
- TableList.CanvasSize = UDim2.new(0,0,0,#TableList:GetChildren() * 20)
- newResult.Visible = true
- end
- newCaution.Parent = explorerPanel.Parent
- newCaution.Visible = true
- newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
- newCaution:Destroy()
- end)
- end
- local function Split(str, delimiter)
- local start = 1
- local t = {}
- while true do
- local pos = string.find (str, delimiter, start, true)
- if not pos then
- break
- end
- table.insert (t, string.sub (str, start, pos - 1))
- start = pos + string.len (delimiter)
- end
- table.insert (t, string.sub (str, start))
- return t
- end
- local function ToValue(value,type)
- if type == "Vector2" then
- local list = Split(value,",")
- if #list < 2 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- return Vector2.new(x,y)
- elseif type == "Vector3" then
- local list = Split(value,",")
- if #list < 3 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- local z = tonumber(list[3]) or 0
- return Vector3.new(x,y,z)
- elseif type == "Color3" then
- local list = Split(value,",")
- if #list < 3 then return nil end
- local r = tonumber(list[1]) or 0
- local g = tonumber(list[2]) or 0
- local b = tonumber(list[3]) or 0
- return Color3.new(r/255,g/255, b/255)
- elseif type == "UDim2" then
- local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
- if #list < 4 then return nil end
- local xScale = tonumber(list[1]) or 0
- local xOffset = tonumber(list[2]) or 0
- local yScale = tonumber(list[3]) or 0
- local yOffset = tonumber(list[4]) or 0
- return UDim2.new(xScale, xOffset, yScale, yOffset)
- elseif type == "Number" then
- return tonumber(value)
- elseif type == "String" then
- return value
- elseif type == "NumberRange" then
- local list = Split(value,",")
- if #list == 1 then
- if tonumber(list[1]) == nil then return nil end
- local newVal = tonumber(list[1]) or 0
- return NumberRange.new(newVal)
- end
- if #list < 2 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- return NumberRange.new(x,y)
- elseif type == "Script" then
- local success,err = ypcall(function()
- _G.D_E_X_DONOTUSETHISPLEASE = nil
- loadstring(
- "_G.D_E_X_DONOTUSETHISPLEASE = "..value
- )()
- return _G.D_E_X_DONOTUSETHISPLEASE
- end)
- if err then
- return nil
- end
- else
- return nil
- end
- end
- local function ToPropValue(value,type)
- if type == "Vector2" then
- local list = Split(value,",")
- if #list < 2 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- return Vector2.new(x,y)
- elseif type == "Vector3" then
- local list = Split(value,",")
- if #list < 3 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- local z = tonumber(list[3]) or 0
- return Vector3.new(x,y,z)
- elseif type == "Color3" then
- local list = Split(value,",")
- if #list < 3 then return nil end
- local r = tonumber(list[1]) or 0
- local g = tonumber(list[2]) or 0
- local b = tonumber(list[3]) or 0
- return Color3.new(r/255,g/255, b/255)
- elseif type == "UDim2" then
- local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
- if #list < 4 then return nil end
- local xScale = tonumber(list[1]) or 0
- local xOffset = tonumber(list[2]) or 0
- local yScale = tonumber(list[3]) or 0
- local yOffset = tonumber(list[4]) or 0
- return UDim2.new(xScale, xOffset, yScale, yOffset)
- elseif type == "Content" then
- return value
- elseif type == "float" or type == "int" or type == "double" then
- return tonumber(value)
- elseif type == "string" then
- return value
- elseif type == "NumberRange" then
- local list = Split(value,",")
- if #list == 1 then
- if tonumber(list[1]) == nil then return nil end
- local newVal = tonumber(list[1]) or 0
- return NumberRange.new(newVal)
- end
- if #list < 2 then return nil end
- local x = tonumber(list[1]) or 0
- local y = tonumber(list[2]) or 0
- return NumberRange.new(x,y)
- elseif string.sub(value,1,4) == "Enum" then
- local getEnum = value
- while true do
- local x,y = string.find(getEnum,".")
- if y then
- getEnum = string.sub(getEnum,y+1)
- else
- break
- end
- end
- print(getEnum)
- return getEnum
- else
- return nil
- end
- end
- function PromptRemoteCaller(inst)
- if CurrentRemoteWindow then
- CurrentRemoteWindow:Destroy()
- CurrentRemoteWindow = nil
- end
- CurrentRemoteWindow = RemoteWindow:Clone()
- CurrentRemoteWindow.Parent = explorerPanel.Parent
- CurrentRemoteWindow.Visible = true
- local displayValues = false
- local ArgumentList = CurrentRemoteWindow.MainWindow.Arguments
- local ArgumentTemplate = CurrentRemoteWindow.MainWindow.ArgumentTemplate
- if inst:IsA("RemoteEvent") then
- CurrentRemoteWindow.Title.Text = "Fire Event"
- CurrentRemoteWindow.MainWindow.Ok.Text = "Fire"
- CurrentRemoteWindow.MainWindow.DisplayReturned.Visible = false
- CurrentRemoteWindow.MainWindow.Desc2.Visible = false
- end
- local newArgument = ArgumentTemplate:Clone()
- newArgument.Parent = ArgumentList
- newArgument.Visible = true
- newArgument.Type.MouseButton1Down:connect(function()
- createDDown(newArgument.Type,function(choice)
- newArgument.Type.Text = choice
- end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
- end)
- CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()
- if CurrentRemoteWindow and inst.Parent ~= nil then
- local MyArguments = {}
- for i,v in pairs(ArgumentList:GetChildren()) do
- table.insert(MyArguments,ToValue(v.Value.Text,v.Type.Text))
- end
- if inst:IsA("RemoteFunction") then
- if displayValues then
- spawn(function()
- local myResults = inst:InvokeServer(unpack(MyArguments))
- if myResults then
- CreateTableCaution("Remote Caller",myResults)
- else
- CreateCaution("Remote Caller","This remote did not return anything.")
- end
- end)
- else
- spawn(function()
- inst:InvokeServer(unpack(MyArguments))
- end)
- end
- else
- inst:FireServer(unpack(MyArguments))
- end
- CurrentRemoteWindow:Destroy()
- CurrentRemoteWindow = nil
- end
- end)
- CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()
- if CurrentRemoteWindow then
- local newArgument = ArgumentTemplate:Clone()
- newArgument.Position = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
- newArgument.Parent = ArgumentList
- ArgumentList.CanvasSize = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
- newArgument.Visible = true
- newArgument.Type.MouseButton1Down:connect(function()
- createDDown(newArgument.Type,function(choice)
- newArgument.Type.Text = choice
- end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
- end)
- end
- end)
- CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()
- if CurrentRemoteWindow then
- if #ArgumentList:GetChildren() > 1 then
- ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
- ArgumentList.CanvasSize = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
- end
- end
- end)
- CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
- if CurrentRemoteWindow then
- CurrentRemoteWindow:Destroy()
- CurrentRemoteWindow = nil
- end
- end)
- CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()
- if displayValues then
- displayValues = false
- CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = false
- else
- displayValues = true
- CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = true
- end
- end)
- end
- function PromptSaveInstance(inst)
- if not SaveInstance and not _G.SaveInstance then CreateCaution("SaveInstance Missing","You do not have the SaveInstance function installed. Please go to RaspberryPi's thread to retrieve it.") return end
- if CurrentSaveInstanceWindow then
- CurrentSaveInstanceWindow:Destroy()
- CurrentSaveInstanceWindow = nil
- if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
- explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
- end
- end
- CurrentSaveInstanceWindow = SaveInstanceWindow:Clone()
- CurrentSaveInstanceWindow.Parent = explorerPanel.Parent
- CurrentSaveInstanceWindow.Visible = true
- local filename = CurrentSaveInstanceWindow.MainWindow.FileName
- local saveObjects = true
- local overwriteCaution = false
- CurrentSaveInstanceWindow.MainWindow.Save.MouseButton1Up:connect(function()
- --[[if readfile and getelysianpath then
- if readfile(getelysianpath()..filename.Text..".rbxmx") then
- if not overwriteCaution then
- overwriteCaution = true
- local newCaution = ConfirmationWindow:Clone()
- newCaution.Name = "SaveInstanceOverwriteCaution"
- newCaution.MainWindow.Desc.Text = "The file, "..filename.Text..".rbxmx, already exists. Overwrite?"
- newCaution.Parent = explorerPanel.Parent
- newCaution.Visible = true
- newCaution.MainWindow.Yes.MouseButton1Up:connect(function()
- ypcall(function()
- SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
- end)
- overwriteCaution = false
- newCaution:Destroy()
- if CurrentSaveInstanceWindow then
- CurrentSaveInstanceWindow:Destroy()
- CurrentSaveInstanceWindow = nil
- end
- end)
- newCaution.MainWindow.No.MouseButton1Up:connect(function()
- overwriteCaution = false
- newCaution:Destroy()
- end)
- end
- else
- ypcall(function()
- SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
- end)
- if CurrentSaveInstanceWindow then
- CurrentSaveInstanceWindow:Destroy()
- CurrentSaveInstanceWindow = nil
- if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
- explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
- end
- end
- end
- else
- ypcall(function()
- if SaveInstance then
- SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
- else
- _G.SaveInstance(inst,filename.Text,not saveObjects)
- end
- end)
- if CurrentSaveInstanceWindow then
- CurrentSaveInstanceWindow:Destroy()
- CurrentSaveInstanceWindow = nil
- if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
- explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
- end
- end
- end]]
- end)
- CurrentSaveInstanceWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
- if CurrentSaveInstanceWindow then
- CurrentSaveInstanceWindow:Destroy()
- CurrentSaveInstanceWindow = nil
- if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
- explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
- end
- end
- end)
- CurrentSaveInstanceWindow.MainWindow.SaveObjects.MouseButton1Up:connect(function()
- if saveObjects then
- saveObjects = false
- CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible = false
- else
- saveObjects = true
- CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible = true
- end
- end)
- end
- function DestroyRightClick()
- if currentRightClickMenu then
- currentRightClickMenu:Destroy()
- currentRightClickMenu = nil
- end
- if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then
- CurrentInsertObjectWindow.Visible = false
- end
- end
- local tabChar = " "
- local function getSmaller(a, b, notLast)
- local aByte = a:byte() or -1
- local bByte = b:byte() or -1
- if aByte == bByte then
- if notLast and #a == 1 and #b == 1 then
- return -1
- elseif #b == 1 then
- return false
- elseif #a == 1 then
- return true
- else
- return getSmaller(a:sub(2), b:sub(2), notLast)
- end
- else
- return aByte < bByte
- end
- end
- local function parseData(obj, numTabs, isKey, overflow, noTables, forceDict)
- local objType = typeof(obj)
- local objStr = tostring(obj)
- if objType == "table" then
- if noTables then
- return objStr
- end
- local isCyclic = overflow[obj]
- overflow[obj] = true
- local out = {}
- local nextIndex = 1
- local isDict = false
- local hasTables = false
- local data = {}
- for key, val in next, obj do
- if not hasTables and typeof(val) == "table" then
- hasTables = true
- end
- if not isDict and key ~= nextIndex then
- isDict = true
- else
- nextIndex = nextIndex + 1
- end
- data[#data+1] = {key, val}
- end
- if isDict or hasTables or forceDict then
- out[#out+1] = (isCyclic and "Cyclic " or "") .. "{"
- table.sort(data, function(a, b)
- local aType = typeof(a[2])
- local bType = typeof(b[2])
- if bType == "string" and aType ~= "string" then
- return false
- end
- local res = getSmaller(aType, bType, true)
- if res == -1 then
- return getSmaller(tostring(a[1]), tostring(b[1]))
- else
- return res
- end
- end)
- for i = 1, #data do
- local arr = data[i]
- local nowKey = arr[1]
- local nowVal = arr[2]
- local parseKey = parseData(nowKey, numTabs+1, true, overflow, isCyclic)
- local parseVal = parseData(nowVal, numTabs+1, false, overflow, isCyclic)
- if isDict then
- local nowValType = typeof(nowVal)
- local preStr = ""
- local postStr = ""
- if i > 1 and (nowValType == "table" or typeof(data[i-1][2]) ~= nowValType) then
- preStr = "\n"
- end
- if i < #data and nowValType == "table" and typeof(data[i+1][2]) ~= "table" and typeof(data[i+1][2]) == nowValType then
- postStr = "\n"
- end
- out[#out+1] = preStr .. string.rep(tabChar, numTabs+1) .. parseKey .. " = " .. parseVal .. ";" .. postStr
- else
- out[#out+1] = string.rep(tabChar, numTabs+1) .. parseVal .. ";"
- end
- end
- out[#out+1] = string.rep(tabChar, numTabs) .. "}"
- else
- local data2 = {}
- for i = 1, #data do
- local arr = data[i]
- local nowVal = arr[2]
- local parseVal = parseData(nowVal, 0, false, overflow, isCyclic)
- data2[#data2+1] = parseVal
- end
- out[#out+1] = "{" .. table.concat(data2, ", ") .. "}"
- end
- return table.concat(out, "\n")
- else
- local returnVal = nil
- if (objType == "string" or objType == "Content") and (not isKey or tonumber(obj:sub(1, 1))) then
- local retVal = '"' .. objStr .. '"'
- if isKey then
- retVal = "[" .. retVal .. "]"
- end
- returnVal = retVal
- elseif objType == "EnumItem" then
- returnVal = "Enum." .. tostring(obj.EnumType) .. "." .. obj.Name
- elseif objType == "Enum" then
- returnVal = "Enum." .. objStr
- elseif objType == "Instance" then
- returnVal = obj.Parent and obj:GetFullName() or obj.ClassName
- elseif objType == "CFrame" then
- returnVal = "CFrame.new(" .. objStr .. ")"
- elseif objType == "Vector3" then
- returnVal = "Vector3.new(" .. objStr .. ")"
- elseif objType == "Vector2" then
- returnVal = "Vector2.new(" .. objStr .. ")"
- elseif objType == "UDim2" then
- returnVal = "UDim2.new(" .. objStr:gsub("[{}]", "") .. ")"
- elseif objType == "BrickColor" then
- returnVal = "BrickColor.new(\"" .. objStr .. "\")"
- elseif objType == "Color3" then
- returnVal = "Color3.new(" .. objStr .. ")"
- elseif objType == "NumberRange" then
- returnVal = "NumberRange.new(" .. objStr:gsub("^%s*(.-)%s*$", "%1"):gsub(" ", ", ") .. ")"
- elseif objType == "PhysicalProperties" then
- returnVal = "PhysicalProperties.new(" .. objStr .. ")"
- else
- returnVal = objStr
- end
- return returnVal
- end
- end
- function tableToString(t)
- local success, result = pcall(function()
- return parseData(t, 0, false, {}, nil, false)
- end)
- return success and result or 'error';
- end
- local HasSpecial = function(string)
- return (string:match("%c") or string:match("%s") or string:match("%p")) ~= nil
- end
- local GetPath = function(Instance) -- ripped from some random script
- local Obj = Instance
- local string = {}
- local temp = {}
- local error = false
- while Obj ~= game do
- if Obj == nil then
- error = true
- break
- end
- table.insert(temp, Obj.Parent == game and Obj.ClassName or tostring(Obj))
- Obj = Obj.Parent
- end
- table.insert(string, "game:GetService(\"" .. temp[#temp] .. "\")")
- for i = #temp - 1, 1, -1 do
- table.insert(string, HasSpecial(temp[i]) and "[\"" .. temp[i] .. "\"]" or "." .. temp[i])
- end
- return (error and "nil -- Path contained an invalid instance" or table.concat(string, ""))
- end
- function rightClickMenu(sObj)
- local mouse = game:GetService("Players").LocalPlayer:GetMouse()
- local extra = ((sObj == RunningScriptsStorageMain or sObj == LoadedModulesStorageMain or sObj == NilStorageMain) and 'Refresh Instances' or nil)
- currentRightClickMenu = CreateRightClickMenu(
- {
- 'Cut',
- 'Copy',
- 'Paste Into',
- 'Duplicate',
- 'Delete',
- -- 'Group',
- -- 'Ungroup',
- 'Select Children',
- 'Teleport To',
- -- 'Insert Part',
- 'Insert Object',
- 'View Script',
- 'Save Script',
- -- 'Save Instance',
- 'Copy Path',
- 'Call Function',
- 'Call Remote',
- extra
- },
- "",
- false,
- function(option)
- if option == "Cut" then
- if not Option.Modifiable then return end
- clipboard = {}
- local list = Selection.List
- local cut = {}
- for i = 1,#list do
- local obj = list[i]:Clone()
- if obj then
- table.insert(clipboard,obj)
- table.insert(cut,list[i])
- end
- end
- for i = 1,#cut do
- pcall(delete,cut[i])
- end
- updateActions()
- elseif option == "Copy" then
- if not Option.Modifiable then return end
- clipboard = {}
- local list = Selection.List
- for i = 1,#list do
- table.insert(clipboard,list[i]:Clone())
- end
- updateActions()
- elseif option == "Paste Into" then
- if not Option.Modifiable then return end
- local parent = Selection.List[1] or workspace
- for i = 1,#clipboard do
- clipboard[i]:Clone().Parent = parent
- end
- elseif option == "Duplicate" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- list[i]:Clone().Parent = Selection.List[1].Parent or workspace
- end
- elseif option == "Delete" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- pcall(delete,list[i])
- end
- Selection:Set({})
- elseif option == "Group" then
- if not Option.Modifiable then return end
- local newModel = Instance.new("Model")
- local list = Selection:Get()
- newModel.Parent = Selection.List[1].Parent or workspace
- for i = 1,#list do
- list[i].Parent = newModel
- end
- Selection:Set({})
- elseif option == "Ungroup" then
- if not Option.Modifiable then return end
- local ungrouped = {}
- local list = Selection:Get()
- for i = 1,#list do
- if list[i]:IsA("Model") then
- for i2,v2 in pairs(list[i]:GetChildren()) do
- v2.Parent = list[i].Parent or workspace
- table.insert(ungrouped,v2)
- end
- pcall(delete,list[i])
- end
- end
- Selection:Set({})
- if SettingsRemote:Invoke("SelectUngrouped") then
- for i,v in pairs(ungrouped) do
- Selection:Add(v)
- end
- end
- elseif option == "Select Children" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- Selection:Set({})
- Selection:StopUpdates()
- for i = 1,#list do
- for i2,v2 in pairs(list[i]:GetChildren()) do
- Selection:Add(v2)
- end
- end
- Selection:ResumeUpdates()
- elseif option == "Teleport To" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- if list[i]:IsA("BasePart") then
- pcall(function()
- game:GetService("Players").LocalPlayer.Character.HumanoidRootPart.CFrame = list[i].CFrame * CFrame.new(0, 3, 0);
- end)
- break
- end
- end
- elseif option == "Insert Part" then
- if not Option.Modifiable then return end
- local insertedParts = {}
- local list = Selection:Get()
- for i = 1,#list do
- pcall(function()
- local newPart = Instance.new("Part")
- newPart.Parent = list[i]
- newPart.CFrame = CFrame.new(game:GetService("Players").LocalPlayer.Character.Head.Position) + Vector3.new(0,3,0)
- table.insert(insertedParts,newPart)
- end)
- end
- elseif option == "Save Instance" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- if #list == 1 then
- list[1].Archivable = true
- ypcall(function()PromptSaveInstance(list[1]:Clone())end)
- elseif #list > 1 then
- local newModel = Instance.new("Model")
- newModel.Name = "SavedInstances"
- for i = 1,#list do
- ypcall(function()
- list[i].Archivable = true
- list[i]:Clone().Parent = newModel
- end)
- end
- PromptSaveInstance(newModel)
- end
- elseif option == 'Copy Path' then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- local paths = {};
- for i = 1,#list do
- paths[#paths + 1] = GetPath(list[i]);
- end
- if #paths > 1 then
- setclipboard(tableToString(paths))
- elseif #paths == 1 then
- setclipboard(paths[1])
- end
- elseif option == "Call Remote" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- if list[i]:IsA("RemoteFunction") or list[i]:IsA("RemoteEvent") then
- PromptRemoteCaller(list[i])
- break
- end
- end
- elseif option == "View Script" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- if list[i]:IsA("LocalScript") or list[i]:IsA("ModuleScript") then
- ScriptEditorEvent:Fire(list[i])
- end
- end
- elseif option == "Save Script" then
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- if list[i]:IsA("LocalScript") or list[i]:IsA("ModuleScript") then
- writefile(game.PlaceId .. '_' .. list[i].Name:gsub('%W', '') .. '_' .. math.random(100000, 999999) .. '.lua', decompile(list[i]));
- end
- end
- elseif option == 'Refresh Instances' then
- if sObj == NilStorageMain then
- for i, v in pairs(getnilinstances()) do
- if v ~= DexOutput and v ~= DexOutputMain and v ~= DexStorage and v ~= DexStorageMain and v ~= RunningScriptsStorage and v ~= RunningScriptsStorageMain and v ~= LoadedModulesStorage and v ~= LoadedModulesStorageMain and v ~= NilStorage and v ~= NilStorageMain then
- pcall(function()
- v:clone().Parent = NilStorageMain;
- end)
- end
- end
- elseif sObj == RunningScriptsStorageMain then
- for i,v in pairs(getscripts()) do
- if v ~= RunningScriptsStorage and v ~= LoadedModulesStorage and v ~= DexStorage and v ~= UpvalueStorage then
- if (v:IsA'LocalScript' or v:IsA'ModuleScript' or v:IsA'Script') then
- v.Archivable = true;
- local ls = v:clone()
- if v:IsA'LocalScript' or v:IsA'Script' then ls.Disabled = true; end
- ls.Parent = RunningScriptsStorageMain
- end
- end
- end
- elseif sObj == LoadedModulesStorageMain then
- for i,v in pairs(getloadedmodules()) do
- if v ~= RunningScriptsStorage and v ~= LoadedModulesStorage and v ~= DexStorage and v ~= UpvalueStorage then
- if (v:IsA'LocalScript' or v:IsA'ModuleScript' or v:IsA'Script') then
- v.Archivable = true;
- local ls = v:clone()
- if v:IsA'LocalScript' or v:IsA'Script' then ls.Disabled = true; end
- ls.Parent = LoadedModulesStorageMain
- end
- end
- end
- end
- end
- end)
- currentRightClickMenu.Parent = explorerPanel.Parent
- currentRightClickMenu.Position = UDim2.new(0,mouse.X,0,mouse.Y)
- if currentRightClickMenu.AbsolutePosition.X + currentRightClickMenu.AbsoluteSize.X > explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X then
- currentRightClickMenu.Position = UDim2.new(0, explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X - currentRightClickMenu.AbsoluteSize.X, 0, mouse.Y)
- end
- end
- local function cancelReparentDrag()end
- local function cancelSelectDrag()end
- do
- local listEntries = {}
- local nameConnLookup = {}
- local mouseDrag = Create('ImageButton',{
- Name = "MouseDrag";
- Position = UDim2.new(-0.25,0,-0.25,0);
- Size = UDim2.new(1.5,0,1.5,0);
- Transparency = 1;
- AutoButtonColor = false;
- Active = true;
- ZIndex = 10;
- })
- local function dragSelect(last,add,button)
- local connDrag
- local conUp
- conDrag = mouseDrag.MouseMoved:connect(function(x,y)
- local pos = Vector2.new(x,y) - listFrame.AbsolutePosition
- local size = listFrame.AbsoluteSize
- if pos.x < 0 or pos.x > size.x or pos.y < 0 or pos.y > size.y then return end
- local i = math.ceil(pos.y/ENTRY_BOUND) + scrollBar.ScrollIndex
- -- Mouse may have made a large step, so interpolate between the
- -- last index and the current.
- for n = i<last and i or last, i>last and i or last do
- local node = TreeList[n]
- if node then
- if add then
- Selection:Add(node.Object)
- else
- Selection:Remove(node.Object)
- end
- end
- end
- last = i
- end)
- function cancelSelectDrag()
- mouseDrag.Parent = nil
- conDrag:disconnect()
- conUp:disconnect()
- function cancelSelectDrag()end
- end
- conUp = mouseDrag[button]:connect(cancelSelectDrag)
- mouseDrag.Parent = GetScreen(listFrame)
- end
- local function dragReparent(object,dragGhost,clickPos,ghostOffset)
- local connDrag
- local conUp
- local conUp2
- local parentIndex = nil
- local dragged = false
- local parentHighlight = Create('Frame',{
- Transparency = 1;
- Visible = false;
- Create('Frame',{
- BorderSizePixel = 0;
- BackgroundColor3 = Color3.new(0,0,0);
- BackgroundTransparency = 0.1;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,0,0,1);
- });
- Create('Frame',{
- BorderSizePixel = 0;
- BackgroundColor3 = Color3.new(0,0,0);
- BackgroundTransparency = 0.1;
- Position = UDim2.new(1,0,0,0);
- Size = UDim2.new(0,1,1,0);
- });
- Create('Frame',{
- BorderSizePixel = 0;
- BackgroundColor3 = Color3.new(0,0,0);
- BackgroundTransparency = 0.1;
- Position = UDim2.new(0,0,1,0);
- Size = UDim2.new(1,0,0,1);
- });
- Create('Frame',{
- BorderSizePixel = 0;
- BackgroundColor3 = Color3.new(0,0,0);
- BackgroundTransparency = 0.1;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(0,1,1,0);
- });
- })
- SetZIndex(parentHighlight,9)
- conDrag = mouseDrag.MouseMoved:connect(function(x,y)
- local dragPos = Vector2.new(x,y)
- if dragged then
- local pos = dragPos - listFrame.AbsolutePosition
- local size = listFrame.AbsoluteSize
- parentIndex = nil
- parentHighlight.Visible = false
- if pos.x >= 0 and pos.x <= size.x and pos.y >= 0 and pos.y <= size.y + ENTRY_SIZE*2 then
- local i = math.ceil(pos.y/ENTRY_BOUND-2)
- local node = TreeList[i + scrollBar.ScrollIndex]
- if node and node.Object ~= object and not object:IsAncestorOf(node.Object) then
- parentIndex = i
- local entry = listEntries[i]
- if entry then
- parentHighlight.Visible = true
- parentHighlight.Position = UDim2.new(0,1,0,entry.AbsolutePosition.y-listFrame.AbsolutePosition.y)
- parentHighlight.Size = UDim2.new(0,size.x-4,0,entry.AbsoluteSize.y)
- end
- end
- end
- dragGhost.Position = UDim2.new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
- elseif (clickPos-dragPos).magnitude > 8 then
- dragged = true
- SetZIndex(dragGhost,9)
- dragGhost.IndentFrame.Transparency = 0.25
- dragGhost.IndentFrame.EntryText.TextColor3 = GuiColor.TextSelected
- dragGhost.Position = UDim2.new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
- dragGhost.Parent = GetScreen(listFrame)
- parentHighlight.Parent = listFrame
- end
- end)
- function cancelReparentDrag()
- mouseDrag.Parent = nil
- conDrag:disconnect()
- conUp:disconnect()
- conUp2:disconnect()
- dragGhost:Destroy()
- parentHighlight:Destroy()
- function cancelReparentDrag()end
- end
- local wasSelected = Selection.Selected[object]
- if not wasSelected and Option.Selectable then
- Selection:Set({object})
- end
- conUp = mouseDrag.MouseButton1Up:connect(function()
- cancelReparentDrag()
- if dragged then
- if parentIndex then
- local parentNode = TreeList[parentIndex + scrollBar.ScrollIndex]
- if parentNode then
- parentNode.Expanded = true
- local parentObj = parentNode.Object
- local function parent(a,b)
- a.Parent = b
- end
- if Option.Selectable then
- local list = Selection.List
- for i = 1,#list do
- pcall(parent,list[i],parentObj)
- end
- else
- pcall(parent,object,parentObj)
- end
- end
- end
- else
- -- do selection click
- if wasSelected and Option.Selectable then
- Selection:Set({})
- end
- end
- end)
- conUp2 = mouseDrag.MouseButton2Down:connect(function()
- cancelReparentDrag()
- end)
- mouseDrag.Parent = GetScreen(listFrame)
- end
- local entryTemplate = Create('ImageButton',{
- Name = "Entry";
- Transparency = 1;
- AutoButtonColor = false;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,0,0,ENTRY_SIZE);
- Create('Frame',{
- Name = "IndentFrame";
- BackgroundTransparency = 1;
- BackgroundColor3 = GuiColor.Selected;
- BorderColor3 = GuiColor.BorderSelected;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,0,1,0);
- Create(Icon('ImageButton',0),{
- Name = "Expand";
- AutoButtonColor = false;
- Position = UDim2.new(0,-GUI_SIZE,0.5,-GUI_SIZE/2);
- Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE);
- });
- Create(Icon(nil,0),{
- Name = "ExplorerIcon";
- Position = UDim2.new(0,2+ENTRY_PADDING,0.5,-GUI_SIZE/2);
- Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE);
- });
- Create('TextLabel',{
- Name = "EntryText";
- BackgroundTransparency = 1;
- TextColor3 = GuiColor.Text;
- TextXAlignment = 'Left';
- TextYAlignment = 'Center';
- Font = FONT;
- FontSize = FONT_SIZE;
- Text = "";
- Position = UDim2.new(0,2+ENTRY_SIZE+4,0,0);
- Size = UDim2.new(1,-2,1,0);
- });
- });
- })
- function scrollBar.UpdateCallback(self)
- for i = 1,self.VisibleSpace do
- local node = TreeList[i + self.ScrollIndex]
- if node then
- local entry = listEntries[i]
- if not entry then
- entry = Create(entryTemplate:Clone(),{
- Position = UDim2.new(0,2,0,ENTRY_BOUND*(i-1)+2);
- Size = UDim2.new(0,nodeWidth,0,ENTRY_SIZE);
- ZIndex = listFrame.ZIndex;
- })
- listEntries[i] = entry
- local expand = entry.IndentFrame.Expand
- expand.MouseEnter:connect(function()
- local node = TreeList[i + self.ScrollIndex]
- if #node > 0 then
- if node.Expanded then
- Icon(expand,NODE_EXPANDED_OVER)
- else
- Icon(expand,NODE_COLLAPSED_OVER)
- end
- end
- end)
- expand.MouseLeave:connect(function()
- local node = TreeList[i + self.ScrollIndex]
- if #node > 0 then
- if node.Expanded then
- Icon(expand,NODE_EXPANDED)
- else
- Icon(expand,NODE_COLLAPSED)
- end
- end
- end)
- expand.MouseButton1Down:connect(function()
- local node = TreeList[i + self.ScrollIndex]
- if #node > 0 then
- node.Expanded = not node.Expanded
- if node.Object == explorerPanel.Parent and node.Expanded then
- CreateCaution("Warning","Please be careful when editing instances inside here, this is like the System32 of Dex and modifying objects here can break Dex.")
- end
- -- use raw update so the list updates instantly
- rawUpdateList()
- end
- end)
- entry.MouseButton1Down:connect(function(x,y)
- local node = TreeList[i + self.ScrollIndex]
- DestroyRightClick()
- if GetAwaitRemote:Invoke() then
- bindSetAwaiting:Fire(node.Object)
- return
- end
- if not HoldingShift then
- lastSelectedNode = i + self.ScrollIndex
- end
- if HoldingShift and not filteringWorkspace() then
- if lastSelectedNode then
- if i + self.ScrollIndex - lastSelectedNode > 0 then
- Selection:StopUpdates()
- for i2 = 1, i + self.ScrollIndex - lastSelectedNode do
- local newNode = TreeList[lastSelectedNode + i2]
- if newNode then
- Selection:Add(newNode.Object)
- end
- end
- Selection:ResumeUpdates()
- else
- Selection:StopUpdates()
- for i2 = i + self.ScrollIndex - lastSelectedNode, 1 do
- local newNode = TreeList[lastSelectedNode + i2]
- if newNode then
- Selection:Add(newNode.Object)
- end
- end
- Selection:ResumeUpdates()
- end
- end
- return
- end
- if HoldingCtrl then
- if Selection.Selected[node.Object] then
- Selection:Remove(node.Object)
- else
- Selection:Add(node.Object)
- end
- return
- end
- if Option.Modifiable then
- local pos = Vector2.new(x,y)
- dragReparent(node.Object,entry:Clone(),pos,entry.AbsolutePosition-pos)
- elseif Option.Selectable then
- if Selection.Selected[node.Object] then
- Selection:Set({})
- else
- Selection:Set({node.Object})
- end
- dragSelect(i+self.ScrollIndex,true,'MouseButton1Up')
- end
- end)
- entry.MouseButton2Down:connect(function()
- if not Option.Selectable then return end
- DestroyRightClick()
- curSelect = entry
- local node = TreeList[i + self.ScrollIndex]
- if GetAwaitRemote:Invoke() then
- bindSetAwaiting:Fire(node.Object)
- return
- end
- if not Selection.Selected[node.Object] then
- Selection:Set({node.Object})
- end
- end)
- entry.MouseButton2Up:connect(function()
- if not Option.Selectable then return end
- local node = TreeList[i + self.ScrollIndex]
- if checkMouseInGui(curSelect) then
- rightClickMenu(node.Object)
- end
- end)
- entry.Parent = listFrame
- end
- entry.Visible = true
- local object = node.Object
- -- update expand icon
- if #node == 0 then
- entry.IndentFrame.Expand.Visible = false
- elseif node.Expanded then
- Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
- entry.IndentFrame.Expand.Visible = true
- else
- Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
- entry.IndentFrame.Expand.Visible = true
- end
- -- update explorer icon
- Icon(entry.IndentFrame.ExplorerIcon,ExplorerIndex[object.ClassName] or 0,object)
- -- update indentation
- local w = (node.Depth)*(2+ENTRY_PADDING+GUI_SIZE)
- entry.IndentFrame.Position = UDim2.new(0,w,0,0)
- entry.IndentFrame.Size = UDim2.new(1,-w,1,0)
- -- update name change detection
- if nameConnLookup[entry] then
- nameConnLookup[entry]:disconnect()
- end
- local text = entry.IndentFrame.EntryText
- text.Text = object.Name
- nameConnLookup[entry] = node.Object.Changed:connect(function(p)
- if p == 'Name' then
- text.Text = object.Name
- end
- end)
- -- update selection
- entry.IndentFrame.Transparency = node.Selected and 0 or 1
- text.TextColor3 = GuiColor[node.Selected and 'TextSelected' or 'Text']
- entry.Size = UDim2.new(0,nodeWidth,0,ENTRY_SIZE)
- elseif listEntries[i] then
- listEntries[i].Visible = false
- end
- end
- for i = self.VisibleSpace+1,self.TotalSpace do
- local entry = listEntries[i]
- if entry then
- listEntries[i] = nil
- entry:Destroy()
- end
- end
- end
- function scrollBarH.UpdateCallback(self)
- for i = 1,scrollBar.VisibleSpace do
- local node = TreeList[i + scrollBar.ScrollIndex]
- if node then
- local entry = listEntries[i]
- if entry then
- entry.Position = UDim2.new(0,2 - scrollBarH.ScrollIndex,0,ENTRY_BOUND*(i-1)+2)
- end
- end
- end
- end
- Connect(listFrame.Changed,function(p)
- if p == 'AbsoluteSize' then
- rawUpdateSize()
- end
- end)
- local wheelAmount = 6
- explorerPanel.MouseWheelForward:connect(function()
- if scrollBar.VisibleSpace - 1 > wheelAmount then
- scrollBar:ScrollTo(scrollBar.ScrollIndex - wheelAmount)
- else
- scrollBar:ScrollTo(scrollBar.ScrollIndex - scrollBar.VisibleSpace)
- end
- end)
- explorerPanel.MouseWheelBackward:connect(function()
- if scrollBar.VisibleSpace - 1 > wheelAmount then
- scrollBar:ScrollTo(scrollBar.ScrollIndex + wheelAmount)
- else
- scrollBar:ScrollTo(scrollBar.ScrollIndex + scrollBar.VisibleSpace)
- end
- end)
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Object detection
- -- Inserts `v` into `t` at `i`. Also sets `Index` field in `v`.
- local function insert(t,i,v)
- for n = #t,i,-1 do
- local v = t[n]
- v.Index = n+1
- t[n+1] = v
- end
- v.Index = i
- t[i] = v
- end
- -- Removes `i` from `t`. Also sets `Index` field in removed value.
- local function remove(t,i)
- local v = t[i]
- for n = i+1,#t do
- local v = t[n]
- v.Index = n-1
- t[n-1] = v
- end
- t[#t] = nil
- v.Index = 0
- return v
- end
- -- Returns how deep `o` is in the tree.
- local function depth(o)
- local d = -1
- while o do
- o = o.Parent
- d = d + 1
- end
- return d
- end
- local connLookup = {}
- -- Returns whether a node would be present in the tree list
- local function nodeIsVisible(node)
- local visible = true
- node = node.Parent
- while node and visible do
- visible = visible and node.Expanded
- node = node.Parent
- end
- return visible
- end
- -- Removes an object's tree node. Called when the object stops existing in the
- -- game tree.
- local function removeObject(object)
- local objectNode = NodeLookup[object]
- if not objectNode then
- return
- end
- local visible = nodeIsVisible(objectNode)
- Selection:Remove(object,true)
- local parent = objectNode.Parent
- remove(parent,objectNode.Index)
- NodeLookup[object] = nil
- connLookup[object]:disconnect()
- connLookup[object] = nil
- if visible then
- updateList()
- elseif nodeIsVisible(parent) then
- updateScroll()
- end
- end
- -- Moves a tree node to a new parent. Called when an existing object's parent
- -- changes.
- local function moveObject(object,parent)
- local objectNode = NodeLookup[object]
- if not objectNode then
- return
- end
- local parentNode = NodeLookup[parent]
- if not parentNode then
- return
- end
- local visible = nodeIsVisible(objectNode)
- remove(objectNode.Parent,objectNode.Index)
- objectNode.Parent = parentNode
- objectNode.Depth = depth(object)
- local function r(node,d)
- for i = 1,#node do
- node[i].Depth = d
- r(node[i],d+1)
- end
- end
- r(objectNode,objectNode.Depth+1)
- insert(parentNode,#parentNode+1,objectNode)
- if visible or nodeIsVisible(objectNode) then
- updateList()
- elseif nodeIsVisible(objectNode.Parent) then
- updateScroll()
- end
- end
- local InstanceBlacklist = {
- 'Instance';
- 'VRService';
- 'ContextActionService';
- 'AssetService';
- 'TouchInputService';
- 'ScriptContext';
- 'FilteredSelection';
- 'MeshContentProvider';
- 'SolidModelContentProvider';
- 'AnalyticsService';
- 'RobloxReplicatedStorage';
- 'GamepadService';
- 'HapticService';
- 'ChangeHistoryService';
- 'Visit';
- 'SocialService';
- 'SpawnerService';
- 'FriendService';
- 'Geometry';
- 'BadgeService';
- 'PhysicsService';
- 'CollectionService';
- 'TeleportService';
- 'HttpRbxApiService';
- 'TweenService';
- 'TextService';
- 'NotificationService';
- 'AdService';
- 'CSGDictionaryService';
- 'ControllerService';
- 'RuntimeScriptService';
- 'ScriptService';
- 'MouseService';
- 'KeyboardService';
- 'CookiesService';
- 'TimerService';
- 'GamePassService';
- 'KeyframeSequenceProvider';
- 'NonReplicatedCSGDictionaryService';
- 'GuidRegistryService';
- 'PathfindingService';
- 'GroupService';
- }
- for i, v in ipairs(InstanceBlacklist) do
- InstanceBlacklist[v] = true;
- InstanceBlacklist[i] = nil;
- end
- -- ScriptContext['/Libraries/LibraryRegistration/LibraryRegistration']
- -- This RobloxLocked object lets me index its properties for some reason
- local function check(object)
- return object.AncestryChanged
- end
- -- Creates a new tree node from an object. Called when an object starts
- -- existing in the game tree.
- local function addObject(object,noupdate)
- local s,e = pcall(function()
- if object.Parent == game and InstanceBlacklist[object.ClassName] or object.ClassName == '' then
- return true;
- end
- end)
- if(s) then
- if(e) then
- return;
- end
- else
- return;
- end
- if script then
- -- protect against naughty RobloxLocked objects
- local s = pcall(check,object)
- if not s then
- return
- end
- end
- local parentNode = NodeLookup[object.Parent]
- if not parentNode then
- return
- end
- local objectNode = {
- Object = object;
- Parent = parentNode;
- Index = 0;
- Expanded = false;
- Selected = false;
- Depth = depth(object);
- }
- connLookup[object] = Connect(object.AncestryChanged,function(c,p)
- if c == object then
- if p == nil then
- removeObject(c)
- else
- moveObject(c,p)
- end
- end
- end)
- NodeLookup[object] = objectNode
- insert(parentNode,#parentNode+1,objectNode)
- if not noupdate then
- if nodeIsVisible(objectNode) then
- updateList()
- elseif nodeIsVisible(objectNode.Parent) then
- updateScroll()
- end
- end
- end
- local function makeObject(obj,par)
- local newObject = Instance.new(obj.ClassName)
- for i,v in pairs(obj.Properties) do
- ypcall(function()
- local newProp
- newProp = ToPropValue(v.Value,v.Type)
- newObject[v.Name] = newProp
- end)
- end
- newObject.Parent = par
- end
- local function writeObject(obj)
- local newObject = {ClassName = obj.ClassName, Properties = {}}
- for i,v in pairs(RbxApi.GetProperties(obj.className)) do
- if v["Name"] ~= "Parent" then
- print("thispassed")
- table.insert(newObject.Properties,{Name = v["Name"], Type = v["ValueType"], Value = tostring(obj[v["Name"]])})
- end
- end
- return newObject
- end
- local function buildDexStorage()
- local localDexStorage
- local success,err = ypcall(function()
- localDexStorage = game:GetObjects("rbxasset://DexStorage.rbxm")[1]
- end)
- if success and localDexStorage then
- for i,v in pairs(localDexStorage:GetChildren()) do
- ypcall(function()
- v.Parent = DexStorageMain
- end)
- end
- end
- updateDexStorageListeners()
- --[[
- local localDexStorage = readfile(getelysianpath().."DexStorage.txt")--game:GetService("CookiesService"):GetCookieValue("DexStorage")
- --local success,err = pcall(function()
- if localDexStorage then
- local objTable = game:GetService("HttpService"):JSONDecode(localDexStorage)
- for i,v in pairs(objTable) do
- makeObject(v,DexStorageMain)
- end
- end
- --end)
- --]]
- end
- local dexStorageDebounce = false
- local dexStorageListeners = {}
- local function updateDexStorage()
- if dexStorageDebounce then return end
- dexStorageDebounce = true
- wait()
- pcall(function()
- -- saveinstance("content//DexStorage.rbxm",DexStorageMain)
- end)
- updateDexStorageListeners()
- dexStorageDebounce = false
- --[[
- local success,err = ypcall(function()
- local objs = {}
- for i,v in pairs(DexStorageMain:GetChildren()) do
- table.insert(objs,writeObject(v))
- end
- writefile(getelysianpath().."DexStorage.txt",game:GetService("HttpService"):JSONEncode(objs))
- --game:GetService("CookiesService"):SetCookieValue("DexStorage",game:GetService("HttpService"):JSONEncode(objs))
- end)
- if err then
- CreateCaution("DexStorage Save Fail!","DexStorage broke! If you see this message, report to Raspberry Pi!")
- end
- print("hi")
- --]]
- end
- function updateDexStorageListeners()
- for i,v in pairs(dexStorageListeners) do
- v:Disconnect()
- end
- dexStorageListeners = {}
- for i,v in pairs(DexStorageMain:GetChildren()) do
- pcall(function()
- local ev = v.Changed:connect(updateDexStorage)
- table.insert(dexStorageListeners,ev)
- end)
- end
- end
- do
- NodeLookup[workspace.Parent] = {
- Object = workspace.Parent;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- NodeLookup[DexOutput] = {
- Object = DexOutput;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- if DexStorageEnabled then
- NodeLookup[DexStorage] = {
- Object = DexStorage;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- end
- if NilStorageEnabled then
- NodeLookup[NilStorage] = {
- Object = NilStorage;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- end
- if RunningScriptsStorageEnabled then
- NodeLookup[RunningScriptsStorage] = {
- Object = RunningScriptsStorage;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- end
- if LoadedModulesStorageEnabled then
- NodeLookup[LoadedModulesStorage] = {
- Object = LoadedModulesStorage;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- end
- Connect(game.DescendantAdded,addObject)
- Connect(game.DescendantRemoving,removeObject)
- Connect(DexOutput.DescendantAdded,addObject)
- Connect(DexOutput.DescendantRemoving,removeObject)
- if DexStorageEnabled then
- --[[
- if readfile(getelysianpath().."DexStorage.txt") == nil then
- writefile(getelysianpath().."DexStorage.txt","")
- end
- --]]
- buildDexStorage()
- Connect(DexStorage.DescendantAdded,addObject)
- Connect(DexStorage.DescendantRemoving,removeObject)
- Connect(DexStorage.DescendantAdded,updateDexStorage)
- Connect(DexStorage.DescendantRemoving,updateDexStorage)
- end
- if NilStorageEnabled then
- Connect(NilStorage.DescendantAdded,addObject)
- Connect(NilStorage.DescendantRemoving,removeObject)
- --[[local currentTable = get_nil_instances()
- spawn(function()
- while wait() do
- if #currentTable ~= #get_nil_instances() then
- currentTable = get_nil_instances()
- --NilStorageMain:ClearAllChildren()
- for i,v in pairs(get_nil_instances()) do
- if v ~= NilStorage and v ~= DexStorage then
- pcall(function()
- v.Parent = NilStorageMain
- end)
- --[ [
- local newNil = v
- newNil.Archivable = true
- newNil:Clone().Parent = NilStorageMain
- -- ] ]
- end
- end
- end
- end
- end)]]
- end
- if RunningScriptsStorageEnabled then
- Connect(RunningScriptsStorage.DescendantAdded,addObject)
- Connect(RunningScriptsStorage.DescendantRemoving,removeObject)
- end
- if LoadedModulesStorageEnabled then
- Connect(LoadedModulesStorage.DescendantAdded,addObject)
- Connect(LoadedModulesStorage.DescendantRemoving,removeObject)
- end
- local function get(o)
- return o:GetDescendants()
- end
- local function r(o)
- local s,children = pcall(get, o)
- if s then
- for i = 1,#children do
- addObject(children[i],true);
- end
- end
- end
- r(workspace.Parent)
- r(DexOutput)
- if DexStorageEnabled then
- r(DexStorage)
- end
- if NilStorageEnabled then
- r(NilStorage)
- end
- if RunningScriptsStorageEnabled then
- r(RunningScriptsStorage)
- end
- if LoadedModulesStorageEnabled then
- r(LoadedModulesStorage)
- end
- scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
- updateList()
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Actions
- local actionButtons do
- actionButtons = {}
- local totalActions = 1
- local currentActions = totalActions
- local function makeButton(icon,over,name,vis,cond)
- local buttonEnabled = false
- local button = Create(Icon('ImageButton',icon),{
- Name = name .. "Button";
- Visible = Option.Modifiable and Option.Selectable;
- Position = UDim2.new(1,-(GUI_SIZE+2)*currentActions+2,0.25,-GUI_SIZE/2);
- Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE);
- Parent = headerFrame;
- })
- local tipText = Create('TextLabel',{
- Name = name .. "Text";
- Text = name;
- Visible = false;
- BackgroundTransparency = 1;
- TextXAlignment = 'Right';
- Font = FONT;
- FontSize = FONT_SIZE;
- Position = UDim2.new(0,0,0,0);
- Size = UDim2.new(1,-(GUI_SIZE+2)*totalActions,1,0);
- Parent = headerFrame;
- })
- button.MouseEnter:connect(function()
- if buttonEnabled then
- button.BackgroundTransparency = 0.9
- end
- --Icon(button,over)
- --tipText.Visible = true
- end)
- button.MouseLeave:connect(function()
- button.BackgroundTransparency = 1
- --Icon(button,icon)
- --tipText.Visible = false
- end)
- currentActions = currentActions + 1
- actionButtons[#actionButtons+1] = {Obj = button,Cond = cond}
- QuickButtons[#actionButtons+1] = {Obj = button,Cond = cond, Toggle = function(on)
- if on then
- buttonEnabled = true
- Icon(button,over)
- else
- buttonEnabled = false
- Icon(button,icon)
- end
- end}
- return button
- end
- --local clipboard = {}
- local function delete(o)
- o.Parent = nil
- end
- makeButton(ACTION_EDITQUICKACCESS,ACTION_EDITQUICKACCESS,"Options",true,function()return true end).MouseButton1Click:connect(function()
- end)
- -- DELETE
- makeButton(ACTION_DELETE,ACTION_DELETE_OVER,"Delete",true,function() return #Selection:Get() > 0 end).MouseButton1Click:connect(function()
- if not Option.Modifiable then return end
- local list = Selection:Get()
- for i = 1,#list do
- pcall(delete,list[i])
- end
- Selection:Set({})
- end)
- -- PASTE
- makeButton(ACTION_PASTE,ACTION_PASTE_OVER,"Paste",true,function() return #Selection:Get() > 0 and #clipboard > 0 end).MouseButton1Click:connect(function()
- if not Option.Modifiable then return end
- local parent = Selection.List[1] or workspace
- for i = 1,#clipboard do
- clipboard[i]:Clone().Parent = parent
- end
- end)
- -- COPY
- makeButton(ACTION_COPY,ACTION_COPY_OVER,"Copy",true,function() return #Selection:Get() > 0 end).MouseButton1Click:connect(function()
- if not Option.Modifiable then return end
- clipboard = {}
- local list = Selection.List
- for i = 1,#list do
- table.insert(clipboard,list[i]:Clone())
- end
- updateActions()
- end)
- -- CUT
- makeButton(ACTION_CUT,ACTION_CUT_OVER,"Cut",true,function() return #Selection:Get() > 0 end).MouseButton1Click:connect(function()
- if not Option.Modifiable then return end
- clipboard = {}
- local list = Selection.List
- local cut = {}
- for i = 1,#list do
- local obj = list[i]:Clone()
- if obj then
- table.insert(clipboard,obj)
- table.insert(cut,list[i])
- end
- end
- for i = 1,#cut do
- pcall(delete,cut[i])
- end
- updateActions()
- end)
- -- FREEZE
- makeButton(ACTION_FREEZE,ACTION_FREEZE,"Freeze",true,function() return true end)
- -- ADD/REMOVE STARRED
- makeButton(ACTION_ADDSTAR,ACTION_ADDSTAR_OVER,"Star",true,function() return #Selection:Get() > 0 end)
- -- STARRED
- makeButton(ACTION_STARRED,ACTION_STARRED,"Starred",true,function() return true end)
- -- SORT
- -- local actionSort = makeButton(ACTION_SORT,ACTION_SORT_OVER,"Sort")
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Option Bindables
- do
- local optionCallback = {
- Modifiable = function(value)
- for i = 1,#actionButtons do
- actionButtons[i].Obj.Visible = value and Option.Selectable
- end
- cancelReparentDrag()
- end;
- Selectable = function(value)
- for i = 1,#actionButtons do
- actionButtons[i].Obj.Visible = value and Option.Modifiable
- end
- cancelSelectDrag()
- Selection:Set({})
- end;
- }
- local bindSetOption = explorerPanel:FindFirstChild("SetOption")
- if not bindSetOption then
- bindSetOption = Create('BindableFunction',{Name = "SetOption"})
- bindSetOption.Parent = explorerPanel
- end
- bindSetOption.OnInvoke = function(optionName,value)
- if optionCallback[optionName] then
- Option[optionName] = value
- optionCallback[optionName](value)
- end
- end
- local bindGetOption = explorerPanel:FindFirstChild("GetOption")
- if not bindGetOption then
- bindGetOption = Create('BindableFunction',{Name = "GetOption"})
- bindGetOption.Parent = explorerPanel
- end
- bindGetOption.OnInvoke = function(optionName)
- if optionName then
- return Option[optionName]
- else
- local options = {}
- for k,v in pairs(Option) do
- options[k] = v
- end
- return options
- end
- end
- end
- function SelectionVar()
- return Selection
- end
- Input.InputBegan:connect(function(key)
- if key.KeyCode == Enum.KeyCode.LeftControl then
- HoldingCtrl = true
- end
- if key.KeyCode == Enum.KeyCode.LeftShift then
- HoldingShift = true
- end
- end)
- Input.InputEnded:connect(function(key)
- if key.KeyCode == Enum.KeyCode.LeftControl then
- HoldingCtrl = false
- end
- if key.KeyCode == Enum.KeyCode.LeftShift then
- HoldingShift = false
- end
- end)
- while RbxApi == nil do
- RbxApi = GetApiRemote:Invoke()
- wait()
- end
- --[[
- explorerFilter.Changed:connect(function(prop)
- if prop == "Text" then
- rawUpdateList()
- end
- end)
- ]] -- literally just free lag
- explorerFilter.FocusLost:Connect(function(EnterPressed)
- if EnterPressed then
- rawUpdateList()
- end
- end)
- CurrentInsertObjectWindow = CreateInsertObjectMenu(
- GetClasses(),
- "",
- false,
- function(option)
- CurrentInsertObjectWindow.Visible = false
- local list = SelectionVar():Get()
- for i = 1,#list do
- pcall(function() Instance.new(option,list[i]) end)
- end
- DestroyRightClick()
- end
- )
Add Comment
Please, Sign In to add comment