Simple Fire Remote
Key RequiredUniversal

Simple Fire Remote

Universal ScriptA2000A2000 1.3K views 143 executesUpdated Nov 26, 2025
5.0/ 5(1 votes)
10100% Positive
Lua Script•234 lines (8734 chars)
-- 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).")

Features & Information

Change log -- Fixed Stupid bug that script won't get remotes inside folders F A R Y W F A K Fire Any Remote You Wish Free And Keyless Draggable

Community Comments (3)

davidisnotafurrydavidisnotafurryNov 26, 2025

Uhh is this a remotespy or...

Replying to @davidisnotafurry
XXMZXXMZNov 26, 2025

@davidisnotafurry most likely

A2000A2000Nov 28, 2025(edited)

no it just searches -- 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

More Scripts for Universal Scripts