-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] -- Is it made by ai? half of them is made by ai's help.. if getgenv().BirdPetSystem then pcall(function() getgenv().BirdPetSystem.Destroy() end) end local Players = cloneref and cloneref(game:GetService("Players")) or game:GetService("Players") local RunService = cloneref and cloneref(game:GetService("RunService")) or game:GetService("RunService") local TweenService = cloneref and cloneref(game:GetService("TweenService")) or game:GetService("TweenService") local LocalPlayer = Players.LocalPlayer local Mouse = LocalPlayer:GetMouse() -- Configuration local TARGET_HAT_ID = "84737037184093" local MEDIUM_MOVE_SPEED = 0.07 local TURN_SPEED = 0.14 -- Separation & Motion local BIRD_SEPARATION_DIST = 2.2 local BASE_HEIGHT = 2.0 local HORIZONTAL_BOUNDS = 8.0 local MAX_MOUSE_DISTANCE = 45 local PLAYER_DETECT_RADIUS = 30 -- Master System State local SystemState = { Mode = "FREE", -- "FREE", "FOLLOW_SELF", or "FOLLOW_MOUSE" BirdInstances = {}, Connections = {} } -------------------------------------------------------------------------------- -- CLEANUP / DESTRUCTOR -------------------------------------------------------------------------------- getgenv().BirdPetSystem = { Destroy = function() for _, conn in pairs(SystemState.Connections) do if conn then pcall(function() conn:Disconnect() end) end end table.clear(SystemState.Connections) table.clear(SystemState.BirdInstances) end } -------------------------------------------------------------------------------- -- MODERN ANIMATED GUI INTERFACE -------------------------------------------------------------------------------- local screenGui = Instance.new("ScreenGui") screenGui.Name = "FEBirdControlGui_" .. math.random(1000, 9999) screenGui.ResetOnSpawn = false if gethui then screenGui.Parent = gethui() elseif syn and syn.protect_gui then syn.protect_gui(screenGui) screenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") else screenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") end -- Main Frame Container local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 230, 0, 265) mainFrame.Position = UDim2.new(0.05, 0, 0.3, 0) mainFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 20) mainFrame.BorderSizePixel = 0 mainFrame.Active = true mainFrame.Draggable = true mainFrame.ClipsDescendants = false mainFrame.Parent = screenGui local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 12) mainCorner.Parent = mainFrame local mainStroke = Instance.new("UIStroke") mainStroke.Color = Color3.fromRGB(60, 60, 80) mainStroke.Thickness = 1.5 mainStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border mainStroke.Parent = mainFrame -- Gradient Glow Effect local mainGradient = Instance.new("UIGradient") mainGradient.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(22, 22, 30)), ColorSequenceKeypoint.new(1, Color3.fromRGB(12, 12, 16)) }) mainGradient.Rotation = 45 mainGradient.Parent = mainFrame -- Content Holder (For Smooth Minimize Folding) local contentHolder = Instance.new("Frame") contentHolder.Size = UDim2.new(1, 0, 1, 0) contentHolder.BackgroundTransparency = 1 contentHolder.Parent = mainFrame -- Header local headerFrame = Instance.new("Frame") headerFrame.Size = UDim2.new(1, 0, 0, 38) headerFrame.BackgroundTransparency = 1 headerFrame.Parent = contentHolder local title = Instance.new("TextLabel") title.Size = UDim2.new(0.6, 0, 1, 0) title.Position = UDim2.new(0, 14, 0, 0) title.BackgroundTransparency = 1 title.Text = "FE Birdy" title.TextColor3 = Color3.fromRGB(245, 245, 255) title.TextSize = 12 title.Font = Enum.Font.GothamBold title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = headerFrame local titleSubtitle = Instance.new("TextLabel") titleSubtitle.Size = UDim2.new(0.4, -36, 1, 0) titleSubtitle.Position = UDim2.new(0.6, 0, 0, 0) titleSubtitle.BackgroundTransparency = 1 titleSubtitle.Text = "Made by Nova!" titleSubtitle.TextColor3 = Color3.fromRGB(110, 110, 135) titleSubtitle.TextSize = 9 titleSubtitle.Font = Enum.Font.GothamBold titleSubtitle.TextXAlignment = Enum.TextXAlignment.Right titleSubtitle.Parent = headerFrame -- Circle Minimize Button local minimizeBtn = Instance.new("TextButton") minimizeBtn.Size = UDim2.new(0, 22, 0, 22) minimizeBtn.Position = UDim2.new(1, -30, 0, 8) minimizeBtn.BackgroundColor3 = Color3.fromRGB(28, 28, 38) minimizeBtn.Text = "-" minimizeBtn.TextColor3 = Color3.fromRGB(200, 200, 220) minimizeBtn.TextSize = 14 minimizeBtn.Font = Enum.Font.GothamBold minimizeBtn.AutoButtonColor = false minimizeBtn.Parent = mainFrame local minCorner = Instance.new("UICorner") minCorner.CornerRadius = UDim.new(1, 0) -- Circle Shape minCorner.Parent = minimizeBtn local minStroke = Instance.new("UIStroke") minStroke.Color = Color3.fromRGB(60, 60, 85) minStroke.Thickness = 1 minStroke.Parent = minimizeBtn local isMinimized = false minimizeBtn.MouseButton1Click:Connect(function() isMinimized = not isMinimized if isMinimized then contentHolder.Visible = false minimizeBtn.Text = "+" TweenService:Create(mainFrame, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Size = UDim2.new(0, 38, 0, 38) }):Play() TweenService:Create(minimizeBtn, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Position = UDim2.new(0, 8, 0, 8) }):Play() else minimizeBtn.Text = "-" local tween = TweenService:Create(mainFrame, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Size = UDim2.new(0, 230, 0, 265) }) tween:Play() TweenService:Create(minimizeBtn, TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), { Position = UDim2.new(1, -30, 0, 8) }):Play() tween.Completed:Connect(function() if not isMinimized then contentHolder.Visible = true end end) end end) -- Divider local divider = Instance.new("Frame") divider.Size = UDim2.new(1, -24, 0, 1) divider.Position = UDim2.new(0, 12, 0, 38) divider.BackgroundColor3 = Color3.fromRGB(35, 35, 48) divider.BorderSizePixel = 0 divider.Parent = contentHolder -- Quantity Field local qtyFrame = Instance.new("Frame") qtyFrame.Size = UDim2.new(1, -24, 0, 30) qtyFrame.Position = UDim2.new(0, 12, 0, 48) qtyFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 28) qtyFrame.Parent = contentHolder local qtyCorner = Instance.new("UICorner") qtyCorner.CornerRadius = UDim.new(0, 6) qtyCorner.Parent = qtyFrame local qtyStroke = Instance.new("UIStroke") qtyStroke.Color = Color3.fromRGB(40, 40, 55) qtyStroke.Thickness = 1 qtyStroke.Parent = qtyFrame local qtyLabel = Instance.new("TextLabel") qtyLabel.Size = UDim2.new(0.65, 0, 1, 0) qtyLabel.Position = UDim2.new(0, 8, 0, 0) qtyLabel.BackgroundTransparency = 1 qtyLabel.Text = "Flock Amount (1-10):" qtyLabel.TextColor3 = Color3.fromRGB(160, 160, 180) qtyLabel.TextSize = 10 qtyLabel.Font = Enum.Font.GothamMedium qtyLabel.TextXAlignment = Enum.TextXAlignment.Left qtyLabel.Parent = qtyFrame local amountBox = Instance.new("TextBox") amountBox.Size = UDim2.new(0.3, -8, 1, -8) amountBox.Position = UDim2.new(0.7, 0, 0, 4) amountBox.BackgroundColor3 = Color3.fromRGB(28, 28, 38) amountBox.Text = "1" amountBox.TextColor3 = Color3.fromRGB(255, 255, 255) amountBox.TextSize = 11 amountBox.Font = Enum.Font.GothamBold amountBox.ClearTextOnFocus = false amountBox.Parent = qtyFrame local boxCorner = Instance.new("UICorner") boxCorner.CornerRadius = UDim.new(0, 4) boxCorner.Parent = amountBox amountBox.FocusLost:Connect(function() local num = tonumber(amountBox.Text) if not num then amountBox.Text = "1" else amountBox.Text = tostring(math.clamp(math.floor(num), 1, 10)) end end) -- Animated Button Creator local function createAnimatedButton(text, posY) local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, -24, 0, 34) btn.Position = UDim2.new(0, 12, 0, posY) btn.BackgroundColor3 = Color3.fromRGB(24, 24, 32) btn.Text = text btn.TextColor3 = Color3.fromRGB(210, 210, 225) btn.Font = Enum.Font.GothamMedium btn.TextSize = 11 btn.AutoButtonColor = false btn.Parent = contentHolder local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 8) btnCorner.Parent = btn local btnStroke = Instance.new("UIStroke") btnStroke.Color = Color3.fromRGB(45, 45, 60) btnStroke.Thickness = 1 btnStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border btnStroke.Parent = btn -- Hover & Click Animations btn.MouseEnter:Connect(function() TweenService:Create(btn, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(34, 34, 46)}):Play() TweenService:Create(btnStroke, TweenInfo.new(0.2), {Color = Color3.fromRGB(90, 90, 120)}):Play() TweenService:Create(btn, TweenInfo.new(0.2), {TextColor3 = Color3.fromRGB(255, 255, 255)}):Play() end) btn.MouseLeave:Connect(function() TweenService:Create(btn, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(24, 24, 32)}):Play() TweenService:Create(btnStroke, TweenInfo.new(0.2), {Color = Color3.fromRGB(45, 45, 60)}):Play() TweenService:Create(btn, TweenInfo.new(0.2), {TextColor3 = Color3.fromRGB(210, 210, 225)}):Play() end) btn.MouseButton1Down:Connect(function() TweenService:Create(btn, TweenInfo.new(0.08), {Size = UDim2.new(1, -28, 0, 32), Position = UDim2.new(0, 14, 0, posY + 1)}):Play() end) btn.MouseButton1Up:Connect(function() TweenService:Create(btn, TweenInfo.new(0.1), {Size = UDim2.new(1, -24, 0, 34), Position = UDim2.new(0, 12, 0, posY)}):Play() end) return btn, btnStroke end local getHatBtn, getHatStroke = createAnimatedButton("1. Get Hat Commands", 88) local reanimateBtn, reanimateStroke = createAnimatedButton("2. Reanimate & Fly", 130) local toggleModeBtn, toggleModeStroke = createAnimatedButton("Mode: Free Flying", 172) local mouseFollowBtn, mouseFollowStroke = createAnimatedButton("Follow Mouse: OFF", 214) -------------------------------------------------------------------------------- -- ACCESSORY FINDER -------------------------------------------------------------------------------- local function findAllHatHandles(maxCount) local char = LocalPlayer.Character if not char then return {} end local foundHandles = {} for _, acc in pairs(char:GetChildren()) do if #foundHandles >= maxCount then break end if acc:IsA("Accessory") then local handle = acc:FindFirstChild("Handle") if handle then if string.find(acc.Name, TARGET_HAT_ID) or string.find(handle.Name, TARGET_HAT_ID) then table.insert(foundHandles, handle) else local mesh = handle:FindFirstChildOfClass("SpecialMesh") if mesh and (string.find(mesh.MeshId, TARGET_HAT_ID) or string.find(mesh.TextureId, TARGET_HAT_ID)) then table.insert(foundHandles, handle) end end end end end if #foundHandles == 0 then for _, acc in pairs(char:GetChildren()) do if #foundHandles >= maxCount then break end if acc:IsA("Accessory") and acc:FindFirstChild("Handle") then table.insert(foundHandles, acc.Handle) end end end return foundHandles end -------------------------------------------------------------------------------- -- SIMPLE PLAYER ORBIT FINDER -------------------------------------------------------------------------------- local function findNearbyPlayerTarget(myPos) local candidates = {} for _, plr in pairs(Players:GetPlayers()) do if plr ~= LocalPlayer then local pChar = plr.Character local pRoot = pChar and pChar:FindFirstChild("HumanoidRootPart") if pRoot then local dist = (myPos - pRoot.Position).Magnitude if dist < PLAYER_DETECT_RADIUS then table.insert(candidates, plr) end end end end if #candidates == 0 then return nil end return candidates[math.random(1, #candidates)] end -------------------------------------------------------------------------------- -- BIRD AI FACTORY -------------------------------------------------------------------------------- local function createBirdAI(handle, index) return { Index = index, Handle = handle, CurrentCFrame = handle.CFrame, TargetPos = handle.Position, NextStateTime = os.clock() + math.random(1, 3), NextGlanceTime = os.clock() + math.random(1, 3), NextPlayerCheck = os.clock() + math.random(6, 12), SeedOffset = math.random() * 100, IsIdle = false, IdleHeadAngle = CFrame.identity, -- Simple Player Interaction State TargetPlayer = nil, OrbitEndTime = 0 } end -------------------------------------------------------------------------------- -- MAIN AI ENGINE LOOP -------------------------------------------------------------------------------- local function startPetLogic() getgenv().BirdPetSystem.Destroy() local maxCount = tonumber(amountBox.Text) or 1 local handles = findAllHatHandles(maxCount) if #handles == 0 then return end SystemState.BirdInstances = {} for i, handle in ipairs(handles) do table.insert(SystemState.BirdInstances, createBirdAI(handle, i)) end local flightLoop = RunService.Heartbeat:Connect(function() local character = LocalPlayer.Character local root = character and character:FindFirstChild("HumanoidRootPart") if not character or not root then return end for _, bird in ipairs(SystemState.BirdInstances) do local handle = bird.Handle if handle and handle.Parent and handle.Parent ~= workspace then -- Anti-Weld Setup handle.CanCollide = false for _, child in pairs(handle:GetChildren()) do if child:IsA("Weld") or child:IsA("WeldConstraint") or child:IsA("TouchTransmitter") then child:Destroy() end end for _, v in pairs(character:GetDescendants()) do if (v:IsA("Weld") or v:IsA("WeldConstraint") or v:IsA("Motor6D")) then if v.Part0 == handle or v.Part1 == handle then pcall(function() v:Destroy() end) end end end handle.Velocity = Vector3.new(0, 25.7, 0) if sethiddenproperty then pcall(function() sethiddenproperty(handle, "NetworkIsWaitingForCollision", false) end) end -- SIMPLE PLAYER ORBIT DECISION ENGINE if SystemState.Mode == "FREE" then if not bird.TargetPlayer and os.clock() > bird.NextPlayerCheck then bird.NextPlayerCheck = os.clock() + math.random(10, 18) local nearbyPlr = findNearbyPlayerTarget(bird.CurrentCFrame.Position) if nearbyPlr then bird.TargetPlayer = nearbyPlr bird.OrbitEndTime = os.clock() + math.random(4, 8) -- Orbit for 4 to 8 seconds then come back end end if bird.TargetPlayer and os.clock() > bird.OrbitEndTime then bird.TargetPlayer = nil -- Return to user end else bird.TargetPlayer = nil end -- TARGET RESOLVER if bird.TargetPlayer and bird.TargetPlayer.Character and bird.TargetPlayer.Character:FindFirstChild("HumanoidRootPart") then -- Swoop and orbit nearby player briefly bird.IsIdle = false local targetRoot = bird.TargetPlayer.Character.HumanoidRootPart local t = os.clock() * 1.5 + bird.SeedOffset local orbitRadius = 3.0 + (bird.Index * 0.8) bird.TargetPos = targetRoot.Position + Vector3.new(math.sin(t) * orbitRadius, BASE_HEIGHT, math.cos(t) * orbitRadius) elseif SystemState.Mode == "FOLLOW_MOUSE" then bird.IsIdle = false local mouseHit = Mouse.Hit local rawTargetPos local mouseOffset = Vector3.new( math.sin(os.clock() * 1.5 + bird.SeedOffset) * (bird.Index * 1.2), 0, math.cos(os.clock() * 1.5 + bird.SeedOffset) * (bird.Index * 1.2) ) if mouseHit and Mouse.Target then rawTargetPos = mouseHit.Position + Vector3.new(0, 1.5, 0) + mouseOffset else local lookDir = (Mouse.Hit and (Mouse.Hit.Position - root.Position).Unit) or root.CFrame.LookVector rawTargetPos = root.Position + (lookDir * MAX_MOUSE_DISTANCE) + Vector3.new(0, BASE_HEIGHT, 0) + mouseOffset end bird.TargetPos = rawTargetPos elseif SystemState.Mode == "FOLLOW_SELF" then bird.IsIdle = false local t = os.clock() * 1.2 + bird.SeedOffset local orbitRadius = 2.5 + (bird.Index * 1.2) bird.TargetPos = root.Position + Vector3.new(math.sin(t) * orbitRadius, BASE_HEIGHT, math.cos(t * 0.7) * orbitRadius) else -- Free Roam Mode (Anchored around local player) local distToTarget = (Vector3.new(bird.CurrentCFrame.Position.X, 0, bird.CurrentCFrame.Position.Z) - Vector3.new(bird.TargetPos.X, 0, bird.TargetPos.Z)).Magnitude if os.clock() > bird.NextStateTime or distToTarget < 1.0 then if math.random(1, 10) <= 3 and not bird.IsIdle then bird.IsIdle = true bird.NextStateTime = os.clock() + math.random(2, 4) else bird.IsIdle = false bird.NextStateTime = os.clock() + math.random(2, 6) local rX = math.random(-HORIZONTAL_BOUNDS, HORIZONTAL_BOUNDS) local rZ = math.random(-HORIZONTAL_BOUNDS, HORIZONTAL_BOUNDS) bird.TargetPos = root.Position + Vector3.new(rX, BASE_HEIGHT + (bird.Index * 0.2), rZ) end end end -- Lerp & Bird Separation local nextPosition = bird.CurrentCFrame.Position:Lerp(bird.TargetPos, MEDIUM_MOVE_SPEED) local separationForce = Vector3.zero for _, otherBird in ipairs(SystemState.BirdInstances) do if otherBird ~= bird and otherBird.Handle then local diff = nextPosition - otherBird.CurrentCFrame.Position local dist = diff.Magnitude if dist < BIRD_SEPARATION_DIST and dist > 0.001 then separationForce = separationForce + (diff.Unit * ((BIRD_SEPARATION_DIST - dist) * 0.3)) end end end nextPosition = nextPosition + separationForce -- Head Look Logic if os.clock() > bird.NextGlanceTime then bird.NextGlanceTime = os.clock() + math.random(1, 4) bird.IdleHeadAngle = CFrame.Angles(0, math.rad(math.random(-35, 35)), 0) end -- Calculate Rotation & Render local feNetSyncOffset = CFrame.new(0, 0.003 * math.sin((os.clock() + bird.SeedOffset) * 30), 0) local finalCF if bird.IsIdle then local subtleBob = math.sin((os.clock() * 2.8) + bird.SeedOffset) * 0.015 local targetCF = CFrame.new(nextPosition + Vector3.new(0, subtleBob, 0)) * (bird.CurrentCFrame.Rotation:Lerp(bird.IdleHeadAngle, 0.1)) finalCF = bird.CurrentCFrame:Lerp(targetCF, 0.05) else local moveDir = (bird.TargetPos - nextPosition) if moveDir.Magnitude > 0.05 then local rawLook = CFrame.lookAt(nextPosition, nextPosition + moveDir) local rx, ry, _ = rawLook:ToOrientation() local clampedPitch = math.clamp(rx, math.rad(-15), math.rad(25)) local pitchAdjustedCF = CFrame.new(nextPosition) * CFrame.Angles(clampedPitch, ry, 0) finalCF = bird.CurrentCFrame:Lerp(pitchAdjustedCF, TURN_SPEED) else finalCF = CFrame.new(nextPosition) * bird.CurrentCFrame.Rotation end end bird.CurrentCFrame = finalCF handle.CFrame = finalCF * feNetSyncOffset end end end) table.insert(SystemState.Connections, flightLoop) end -------------------------------------------------------------------------------- -- GUI BUTTON CONTROLS -------------------------------------------------------------------------------- getHatBtn.MouseButton1Click:Connect(function() local count = tonumber(amountBox.Text) or 1 count = math.clamp(math.floor(count), 1, 10) local hatCommand = "-gh" for _ = 1, count do hatCommand = hatCommand .. " " .. TARGET_HAT_ID end task.spawn(function() local TextChatService = cloneref and cloneref(game:GetService("TextChatService")) or game:GetService("TextChatService") local ReplicatedStorage = cloneref and cloneref(game:GetService("ReplicatedStorage")) or game:GetService("ReplicatedStorage") local function sendMsg(msg) pcall(function() if TextChatService.ChatVersion == Enum.ChatVersion.TextChatService then local textChannel = TextChatService.TextChannels:FindFirstChild("RBXGeneral") if textChannel then textChannel:SendAsync(msg) end else local sayMessage = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents") and ReplicatedStorage.DefaultChatSystemChatEvents:FindFirstChild("SayMessageRequest") if sayMessage then sayMessage:FireServer(msg, "All") end end end) end sendMsg(hatCommand) task.wait(1.2) sendMsg("-sh") task.wait(1.2) sendMsg("-net") end) end) reanimateBtn.MouseButton1Click:Connect(function() startPetLogic() end) toggleModeBtn.MouseButton1Click:Connect(function() if SystemState.Mode == "FOLLOW_MOUSE" then mouseFollowBtn.Text = "Follow Mouse: OFF" TweenService:Create(mouseFollowStroke, TweenInfo.new(0.2), {Color = Color3.fromRGB(45, 45, 60)}):Play() end if SystemState.Mode == "FREE" then SystemState.Mode = "FOLLOW_SELF" toggleModeBtn.Text = "Mode: Orbiting You" else SystemState.Mode = "FREE" toggleModeBtn.Text = "Mode: Free Flying" end end) mouseFollowBtn.MouseButton1Click:Connect(function() if SystemState.Mode == "FOLLOW_MOUSE" then SystemState.Mode = "FREE" mouseFollowBtn.Text = "Follow Mouse: OFF" TweenService:Create(mouseFollowStroke, TweenInfo.new(0.2), {Color = Color3.fromRGB(45, 45, 60)}):Play() toggleModeBtn.Text = "Mode: Free Flying" else SystemState.Mode = "FOLLOW_MOUSE" mouseFollowBtn.Text = "Follow Mouse: ON" TweenService:Create(mouseFollowStroke, TweenInfo.new(0.2), {Color = Color3.fromRGB(100, 100, 140)}):Play() toggleModeBtn.Text = "Mode: Mouse Active" end end)