-- Simple LocalScript for Roblox Studio. -- Place this in StarterPlayer > StarterPlayerScripts. -- Polished, draggable GUI that RECURSIVELY searches ALL remotes (RemoteEvent/RemoteFunction) -- in ReplicatedStorage (including inside folders like "Remotes"). -- Each button fires/invokes the remote with args: [remoteName, 42, true]. local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Create ScreenGui local screenGui = Instance.new("ScreenGui") screenGui.Name = "RemoteFirer" screenGui.Parent = playerGui -- Main Frame (window-like, draggable with Active=true) local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.Size = UDim2.new(0, 320, 0, 420) mainFrame.Position = UDim2.new(0, 10, 0, 10) mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 35) mainFrame.BorderSizePixel = 0 mainFrame.Active = true -- Enables input handling for dragging mainFrame.Draggable = true -- Built-in dragging enabled! mainFrame.Parent = screenGui -- Rounded corners for mainFrame local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 12) mainCorner.Parent = mainFrame -- Title Bar local titleBar = Instance.new("Frame") titleBar.Name = "TitleBar" titleBar.Size = UDim2.new(1, 0, 0, 40) titleBar.Position = UDim2.new(0, 0, 0, 0) titleBar.BackgroundColor3 = Color3.fromRGB(45, 45, 50) titleBar.BorderSizePixel = 0 titleBar.Parent = mainFrame -- Rounded top corners for titleBar local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 12) titleCorner.Parent = titleBar -- Title Text local titleLabel = Instance.new("TextLabel") titleLabel.Name = "TitleLabel" titleLabel.Size = UDim2.new(1, -60, 1, 0) titleLabel.Position = UDim2.new(0, 10, 0, 0) titleLabel.BackgroundTransparency = 1 titleLabel.Text = "Remote Firer" titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255) titleLabel.TextScaled = true titleLabel.Font = Enum.Font.GothamBold titleLabel.Active = false -- Ensures input passes to titleBar/mainFrame for dragging titleLabel.Parent = titleBar -- Refresh Button in title bar local refreshButton = Instance.new("TextButton") refreshButton.Name = "RefreshButton" refreshButton.Size = UDim2.new(0, 40, 0, 30) refreshButton.Position = UDim2.new(1, -50, 0, 5) refreshButton.BackgroundColor3 = Color3.fromRGB(70, 70, 75) refreshButton.BorderSizePixel = 0 refreshButton.Text = "⟳" refreshButton.TextColor3 = Color3.fromRGB(255, 255, 255) refreshButton.TextScaled = true refreshButton.Font = Enum.Font.GothamBold refreshButton.Active = true refreshButton.Parent = titleBar local refreshCorner = Instance.new("UICorner") refreshCorner.CornerRadius = UDim.new(0, 6) refreshCorner.Parent = refreshButton -- Gradient for titleBar local titleGradient = Instance.new("UIGradient") titleGradient.Color = ColorSequence.new{ ColorSequenceKeypoint.new(0, Color3.fromRGB(60, 60, 65)), ColorSequenceKeypoint.new(1, Color3.fromRGB(45, 45, 50)) } titleGradient.Rotation = 90 titleGradient.Parent = titleBar -- ScrollingFrame for content local scrollingFrame = Instance.new("ScrollingFrame") scrollingFrame.Name = "ScrollingFrame" scrollingFrame.Size = UDim2.new(1, -10, 1, -50) scrollingFrame.Position = UDim2.new(0, 5, 0, 45) scrollingFrame.BackgroundTransparency = 1 scrollingFrame.BorderSizePixel = 0 scrollingFrame.ScrollBarThickness = 6 scrollingFrame.ScrollBarImageColor3 = Color3.fromRGB(100, 100, 105) scrollingFrame.Active = false -- Prevents interfering with mainFrame dragging scrollingFrame.Parent = mainFrame -- UIListLayout for buttons local listLayout = Instance.new("UIListLayout") listLayout.SortOrder = Enum.SortOrder.Name listLayout.Padding = UDim.new(0, 5) listLayout.Parent = scrollingFrame -- Table to hold remote buttons for refresh local remoteButtons = {} -- Function to populate buttons (recursive search) local function populateRemotes() -- Clear existing buttons for _, button in ipairs(remoteButtons) do button:Destroy() end remoteButtons = {} -- Find ALL remotes recursively local remotes = {} for _, obj in ipairs(ReplicatedStorage:GetDescendants()) do if obj:IsA("RemoteEvent") or obj:IsA("RemoteFunction") then table.insert(remotes, obj) end end -- Create buttons for each for _, remote in ipairs(remotes) do local button = createButton(remote) table.insert(remoteButtons, button) button.MouseButton1Click:Connect(function() local clickTween = TweenService:Create(button, TweenInfo.new(0.1, Enum.EasingStyle.Quad), {Size = UDim2.new(1, 0, 0, 32)}) clickTween:Play() clickTween.Completed:Connect(function() TweenService:Create(button, TweenInfo.new(0.1, Enum.EasingStyle.Quad), {Size = UDim2.new(1, 0, 0, 35)}):Play() end) fireRemote(remote) end) end print("Found and listed " .. #remotes .. " remotes recursively in ReplicatedStorage!") end -- Function to create a button with polish function createButton(remote) local button = Instance.new("TextButton") button.Name = remote.Name .. "_" .. remote:GetFullName() -- Unique name with path to avoid duplicates button.Size = UDim2.new(1, 0, 0, 35) button.BackgroundColor3 = Color3.fromRGB(50, 50, 55) button.BorderSizePixel = 0 local displayText = remote.Name .. " (" .. remote.ClassName .. ")" if remote.Parent ~= ReplicatedStorage then displayText = displayText .. " [" .. remote.Parent.Name .. "]" end button.Text = displayText button.TextColor3 = Color3.fromRGB(255, 255, 255) button.TextScaled = true button.Font = Enum.Font.Gotham button.Active = true -- Ensures buttons handle clicks button.Parent = scrollingFrame -- Rounded corners local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 8) buttonCorner.Parent = button -- Gradient local buttonGradient = Instance.new("UIGradient") buttonGradient.Color = ColorSequence.new{ ColorSequenceKeypoint.new(0, Color3.fromRGB(60, 60, 65)), ColorSequenceKeypoint.new(1, Color3.fromRGB(50, 50, 55)) } buttonGradient.Rotation = 90 buttonGradient.Parent = button -- Hover effects local hoverTweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) local hoverColor = Color3.fromRGB(70, 70, 75) local normalColor = Color3.fromRGB(50, 50, 55) button.MouseEnter:Connect(function() TweenService:Create(button, hoverTweenInfo, {BackgroundColor3 = hoverColor}):Play() end) button.MouseLeave:Connect(function() TweenService:Create(button, hoverTweenInfo, {BackgroundColor3 = normalColor}):Play() end) return button end -- Function to fire/invoke a remote function fireRemote(remote) local args = {remote.Name, 42, true} if remote:IsA("RemoteEvent") then remote:FireServer(unpack(args)) print("Fired RemoteEvent: " .. remote:GetFullName() .. " with args: " .. table.concat(args, ", ")) elseif remote:IsA("RemoteFunction") then local success, result = pcall(function() return remote:InvokeServer(unpack(args)) end) if success then print("Invoked RemoteFunction: " .. remote:GetFullName() .. " with args: " .. table.concat(args, ", ") .. " | Result: " .. tostring(result)) else warn("Failed to invoke RemoteFunction: " .. remote:GetFullName() .. " | Error: " .. tostring(result)) end end end -- Refresh button functionality local refreshHoverTweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) refreshButton.MouseEnter:Connect(function() TweenService:Create(refreshButton, refreshHoverTweenInfo, {BackgroundColor3 = Color3.fromRGB(90, 90, 95)}):Play() end) refreshButton.MouseLeave:Connect(function() TweenService:Create(refreshButton, refreshHoverTweenInfo, {BackgroundColor3 = Color3.fromRGB(70, 70, 75)}):Play() end) refreshButton.MouseButton1Click:Connect(function() populateRemotes() end) -- Initial population populateRemotes() -- Update canvas size local function updateCanvas() scrollingFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 10) end updateCanvas() listLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(updateCanvas) print("Recursive remote firer GUI loaded! Drag with Active/Draggable. Use ⟳ to refresh. Found remotes in ReplicatedStorage (all folders).")