local CustomUI = {} local Settings = { Background = Color3.fromRGB(25, 25, 35), Accent = Color3.fromRGB(65, 105, 225), -- blue im pretty sure !!111!! Text = Color3.fromRGB(255, 255, 255), Secondary = Color3.fromRGB(40, 40, 60), Highlight = Color3.fromRGB(90, 140, 240), Radius = UDim.new(0, 6), Font = Enum.Font.GothamSemibold, TweenSpeed = 0.25, Shadow = true } -- varaibles blah blah blah local remotes = {} local selectedRemote = nil local isListening = false local filterText = "" local function tweenObject(obj, properties, duration) local tween = game:GetService("TweenService"):Create( obj, TweenInfo.new(duration, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), properties ) tween:Play() return tween end local function getInstancePath(instance) local path = instance.Name local current = instance.Parent while current and current ~= game do path = current.Name .. "." .. path current = current.Parent end return path end local function createShadow(parent) if not Settings.Shadow then return end local shadow = Instance.new("ImageLabel") shadow.Name = "Shadow" shadow.BackgroundTransparency = 1 shadow.Image = "rbxassetid://5554236805" shadow.ImageColor3 = Color3.fromRGB(0, 0, 0) shadow.ImageTransparency = 0.4 shadow.Position = UDim2.fromOffset(0, 0) shadow.Size = UDim2.new(1, 12, 1, 12) shadow.ZIndex = parent.ZIndex - 1 shadow.Parent = parent end function CustomUI:Create() if game:GetService("CoreGui"):FindFirstChild("RatwareRemoteFinder") then game:GetService("CoreGui"):FindFirstChild("RatwareRemoteFinder"):Destroy() end local main = Instance.new("ScreenGui") main.Name = "RatwareRemoteFinder" main.Parent = game:GetService("CoreGui") main.ZIndexBehavior = Enum.ZIndexBehavior.Sibling local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.BackgroundColor3 = Settings.Background mainFrame.BorderSizePixel = 0 mainFrame.Position = UDim2.new(0.5, -300, 0.5, -200) mainFrame.Size = UDim2.new(0, 600, 0, 400) mainFrame.ZIndex = 10 mainFrame.ClipsDescendants = true mainFrame:SetAttribute("Draggable", true) mainFrame.Parent = main local corner = Instance.new("UICorner") corner.CornerRadius = Settings.Radius corner.Parent = mainFrame createShadow(mainFrame) local titleBar = Instance.new("Frame") titleBar.Name = "TitleBar" titleBar.BackgroundColor3 = Settings.Accent titleBar.BorderSizePixel = 0 titleBar.Size = UDim2.new(1, 0, 0, 30) titleBar.ZIndex = 11 titleBar.Parent = mainFrame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 6) titleCorner.Parent = titleBar local titleLabel = Instance.new("TextLabel") titleLabel.BackgroundTransparency = 1 titleLabel.Position = UDim2.new(0, 10, 0, 0) titleLabel.Size = UDim2.new(1, -20, 1, 0) titleLabel.Font = Settings.Font titleLabel.Text = "Ratware remote detector" titleLabel.TextColor3 = Settings.Text titleLabel.TextSize = 16 titleLabel.TextXAlignment = Enum.TextXAlignment.Left titleLabel.ZIndex = 12 titleLabel.Parent = titleBar -- closing thing local closeBtn = Instance.new("TextButton") closeBtn.Name = "CloseButton" closeBtn.BackgroundColor3 = Color3.fromRGB(255, 70, 70) closeBtn.BorderSizePixel = 0 closeBtn.Position = UDim2.new(1, -25, 0.5, -8) closeBtn.Size = UDim2.new(0, 16, 0, 16) closeBtn.Font = Enum.Font.SourceSans closeBtn.Text = "" closeBtn.ZIndex = 12 closeBtn.Parent = titleBar local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(1, 0) closeCorner.Parent = closeBtn closeBtn.MouseButton1Click:Connect(function() tweenObject(mainFrame, {Position = UDim2.new(0.5, -300, 1.5, 0)}, 0.5) wait(0.5) main:Destroy() end) local searchBox = Instance.new("TextBox") searchBox.Name = "SearchBox" searchBox.BackgroundColor3 = Settings.Secondary searchBox.BorderSizePixel = 0 searchBox.Position = UDim2.new(0, 10, 0, 40) searchBox.Size = UDim2.new(1, -20, 0, 30) searchBox.Font = Settings.Font searchBox.PlaceholderText = "Search remotes..." searchBox.Text = "" searchBox.TextColor3 = Settings.Text searchBox.TextSize = 14 searchBox.ZIndex = 11 searchBox.Parent = mainFrame local searchCorner = Instance.new("UICorner") searchCorner.CornerRadius = UDim.new(0, 4) searchCorner.Parent = searchBox local remotesFrame = Instance.new("ScrollingFrame") remotesFrame.Name = "RemotesFrame" remotesFrame.BackgroundColor3 = Settings.Secondary remotesFrame.BorderSizePixel = 0 remotesFrame.Position = UDim2.new(0, 10, 0, 80) remotesFrame.Size = UDim2.new(1, -20, 1, -140) remotesFrame.CanvasSize = UDim2.new(0, 0, 0, 0) remotesFrame.ScrollBarThickness = 6 remotesFrame.ScrollBarImageColor3 = Settings.Accent remotesFrame.ZIndex = 11 remotesFrame.Parent = mainFrame local remotesCorner = Instance.new("UICorner") remotesCorner.CornerRadius = UDim.new(0, 4) remotesCorner.Parent = remotesFrame local buttonPanel = Instance.new("Frame") buttonPanel.Name = "ButtonPanel" buttonPanel.BackgroundColor3 = Settings.Secondary buttonPanel.BorderSizePixel = 0 buttonPanel.Position = UDim2.new(0, 10, 1, -50) buttonPanel.Size = UDim2.new(1, -20, 0, 40) buttonPanel.ZIndex = 11 buttonPanel.Parent = mainFrame local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 4) buttonCorner.Parent = buttonPanel local function createButton(name, position, callback) local button = Instance.new("TextButton") button.Name = name .. "Button" button.BackgroundColor3 = Settings.Accent button.BorderSizePixel = 0 button.Position = position button.Size = UDim2.new(0, 120, 0, 30) button.Font = Settings.Font button.Text = name button.TextColor3 = Settings.Text button.TextSize = 14 button.ZIndex = 12 button.Parent = buttonPanel local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 4) btnCorner.Parent = button button.MouseEnter:Connect(function() tweenObject(button, {BackgroundColor3 = Settings.Highlight}, Settings.TweenSpeed) end) button.MouseLeave:Connect(function() tweenObject(button, {BackgroundColor3 = Settings.Accent}, Settings.TweenSpeed) end) button.MouseButton1Click:Connect(callback) return button end local refreshBtn = createButton("Refresh", UDim2.new(0, 10, 0.5, -15), function() CustomUI:RefreshRemotes() end) local listenBtn = createButton("Listen", UDim2.new(0.5, -60, 0.5, -15), function() isListening = not isListening listenBtn.Text = isListening and "Stop Listening" or "Listen" if isListening then CustomUI:StartListening() else CustomUI:StopListening() end end) local copyBtn = createButton("Copy Path", UDim2.new(1, -130, 0.5, -15), function() if selectedRemote then setclipboard(remotes[selectedRemote].path) end end) local dragging local dragInput local dragStart local startPos local function updateDrag(input) local delta = input.Position - dragStart mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = mainFrame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) titleBar.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then dragInput = input end end) game:GetService("UserInputService").InputChanged:Connect(function(input) if input == dragInput and dragging then updateDrag(input) end end) mainFrame.Position = UDim2.new(0.5, -300, 1.5, 0) tweenObject(mainFrame, {Position = UDim2.new(0.5, -300, 0.5, -200)}, 0.5) CustomUI.MainUI = main CustomUI.RemotesFrame = remotesFrame CustomUI.SearchBox = searchBox searchBox.Changed:Connect(function(prop) if prop == "Text" then filterText = searchBox.Text:lower() CustomUI:UpdateRemotesList() end end) CustomUI:RefreshRemotes() return CustomUI end -- refresh remotes thing function CustomUI:RefreshRemotes() remotes = {} for _, instance in pairs(game:GetDescendants()) do if instance:IsA("RemoteEvent") or instance:IsA("RemoteFunction") then table.insert(remotes, { instance = instance, name = instance.Name, class = instance.ClassName, parent = instance.Parent.Name, path = getInstancePath(instance), fired = false, args = {} }) end end self:UpdateRemotesList() end function CustomUI:UpdateRemotesList() for _, child in pairs(self.RemotesFrame:GetChildren()) do if child:IsA("Frame") then child:Destroy() end end local yOffset = 5 local count = 0 for i, remote in pairs(remotes) do if filterText ~= "" and not string.find(remote.name:lower(), filterText) and not string.find(remote.path:lower(), filterText) and not string.find(remote.class:lower(), filterText) then continue end local remoteItem = Instance.new("Frame") remoteItem.Name = "RemoteItem_" .. i remoteItem.BackgroundColor3 = selectedRemote == i and Settings.Highlight or Settings.Background remoteItem.BorderSizePixel = 0 remoteItem.Position = UDim2.new(0, 5, 0, yOffset) remoteItem.Size = UDim2.new(1, -16, 0, 40) remoteItem.ZIndex = 12 remoteItem.Parent = self.RemotesFrame local itemCorner = Instance.new("UICorner") itemCorner.CornerRadius = UDim.new(0, 4) itemCorner.Parent = remoteItem local typeIndicator = Instance.new("Frame") typeIndicator.Name = "TypeIndicator" typeIndicator.BackgroundColor3 = remote.class == "RemoteEvent" and Color3.fromRGB(0, 170, 255) or Color3.fromRGB(255, 170, 0) typeIndicator.BorderSizePixel = 0 typeIndicator.Position = UDim2.new(0, 5, 0.5, -4) typeIndicator.Size = UDim2.new(0, 8, 0, 8) typeIndicator.ZIndex = 13 typeIndicator.Parent = remoteItem local indicatorCorner = Instance.new("UICorner") indicatorCorner.CornerRadius = UDim.new(1, 0) indicatorCorner.Parent = typeIndicator local nameLabel = Instance.new("TextLabel") nameLabel.Name = "NameLabel" nameLabel.BackgroundTransparency = 1 nameLabel.Position = UDim2.new(0, 20, 0, 2) nameLabel.Size = UDim2.new(1, -25, 0, 20) nameLabel.Font = Settings.Font nameLabel.Text = remote.name nameLabel.TextColor3 = Settings.Text nameLabel.TextSize = 14 nameLabel.TextXAlignment = Enum.TextXAlignment.Left nameLabel.ZIndex = 13 nameLabel.Parent = remoteItem local pathLabel = Instance.new("TextLabel") pathLabel.Name = "PathLabel" pathLabel.BackgroundTransparency = 1 pathLabel.Position = UDim2.new(0, 20, 0, 22) pathLabel.Size = UDim2.new(1, -25, 0, 16) pathLabel.Font = Enum.Font.Gotham pathLabel.Text = remote.parent .. " (" .. remote.class .. ")" pathLabel.TextColor3 = Color3.fromRGB(180, 180, 180) pathLabel.TextSize = 12 pathLabel.TextXAlignment = Enum.TextXAlignment.Left pathLabel.ZIndex = 13 pathLabel.Parent = remoteItem if remote.fired then local firedIndicator = Instance.new("Frame") firedIndicator.Name = "FiredIndicator" firedIndicator.BackgroundColor3 = Color3.fromRGB(0, 255, 100) firedIndicator.BorderSizePixel = 0 firedIndicator.Position = UDim2.new(1, -15, 0.5, -4) firedIndicator.Size = UDim2.new(0, 8, 0, 8) firedIndicator.ZIndex = 13 firedIndicator.Parent = remoteItem local firedCorner = Instance.new("UICorner") firedCorner.CornerRadius = UDim.new(1, 0) firedCorner.Parent = firedIndicator end remoteItem.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then if selectedRemote == i then selectedRemote = nil tweenObject(remoteItem, {BackgroundColor3 = Settings.Background}, Settings.TweenSpeed) else if selectedRemote then local previousItem = self.RemotesFrame:FindFirstChild("RemoteItem_" .. selectedRemote) if previousItem then tweenObject(previousItem, {BackgroundColor3 = Settings.Background}, Settings.TweenSpeed) end end selectedRemote = i tweenObject(remoteItem, {BackgroundColor3 = Settings.Highlight}, Settings.TweenSpeed) end end end) remoteItem.MouseEnter:Connect(function() if selectedRemote ~= i then tweenObject(remoteItem, {BackgroundColor3 = Color3.fromRGB(40, 40, 50)}, Settings.TweenSpeed) end end) remoteItem.MouseLeave:Connect(function() if selectedRemote ~= i then tweenObject(remoteItem, {BackgroundColor3 = Settings.Background}, Settings.TweenSpeed) end end) yOffset = yOffset + 45 count = count + 1 end self.RemotesFrame.CanvasSize = UDim2.new(0, 0, 0, yOffset + 5) end function CustomUI:StartListening() for i, remote in pairs(remotes) do if remote.class == "RemoteEvent" then remote.connection = remote.instance.OnClientEvent:Connect(function(...) local args = {...} remotes[i].fired = true remotes[i].args = args self:UpdateRemotesList() print("Remote fired: " .. remote.path) for j, arg in pairs(args) do print(" Arg " .. j .. ":", arg) end end) elseif remote.class == "RemoteFunction" then remote.originalFunction = hookmetamethod(remote.instance, "__namecall", function(self, ...) local args = {...} local method = getnamecallmethod() if self == remote.instance and (method == "InvokeClient" or method == "InvokeServer") then remotes[i].fired = true remotes[i].args = args CustomUI:UpdateRemotesList() print("Remote function called: " .. remote.path) for j, arg in pairs(args) do print(" Arg " .. j .. ":", arg) end end return remote.originalFunction(self, ...) end) end end end function CustomUI:StopListening() for i, remote in pairs(remotes) do if remote.connection then remote.connection:Disconnect() remote.connection = nil end if remote.originalFunction then hookmetamethod(remote.instance, "__namecall", remote.originalFunction) remote.originalFunction = nil end end end local UI = CustomUI:Create() local notification = Instance.new("ScreenGui") notification.Name = "Notification" notification.Parent = game:GetService("CoreGui") local notifFrame = Instance.new("Frame") notifFrame.Name = "NotifFrame" notifFrame.BackgroundColor3 = Settings.Accent notifFrame.BorderSizePixel = 0 notifFrame.Position = UDim2.new(0.5, -125, 0, -50) notifFrame.Size = UDim2.new(0, 250, 0, 40) notifFrame.ZIndex = 100 notifFrame.Parent = notification local notifCorner = Instance.new("UICorner") notifCorner.CornerRadius = UDim.new(0, 6) notifCorner.Parent = notifFrame local notifLabel = Instance.new("TextLabel") notifLabel.BackgroundTransparency = 1 notifLabel.Position = UDim2.new(0, 0, 0, 0) notifLabel.Size = UDim2.new(1, 0, 1, 0) notifLabel.Font = Settings.Font notifLabel.Text = "Ratware detector is loaded." notifLabel.TextColor3 = Settings.Text notifLabel.TextSize = 16 notifLabel.ZIndex = 101 notifLabel.Parent = notifFrame tweenObject(notifFrame, {Position = UDim2.new(0.5, -125, 0, 20)}, 0.5) wait(2) tweenObject(notifFrame, {Position = UDim2.new(0.5, -125, 0, -50)}, 0.5) wait(0.5) notification:Destroy() return UI