Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Farewell Infortality.
- -- Version: 2.82
- -- Instances:
- local Dex = Instance.new("ScreenGui")
- local PropertiesFrame = Instance.new("Frame")
- local Header = Instance.new("Frame")
- local TextLabel = Instance.new("TextLabel")
- local TextBox = Instance.new("TextBox")
- local ExplorerPanel = Instance.new("Frame")
- local SideMenu = Instance.new("Frame")
- local Toggle = Instance.new("TextButton")
- local Explorer = Instance.new("TextButton")
- local Settings = Instance.new("TextButton")
- local Title = Instance.new("TextLabel")
- local Version = Instance.new("TextLabel")
- local Toggle_2 = Instance.new("TextButton")
- local SettingsPanel = Instance.new("Frame")
- local Header_2 = Instance.new("Frame")
- local TextLabel_2 = Instance.new("TextLabel")
- local ClickSelect = Instance.new("Frame")
- local Name = Instance.new("TextLabel")
- local Change = Instance.new("TextButton")
- local ClearProperties = Instance.new("Frame")
- local Name_2 = Instance.new("TextLabel")
- local Change_2 = Instance.new("TextButton")
- local SelectionBox = Instance.new("Frame")
- local Name_3 = Instance.new("TextLabel")
- local Change_3 = Instance.new("TextButton")
- local SelectUngrouped = Instance.new("Frame")
- local Name_4 = Instance.new("TextLabel")
- local Change_4 = Instance.new("TextButton")
- local SaveInstance = Instance.new("Frame")
- local Title_2 = Instance.new("TextLabel")
- local MainWindow = Instance.new("Frame")
- local Save = Instance.new("TextButton")
- local Desc = Instance.new("TextLabel")
- local Cancel = Instance.new("TextButton")
- local FileName = Instance.new("TextBox")
- local SaveObjects = Instance.new("TextButton")
- local enabled = Instance.new("TextLabel")
- local Desc2 = Instance.new("TextLabel")
- local Confirmation = Instance.new("Frame")
- local Title_3 = Instance.new("TextLabel")
- local MainWindow_2 = Instance.new("Frame")
- local Yes = Instance.new("TextButton")
- local Desc_2 = Instance.new("TextLabel")
- local No = Instance.new("TextButton")
- local Caution = Instance.new("Frame")
- local Title_4 = Instance.new("TextLabel")
- local MainWindow_3 = Instance.new("Frame")
- local Desc_3 = Instance.new("TextLabel")
- local Ok = Instance.new("TextButton")
- local CallRemote = Instance.new("Frame")
- local Title_5 = Instance.new("TextLabel")
- local MainWindow_4 = Instance.new("Frame")
- local Desc_4 = Instance.new("TextLabel")
- local Arguments = Instance.new("ScrollingFrame")
- local DisplayReturned = Instance.new("TextButton")
- local enabled_2 = Instance.new("TextLabel")
- local Desc2_2 = Instance.new("TextLabel")
- local Add = Instance.new("TextButton")
- local Subtract = Instance.new("TextButton")
- local ArgumentTemplate = Instance.new("Frame")
- local Type = Instance.new("TextButton")
- local Value = Instance.new("TextBox")
- local Cancel_2 = Instance.new("TextButton")
- local Ok_2 = Instance.new("TextButton")
- local TableCaution = Instance.new("Frame")
- local MainWindow_5 = Instance.new("Frame")
- local Ok_3 = Instance.new("TextButton")
- local TableResults = Instance.new("ScrollingFrame")
- local TableTemplate = Instance.new("Frame")
- local Type_2 = Instance.new("TextLabel")
- local Value_2 = Instance.new("TextLabel")
- local Title_6 = Instance.new("TextLabel")
- --Properties:
- Dex.Name = "Dex"
- Dex.Parent = game.Players.LocalPlayer:WaitForChild("PlayerGui")
- PropertiesFrame.Name = "PropertiesFrame"
- PropertiesFrame.Parent = Dex
- PropertiesFrame.Active = true
- PropertiesFrame.BackgroundColor3 = Color3.new(1, 1, 1)
- PropertiesFrame.BackgroundTransparency = 0.10000000149012
- PropertiesFrame.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- PropertiesFrame.Position = UDim2.new(1, -300, 0.5, 21)
- PropertiesFrame.Size = UDim2.new(0, 300, 0.5, -3)
- Header.Name = "Header"
- Header.Parent = PropertiesFrame
- Header.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- Header.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- Header.Position = UDim2.new(0, 0, 0, -36)
- Header.Size = UDim2.new(1, 0, 0, 35)
- TextLabel.Parent = Header
- TextLabel.BackgroundTransparency = 1
- TextLabel.Position = UDim2.new(0, 4, 0, 0)
- TextLabel.Size = UDim2.new(1, -4, 0.5, 0)
- TextLabel.Font = Enum.Font.SourceSans
- TextLabel.Text = "Properties"
- TextLabel.TextColor3 = Color3.new(0, 0, 0)
- TextLabel.TextSize = 14
- TextLabel.TextXAlignment = Enum.TextXAlignment.Left
- TextBox.Parent = Header
- TextBox.BackgroundTransparency = 0.80000001192093
- TextBox.Position = UDim2.new(0, 4, 0.5, 0)
- TextBox.Size = UDim2.new(1, -8, 0.5, -3)
- TextBox.Font = Enum.Font.SourceSans
- TextBox.Text = "Search Properties"
- TextBox.TextColor3 = Color3.new(0, 0, 0)
- TextBox.TextSize = 14
- TextBox.TextXAlignment = Enum.TextXAlignment.Left
- ExplorerPanel.Name = "ExplorerPanel"
- ExplorerPanel.Parent = Dex
- ExplorerPanel.BackgroundColor3 = Color3.new(1, 1, 1)
- ExplorerPanel.BackgroundTransparency = 0.10000000149012
- ExplorerPanel.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- ExplorerPanel.Position = UDim2.new(1, -300, 0, 0)
- ExplorerPanel.Size = UDim2.new(0, 300, 0.5, -15)
- SideMenu.Name = "SideMenu"
- SideMenu.Parent = Dex
- SideMenu.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- SideMenu.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- SideMenu.Position = UDim2.new(1, -330, 0, 0)
- SideMenu.Size = UDim2.new(0, 30, 0, 150)
- SideMenu.ZIndex = 2
- Toggle.Name = "Toggle"
- Toggle.Parent = SideMenu
- Toggle.BackgroundColor3 = Color3.new(1, 1, 1)
- Toggle.BackgroundTransparency = 1
- Toggle.Position = UDim2.new(0, 0, 0, 120)
- Toggle.Size = UDim2.new(0, 30, 0, 30)
- Toggle.ZIndex = 2
- Toggle.Font = Enum.Font.SourceSans
- Toggle.Text = ">"
- Toggle.TextSize = 24
- Explorer.Name = "Explorer"
- Explorer.Parent = SideMenu
- Explorer.BackgroundColor3 = Color3.new(1, 1, 1)
- Explorer.BackgroundTransparency = 1
- Explorer.Position = UDim2.new(0, 0, 0, 90)
- Explorer.Size = UDim2.new(0, 30, 0, 30)
- Explorer.ZIndex = 2
- Explorer.Font = Enum.Font.SourceSans
- Explorer.Text = "E"
- Explorer.TextSize = 24
- Settings.Name = "Settings"
- Settings.Parent = SideMenu
- Settings.BackgroundColor3 = Color3.new(1, 1, 1)
- Settings.BackgroundTransparency = 1
- Settings.Position = UDim2.new(0, 0, 0, 60)
- Settings.Size = UDim2.new(0, 30, 0, 30)
- Settings.ZIndex = 2
- Settings.Font = Enum.Font.SourceSans
- Settings.Text = "S"
- Settings.TextSize = 24
- Title.Name = "Title"
- Title.Parent = SideMenu
- Title.BackgroundColor3 = Color3.new(1, 1, 1)
- Title.BackgroundTransparency = 1
- Title.Size = UDim2.new(0, 30, 0, 20)
- Title.ZIndex = 2
- Title.Font = Enum.Font.SourceSansBold
- Title.Text = "DEX"
- Title.TextSize = 14
- Title.TextWrapped = true
- Version.Name = "Version"
- Version.Parent = SideMenu
- Version.BackgroundColor3 = Color3.new(1, 1, 1)
- Version.BackgroundTransparency = 1
- Version.Position = UDim2.new(0, 0, 0, 15)
- Version.Size = UDim2.new(0, 30, 0, 20)
- Version.ZIndex = 2
- Version.Font = Enum.Font.SourceSansBold
- Version.Text = "V0.98"
- Version.TextSize = 12
- Version.TextWrapped = true
- Toggle_2.Name = "Toggle"
- Toggle_2.Parent = Dex
- Toggle_2.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- Toggle_2.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- Toggle_2.Position = UDim2.new(1, 0, 0, 0)
- Toggle_2.Size = UDim2.new(0, 30, 0, 30)
- Toggle_2.Font = Enum.Font.SourceSans
- Toggle_2.Text = "<"
- Toggle_2.TextSize = 24
- SettingsPanel.Name = "SettingsPanel"
- SettingsPanel.Parent = Dex
- SettingsPanel.BackgroundColor3 = Color3.new(1, 1, 1)
- SettingsPanel.BackgroundTransparency = 0.10000000149012
- SettingsPanel.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- SettingsPanel.Position = UDim2.new(1, 0, 0, 0)
- SettingsPanel.Size = UDim2.new(0, 300, 1, 0)
- Header_2.Name = "Header"
- Header_2.Parent = SettingsPanel
- Header_2.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- Header_2.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- Header_2.Size = UDim2.new(1, 0, 0, 17)
- TextLabel_2.Parent = Header_2
- TextLabel_2.BackgroundTransparency = 1
- TextLabel_2.Position = UDim2.new(0, 4, 0, 0)
- TextLabel_2.Size = UDim2.new(1, -4, 1, 0)
- TextLabel_2.Font = Enum.Font.SourceSans
- TextLabel_2.Text = "Settings"
- TextLabel_2.TextColor3 = Color3.new(0, 0, 0)
- TextLabel_2.TextSize = 14
- TextLabel_2.TextXAlignment = Enum.TextXAlignment.Left
- ClickSelect.Name = "ClickSelect"
- ClickSelect.Parent = SettingsPanel
- ClickSelect.BackgroundColor3 = Color3.new(1, 1, 1)
- ClickSelect.BackgroundTransparency = 1
- ClickSelect.Position = UDim2.new(0, 0, 0, 18)
- ClickSelect.Size = UDim2.new(1, 0, 0, 30)
- Name.Name = "Name"
- Name.Parent = ClickSelect
- Name.BackgroundColor3 = Color3.new(1, 1, 1)
- Name.BackgroundTransparency = 0.5
- Name.Size = UDim2.new(0.5, 0, 1, 0)
- Name.Font = Enum.Font.SourceSans
- Name.Text = "Click Part to Select"
- Name.TextSize = 14
- Change.Name = "Change"
- Change.Parent = ClickSelect
- Change.BackgroundColor3 = Color3.new(1, 1, 1)
- Change.BackgroundTransparency = 0.5
- Change.BorderColor3 = Color3.new(0, 0, 0)
- Change.Position = UDim2.new(0.5, 0, 0, 0)
- Change.Size = UDim2.new(0.5, 0, 1, 0)
- Change.Font = Enum.Font.SourceSans
- Change.Text = "OFF"
- Change.TextSize = 18
- ClearProperties.Name = "ClearProperties"
- ClearProperties.Parent = SettingsPanel
- ClearProperties.BackgroundColor3 = Color3.new(1, 1, 1)
- ClearProperties.BackgroundTransparency = 1
- ClearProperties.Position = UDim2.new(0, 0, 0, 78)
- ClearProperties.Size = UDim2.new(1, 0, 0, 30)
- Name_2.Name = "Name"
- Name_2.Parent = ClearProperties
- Name_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Name_2.BackgroundTransparency = 0.5
- Name_2.Size = UDim2.new(0.5, 0, 1, 0)
- Name_2.Font = Enum.Font.SourceSans
- Name_2.Text = "Clear Property on Focus"
- Name_2.TextSize = 14
- Change_2.Name = "Change"
- Change_2.Parent = ClearProperties
- Change_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Change_2.BackgroundTransparency = 0.5
- Change_2.BorderColor3 = Color3.new(0, 0, 0)
- Change_2.Position = UDim2.new(0.5, 0, 0, 0)
- Change_2.Size = UDim2.new(0.5, 0, 1, 0)
- Change_2.Font = Enum.Font.SourceSans
- Change_2.Text = "OFF"
- Change_2.TextSize = 18
- SelectionBox.Name = "SelectionBox"
- SelectionBox.Parent = SettingsPanel
- SelectionBox.BackgroundColor3 = Color3.new(1, 1, 1)
- SelectionBox.BackgroundTransparency = 1
- SelectionBox.Position = UDim2.new(0, 0, 0, 48)
- SelectionBox.Size = UDim2.new(1, 0, 0, 30)
- Name_3.Name = "Name"
- Name_3.Parent = SelectionBox
- Name_3.BackgroundColor3 = Color3.new(1, 1, 1)
- Name_3.BackgroundTransparency = 0.5
- Name_3.Size = UDim2.new(0.5, 0, 1, 0)
- Name_3.Font = Enum.Font.SourceSans
- Name_3.Text = "Selection Box"
- Name_3.TextSize = 14
- Change_3.Name = "Change"
- Change_3.Parent = SelectionBox
- Change_3.BackgroundColor3 = Color3.new(1, 1, 1)
- Change_3.BackgroundTransparency = 0.5
- Change_3.BorderColor3 = Color3.new(0, 0, 0)
- Change_3.Position = UDim2.new(0.5, 0, 0, 0)
- Change_3.Size = UDim2.new(0.5, 0, 1, 0)
- Change_3.Font = Enum.Font.SourceSans
- Change_3.Text = "OFF"
- Change_3.TextSize = 18
- SelectUngrouped.Name = "SelectUngrouped"
- SelectUngrouped.Parent = SettingsPanel
- SelectUngrouped.BackgroundColor3 = Color3.new(1, 1, 1)
- SelectUngrouped.BackgroundTransparency = 1
- SelectUngrouped.Position = UDim2.new(0, 0, 0, 108)
- SelectUngrouped.Size = UDim2.new(1, 0, 0, 30)
- Name_4.Name = "Name"
- Name_4.Parent = SelectUngrouped
- Name_4.BackgroundColor3 = Color3.new(1, 1, 1)
- Name_4.BackgroundTransparency = 0.5
- Name_4.Size = UDim2.new(0.5, 0, 1, 0)
- Name_4.Font = Enum.Font.SourceSans
- Name_4.Text = "Select Ungrouped"
- Name_4.TextSize = 14
- Change_4.Name = "Change"
- Change_4.Parent = SelectUngrouped
- Change_4.BackgroundColor3 = Color3.new(1, 1, 1)
- Change_4.BackgroundTransparency = 0.5
- Change_4.BorderColor3 = Color3.new(0, 0, 0)
- Change_4.Position = UDim2.new(0.5, 0, 0, 0)
- Change_4.Size = UDim2.new(0.5, 0, 1, 0)
- Change_4.Font = Enum.Font.SourceSans
- Change_4.Text = "ON"
- Change_4.TextSize = 18
- SaveInstance.Name = "SaveInstance"
- SaveInstance.Parent = Dex
- SaveInstance.Active = true
- SaveInstance.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- SaveInstance.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- SaveInstance.Draggable = true
- SaveInstance.Position = UDim2.new(0.300000012, 0, 0.300000012, 0)
- SaveInstance.Size = UDim2.new(0, 350, 0, 20)
- SaveInstance.Visible = false
- SaveInstance.ZIndex = 2
- Title_2.Name = "Title"
- Title_2.Parent = SaveInstance
- Title_2.BackgroundTransparency = 1
- Title_2.Size = UDim2.new(1, 0, 1, 0)
- Title_2.ZIndex = 2
- Title_2.Font = Enum.Font.SourceSans
- Title_2.Text = "Save Instance"
- Title_2.TextColor3 = Color3.new(0, 0, 0)
- Title_2.TextSize = 14
- Title_2.TextXAlignment = Enum.TextXAlignment.Left
- MainWindow.Name = "MainWindow"
- MainWindow.Parent = SaveInstance
- MainWindow.BackgroundColor3 = Color3.new(1, 1, 1)
- MainWindow.BackgroundTransparency = 0.10000000149012
- MainWindow.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- MainWindow.Size = UDim2.new(1, 0, 0, 200)
- Save.Name = "Save"
- Save.Parent = MainWindow
- Save.BackgroundColor3 = Color3.new(1, 1, 1)
- Save.BackgroundTransparency = 0.5
- Save.BorderColor3 = Color3.new(0, 0, 0)
- Save.Position = UDim2.new(0.075000003, 0, 1, -40)
- Save.Size = UDim2.new(0.400000006, 0, 0, 30)
- Save.Font = Enum.Font.SourceSans
- Save.Text = "Save"
- Save.TextSize = 18
- Desc.Name = "Desc"
- Desc.Parent = MainWindow
- Desc.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc.BackgroundTransparency = 1
- Desc.Position = UDim2.new(0, 0, 0, 20)
- Desc.Size = UDim2.new(1, 0, 0, 40)
- Desc.Font = Enum.Font.SourceSans
- Desc.Text = "This will save an instance to your PC. Type in the name for your instance. (.rbxmx will be added automatically.)"
- Desc.TextSize = 14
- Desc.TextWrapped = true
- Cancel.Name = "Cancel"
- Cancel.Parent = MainWindow
- Cancel.BackgroundColor3 = Color3.new(1, 1, 1)
- Cancel.BackgroundTransparency = 0.5
- Cancel.BorderColor3 = Color3.new(0, 0, 0)
- Cancel.Position = UDim2.new(0.524999976, 0, 1, -40)
- Cancel.Size = UDim2.new(0.400000006, 0, 0, 30)
- Cancel.Font = Enum.Font.SourceSans
- Cancel.Text = "Cancel"
- Cancel.TextSize = 18
- FileName.Name = "FileName"
- FileName.Parent = MainWindow
- FileName.BackgroundColor3 = Color3.new(1, 1, 1)
- FileName.BackgroundTransparency = 0.20000000298023
- FileName.Position = UDim2.new(0.075000003, 0, 0.400000006, 0)
- FileName.Size = UDim2.new(0.850000024, 0, 0, 30)
- FileName.Font = Enum.Font.SourceSans
- FileName.Text = ""
- FileName.TextSize = 18
- FileName.TextXAlignment = Enum.TextXAlignment.Left
- SaveObjects.Name = "SaveObjects"
- SaveObjects.Parent = MainWindow
- SaveObjects.BackgroundColor3 = Color3.new(1, 1, 1)
- SaveObjects.BackgroundTransparency = 0.60000002384186
- SaveObjects.Position = UDim2.new(0.075000003, 0, 0.625, 0)
- SaveObjects.Size = UDim2.new(0, 20, 0, 20)
- SaveObjects.ZIndex = 2
- SaveObjects.Font = Enum.Font.SourceSans
- SaveObjects.Text = ""
- SaveObjects.TextColor3 = Color3.new(1, 1, 1)
- SaveObjects.TextSize = 18
- enabled.Name = "enabled"
- enabled.Parent = SaveObjects
- enabled.BackgroundColor3 = Color3.new(0.380392, 0.380392, 0.380392)
- enabled.BackgroundTransparency = 0.40000000596046
- enabled.BorderSizePixel = 0
- enabled.Position = UDim2.new(0, 3, 0, 3)
- enabled.Size = UDim2.new(0, 14, 0, 14)
- enabled.Font = Enum.Font.SourceSans
- enabled.Text = ""
- enabled.TextSize = 14
- Desc2.Name = "Desc2"
- Desc2.Parent = MainWindow
- Desc2.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc2.BackgroundTransparency = 1
- Desc2.Position = UDim2.new(0.075000003, 30, 0.625, 0)
- Desc2.Size = UDim2.new(0.925000012, -30, 0, 20)
- Desc2.Font = Enum.Font.SourceSans
- Desc2.Text = "Save \"Object\" type values"
- Desc2.TextSize = 14
- Desc2.TextXAlignment = Enum.TextXAlignment.Left
- Confirmation.Name = "Confirmation"
- Confirmation.Parent = Dex
- Confirmation.Active = true
- Confirmation.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- Confirmation.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- Confirmation.Draggable = true
- Confirmation.Position = UDim2.new(0.300000012, 0, 0.349999994, 0)
- Confirmation.Size = UDim2.new(0, 350, 0, 20)
- Confirmation.Visible = false
- Confirmation.ZIndex = 3
- Title_3.Name = "Title"
- Title_3.Parent = Confirmation
- Title_3.BackgroundTransparency = 1
- Title_3.Size = UDim2.new(1, 0, 1, 0)
- Title_3.ZIndex = 3
- Title_3.Font = Enum.Font.SourceSans
- Title_3.Text = "Confirm"
- Title_3.TextColor3 = Color3.new(0, 0, 0)
- Title_3.TextSize = 14
- Title_3.TextXAlignment = Enum.TextXAlignment.Left
- MainWindow_2.Name = "MainWindow"
- MainWindow_2.Parent = Confirmation
- MainWindow_2.BackgroundColor3 = Color3.new(1, 1, 1)
- MainWindow_2.BackgroundTransparency = 0.10000000149012
- MainWindow_2.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- MainWindow_2.Size = UDim2.new(1, 0, 0, 150)
- MainWindow_2.ZIndex = 2
- Yes.Name = "Yes"
- Yes.Parent = MainWindow_2
- Yes.BackgroundColor3 = Color3.new(1, 1, 1)
- Yes.BackgroundTransparency = 0.5
- Yes.BorderColor3 = Color3.new(0, 0, 0)
- Yes.Position = UDim2.new(0.075000003, 0, 1, -40)
- Yes.Size = UDim2.new(0.400000006, 0, 0, 30)
- Yes.ZIndex = 2
- Yes.Font = Enum.Font.SourceSans
- Yes.Text = "Yes"
- Yes.TextSize = 18
- Desc_2.Name = "Desc"
- Desc_2.Parent = MainWindow_2
- Desc_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc_2.BackgroundTransparency = 1
- Desc_2.Position = UDim2.new(0, 0, 0, 20)
- Desc_2.Size = UDim2.new(1, 0, 0, 40)
- Desc_2.ZIndex = 2
- Desc_2.Font = Enum.Font.SourceSans
- Desc_2.Text = "The file, FILENAME, already exists. Overwrite?"
- Desc_2.TextSize = 14
- Desc_2.TextWrapped = true
- No.Name = "No"
- No.Parent = MainWindow_2
- No.BackgroundColor3 = Color3.new(1, 1, 1)
- No.BackgroundTransparency = 0.5
- No.BorderColor3 = Color3.new(0, 0, 0)
- No.Position = UDim2.new(0.524999976, 0, 1, -40)
- No.Size = UDim2.new(0.400000006, 0, 0, 30)
- No.ZIndex = 2
- No.Font = Enum.Font.SourceSans
- No.Text = "No"
- No.TextSize = 18
- Caution.Name = "Caution"
- Caution.Parent = Dex
- Caution.Active = true
- Caution.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- Caution.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- Caution.Draggable = true
- Caution.Position = UDim2.new(0.300000012, 0, 0.300000012, 0)
- Caution.Size = UDim2.new(0, 350, 0, 20)
- Caution.Visible = false
- Caution.ZIndex = 5
- Title_4.Name = "Title"
- Title_4.Parent = Caution
- Title_4.BackgroundTransparency = 1
- Title_4.Size = UDim2.new(1, 0, 1, 0)
- Title_4.ZIndex = 5
- Title_4.Font = Enum.Font.SourceSans
- Title_4.Text = "Caution"
- Title_4.TextColor3 = Color3.new(0, 0, 0)
- Title_4.TextSize = 14
- Title_4.TextXAlignment = Enum.TextXAlignment.Left
- MainWindow_3.Name = "MainWindow"
- MainWindow_3.Parent = Caution
- MainWindow_3.BackgroundColor3 = Color3.new(1, 1, 1)
- MainWindow_3.BackgroundTransparency = 0.10000000149012
- MainWindow_3.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- MainWindow_3.Size = UDim2.new(1, 0, 0, 150)
- MainWindow_3.ZIndex = 4
- Desc_3.Name = "Desc"
- Desc_3.Parent = MainWindow_3
- Desc_3.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc_3.BackgroundTransparency = 1
- Desc_3.Position = UDim2.new(0, 0, 0, 20)
- Desc_3.Size = UDim2.new(1, 0, 0, 42)
- Desc_3.ZIndex = 4
- Desc_3.Font = Enum.Font.SourceSans
- Desc_3.Text = "The file, FILENAME, already exists. Overwrite?"
- Desc_3.TextSize = 14
- Desc_3.TextWrapped = true
- Ok.Name = "Ok"
- Ok.Parent = MainWindow_3
- Ok.BackgroundColor3 = Color3.new(1, 1, 1)
- Ok.BackgroundTransparency = 0.5
- Ok.BorderColor3 = Color3.new(0, 0, 0)
- Ok.Position = UDim2.new(0.300000012, 0, 1, -40)
- Ok.Size = UDim2.new(0.400000006, 0, 0, 30)
- Ok.ZIndex = 4
- Ok.Font = Enum.Font.SourceSans
- Ok.Text = "Ok"
- Ok.TextSize = 18
- CallRemote.Name = "CallRemote"
- CallRemote.Parent = Dex
- CallRemote.Active = true
- CallRemote.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- CallRemote.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- CallRemote.Draggable = true
- CallRemote.Position = UDim2.new(0.300000012, 0, 0.300000012, 0)
- CallRemote.Size = UDim2.new(0, 350, 0, 20)
- CallRemote.Visible = false
- CallRemote.ZIndex = 2
- Title_5.Name = "Title"
- Title_5.Parent = CallRemote
- Title_5.BackgroundTransparency = 1
- Title_5.Size = UDim2.new(1, 0, 1, 0)
- Title_5.ZIndex = 2
- Title_5.Font = Enum.Font.SourceSans
- Title_5.Text = "Call Remote"
- Title_5.TextColor3 = Color3.new(0, 0, 0)
- Title_5.TextSize = 14
- Title_5.TextXAlignment = Enum.TextXAlignment.Left
- MainWindow_4.Name = "MainWindow"
- MainWindow_4.Parent = CallRemote
- MainWindow_4.BackgroundColor3 = Color3.new(1, 1, 1)
- MainWindow_4.BackgroundTransparency = 0.10000000149012
- MainWindow_4.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- MainWindow_4.Size = UDim2.new(1, 0, 0, 200)
- Desc_4.Name = "Desc"
- Desc_4.Parent = MainWindow_4
- Desc_4.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc_4.BackgroundTransparency = 1
- Desc_4.Position = UDim2.new(0, 0, 0, 20)
- Desc_4.Size = UDim2.new(1, 0, 0, 20)
- Desc_4.Font = Enum.Font.SourceSans
- Desc_4.Text = "Arguments"
- Desc_4.TextSize = 14
- Desc_4.TextWrapped = true
- Arguments.Name = "Arguments"
- Arguments.Parent = MainWindow_4
- Arguments.BackgroundColor3 = Color3.new(1, 1, 1)
- Arguments.BackgroundTransparency = 1
- Arguments.Position = UDim2.new(0, 0, 0, 40)
- Arguments.Size = UDim2.new(1, 0, 0, 80)
- Arguments.BottomImage = "rbxasset://textures/blackBkg_square.png"
- Arguments.CanvasSize = UDim2.new(0, 0, 0, 0)
- Arguments.MidImage = "rbxasset://textures/blackBkg_square.png"
- Arguments.TopImage = "rbxasset://textures/blackBkg_square.png"
- DisplayReturned.Name = "DisplayReturned"
- DisplayReturned.Parent = MainWindow_4
- DisplayReturned.BackgroundColor3 = Color3.new(1, 1, 1)
- DisplayReturned.BackgroundTransparency = 0.60000002384186
- DisplayReturned.Position = UDim2.new(0.075000003, 0, 0.625, 0)
- DisplayReturned.Size = UDim2.new(0, 20, 0, 20)
- DisplayReturned.ZIndex = 2
- DisplayReturned.Font = Enum.Font.SourceSans
- DisplayReturned.Text = ""
- DisplayReturned.TextColor3 = Color3.new(1, 1, 1)
- DisplayReturned.TextSize = 18
- enabled_2.Name = "enabled"
- enabled_2.Parent = DisplayReturned
- enabled_2.BackgroundColor3 = Color3.new(0.380392, 0.380392, 0.380392)
- enabled_2.BackgroundTransparency = 0.40000000596046
- enabled_2.BorderSizePixel = 0
- enabled_2.Position = UDim2.new(0, 3, 0, 3)
- enabled_2.Size = UDim2.new(0, 14, 0, 14)
- enabled_2.Visible = false
- enabled_2.Font = Enum.Font.SourceSans
- enabled_2.Text = ""
- enabled_2.TextSize = 14
- Desc2_2.Name = "Desc2"
- Desc2_2.Parent = MainWindow_4
- Desc2_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Desc2_2.BackgroundTransparency = 1
- Desc2_2.Position = UDim2.new(0.075000003, 30, 0.625, 0)
- Desc2_2.Size = UDim2.new(0.925000012, -30, 0, 20)
- Desc2_2.Font = Enum.Font.SourceSans
- Desc2_2.Text = "Display values returned"
- Desc2_2.TextSize = 14
- Desc2_2.TextXAlignment = Enum.TextXAlignment.Left
- Add.Name = "Add"
- Add.Parent = MainWindow_4
- Add.BackgroundColor3 = Color3.new(1, 1, 1)
- Add.BackgroundTransparency = 0.5
- Add.BorderColor3 = Color3.new(0, 0, 0)
- Add.Position = UDim2.new(0.800000012, 0, 0.625, 0)
- Add.Size = UDim2.new(0, 20, 0, 20)
- Add.Font = Enum.Font.SourceSansBold
- Add.Text = "+"
- Add.TextSize = 24
- Subtract.Name = "Subtract"
- Subtract.Parent = MainWindow_4
- Subtract.BackgroundColor3 = Color3.new(1, 1, 1)
- Subtract.BackgroundTransparency = 0.5
- Subtract.BorderColor3 = Color3.new(0, 0, 0)
- Subtract.Position = UDim2.new(0.899999976, 0, 0.625, 0)
- Subtract.Size = UDim2.new(0, 20, 0, 20)
- Subtract.Font = Enum.Font.SourceSansBold
- Subtract.Text = "-"
- Subtract.TextSize = 24
- ArgumentTemplate.Name = "ArgumentTemplate"
- ArgumentTemplate.Parent = MainWindow_4
- ArgumentTemplate.BackgroundColor3 = Color3.new(1, 1, 1)
- ArgumentTemplate.BackgroundTransparency = 0.5
- ArgumentTemplate.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- ArgumentTemplate.Size = UDim2.new(1, 0, 0, 20)
- ArgumentTemplate.Visible = false
- Type.Name = "Type"
- Type.Parent = ArgumentTemplate
- Type.BackgroundColor3 = Color3.new(1, 1, 1)
- Type.BackgroundTransparency = 0.89999997615814
- Type.BorderColor3 = Color3.new(0, 0, 0)
- Type.Size = UDim2.new(0.400000006, 0, 0, 20)
- Type.Font = Enum.Font.SourceSans
- Type.Text = "Script"
- Type.TextSize = 18
- Value.Name = "Value"
- Value.Parent = ArgumentTemplate
- Value.BackgroundColor3 = Color3.new(1, 1, 1)
- Value.BackgroundTransparency = 0.89999997615814
- Value.Position = UDim2.new(0.400000006, 0, 0, 0)
- Value.Size = UDim2.new(0.600000024, -12, 0, 20)
- Value.Font = Enum.Font.SourceSans
- Value.Text = ""
- Value.TextSize = 14
- Value.TextXAlignment = Enum.TextXAlignment.Left
- Cancel_2.Name = "Cancel"
- Cancel_2.Parent = MainWindow_4
- Cancel_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Cancel_2.BackgroundTransparency = 0.5
- Cancel_2.BorderColor3 = Color3.new(0, 0, 0)
- Cancel_2.Position = UDim2.new(0.524999976, 0, 1, -40)
- Cancel_2.Size = UDim2.new(0.400000006, 0, 0, 30)
- Cancel_2.Font = Enum.Font.SourceSans
- Cancel_2.Text = "Cancel"
- Cancel_2.TextSize = 18
- Ok_2.Name = "Ok"
- Ok_2.Parent = MainWindow_4
- Ok_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Ok_2.BackgroundTransparency = 0.5
- Ok_2.BorderColor3 = Color3.new(0, 0, 0)
- Ok_2.Position = UDim2.new(0.075000003, 0, 1, -40)
- Ok_2.Size = UDim2.new(0.400000006, 0, 0, 30)
- Ok_2.Font = Enum.Font.SourceSans
- Ok_2.Text = "Call"
- Ok_2.TextSize = 18
- TableCaution.Name = "TableCaution"
- TableCaution.Parent = Dex
- TableCaution.Active = true
- TableCaution.BackgroundColor3 = Color3.new(0.913726, 0.913726, 0.913726)
- TableCaution.BorderColor3 = Color3.new(0.584314, 0.584314, 0.584314)
- TableCaution.Draggable = true
- TableCaution.Position = UDim2.new(0.300000012, 0, 0.300000012, 0)
- TableCaution.Size = UDim2.new(0, 350, 0, 20)
- TableCaution.Visible = false
- TableCaution.ZIndex = 2
- MainWindow_5.Name = "MainWindow"
- MainWindow_5.Parent = TableCaution
- MainWindow_5.BackgroundColor3 = Color3.new(1, 1, 1)
- MainWindow_5.BackgroundTransparency = 0.10000000149012
- MainWindow_5.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- MainWindow_5.Size = UDim2.new(1, 0, 0, 150)
- Ok_3.Name = "Ok"
- Ok_3.Parent = MainWindow_5
- Ok_3.BackgroundColor3 = Color3.new(1, 1, 1)
- Ok_3.BackgroundTransparency = 0.5
- Ok_3.BorderColor3 = Color3.new(0, 0, 0)
- Ok_3.Position = UDim2.new(0.300000012, 0, 1, -40)
- Ok_3.Size = UDim2.new(0.400000006, 0, 0, 30)
- Ok_3.Font = Enum.Font.SourceSans
- Ok_3.Text = "Ok"
- Ok_3.TextSize = 18
- TableResults.Name = "TableResults"
- TableResults.Parent = MainWindow_5
- TableResults.BackgroundColor3 = Color3.new(1, 1, 1)
- TableResults.BackgroundTransparency = 1
- TableResults.Position = UDim2.new(0, 0, 0, 20)
- TableResults.Size = UDim2.new(1, 0, 0, 80)
- TableResults.BottomImage = "rbxasset://textures/blackBkg_square.png"
- TableResults.CanvasSize = UDim2.new(0, 0, 0, 0)
- TableResults.MidImage = "rbxasset://textures/blackBkg_square.png"
- TableResults.TopImage = "rbxasset://textures/blackBkg_square.png"
- TableTemplate.Name = "TableTemplate"
- TableTemplate.Parent = MainWindow_5
- TableTemplate.BackgroundColor3 = Color3.new(1, 1, 1)
- TableTemplate.BackgroundTransparency = 0.5
- TableTemplate.BorderColor3 = Color3.new(0.74902, 0.74902, 0.74902)
- TableTemplate.Size = UDim2.new(1, 0, 0, 20)
- TableTemplate.Visible = false
- Type_2.Name = "Type"
- Type_2.Parent = TableTemplate
- Type_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Type_2.BackgroundTransparency = 0.89999997615814
- Type_2.Size = UDim2.new(0.400000006, 0, 0, 20)
- Type_2.Font = Enum.Font.SourceSans
- Type_2.Text = "Script"
- Type_2.TextSize = 18
- Value_2.Name = "Value"
- Value_2.Parent = TableTemplate
- Value_2.BackgroundColor3 = Color3.new(1, 1, 1)
- Value_2.BackgroundTransparency = 0.89999997615814
- Value_2.Position = UDim2.new(0.400000006, 0, 0, 0)
- Value_2.Size = UDim2.new(0.600000024, -12, 0, 20)
- Value_2.Font = Enum.Font.SourceSans
- Value_2.Text = "Script"
- Value_2.TextSize = 14
- Title_6.Name = "Title"
- Title_6.Parent = TableCaution
- Title_6.BackgroundTransparency = 1
- Title_6.Size = UDim2.new(1, 0, 1, 0)
- Title_6.ZIndex = 2
- Title_6.Font = Enum.Font.SourceSans
- Title_6.Text = "Caution"
- Title_6.TextColor3 = Color3.new(0, 0, 0)
- Title_6.TextSize = 14
- Title_6.TextXAlignment = Enum.TextXAlignment.Left
- -- Scripts:
- function SCRIPT_SOUD85_FAKESCRIPT() -- PropertiesFrame.Properties
- local script = Instance.new('LocalScript')
- script.Parent = PropertiesFrame
- --[[
- Change log:
- 09/18
- Fixed checkbox mouseover sprite
- Encapsulated checkbox creation into separate method
- Fixed another checkbox issue
- 09/15
- Invalid input is ignored instead of setting to default of that data type
- Consolidated control methods and simplified them
- All input goes through ToValue method
- Fixed position of BrickColor palette
- Made DropDown appear above row if it would otherwise exceed the page height
- Cleaned up stylesheets
- 09/14
- Made properties window scroll when mouse wheel scrolled
- Object/Instance and Color3 data types handled properly
- Multiple BrickColor controls interfering with each other fixed
- Added support for Content data type
- --]]
- wait(0.2)
- local print = function(s)
- print(tostring(s))
- end
- -- Services
- local Teams = game:GetService("Teams")
- local Workspace = game:GetService("Workspace")
- local Debris = game:GetService("Debris")
- local ContentProvider = game:GetService("ContentProvider")
- local Players = game:GetService("Players")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- -- Functions
- function httpGet(url)
- return game:HttpGet(url,true)
- end
- -- RbxApi Stuff
- local apiUrl = "http://anaminus.github.io/rbx/json/api/latest.json"
- local maxChunkSize = 100 * 1000
- local ApiJson
- if script:FindFirstChild("RawApiJson") then
- ApiJson = script.RawApiJson
- else
- ApiJson = ""
- end
- function getLocalApiJson()
- local rawApiJson = require(ApiJson)()
- return rawApiJson
- end
- function getCurrentApiJson()
- local jsonStr = nil
- if readfile and getelysianpath then
- if readfile(getelysianpath().."Xpl0rerApi.txt") then
- print("Api found in folder!")
- jsonStr = readfile(getelysianpath().."Xpl0rerApi.txt")
- return jsonStr
- end
- end
- local success, err = pcall(function()
- jsonStr = httpGet(apiUrl)
- print("Fetched json successfully")
- end)
- if success then
- print("Returning json")
- --print(jsonStr:sub(1,500))
- return jsonStr
- else
- print("Error fetching json: " .. tostring(err))
- print("Falling back to local copy")
- return getLocalApiJson()
- end
- end
- function splitStringIntoChunks(jsonStr)
- -- Splits up a string into a table with a given size
- local t = {}
- for i = 1, math.ceil(string.len(jsonStr)/maxChunkSize) do
- local str = jsonStr:sub((i-1)*maxChunkSize+1, i*maxChunkSize)
- table.insert(t, str)
- end
- return t
- end
- local jsonToParse = getCurrentApiJson()
- local apiChunks = splitStringIntoChunks(jsonToParse)
- function getRbxApi()
- --[[
- Api.Classes
- Api.Enums
- Api.GetProperties(className)
- Api.IsEnum(valueType)
- --]]
- -- Services
- local HttpService = game:GetService("HttpService")
- local ServerStorage = game:GetService("ServerStorage")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- -- Remotes
- --local Remotes = ReplicatedStorage:WaitForChild("OnlineStudio"):WaitForChild("Remotes")
- --local GetApiJsonFunction = Remotes:WaitForChild("GetApiJson")
- -- Functions
- local JsonDecode = function(s) return HttpService:JSONDecode(s) end
- local function GetApiRemoteFunction(index)
- if (apiChunks[index]) then
- return apiChunks[index], #apiChunks
- else
- print("Bad index for GetApiJson")
- return nil
- end
- end
- local function getApiJson()
- local apiTable = {}
- local firstPage, pageCount = GetApiRemoteFunction(1)
- table.insert(apiTable, firstPage)
- for i = 2, pageCount do
- --print("Fetching API page # " .. tostring(i))
- local result = GetApiRemoteFunction(i)
- table.insert(apiTable, result)
- end
- return table.concat(apiTable)
- end
- local json = getApiJson()
- local apiDump = JsonDecode(json)
- local Classes = {}
- local Enums = {}
- local function sortAlphabetic(t, property)
- table.sort(t,
- function(x,y) return x[property] < y[property]
- end)
- end
- local function isEnum(name)
- return Enums[name] ~= nil
- end
- local function getProperties(className)
- local class = Classes[className]
- local properties = {}
- if not class then return properties end
- while class do
- for _,property in pairs(class.Properties) do
- table.insert(properties, property)
- end
- class = Classes[class.Superclass]
- end
- sortAlphabetic(properties, "Name")
- return properties
- end
- for _,item in pairs(apiDump) do
- local itemType = item.type
- -- Classes --
- if (itemType == 'Class') then
- Classes[item.Name] = item
- item.Properties = {}
- item.Functions = {}
- item.YieldFunctions = {}
- item.Events = {}
- item.Callbacks = {}
- -- Members --
- elseif (itemType == 'Property') then
- table.insert(Classes[item.Class].Properties, item)
- elseif (itemType == 'Function') then
- table.insert(Classes[item.Class].Functions, item)
- elseif (itemType == 'YieldFunction') then
- table.insert(Classes[item.Class].YieldFunctions, item)
- elseif (itemType == 'Event') then
- table.insert(Classes[item.Class].Events, item)
- elseif (itemType == 'Callback') then
- table.insert(Classes[item.Class].Callbacks, item)
- -- Enums --
- elseif (itemType == 'Enum') then
- Enums[item.Name] = item
- item.EnumItems = {}
- elseif (itemType == 'EnumItem') then
- Enums[item.Enum].EnumItems[item.Name] = item
- end
- end
- return {
- Classes = Classes;
- Enums = Enums;
- GetProperties = getProperties;
- IsEnum = isEnum;
- }
- end
- -- Modules
- local Permissions = {CanEdit = true}
- local RbxApi = getRbxApi()
- --[[
- RbxApi.Classes
- RbxApi.Enums
- RbxApi.GetProperties(className)
- RbxApi.IsEnum(valueType)
- --]]
- -- Styles
- 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);
- White = CreateColor3(255,255,255);
- }
- local Row = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextXAlignment = Enum.TextXAlignment.Left;
- TextColor = Styles.Black;
- TextColorOver = Styles.White;
- TextLockedColor = CreateColor3(120,120,120);
- Height = 24;
- BorderColor = CreateColor3(216,216,216);
- BackgroundColor = Styles.White;
- BackgroundColorAlternate = CreateColor3(246,246,246);
- BackgroundColorMouseover = CreateColor3(211,224,244);
- TitleMarginLeft = 15;
- }
- local DropDown = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextColor = CreateColor3(0,0,0);
- TextColorOver = Styles.White;
- TextXAlignment = Enum.TextXAlignment.Left;
- Height = 16;
- BackColor = Styles.White;
- BackColorOver = CreateColor3(86,125,188);
- BorderColor = CreateColor3(216,216,216);
- BorderSizePixel = 2;
- ArrowColor = CreateColor3(160,160,160);
- ArrowColorOver = Styles.Black;
- }
- local BrickColors = {
- BoxSize = 13;
- BorderSizePixel = 1;
- BorderColor = CreateColor3(160,160,160);
- FrameColor = CreateColor3(160,160,160);
- Size = 20;
- Padding = 4;
- ColorsPerRow = 8;
- OuterBorder = 1;
- OuterBorderColor = Styles.Black;
- }
- wait(1)
- local Gui = script.Parent.Parent
- local PropertiesFrame = Gui:WaitForChild("PropertiesFrame")
- local ExplorerFrame = Gui:WaitForChild("ExplorerPanel")
- local bindGetSelection = ExplorerFrame.GetSelection
- local bindSelectionChanged = ExplorerFrame.SelectionChanged
- local bindGetApi = PropertiesFrame.GetApi
- local bindGetAwait = PropertiesFrame.GetAwaiting
- local bindSetAwait = PropertiesFrame.SetAwaiting
- local ContentUrl = ContentProvider.BaseUrl .. "asset/?id="
- local SettingsRemote = Gui:WaitForChild("SettingsPanel"):WaitForChild("GetSetting")
- local propertiesSearch = PropertiesFrame.Header.TextBox
- local AwaitingObjectValue = false
- local AwaitingObjectObj
- local AwaitingObjectProp
- function searchingProperties()
- if propertiesSearch.Text ~= "" and propertiesSearch.Text ~= "Search Properties" then
- return true
- end
- return false
- end
- local function GetSelection()
- local selection = bindGetSelection:Invoke()
- if #selection == 0 then
- return nil
- else
- return selection
- end
- end
- -- Number
- local function Round(number, decimalPlaces)
- return tonumber(string.format("%." .. (decimalPlaces or 0) .. "f", number))
- end
- -- Strings
- 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
- -- Data Type Handling
- local function ToString(value, type)
- if type == "float" then
- return tostring(Round(value,2))
- elseif type == "Content" then
- if string.find(value,"/asset") then
- local match = string.find(value, "=") + 1
- local id = string.sub(value, match)
- return id
- else
- return tostring(value)
- end
- elseif type == "Vector2" then
- local x = value.x
- local y = value.y
- return string.format("%g, %g", x,y)
- elseif type == "Vector3" then
- local x = value.x
- local y = value.y
- local z = value.z
- return string.format("%g, %g, %g", x,y,z)
- elseif type == "Color3" then
- local r = value.r
- local g = value.g
- local b = value.b
- return string.format("%d, %d, %d", r*255,g*255,b*255)
- elseif type == "UDim2" then
- local xScale = value.X.Scale
- local xOffset = value.X.Offset
- local yScale = value.Y.Scale
- local yOffset = value.Y.Offset
- return string.format("{%d, %d}, {%d, %d}", xScale, xOffset, yScale, yOffset)
- else
- return tostring(value)
- end
- 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 == "Content" then
- if tonumber(value) ~= nil then
- value = ContentUrl .. value
- end
- 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)
- else
- return nil
- end
- end
- -- Tables
- local function CopyTable(T)
- local t2 = {}
- for k,v in pairs(T) do
- t2[k] = v
- end
- return t2
- end
- local function SortTable(T)
- table.sort(T,
- function(x,y) return x.Name < y.Name
- end)
- end
- -- Spritesheet
- local Sprite = {
- Width = 13;
- Height = 13;
- }
- local Spritesheet = {
- Image = "http://www.roblox.com/asset/?id=128896947";
- Height = 256;
- Width = 256;
- }
- local Images = {
- "unchecked",
- "checked",
- "unchecked_over",
- "checked_over",
- "unchecked_disabled",
- "checked_disabled"
- }
- local function SpritePosition(spriteName)
- local x = 0
- local y = 0
- for i,v in pairs(Images) do
- if (v == spriteName) then
- return {x, y}
- end
- x = x + Sprite.Height
- if (x + Sprite.Width) > Spritesheet.Width then
- x = 0
- y = y + Sprite.Height
- end
- end
- end
- local function GetCheckboxImageName(checked, readOnly, mouseover)
- if checked then
- if readOnly then
- return "checked_disabled"
- elseif mouseover then
- return "checked_over"
- else
- return "checked"
- end
- else
- if readOnly then
- return "unchecked_disabled"
- elseif mouseover then
- return "unchecked_over"
- else
- return "unchecked"
- end
- end
- end
- local MAP_ID = 418720155
- -- Gui Controls --
- ---- 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 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)
- 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)
- return IconFrame
- end
- end
- local function CreateCell()
- local tableCell = Instance.new("Frame")
- tableCell.Size = UDim2.new(0.5, -1, 1, 0)
- tableCell.BackgroundColor3 = Row.BackgroundColor
- tableCell.BorderColor3 = Row.BorderColor
- return tableCell
- end
- local function CreateLabel(readOnly)
- local label = Instance.new("TextLabel")
- label.Font = Row.Font
- label.FontSize = Row.FontSize
- label.TextXAlignment = Row.TextXAlignment
- label.BackgroundTransparency = 1
- if readOnly then
- label.TextColor3 = Row.TextLockedColor
- else
- label.TextColor3 = Row.TextColor
- end
- return label
- end
- local function CreateTextButton(readOnly, onClick)
- local button = Instance.new("TextButton")
- button.Font = Row.Font
- button.FontSize = Row.FontSize
- button.TextXAlignment = Row.TextXAlignment
- button.BackgroundTransparency = 1
- if readOnly then
- button.TextColor3 = Row.TextLockedColor
- else
- button.TextColor3 = Row.TextColor
- button.MouseButton1Click:connect(function()
- onClick()
- end)
- end
- return button
- end
- local function CreateObject(readOnly)
- local button = Instance.new("TextButton")
- button.Font = Row.Font
- button.FontSize = Row.FontSize
- button.TextXAlignment = Row.TextXAlignment
- button.BackgroundTransparency = 1
- if readOnly then
- button.TextColor3 = Row.TextLockedColor
- else
- button.TextColor3 = Row.TextColor
- end
- local cancel = Create(Icon('ImageButton',177),{
- Name = "Cancel";
- Visible = false;
- Position = UDim2.new(1,-20,0,0);
- Size = UDim2.new(0,20,0,20);
- Parent = button;
- })
- return button
- end
- local function CreateTextBox(readOnly)
- if readOnly then
- local box = CreateLabel(readOnly)
- return box
- else
- local box = Instance.new("TextBox")
- if not SettingsRemote:Invoke("ClearProps") then
- box.ClearTextOnFocus = false
- end
- box.Font = Row.Font
- box.FontSize = Row.FontSize
- box.TextXAlignment = Row.TextXAlignment
- box.BackgroundTransparency = 1
- box.TextColor3 = Row.TextColor
- return box
- end
- end
- local function CreateDropDownItem(text, onClick)
- 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
- button.MouseEnter:connect(function()
- button.TextColor3 = DropDown.TextColorOver
- button.BackgroundColor3 = DropDown.BackColorOver
- end)
- button.MouseLeave:connect(function()
- button.TextColor3 = DropDown.TextColor
- button.BackgroundColor3 = DropDown.BackColor
- end)
- button.MouseButton1Click:connect(function()
- onClick(text)
- end)
- return button
- end
- local function CreateDropDown(choices, currentChoice, readOnly, onClick)
- local frame = Instance.new("Frame")
- frame.Name = "DropDown"
- frame.Size = UDim2.new(1, 0, 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 showArrow(color)
- if arrow then arrow:Destroy() end
- local graphicTemplate = Create('Frame',{
- Name="Graphic";
- BorderSizePixel = 0;
- BackgroundColor3 = color;
- })
- local graphicSize = 16/2
- arrow = ArrowGraphic(graphicSize,'Down',true,graphicTemplate)
- arrow.Position = UDim2.new(1,-graphicSize * 2,0.5,-graphicSize/2)
- arrow.Parent = frame
- end
- local function hideMenu()
- expanded = false
- showArrow(DropDown.ArrowColor)
- if menu then menu:Destroy() end
- end
- local function showMenu()
- expanded = true
- menu = Instance.new("Frame")
- menu.Size = UDim2.new(1, -2 * margin, 0, #choices * DropDown.Height)
- menu.Position = UDim2.new(0, margin, 0, Row.Height + margin)
- 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 = menu.Parent.Parent.Parent.Parent.Size.Y.Offset
- local rowHeight = menu.Parent.Parent.Parent.Position.Y.Offset
- if (rowHeight + menu.Size.Y.Offset) > math.max(parentFrameHeight,PropertiesFrame.AbsoluteSize.y) 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 = CreateDropDownItem(name, function()
- choice(name)
- end)
- option.Size = UDim2.new(1, 0, 0, 16)
- option.Position = UDim2.new(0, 0, 0, (i - 1) * DropDown.Height)
- option.ZIndex = menu.ZIndex
- option.Parent = menu
- end
- end
- showArrow(DropDown.ArrowColor)
- if not readOnly then
- button.MouseEnter:connect(function()
- button.TextColor3 = Row.TextColor
- showArrow(DropDown.ArrowColorOver)
- end)
- button.MouseLeave:connect(function()
- button.TextColor3 = Row.TextColor
- if not expanded then
- showArrow(DropDown.ArrowColor)
- end
- end)
- button.MouseButton1Click:connect(function()
- if expanded then
- hideMenu()
- else
- showMenu()
- end
- end)
- end
- return frame,button
- end
- local function CreateBrickColor(readOnly, onClick)
- local frame = Instance.new("Frame")
- frame.Size = UDim2.new(1,0,1,0)
- frame.BackgroundTransparency = 1
- local colorPalette = Instance.new("Frame")
- colorPalette.BackgroundTransparency = 0
- colorPalette.SizeConstraint = Enum.SizeConstraint.RelativeXX
- colorPalette.Size = UDim2.new(1, -2 * BrickColors.OuterBorder, 1, -2 * BrickColors.OuterBorder)
- colorPalette.BorderSizePixel = BrickColors.BorderSizePixel
- colorPalette.BorderColor3 = BrickColors.BorderColor
- colorPalette.Position = UDim2.new(0, BrickColors.OuterBorder, 0, BrickColors.OuterBorder + Row.Height)
- colorPalette.ZIndex = 5
- colorPalette.Visible = false
- colorPalette.BorderSizePixel = BrickColors.OuterBorder
- colorPalette.BorderColor3 = BrickColors.OuterBorderColor
- colorPalette.Parent = frame
- local function show()
- colorPalette.Visible = true
- end
- local function hide()
- colorPalette.Visible = false
- end
- local function toggle()
- colorPalette.Visible = not colorPalette.Visible
- end
- local colorBox = Instance.new("TextButton", frame)
- colorBox.Position = UDim2.new(0, Styles.Margin, 0, Styles.Margin)
- colorBox.Size = UDim2.new(0, BrickColors.BoxSize, 0, BrickColors.BoxSize)
- colorBox.Text = ""
- colorBox.MouseButton1Click:connect(function()
- if not readOnly then
- toggle()
- end
- end)
- if readOnly then
- colorBox.AutoButtonColor = false
- end
- local spacingBefore = (Styles.Margin * 2) + BrickColors.BoxSize
- local propertyLabel = CreateTextButton(readOnly, function()
- if not readOnly then
- toggle()
- end
- end)
- propertyLabel.Size = UDim2.new(1, (-1 * spacingBefore) - Styles.Margin, 1, 0)
- propertyLabel.Position = UDim2.new(0, spacingBefore, 0, 0)
- propertyLabel.Parent = frame
- local size = (1 / BrickColors.ColorsPerRow)
- for index = 0, 127 do
- local brickColor = BrickColor.palette(index)
- local color3 = brickColor.Color
- local x = size * (index % BrickColors.ColorsPerRow)
- local y = size * math.floor(index / BrickColors.ColorsPerRow)
- local brickColorBox = Instance.new("TextButton")
- brickColorBox.Text = ""
- brickColorBox.Size = UDim2.new(size,0,size,0)
- brickColorBox.BackgroundColor3 = color3
- brickColorBox.Position = UDim2.new(x, 0, y, 0)
- brickColorBox.ZIndex = colorPalette.ZIndex
- brickColorBox.Parent = colorPalette
- brickColorBox.MouseButton1Click:connect(function()
- hide()
- onClick(brickColor)
- end)
- end
- return frame,propertyLabel,colorBox
- end
- local function CreateColor3Control(readOnly, onClick)
- local frame = Instance.new("Frame")
- frame.Size = UDim2.new(1,0,1,0)
- frame.BackgroundTransparency = 1
- local colorBox = Instance.new("TextButton", frame)
- colorBox.Position = UDim2.new(0, Styles.Margin, 0, Styles.Margin)
- colorBox.Size = UDim2.new(0, BrickColors.BoxSize, 0, BrickColors.BoxSize)
- colorBox.Text = ""
- colorBox.AutoButtonColor = false
- local spacingBefore = (Styles.Margin * 2) + BrickColors.BoxSize
- local box = CreateTextBox(readOnly)
- box.Size = UDim2.new(1, (-1 * spacingBefore) - Styles.Margin, 1, 0)
- box.Position = UDim2.new(0, spacingBefore, 0, 0)
- box.Parent = frame
- return frame,box,colorBox
- end
- function CreateCheckbox(value, readOnly, onClick)
- local checked = value
- local mouseover = false
- local checkboxFrame = Instance.new("ImageButton")
- checkboxFrame.Size = UDim2.new(0, Sprite.Width, 0, Sprite.Height)
- checkboxFrame.BackgroundTransparency = 1
- checkboxFrame.ClipsDescendants = true
- --checkboxFrame.Position = UDim2.new(0, Styles.Margin, 0, Styles.Margin)
- local spritesheetImage = Instance.new("ImageLabel", checkboxFrame)
- spritesheetImage.Name = "SpritesheetImageLabel"
- spritesheetImage.Size = UDim2.new(0, Spritesheet.Width, 0, Spritesheet.Height)
- spritesheetImage.Image = Spritesheet.Image
- spritesheetImage.BackgroundTransparency = 1
- local function updateSprite()
- local spriteName = GetCheckboxImageName(checked, readOnly, mouseover)
- local spritePosition = SpritePosition(spriteName)
- spritesheetImage.Position = UDim2.new(0, -1 * spritePosition[1], 0, -1 * spritePosition[2])
- end
- local function setValue(val)
- checked = val
- updateSprite()
- end
- if not readOnly then
- checkboxFrame.MouseEnter:connect(function() mouseover = true updateSprite() end)
- checkboxFrame.MouseLeave:connect(function() mouseover = false updateSprite() end)
- checkboxFrame.MouseButton1Click:connect(function()
- onClick(checked)
- end)
- end
- updateSprite()
- return checkboxFrame, setValue
- end
- -- Code for handling controls of various data types --
- local Controls = {}
- Controls["default"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local propertyType = propertyData["ValueType"]
- local box = CreateTextBox(readOnly)
- box.Size = UDim2.new(1, -2 * Styles.Margin, 1, 0)
- box.Position = UDim2.new(0, Styles.Margin, 0, 0)
- local function update()
- local value = object[propertyName]
- box.Text = ToString(value, propertyType)
- end
- if not readOnly then
- box.FocusLost:connect(function(enterPressed)
- Set(object, propertyData, ToValue(box.Text,propertyType))
- update()
- end)
- end
- update()
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- return box
- end
- Controls["bool"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local checked = object[propertyName]
- local checkbox, setValue = CreateCheckbox(checked, readOnly, function(value)
- Set(object, propertyData, not checked)
- end)
- checkbox.Position = UDim2.new(0, Styles.Margin, 0, Styles.Margin)
- setValue(checked)
- local function update()
- checked = object[propertyName]
- setValue(checked)
- end
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- if object:IsA("BoolValue") then
- object.Changed:connect(function(val)
- update()
- end)
- end
- update()
- return checkbox
- end
- Controls["BrickColor"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local frame,label,brickColorBox = CreateBrickColor(readOnly, function(brickColor)
- Set(object, propertyData, brickColor)
- end)
- local function update()
- local value = object[propertyName]
- brickColorBox.BackgroundColor3 = value.Color
- label.Text = tostring(value)
- end
- update()
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- return frame
- end
- Controls["Color3"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local frame,textBox,colorBox = CreateColor3Control(readOnly)
- textBox.FocusLost:connect(function(enterPressed)
- Set(object, propertyData, ToValue(textBox.Text,"Color3"))
- local value = object[propertyName]
- colorBox.BackgroundColor3 = value
- textBox.Text = ToString(value, "Color3")
- end)
- local function update()
- local value = object[propertyName]
- colorBox.BackgroundColor3 = value
- textBox.Text = ToString(value, "Color3")
- end
- update()
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- return frame
- end
- Controls["Enum"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local propertyType = propertyData["ValueType"]
- local enumName = object[propertyName].Name
- local enumNames = {}
- for _,enum in pairs(Enum[tostring(propertyType)]:GetEnumItems()) do
- table.insert(enumNames, enum.Name)
- end
- local dropdown, propertyLabel = CreateDropDown(enumNames, enumName, readOnly, function(value)
- Set(object, propertyData, value)
- end)
- --dropdown.Parent = frame
- local function update()
- local value = object[propertyName].Name
- propertyLabel.Text = tostring(value)
- end
- update()
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- return dropdown
- end
- Controls["Object"] = function(object, propertyData, readOnly)
- local propertyName = propertyData["Name"]
- local propertyType = propertyData["ValueType"]
- local box = CreateObject(readOnly,function()end)
- box.Size = UDim2.new(1, -2 * Styles.Margin, 1, 0)
- box.Position = UDim2.new(0, Styles.Margin, 0, 0)
- local function update()
- if AwaitingObjectObj == object then
- if AwaitingObjectValue == true then
- box.Text = "Select an Object"
- return
- end
- end
- local value = object[propertyName]
- box.Text = ToString(value, propertyType)
- end
- if not readOnly then
- box.MouseButton1Click:connect(function()
- if AwaitingObjectValue then
- AwaitingObjectValue = false
- update()
- return
- end
- AwaitingObjectValue = true
- AwaitingObjectObj = object
- AwaitingObjectProp = propertyData
- box.Text = "Select an Object"
- end)
- box.Cancel.Visible = true
- box.Cancel.MouseButton1Click:connect(function()
- object[propertyName] = nil
- end)
- end
- update()
- object.Changed:connect(function(property)
- if (property == propertyName) then
- update()
- end
- end)
- if object:IsA("ObjectValue") then
- object.Changed:connect(function(val)
- update()
- end)
- end
- return box
- end
- function GetControl(object, propertyData, readOnly)
- local propertyType = propertyData["ValueType"]
- local control = nil
- if Controls[propertyType] then
- control = Controls[propertyType](object, propertyData, readOnly)
- elseif RbxApi.IsEnum(propertyType) then
- control = Controls["Enum"](object, propertyData, readOnly)
- else
- control = Controls["default"](object, propertyData, readOnly)
- end
- return control
- end
- -- Permissions
- function CanEditObject(object)
- local player = Players.LocalPlayer
- local character = player.Character
- return Permissions.CanEdit
- end
- function CanEditProperty(object,propertyData)
- local tags = propertyData["tags"]
- for _,name in pairs(tags) do
- if name == "readonly" then
- return false
- end
- end
- return CanEditObject(object)
- end
- --RbxApi
- local function PropertyIsHidden(propertyData)
- local tags = propertyData["tags"]
- for _,name in pairs(tags) do
- if name == "deprecated"
- or name == "hidden"
- or name == "writeonly" then
- return true
- end
- end
- return false
- end
- function Set(object, propertyData, value)
- local propertyName = propertyData["Name"]
- local propertyType = propertyData["ValueType"]
- if value == nil then return end
- for i,v in pairs(GetSelection()) do
- if CanEditProperty(v,propertyData) then
- pcall(function()
- --print("Setting " .. propertyName .. " to " .. tostring(value))
- v[propertyName] = value
- end)
- end
- end
- end
- function CreateRow(object, propertyData, isAlternateRow)
- local propertyName = propertyData["Name"]
- local propertyType = propertyData["ValueType"]
- local propertyValue = object[propertyName]
- --rowValue, rowValueType, isAlternate
- local backColor = Row.BackgroundColor;
- if (isAlternateRow) then
- backColor = Row.BackgroundColorAlternate
- end
- local readOnly = not CanEditProperty(object, propertyData)
- if propertyType == "Instance" or propertyName == "Parent" then readOnly = true end
- local rowFrame = Instance.new("Frame")
- rowFrame.Size = UDim2.new(1,0,0,Row.Height)
- rowFrame.BackgroundTransparency = 1
- rowFrame.Name = 'Row'
- local propertyLabelFrame = CreateCell()
- propertyLabelFrame.Parent = rowFrame
- propertyLabelFrame.ClipsDescendants = true
- local propertyLabel = CreateLabel(readOnly)
- propertyLabel.Text = propertyName
- propertyLabel.Size = UDim2.new(1, -1 * Row.TitleMarginLeft, 1, 0)
- propertyLabel.Position = UDim2.new(0, Row.TitleMarginLeft, 0, 0)
- propertyLabel.Parent = propertyLabelFrame
- local propertyValueFrame = CreateCell()
- propertyValueFrame.Size = UDim2.new(0.5, -1, 1, 0)
- propertyValueFrame.Position = UDim2.new(0.5, 0, 0, 0)
- propertyValueFrame.Parent = rowFrame
- local control = GetControl(object, propertyData, readOnly)
- control.Parent = propertyValueFrame
- rowFrame.MouseEnter:connect(function()
- propertyLabelFrame.BackgroundColor3 = Row.BackgroundColorMouseover
- propertyValueFrame.BackgroundColor3 = Row.BackgroundColorMouseover
- end)
- rowFrame.MouseLeave:connect(function()
- propertyLabelFrame.BackgroundColor3 = backColor
- propertyValueFrame.BackgroundColor3 = backColor
- end)
- propertyLabelFrame.BackgroundColor3 = backColor
- propertyValueFrame.BackgroundColor3 = backColor
- return rowFrame
- end
- function ClearPropertiesList()
- for _,instance in pairs(ContentFrame:GetChildren()) do
- instance:Destroy()
- end
- end
- local selection = Gui:FindFirstChild("Selection", 1)
- print(selection)
- function displayProperties(props)
- for i,v in pairs(props) do
- pcall(function()
- local a = CreateRow(v.object, v.propertyData, ((numRows % 2) == 0))
- a.Position = UDim2.new(0,0,0,numRows*Row.Height)
- a.Parent = ContentFrame
- numRows = numRows + 1
- end)
- end
- end
- function checkForDupe(prop,props)
- for i,v in pairs(props) do
- if v.propertyData.Name == prop.Name and v.propertyData.ValueType == prop.ValueType then
- return true
- end
- end
- return false
- end
- function sortProps(t)
- table.sort(t,
- function(x,y) return x.propertyData.Name < y.propertyData.Name
- end)
- end
- function showProperties(obj)
- ClearPropertiesList()
- if obj == nil then return end
- local propHolder = {}
- local foundProps = {}
- numRows = 0
- for _,nextObj in pairs(obj) do
- if not foundProps[nextObj.className] then
- foundProps[nextObj.className] = true
- for i,v in pairs(RbxApi.GetProperties(nextObj.className)) do
- local suc, err = pcall(function()
- if not (PropertyIsHidden(v)) and not checkForDupe(v,propHolder) then
- if string.find(string.lower(v.Name),string.lower(propertiesSearch.Text)) or not searchingProperties() then
- table.insert(propHolder,{propertyData = v, object = nextObj})
- end
- end
- end)
- --[[if not suc then
- warn("Problem getting the value of property " .. v.Name .. " | " .. err)
- end --]]
- end
- end
- end
- sortProps(propHolder)
- displayProperties(propHolder)
- ContentFrame.Size = UDim2.new(1, 0, 0, numRows * Row.Height)
- scrollBar.ScrollIndex = 0
- scrollBar.TotalSpace = numRows * Row.Height
- scrollBar.Update()
- end
- ----------------------------------------------------------------
- -----------------------SCROLLBAR STUFF--------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- local ScrollBarWidth = 16
- local ScrollStyles = {
- Background = Color3.new(233/255, 233/255, 233/255);
- Border = Color3.new(149/255, 149/255, 149/255);
- Selected = Color3.new( 63/255, 119/255, 189/255);
- BorderSelected = Color3.new( 55/255, 106/255, 167/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);
- }
- do
- local ZIndexLock = {}
- 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
- end
- function SetZIndexOnChanged(object)
- return object.Changed:connect(function(p)
- if p == "ZIndex" then
- SetZIndex(object,object.ZIndex)
- end
- end)
- end
- 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
- -- 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
- -- AutoButtonColor doesn't always reset properly
- function ResetButtonColor(button)
- local active = button.Active
- button.Active = not active
- button.Active = active
- end
- 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
- 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
- return Frame
- end
- 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
- do
- 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";
- Position = horizontal and UDim2.new(0,0,1,-ScrollBarWidth) or UDim2.new(1,-ScrollBarWidth,0,0);
- Size = horizontal and UDim2.new(1,0,0,ScrollBarWidth) or UDim2.new(0,ScrollBarWidth,1,0);
- BackgroundTransparency = 1;
- Create('ImageButton',{
- Name = "ScrollDown";
- Position = horizontal and UDim2.new(1,-ScrollBarWidth,0,0) or UDim2.new(0,0,1,-ScrollBarWidth);
- Size = UDim2.new(0, ScrollBarWidth, 0, ScrollBarWidth);
- BackgroundColor3 = ScrollStyles.Button;
- BorderColor3 = ScrollStyles.Border;
- --BorderSizePixel = 0;
- });
- Create('ImageButton',{
- Name = "ScrollUp";
- Size = UDim2.new(0, ScrollBarWidth, 0, ScrollBarWidth);
- BackgroundColor3 = ScrollStyles.Button;
- BorderColor3 = ScrollStyles.Border;
- --BorderSizePixel = 0;
- });
- Create('ImageButton',{
- Name = "ScrollBar";
- Size = horizontal and UDim2.new(1,-ScrollBarWidth*2,1,0) or UDim2.new(1,0,1,-ScrollBarWidth*2);
- Position = horizontal and UDim2.new(0,ScrollBarWidth,0,0) or UDim2.new(0,0,0,ScrollBarWidth);
- AutoButtonColor = false;
- BackgroundColor3 = Color3.new(0.94902, 0.94902, 0.94902);
- BorderColor3 = ScrollStyles.Border;
- --BorderSizePixel = 0;
- Create('ImageButton',{
- Name = "ScrollThumb";
- AutoButtonColor = false;
- Size = UDim2.new(0, ScrollBarWidth, 0, ScrollBarWidth);
- BackgroundColor3 = ScrollStyles.Button;
- BorderColor3 = ScrollStyles.Border;
- --BorderSizePixel = 0;
- });
- });
- })
- local graphicTemplate = Create('Frame',{
- Name="Graphic";
- BorderSizePixel = 0;
- BackgroundColor3 = ScrollStyles.Border;
- })
- local graphicSize = ScrollBarWidth/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 = ScrollBarWidth*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 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 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,ScrollBarWidth)
- if ScrollThumbFrame.AbsoluteSize.x < ScrollBarWidth then
- ScrollThumbFrame.Size = UDim2.new(0,ScrollBarWidth,0,ScrollBarWidth)
- 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,ScrollBarWidth,Class.VisibleSpace/Class.TotalSpace,0)
- if ScrollThumbFrame.AbsoluteSize.y < ScrollBarWidth then
- ScrollThumbFrame.Size = UDim2.new(0,ScrollBarWidth,0,ScrollBarWidth)
- 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=ScrollStyles.Border,BackgroundTransparency=0}
- local scrollStyle_ds = {BackgroundColor3=ScrollStyles.Border,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 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
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- local MainFrame = Instance.new("Frame")
- MainFrame.Name = "MainFrame"
- MainFrame.Size = UDim2.new(1, -1 * ScrollBarWidth, 1, 0)
- MainFrame.Position = UDim2.new(0, 0, 0, 0)
- MainFrame.BackgroundTransparency = 1
- MainFrame.ClipsDescendants = true
- MainFrame.Parent = PropertiesFrame
- ContentFrame = Instance.new("Frame")
- ContentFrame.Name = "ContentFrame"
- ContentFrame.Size = UDim2.new(1, 0, 0, 0)
- ContentFrame.BackgroundTransparency = 1
- ContentFrame.Parent = MainFrame
- scrollBar = ScrollBar(false)
- scrollBar.PageIncrement = 1
- Create(scrollBar.GUI,{
- Position = UDim2.new(1,-ScrollBarWidth,0,0);
- Size = UDim2.new(0,ScrollBarWidth,1,0);
- Parent = PropertiesFrame;
- })
- scrollBarH = ScrollBar(true)
- scrollBarH.PageIncrement = ScrollBarWidth
- Create(scrollBarH.GUI,{
- Position = UDim2.new(0,0,1,-ScrollBarWidth);
- Size = UDim2.new(1,-ScrollBarWidth,0,ScrollBarWidth);
- Visible = false;
- Parent = PropertiesFrame;
- })
- do
- local listEntries = {}
- local nameConnLookup = {}
- function scrollBar.UpdateCallback(self)
- scrollBar.TotalSpace = ContentFrame.AbsoluteSize.Y
- scrollBar.VisibleSpace = MainFrame.AbsoluteSize.Y
- ContentFrame.Position = UDim2.new(ContentFrame.Position.X.Scale,ContentFrame.Position.X.Offset,0,-1*scrollBar.ScrollIndex)
- end
- function scrollBarH.UpdateCallback(self)
- end
- MainFrame.Changed:connect(function(p)
- if p == 'AbsoluteSize' then
- scrollBarH.VisibleSpace = math.ceil(MainFrame.AbsoluteSize.x)
- scrollBarH:Update()
- scrollBar.VisibleSpace = math.ceil(MainFrame.AbsoluteSize.y)
- scrollBar:Update()
- end
- end)
- local wheelAmount = Row.Height
- PropertiesFrame.MouseWheelForward:connect(function()
- if scrollBar.VisibleSpace - 1 > wheelAmount then
- scrollBar:ScrollTo(scrollBar.ScrollIndex - wheelAmount)
- else
- scrollBar:ScrollTo(scrollBar.ScrollIndex - scrollBar.VisibleSpace)
- end
- end)
- PropertiesFrame.MouseWheelBackward:connect(function()
- if scrollBar.VisibleSpace - 1 > wheelAmount then
- scrollBar:ScrollTo(scrollBar.ScrollIndex + wheelAmount)
- else
- scrollBar:ScrollTo(scrollBar.ScrollIndex + scrollBar.VisibleSpace)
- end
- end)
- end
- scrollBar.VisibleSpace = math.ceil(MainFrame.AbsoluteSize.y)
- scrollBar:Update()
- showProperties(GetSelection())
- bindSelectionChanged.Event:connect(function()
- showProperties(GetSelection())
- end)
- bindSetAwait.Event:connect(function(obj)
- if AwaitingObjectValue then
- AwaitingObjectValue = false
- local mySel = obj
- if mySel then
- pcall(function()
- Set(AwaitingObjectObj, AwaitingObjectProp, mySel)
- end)
- end
- end
- end)
- propertiesSearch.Changed:connect(function(prop)
- if prop == "Text" then
- showProperties(GetSelection())
- end
- end)
- bindGetApi.OnInvoke = function()
- return RbxApi
- end
- bindGetAwait.OnInvoke = function()
- return AwaitingObjectValue
- end
- end
- coroutine.resume(coroutine.create(SCRIPT_SOUD85_FAKESCRIPT))
- function SCRIPT_RHNM65_FAKESCRIPT() -- ExplorerPanel.LocalScript
- local script = Instance.new('LocalScript')
- script.Parent = ExplorerPanel
- -- initial states
- local Option = {
- -- can modify object parents in the hierarchy
- Modifiable = false;
- -- can select objects
- Selectable = true;
- }
- -- 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 Input = game:GetService("UserInputService")
- local HoldingCtrl = false
- local HoldingShift = false
- --[[
- # 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.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 = 418720155
- -- 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 NODE_COLLAPSED = 165
- local NODE_EXPANDED = 166
- local NODE_COLLAPSED_OVER = 179
- local NODE_EXPANDED_OVER = 180
- 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;
- ["ServerStorage"] = 74;
- ["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 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)
- 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)
- 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
- 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
- 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";
- 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(0.94902, 0.94902, 0.94902);
- 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=GuiColor.Border,BackgroundTransparency=0}
- local scrollStyle_ds = {BackgroundColor3=GuiColor.Border,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
- local explorerPanel = script.Parent
- 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 CurrentSaveInstanceWindow
- local CurrentRemoteWindow
- local lastSelectedNode
- local listFrame = Create('Frame',{
- Name = "List";
- 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";
- 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);
- White = CreateColor3(255,255,255);
- }
- local DropDown = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextColor = CreateColor3(0,0,0);
- TextColorOver = Styles.White;
- TextXAlignment = Enum.TextXAlignment.Left;
- Height = 20;
- BackColor = Styles.White;
- BackColorOver = CreateColor3(86,125,188);
- BorderColor = CreateColor3(216,216,216);
- BorderSizePixel = 2;
- ArrowColor = CreateColor3(160,160,160);
- ArrowColorOver = Styles.Black;
- }
- local Row = {
- Font = Styles.Font;
- FontSize = Enum.FontSize.Size14;
- TextXAlignment = Enum.TextXAlignment.Left;
- TextColor = Styles.Black;
- TextColorOver = Styles.White;
- TextLockedColor = CreateColor3(120,120,120);
- Height = 24;
- BorderColor = CreateColor3(216,216,216);
- BackgroundColor = Styles.White;
- BackgroundColorAlternate = CreateColor3(246,246,246);
- BackgroundColorMouseover = CreateColor3(211,224,244);
- TitleMarginLeft = 15;
- }
- 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.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.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()
- if CurrentFunctionCallerWindow then
- CurrentFunctionCallerWindow:Destroy()
- CurrentFunctionCallerWindow = nil
- end
- CurrentFunctionCallerWindow = CreateFunctionCallerMenu(
- GetFunctions(),
- "",
- false,
- function(option)
- CurrentFunctionCallerWindow:Destroy()
- CurrentFunctionCallerWindow = nil
- local list = SelectionVar():Get()
- for i = 1,#list do
- pcall(function() Instance.new(option,list[i]) end)
- end
- print(option.Name .. " selected to be called. Function caller being added soon, please wait!")
- --CallFunction()
- 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
- 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)
- 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 = "\t\t"..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.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.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
- 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
- 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])
- rawUpdateSize()
- 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 then return end
- updatingList = true
- wait(0.25)
- updatingList = false
- rawUpdateList()
- end
- local updatingScroll = false
- function updateScroll()
- if updatingScroll then return end
- updatingScroll = true
- wait(0.25)
- 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()
- end
- end
- function Selection:Add(object)
- local l,s = addObject(object)
- if l then
- rawUpdateList()
- if Updates then
- bindSelectionChanged:Fire()
- end
- elseif s then
- scrollBar:Update()
- if Updates then
- bindSelectionChanged:Fire()
- end
- end
- end
- function Selection:StopUpdates()
- Updates = false
- end
- function Selection:ResumeUpdates()
- Updates = true
- bindSelectionChanged:Fire()
- 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()
- 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:Clone()
- newCaution.Title.Text = title
- newCaution.MainWindow.Desc.Text = msg
- newCaution.Parent = explorerPanel.Parent
- newCaution.Visible = true
- newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
- newCaution:Destroy()
- 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
- 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
- function rightClickMenu(sObj)
- local mouse = game.Players.LocalPlayer:GetMouse()
- currentRightClickMenu = CreateRightClickMenu(
- {"Cut","Copy","Paste Into","Duplicate","Delete","Group","Ungroup","Select Children","Teleport To","Insert Part","Insert Object","Save Instance","Call Function","Call Remote"},
- "",
- 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
- 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
- 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.Players.LocalPlayer.Character.HumanoidRootPart.CFrame = list[i].CFrame
- 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.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 == "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
- 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
- -- 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)
- -- 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
- -- 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)
- 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
- do
- NodeLookup[workspace.Parent] = {
- Object = workspace.Parent;
- Parent = nil;
- Index = 0;
- Expanded = true;
- }
- Connect(game.DescendantAdded,addObject)
- Connect(game.DescendantRemoving,removeObject)
- local function get(o)
- return o:GetChildren()
- end
- local function r(o)
- local s,children = pcall(get,o)
- if s then
- for i = 1,#children do
- addObject(children[i],true)
- r(children[i])
- end
- end
- end
- r(workspace.Parent)
- scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
- updateList()
- end
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ----------------------------------------------------------------
- ---- Actions
- local actionButtons do
- actionButtons = {}
- local totalActions = (4) + 1
- local currentActions = totalActions
- local function makeButton(icon,over,name)
- 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.5,-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()
- Icon(button,over)
- tipText.Visible = true
- end)
- button.MouseLeave:connect(function()
- Icon(button,icon)
- tipText.Visible = false
- end)
- currentActions = currentActions - 1
- actionButtons[#actionButtons+1] = button
- return button
- end
- local clipboard = {}
- local function delete(o)
- o.Parent = nil
- end
- --[[
- -- CUT
- makeButton(ACTION_CUT,ACTION_CUT_OVER,"Cut").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
- end)
- -- COPY
- makeButton(ACTION_COPY,ACTION_COPY_OVER,"Copy").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
- end)
- -- PASTE
- makeButton(ACTION_PASTE,ACTION_PASTE_OVER,"Paste").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)
- -- DELETE
- makeButton(ACTION_DELETE,ACTION_DELETE_OVER,"Delete").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)
- ]]--
- -- 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].Visible = value and Option.Selectable
- end
- cancelReparentDrag()
- end;
- Selectable = function(value)
- for i = 1,#actionButtons do
- actionButtons[i].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)
- 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
- )
- end
- coroutine.resume(coroutine.create(SCRIPT_RHNM65_FAKESCRIPT))
- function SCRIPT_LPJZ85_FAKESCRIPT() -- Dex.Selection
- local script = Instance.new('LocalScript')
- script.Parent = Dex
- local Gui = script.Parent
- local SideMenu = Gui:WaitForChild("SideMenu")
- local OpenToggleButton = Gui:WaitForChild("Toggle")
- local CloseToggleButton = SideMenu:WaitForChild("Toggle")
- local ExplorerButton = SideMenu:WaitForChild("Explorer")
- local SettingsButton = SideMenu:WaitForChild("Settings")
- local SelectionBox = Instance.new("SelectionBox")
- SelectionBox.Parent = Gui
- local ExplorerPanel = Gui:WaitForChild("ExplorerPanel")
- local PropertiesFrame = Gui:WaitForChild("PropertiesFrame")
- local SettingsPanel = Gui:WaitForChild("SettingsPanel")
- local SettingsListener = SettingsPanel:WaitForChild("GetSetting")
- local ClickSelectOption = SettingsPanel:WaitForChild("ClickSelect"):WaitForChild("Change")
- local SelectionBoxOption = SettingsPanel:WaitForChild("SelectionBox"):WaitForChild("Change")
- local ClearPropsOption = SettingsPanel:WaitForChild("ClearProperties"):WaitForChild("Change")
- local SelectUngroupedOption = SettingsPanel:WaitForChild("SelectUngrouped"):WaitForChild("Change")
- local SelectionChanged = ExplorerPanel:WaitForChild("SelectionChanged")
- local GetSelection = ExplorerPanel:WaitForChild("GetSelection")
- local SetSelection = ExplorerPanel:WaitForChild("SetSelection")
- local Player = game:GetService("Players").LocalPlayer
- local Mouse = Player:GetMouse()
- local CurrentWindow = "Explorer"
- local Settings = {
- ClickSelect = false,
- SelBox = false,
- ClearProps = false,
- SelectUngrouped = true
- }
- function ReturnSetting(set)
- if set == "ClearProps" then
- return Settings.ClearProps
- elseif set == "SelectUngrouped" then
- return Settings.SelectUngrouped
- end
- end
- OpenToggleButton.MouseButton1Up:connect(function()
- SideMenu:TweenPosition(UDim2.new(1, -330, 0, 0), "Out", "Quad", 0.5, true)
- if CurrentWindow == "Explorer" then
- ExplorerPanel:TweenPosition(UDim2.new(1, -300, 0, 0), "Out", "Quad", 0.5, true)
- PropertiesFrame:TweenPosition(UDim2.new(1, -300, 0.5, 21), "Out", "Quad", 0.5, true)
- else
- SettingsPanel:TweenPosition(UDim2.new(1, -300, 0, 0), "Out", "Quad", 0.5, true)
- end
- OpenToggleButton:TweenPosition(UDim2.new(1,0,0,0), "Out", "Quad", 0.5, true)
- end)
- CloseToggleButton.MouseButton1Up:connect(function()
- SideMenu:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Quad", 0.5, true)
- ExplorerPanel:TweenPosition(UDim2.new(1, 30, 0, 0), "Out", "Quad", 0.5, true)
- PropertiesFrame:TweenPosition(UDim2.new(1, 30, 0.5, 21), "Out", "Quad", 0.5, true)
- SettingsPanel:TweenPosition(UDim2.new(1, 30, 0, 0), "Out", "Quad", 0.5, true)
- OpenToggleButton:TweenPosition(UDim2.new(1,-30,0,0), "Out", "Quad", 0.5, true)
- end)
- ExplorerButton.MouseButton1Up:connect(function()
- if CurrentWindow ~= "Explorer" then
- CurrentWindow = "Explorer"
- ExplorerPanel:TweenPosition(UDim2.new(1, -300, 0, 0), "Out", "Quad", 0.5, true)
- PropertiesFrame:TweenPosition(UDim2.new(1, -300, 0.5, 21), "Out", "Quad", 0.5, true)
- SettingsPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Quad", 0.5, true)
- end
- end)
- SettingsButton.MouseButton1Up:connect(function()
- if CurrentWindow ~= "Settings" then
- CurrentWindow = "Settings"
- ExplorerPanel:TweenPosition(UDim2.new(1, 0, 0, 0), "Out", "Quad", 0.5, true)
- PropertiesFrame:TweenPosition(UDim2.new(1, 0, 0.5, 21), "Out", "Quad", 0.5, true)
- SettingsPanel:TweenPosition(UDim2.new(1, -300, 0, 0), "Out", "Quad", 0.5, true)
- end
- end)
- ClickSelectOption.MouseButton1Up:connect(function()
- if Settings.ClickSelect then
- Settings.ClickSelect = false
- ClickSelectOption.Text = "OFF"
- else
- Settings.ClickSelect = true
- ClickSelectOption.Text = "ON"
- end
- end)
- SelectionBoxOption.MouseButton1Up:connect(function()
- if Settings.SelBox then
- Settings.SelBox = false
- SelectionBox.Adornee = nil
- SelectionBoxOption.Text = "OFF"
- else
- Settings.SelBox = true
- SelectionBoxOption.Text = "ON"
- end
- end)
- ClearPropsOption.MouseButton1Up:connect(function()
- if Settings.ClearProps then
- Settings.ClearProps = false
- ClearPropsOption.Text = "OFF"
- else
- Settings.ClearProps = true
- ClearPropsOption.Text = "ON"
- end
- end)
- SelectUngroupedOption.MouseButton1Up:connect(function()
- if Settings.SelectUngrouped then
- Settings.SelectUngrouped = false
- SelectUngroupedOption.Text = "OFF"
- else
- Settings.SelectUngrouped = true
- SelectUngroupedOption.Text = "ON"
- end
- end)
- local function getSelection()
- local t = GetSelection:Invoke()
- if t and #t > 0 then
- return t[1]
- else
- return nil
- end
- end
- Mouse.Button1Down:connect(function()
- if CurrentWindow == "Explorer" and Settings.ClickSelect then
- local target = Mouse.Target
- if target then
- SetSelection:Invoke({target})
- end
- end
- end)
- SelectionChanged.Event:connect(function()
- if Settings.SelBox then
- local success,err = pcall(function()
- local selection = getSelection()
- SelectionBox.Adornee = selection
- end)
- if err then
- SelectionBox.Adornee = nil
- end
- end
- end)
- SettingsListener.OnInvoke = ReturnSetting
- end
- coroutine.resume(coroutine.create(SCRIPT_LPJZ85_FAKESCRIPT))
Add Comment
Please, Sign In to add comment