To explain why the part at the showcase at the beginning of the video didn't move, you were only moving it on the client, but your script is on the server, so your script didn't see the change and didn't think the part was close enough to be sucked in.
script local blackHole = script.Parent local pullRadius = 200 local basePullStrength = 100 local damageRadius = 10 local damageAmount = 10 local damageInterval = 1 local function applyPullEffect() while true do local objectsInRange = workspace:GetDescendants() for _, object in ipairs(objectsInRange) do if object:IsA("BasePart") and (blackHole.Position - object.Position).Magnitude < pullRadius then local distance = (blackHole.Position - object.Position).Magnitude local direction = (blackHole.Position - object.Position).unit local bodyVelocity = object:FindFirstChild("BodyVelocity") if not bodyVelocity then bodyVelocity = Instance.new("BodyVelocity") bodyVelocity.MaxForce = Vector3.new(1e6, 1e6, 1e6) -- 1e6 = 10^6 = 1,000,000 bodyVelocity.Parent = object end local pullVelocity = direction * basePullStrength * (1 - (distance / pullRadius)) local currentVelocity = object.AssemblyLinearVelocity local velocityTowardsBlackHole = currentVelocity:Dot(direction) * direction local dampenedVelocity = pullVelocity + velocityTowardsBlackHole * 0.5 bodyVelocity.Velocity = dampenedVelocity object.Touched:Connect(function(hit) if hit == blackHole then object:Destroy() end end) else local bodyVelocity = object:FindFirstChild("BodyVelocity") if bodyVelocity then bodyVelocity:Destroy() end end end task.wait(0.1) end end local function damagePlayers() while true do local players = game.Players:GetPlayers() for _, player in ipairs(players) do local character = player.Character if character and character:FindFirstChild("HumanoidRootPart") then local distance = (blackHole.Position - character.HumanoidRootPart.Position).Magnitude if distance < damageRadius then local humanoid = character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid:TakeDamage(damageAmount) end end end end task.wait(damageInterval) end end coroutine.wrap(applyPullEffect)() coroutine.wrap(damagePlayers)()