local PathfindingService = game:GetService("PathfindingService") local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local TweenService = game:GetService("TweenService") local MAX_RATS = 12 local WHIELIST = {["YourUsernameHere"] = true} local ATTACK_RANGE = 5 local BLOOD_COLOR = Color3.fromRGB(150, 0, 0) local function playNibbleTween(headPart) local tween = TweenService:Create(headPart, TweenInfo.new(0.1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, 0, true), { CFrame = headPart.CFrame * CFrame.new(0, 0, 0.2) }) tween:Play() end local function performRip(target) local missingFolder = target:FindFirstChild("MissingLimbs") or Instance.new("Folder", target) missingFolder.Name = "MissingLimbs" local legJoints = {} local otherJoints = {} for _, desc in pairs(target:GetDescendants()) do if desc:IsA("Motor6D") and desc.Name ~= "RootJoint" and desc.Name ~= "Neck" then if not missingFolder:FindFirstChild(desc.Name) then if string.find(desc.Name, "Leg") or string.find(desc.Name, "Foot") then table.insert(legJoints, desc) else table.insert(otherJoints, desc) end end end end local targetJoint = #legJoints > 0 and legJoints[math.random(#legJoints)] or (#otherJoints > 0 and otherJoints[math.random(#otherJoints)] or nil) if targetJoint then local marker = Instance.new("BoolValue", missingFolder) marker.Name = targetJoint.Name targetJoint:Destroy() return true end return false end local function executeAttack(ratData, target) local hum = target:FindFirstChild("Humanoid") local root = target:FindFirstChild("HumanoidRootPart") if not hum or not root then return end ratData.isStunned = true hum:TakeDamage(10) hum.PlatformStand = true local bv = Instance.new("BodyVelocity", root) bv.MaxForce = Vector3.new(5000, 0, 5000) local start = tick() while tick() - start < 2 do bv.Velocity = (ratData.model.PrimaryPart.Position - root.Position).Unit * 6 playNibbleTween(ratData.model.Head) task.wait(0.2) end bv:Destroy() if math.random() > 0.5 then if performRip(target) then local part = Instance.new("Part", workspace) part.Position = root.Position; part.Anchored = true; part.Transparency = 1 local em = Instance.new("ParticleEmitter", part) em.Color = ColorSequence.new(BLOOD_COLOR); em.Rate = 100 Debris:AddItem(part, 1) end end hum.PlatformStand = false ratData.isStunned = false end local function createRat(pos) local model = Instance.new("Model", workspace); model.Name = "Rat" local root = Instance.new("Part", model) root.Name = "HumanoidRootPart"; root.Size = Vector3.new(2, 2, 2); root.Transparency = 1 root.CanCollide = true; root.CFrame = CFrame.new(pos + Vector3.new(0,1,0)) model.PrimaryPart = root local head = Instance.new("Part", model) head.Name = "Head"; head.Size = Vector3.new(1.5, 1.5, 1.5); head.CanCollide = false head.CFrame = root.CFrame * CFrame.new(0, -0.3, 0) local mesh = Instance.new("SpecialMesh", head) mesh.MeshId = "rbxassetid://106612668"; mesh.TextureId = "rbxassetid://106612711" local weld = Instance.new("WeldConstraint", root); weld.Part0 = root; weld.Part1 = head; weld.Parent = root local hum = Instance.new("Humanoid", model) return {model = model, target = nil, isStunned = false, isAggressive = math.random() > 0.5} end local activeRats = {} RunService.Heartbeat:Connect(function() if #activeRats < MAX_RATS then table.insert(activeRats, createRat(Vector3.new(math.random(-50,50), 5, math.random(-50,50)))) end for i, ratData in pairs(activeRats) do local rat = ratData.model if not rat or not rat.Parent then table.remove(activeRats, i); continue end if ratData.isStunned then continue end if ratData.isAggressive and (not ratData.target or ratData.target.Parent == nil) then for _, p in pairs(Players:GetPlayers()) do if p.Character and not WHIELIST[p.Name] then ratData.target = p.Character; break end end end if ratData.target then local dist = (rat.PrimaryPart.Position - ratData.target.HumanoidRootPart.Position).Magnitude if dist < ATTACK_RANGE then executeAttack(ratData, ratData.target) else rat.Humanoid:MoveTo(ratData.target.HumanoidRootPart.Position) end else if math.random(1, 200) == 1 then rat.Humanoid:MoveTo(rat.PrimaryPart.Position + Vector3.new(math.random(-20,20), 0, math.random(-20,20))) end end end end)