-- SERVICES local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local SoundService = game:GetService("SoundService") -- VARIABLES local localPlayer = Players.LocalPlayer local plots = workspace.Map.Plots local pigeonCollectRemote = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("PigeonCollectRequest") local collecting = false local multiFireCount = 4 local requestsThisFrame = 0 local totalCollected = 0 local maxSafeRequests = 20 -- safe max per frame local miniMode = false -- PREVENT DUPLICATE GUI if localPlayer.PlayerGui:FindFirstChild("PigeonCollectorGUI") then localPlayer.PlayerGui.PigeonCollectorGUI:Destroy() end -- GUI SETUP local screenGui = Instance.new("ScreenGui") screenGui.Name = "PigeonCollectorGUI" screenGui.Parent = localPlayer:WaitForChild("PlayerGui") -- MAIN FRAME local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 320, 0, 300) frame.Position = UDim2.new(0.5, -160, 0.3, 0) frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) frame.BorderSizePixel = 0 frame.AnchorPoint = Vector2.new(0.5, 0) frame.Parent = screenGui local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 15) frameCorner.Parent = frame local frameStroke = Instance.new("UIStroke") frameStroke.Thickness = 2 frameStroke.Transparency = 0.5 frameStroke.Parent = frame -- TITLE BAR local titleBar = Instance.new("Frame") titleBar.Size = UDim2.new(1, 0, 0, 30) titleBar.BackgroundColor3 = Color3.fromRGB(50, 50, 50) titleBar.BorderSizePixel = 0 titleBar.Parent = frame local titleText = Instance.new("TextLabel") titleText.Size = UDim2.new(1, -30, 1, 0) titleText.Position = UDim2.new(0, 10, 0, 0) titleText.BackgroundTransparency = 1 titleText.Text = "Pigeon Collector PRO" titleText.TextColor3 = Color3.new(1,1,1) titleText.Font = Enum.Font.GothamBold titleText.TextSize = 18 titleText.TextXAlignment = Enum.TextXAlignment.Left titleText.Parent = titleBar -- CLOSE BUTTON local closeButton = Instance.new("TextButton") closeButton.Size = UDim2.new(0, 30, 1, 0) closeButton.Position = UDim2.new(1, -30, 0, 0) closeButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50) closeButton.TextColor3 = Color3.new(1,1,1) closeButton.Font = Enum.Font.GothamBold closeButton.TextSize = 18 closeButton.Text = "X" closeButton.Parent = titleBar local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(0, 5) closeCorner.Parent = closeButton closeButton.MouseButton1Click:Connect(function() screenGui:Destroy() collecting=false end) -- STATUS LABEL local statusLabel = Instance.new("TextLabel") statusLabel.Size = UDim2.new(1, -20, 0, 20) statusLabel.Position = UDim2.new(0, 10, 0, 35) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "Status: Stopped" statusLabel.TextColor3 = Color3.fromRGB(200,200,200) statusLabel.Font = Enum.Font.Gotham statusLabel.TextSize = 16 statusLabel.TextXAlignment = Enum.TextXAlignment.Left statusLabel.Parent = frame -- REQUESTS PER SECOND local rpsLabel = Instance.new("TextLabel") rpsLabel.Size = UDim2.new(1, -20, 0, 20) rpsLabel.Position = UDim2.new(0, 10, 0, 55) rpsLabel.BackgroundTransparency = 1 rpsLabel.Text = "Requests/sec: 0" rpsLabel.TextColor3 = Color3.fromRGB(180,180,255) rpsLabel.Font = Enum.Font.Gotham rpsLabel.TextSize = 14 rpsLabel.TextXAlignment = Enum.TextXAlignment.Left rpsLabel.Parent = frame -- COLLECT COUNT local collectLabel = Instance.new("TextLabel") collectLabel.Size = UDim2.new(1, -20, 0, 20) collectLabel.Position = UDim2.new(0, 10, 0, 75) collectLabel.BackgroundTransparency = 1 collectLabel.Text = "Collected: 0" collectLabel.TextColor3 = Color3.fromRGB(100,255,100) collectLabel.Font = Enum.Font.Gotham collectLabel.TextSize = 14 collectLabel.TextXAlignment = Enum.TextXAlignment.Left collectLabel.Parent = frame -- ERROR / WARNING LABEL local errorLabel = Instance.new("TextLabel") errorLabel.Size = UDim2.new(1, -20, 0, 18) errorLabel.Position = UDim2.new(0, 10, 0, 95) errorLabel.BackgroundTransparency = 1 errorLabel.Text = "" errorLabel.TextColor3 = Color3.fromRGB(255,100,100) errorLabel.Font = Enum.Font.Gotham errorLabel.TextSize = 14 errorLabel.TextXAlignment = Enum.TextXAlignment.Left errorLabel.Parent = frame -- TOGGLE BUTTON local toggleButton = Instance.new("TextButton") toggleButton.Size = UDim2.new(0, 200, 0, 50) toggleButton.Position = UDim2.new(0.5, -100, 0, 120) toggleButton.BackgroundColor3 = Color3.fromRGB(80, 80, 255) toggleButton.TextColor3 = Color3.new(1,1,1) toggleButton.Font = Enum.Font.GothamBold toggleButton.TextSize = 24 toggleButton.Text = "Start Collecting" toggleButton.AutoButtonColor = false toggleButton.Parent = frame local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 12) buttonCorner.Parent = toggleButton -- HOVER + CLICK ANIMATION toggleButton.MouseEnter:Connect(function() TweenService:Create(toggleButton, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(100, 100, 255)}):Play() end) toggleButton.MouseLeave:Connect(function() TweenService:Create(toggleButton, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(80, 80, 255)}):Play() end) toggleButton.MouseButton1Click:Connect(function() TweenService:Create(toggleButton, TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0,210,0,55)}):Play() task.delay(0.1,function() TweenService:Create(toggleButton, TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0,200,0,50)}):Play() end) collecting = not collecting toggleButton.Text = collecting and "Stop Collecting" or "Start Collecting" end) -- SLIDER SETUP local sliderFrame = Instance.new("Frame") sliderFrame.Size = UDim2.new(0, 260, 0, 50) sliderFrame.Position = UDim2.new(0.5, -130, 0, 180) sliderFrame.BackgroundTransparency = 1 sliderFrame.Parent = frame local sliderLabel = Instance.new("TextLabel") sliderLabel.Size = UDim2.new(1, 0, 0, 20) sliderLabel.Position = UDim2.new(0, 0, 0, 0) sliderLabel.BackgroundTransparency = 1 sliderLabel.Text = "Requests per frame: "..multiFireCount sliderLabel.TextColor3 = Color3.new(1,1,1) sliderLabel.Font = Enum.Font.Gotham sliderLabel.TextSize = 16 sliderLabel.TextXAlignment = Enum.TextXAlignment.Left sliderLabel.Parent = sliderFrame local sliderTrack = Instance.new("Frame") sliderTrack.Size = UDim2.new(1, -20, 0, 10) sliderTrack.Position = UDim2.new(0, 10, 0, 25) sliderTrack.BackgroundColor3 = Color3.fromRGB(60, 60, 60) sliderTrack.Parent = sliderFrame local trackCorner = Instance.new("UICorner") trackCorner.CornerRadius = UDim.new(0, 5) trackCorner.Parent = sliderTrack local sliderKnob = Instance.new("Frame") sliderKnob.Size = UDim2.new(multiFireCount/100,0,1,0) sliderKnob.Position = UDim2.new(0,0,0,0) sliderKnob.BackgroundColor3 = Color3.fromRGB(100,100,255) sliderKnob.Parent = sliderTrack local knobCorner = Instance.new("UICorner") knobCorner.CornerRadius = UDim.new(0,5) knobCorner.Parent = sliderKnob -- SLIDER TOOLTIP local sliderTooltip = Instance.new("TextLabel") sliderTooltip.Size = UDim2.new(0,60,0,20) sliderTooltip.BackgroundColor3 = Color3.fromRGB(50,50,50) sliderTooltip.TextColor3 = Color3.new(1,1,1) sliderTooltip.Font = Enum.Font.Gotham sliderTooltip.TextSize = 14 sliderTooltip.Text = multiFireCount sliderTooltip.Visible = false sliderTooltip.AnchorPoint = Vector2.new(0.5,1) sliderTooltip.Parent = sliderFrame -- DRAGGING SLIDER LOGIC local draggingSlider=false sliderKnob.InputBegan:Connect(function(input) if input.UserInputType==Enum.UserInputType.MouseButton1 then draggingSlider=true sliderTooltip.Visible=true end end) sliderKnob.InputEnded:Connect(function(input) if input.UserInputType==Enum.UserInputType.MouseButton1 then draggingSlider=false sliderTooltip.Visible=false end end) UserInputService.InputChanged:Connect(function(input) if draggingSlider and input.UserInputType==Enum.UserInputType.MouseMovement then local relative=math.clamp((input.Position.X - sliderTrack.AbsolutePosition.X)/sliderTrack.AbsoluteSize.X,0,1) multiFireCount = math.max(1, math.floor(relative*100)) TweenService:Create(sliderKnob, TweenInfo.new(0.05), {Size=UDim2.new(relative,0,1,0)}):Play() sliderLabel.Text="Requests per frame: "..multiFireCount sliderTooltip.Position=UDim2.new(relative,0,0,0) sliderTooltip.Text=multiFireCount end end) -- DRAGGABLE GUI local dragging, dragInput, mousePos, framePos local function update(input) local delta=input.Position-mousePos frame.Position=UDim2.new(framePos.X.Scale, framePos.X.Offset+delta.X, framePos.Y.Scale, framePos.Y.Offset+delta.Y) end titleBar.InputBegan:Connect(function(input) if input.UserInputType==Enum.UserInputType.MouseButton1 then dragging=true mousePos=input.Position framePos=frame.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) UserInputService.InputChanged:Connect(function(input) if input==dragInput and dragging then update(input) end end) -- KEYBOARD SHORTCUTS UserInputService.InputBegan:Connect(function(input,gameProcessed) if gameProcessed then return end if input.KeyCode==Enum.KeyCode.C then collecting=not collecting toggleButton.Text=collecting and "Stop Collecting" or "Start Collecting" elseif input.KeyCode==Enum.KeyCode.RightControl then screenGui:Destroy() collecting=false elseif input.KeyCode==Enum.KeyCode.Up then multiFireCount=math.min(100,multiFireCount+1) elseif input.KeyCode==Enum.KeyCode.Down then multiFireCount=math.max(1,multiFireCount-1) end end) -- HELPER FUNCTIONS local function findPlayerPlot() local plrUserId=localPlayer.UserId for _, plot in pairs(plots:GetChildren()) do if plot:GetAttribute("OwnerUserId")==plrUserId then return plot end end errorLabel.Text="Couldn't find plot!" return nil end local function getPigeons(plot) if not plot then return {} end local pigeons=plot:FindFirstChild("Pigeons") if pigeons then local list={} for _, model in pairs(pigeons:GetChildren()) do local id=model:GetAttribute("PigeonID") if id then table.insert(list,id) end end return list end errorLabel.Text="No pigeons found on plot!" return {} end local plot=findPlayerPlot() local pigeonList=getPigeons(plot) if #pigeonList==0 then return end local pigeonId=pigeonList[1] -- default first pigeon (multi-pigeon selection can be added later) -- SOUND EFFECT local collectSound = Instance.new("Sound") collectSound.SoundId="rbxassetid://9118811807" -- soft click/pop sound collectSound.Volume=0.3 collectSound.Parent=SoundService -- COLLECTION LOOP task.spawn(function() while true do RunService.Heartbeat:Wait() requestsThisFrame=0 if collecting then if multiFireCount>maxSafeRequests then errorLabel.Text="Warning: Multi-fire above safe max!" else errorLabel.Text="" end statusLabel.Text="Status: Collecting ("..multiFireCount.." per frame)" for i=1,multiFireCount do if not collecting then break end -- FIRE SERVER local success,err = pcall(function() pigeonCollectRemote:FireServer(pigeonId, math.huge+0.9439858923809532) end) if success then requestsThisFrame=requestsThisFrame+1 totalCollected=totalCollected+1 collectLabel.Text="Collected: "..totalCollected collectSound:Play() end end else statusLabel.Text="Status: Stopped" end rpsLabel.Text="Requests/sec: "..requestsThisFrame end end)