-- Script By @AzizAnzofficiall on Youtube -- ScriptBlox Account @AzScripter local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local cam = workspace.CurrentCamera local blurEffect = Instance.new("BlurEffect") blurEffect.Size = 0 blurEffect.Parent = cam local walkSpeed = 5 local sprintSpeed = 25 local maxStamina = 100 local staminaDrainRate = 20 local staminaRegenRate = 20 local fovSprint = 85 local fovNormal = 70 local fovExhausted = 50 local fadeSpeed = 10 local flashInterval = 0.3 local sprintButtonYOffset = 60 local stamina = maxStamina local sprinting = false local isFlashing = false local isExhausted = false local isShaking = false local isCameraShaking = false local currentFOVState = "normal" local gui = Instance.new("ScreenGui") gui.Name = "SprintSystem" gui.ResetOnSpawn = false gui.Parent = player:WaitForChild("PlayerGui") local staminaBackground = Instance.new("Frame") staminaBackground.Size = UDim2.new(0.3, 0, 0.05, 0) staminaBackground.Position = UDim2.new(0.05, 0, 0.9, 0) staminaBackground.BackgroundColor3 = Color3.new(0, 0, 0) staminaBackground.BackgroundTransparency = 0.5 staminaBackground.BorderSizePixel = 0 staminaBackground.Parent = gui local staminaFill = Instance.new("Frame") staminaFill.Size = UDim2.new(1, 0, 1, 0) staminaFill.BackgroundColor3 = Color3.new(1, 1, 1) staminaFill.BorderSizePixel = 0 staminaFill.Parent = staminaBackground local sprintBtn = Instance.new("ImageButton") sprintBtn.Name = "SprintButton" sprintBtn.AnchorPoint = Vector2.new(0.5, 1) sprintBtn.BackgroundTransparency = 1 sprintBtn.Image = "rbxassetid://89190879948216" sprintBtn.Parent = gui local breathSound = Instance.new("Sound") breathSound.SoundId = "rbxassetid://6814463121" breathSound.Volume = 1 breathSound.Looped = true local function changeFOV(target) TweenService:Create(cam, TweenInfo.new(0.5, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {FieldOfView = target}):Play() end local function shakeStaminaUI() if isShaking then return end isShaking = true task.spawn(function() while isShaking do local offsetX = math.random(-5, 5) local offsetY = math.random(-2, 2) staminaBackground.Position = UDim2.new(0.05, offsetX, 0.9, offsetY) task.wait(0.05) end end) end local function stopShakeStaminaUI() isShaking = false staminaBackground.Position = UDim2.new(0.05, 0, 0.9, 0) end local function shakeCamera(humanoid) if isCameraShaking then return end isCameraShaking = true task.spawn(function() while isCameraShaking do local camX = (math.random(-2, 2) * 0.1) local camY = (math.random(-2, 2) * 0.1) humanoid.CameraOffset = Vector3.new(camX, camY, 0) task.wait(0.05) end end) end local function stopShakeCamera(humanoid) isCameraShaking = false humanoid.CameraOffset = Vector3.new(0, 0, 0) end local function startFlash() if isFlashing then return end isFlashing = true task.spawn(function() while isFlashing do staminaFill.BackgroundColor3 = Color3.new(1, 0, 0) TweenService:Create(staminaFill, TweenInfo.new(flashInterval), {BackgroundTransparency = 0}):Play() task.wait(flashInterval) TweenService:Create(staminaFill, TweenInfo.new(flashInterval), {BackgroundTransparency = 1}):Play() task.wait(flashInterval) end end) end local function stopFlash() isFlashing = false staminaFill.BackgroundColor3 = Color3.new(1, 1, 1) staminaFill.BackgroundTransparency = 0 end local function setupSprintButton() sprintBtn.MouseButton1Down:Connect(function() if stamina > 0 and not isExhausted then sprinting = true sprintBtn.Image = "rbxassetid://96892467644525" end end) sprintBtn.MouseButton1Up:Connect(function() sprinting = false sprintBtn.Image = "rbxassetid://89190879948216" end) end setupSprintButton() -- Call once to set up connections local function initializeCharacter(newCharacter) local humanoid = newCharacter:WaitForChild("Humanoid") local hrp = newCharacter:WaitForChild("HumanoidRootPart") breathSound.Parent = hrp stamina = maxStamina sprinting = false isExhausted = false stopFlash() stopShakeStaminaUI() stopShakeCamera(humanoid) if breathSound.IsPlaying then breathSound:Stop() end TweenService:Create(blurEffect, TweenInfo.new(1), {Size = 0}):Play() changeFOV(fovNormal) currentFOVState = "normal" humanoid.WalkSpeed = walkSpeed -- Handle death to reset on respawn humanoid.Died:Connect(function() sprinting = false isExhausted = false stopFlash() stopShakeStaminaUI() stopShakeCamera(humanoid) if breathSound.IsPlaying then breathSound:Stop() end TweenService:Create(blurEffect, TweenInfo.new(1), {Size = 0}):Play() end) return humanoid end local humanoid = initializeCharacter(player.Character or player.CharacterAdded:Wait()) player.CharacterAdded:Connect(function(newCharacter) humanoid = initializeCharacter(newCharacter) end) RunService.RenderStepped:Connect(function() local jumpBtn = player.PlayerGui:FindFirstChild("TouchGui") and player.PlayerGui.TouchGui:FindFirstChild("TouchControlFrame") and player.PlayerGui.TouchGui.TouchControlFrame:FindFirstChild("JumpButton") if jumpBtn then sprintBtn.Size = jumpBtn.Size local pos = jumpBtn.AbsolutePosition local size = jumpBtn.AbsoluteSize sprintBtn.Position = UDim2.new(0, pos.X + size.X/2, 0, pos.Y - size.Y + sprintButtonYOffset) end end) RunService.RenderStepped:Connect(function(dt) local isMoving = humanoid.MoveDirection.Magnitude > 0.1 if isExhausted or stamina <= 0 then sprinting = false sprintBtn.Image = "rbxassetid://89190879948216" end if sprinting and stamina > 0 and isMoving and not isExhausted then stamina = math.max(0, stamina - staminaDrainRate * dt) humanoid.WalkSpeed = sprintSpeed if currentFOVState ~= "sprint" then changeFOV(fovSprint) currentFOVState = "sprint" end else humanoid.WalkSpeed = walkSpeed if isExhausted then stamina = math.min(maxStamina, stamina + staminaRegenRate * 0.5 * dt) if currentFOVState ~= "exhausted" then changeFOV(fovExhausted) currentFOVState = "exhausted" end else stamina = math.min(maxStamina, stamina + staminaRegenRate * dt) if currentFOVState ~= "normal" then changeFOV(fovNormal) currentFOVState = "normal" end end end staminaFill.Size = UDim2.new(stamina / maxStamina, 0, 1, 0) if stamina <= 0 and not isExhausted then stamina = 0 sprinting = false sprintBtn.Image = "rbxassetid://89190879948216" isExhausted = true startFlash() shakeStaminaUI() shakeCamera(humanoid) if not breathSound.IsPlaying then breathSound:Play() breathSound.Volume = 1 end TweenService:Create(blurEffect, TweenInfo.new(0.5), {Size = 20}):Play() elseif isExhausted and stamina >= maxStamina * 0.5 then isExhausted = false stopFlash() stopShakeStaminaUI() stopShakeCamera(humanoid) TweenService:Create(blurEffect, TweenInfo.new(1), {Size = 0}):Play() end if breathSound.IsPlaying then if isExhausted then breathSound.Volume = 1 else breathSound.Volume = math.clamp(breathSound.Volume - dt * 5, 0, 1) if breathSound.Volume <= 0 then breathSound:Stop() breathSound.Volume = 1 end end else if isExhausted then breathSound:Play() breathSound.Volume = 1 end end local targetTransparency = (stamina >= maxStamina) and 1 or 0 staminaBackground.BackgroundTransparency = staminaBackground.BackgroundTransparency + (targetTransparency - staminaBackground.BackgroundTransparency) * dt * fadeSpeed staminaFill.BackgroundTransparency = staminaFill.BackgroundTransparency + (targetTransparency - staminaFill.BackgroundTransparency) * dt * fadeSpeed end) cam.FieldOfView = fovNormal