How can I improve this sprinting system code?

How can I improve this Sprinting system?

image

local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

local Players = game:GetService("Players")

local Camera = workspace.CurrentCamera

local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")

local OriginalSpeed = 16
local SprintingSpeed = 26

local OriginalFieldOfView = 90
local SprintingFieldOfView = 100

local Sprinting = script:WaitForChild("Sprinting")
local Animation = script:WaitForChild("SprintingAnimation")
local SprintingTrack = Humanoid:LoadAnimation(Animation)

local TweenFieldOfView = function(Duration, Value)
	local FieldOfViewTween = TweenService:Create(Camera, TweenInfo.new(Duration, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {FieldOfView = Value})
	
	FieldOfViewTween:Play()
	
	return FieldOfViewTween
end

UserInputService.InputBegan:Connect(function(Input, Processed)
	if Input.KeyCode == Enum.KeyCode.LeftControl and not Processed then
		if Humanoid.MoveDirection.Magnitude <= 0 then
			Sprinting.Value = true
			
			Humanoid.WalkSpeed = SprintingSpeed
		else
			Sprinting.Value = true
			
			Humanoid.WalkSpeed = SprintingSpeed
			
			SprintingTrack:Play(0.25)
		end
	end
end)

UserInputService.InputEnded:Connect(function(Input, Processed)
	if Input.KeyCode == Enum.KeyCode.LeftControl and not Processed then
		Sprinting.Value = false
		
		Humanoid.WalkSpeed = OriginalSpeed
		
		SprintingTrack:Stop(0.25)
	end
end)

Sprinting:GetPropertyChangedSignal("Value"):Connect(function()
	if Sprinting.Value then
		TweenFieldOfView(0.5, SprintingFieldOfView)
	elseif not Sprinting.Value then
		TweenFieldOfView(0.5, OriginalFieldOfView)
	end
end)

RunService.RenderStepped:Connect(function()
	if Sprinting.Value then
		if Humanoid.MoveDirection.Magnitude <= 0 then
			if SprintingTrack.IsPlaying then
				SprintingTrack:Stop(0.25)
			end
		elseif Humanoid.MoveDirection.Magnitude > 0 then
			if not SprintingTrack.IsPlaying then
				SprintingTrack:Play(0.25)
			end
		end
		
		if Humanoid.FloorMaterial == Enum.Material.Air then
			if SprintingTrack.IsPlaying then
				SprintingTrack:Stop(0.1)
			end
		elseif Humanoid.FloorMaterial ~= Enum.Material.Air and Humanoid.MoveDirection.Magnitude > 0 then
			if not SprintingTrack.IsPlaying then
				SprintingTrack:Play(0.25)
			end
		end
	end
end)
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

local Players = game:GetService("Players")

local Camera = workspace.CurrentCamera

local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")

local OriginalSpeed = 16
local SprintingSpeed = 26

local OriginalFieldOfView = 90
local SprintingFieldOfView = 100

local Sprinting = script:WaitForChild("Sprinting")
local Animation = script:WaitForChild("SprintingAnimation")
local SprintingTrack = Humanoid:LoadAnimation(Animation)

local TweenFieldOfView = function(Duration, Value)
	local FieldOfViewTween = TweenService:Create(Camera, TweenInfo.new(Duration, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {FieldOfView = Value})
	
	FieldOfViewTween:Play()
	
	return FieldOfViewTween
end

UserInputService.InputBegan:Connect(function(Input, Processed)
	if Input.KeyCode == Enum.KeyCode.LeftControl and not Processed then
		if Humanoid.MoveDirection.Magnitude <= 0 then
			Sprinting.Value = true
			TweenFieldOfView(0.5, SprintingFieldOfView)
			
			Humanoid.WalkSpeed = SprintingSpeed
		else
			Sprinting.Value = true
			TweenFieldOfView(0.5, SprintingFieldOfView)
			
			Humanoid.WalkSpeed = SprintingSpeed
			
			SprintingTrack:Play(0.25)
		end
	end
end)

UserInputService.InputEnded:Connect(function(Input, Processed)
	if Input.KeyCode == Enum.KeyCode.LeftControl and not Processed then
		Sprinting.Value = false
		
		Humanoid.WalkSpeed = OriginalSpeed
		TweenFieldOfView(0.5, OriginalFieldOfView)
		
		SprintingTrack:Stop(0.25)
	end
end)

RunService.RenderStepped:Connect(function()
	if Sprinting.Value then
		if Humanoid.MoveDirection.Magnitude <= 0 then
			if SprintingTrack.IsPlaying then
				SprintingTrack:Stop(0.25)
			end
		elseif Humanoid.MoveDirection.Magnitude > 0 then
			if not SprintingTrack.IsPlaying then
				SprintingTrack:Play(0.25)
			end
		end
		
		if Humanoid.FloorMaterial == Enum.Material.Air then
			if SprintingTrack.IsPlaying then
				SprintingTrack:Stop(0.1)
			end
		elseif Humanoid.FloorMaterial ~= Enum.Material.Air and Humanoid.MoveDirection.Magnitude > 0 then
			if not SprintingTrack.IsPlaying then
				SprintingTrack:Play(0.25)
			end
		end
	end
end)
1 Like

Can be reduced to

Sprinting.Value = true
Humanoid.WalkSpeed = SprintingSpeed

if Humanoid.MoveDirection.Magnitude > 0 then
	SprintingTrack:Play(0.25)
end

Can be reduced to by using the ternary operator:

Sprinting:GetPropertyChangedSignal("Value"):Connect(function()
	TweenFieldOfView(0.5, Sprinting.Value and SprintingFieldOfView or OriginalFieldOfView)
end)

Also I noticed a couple of cases where you used elseif while using only else would be equivalent.

I have not covered the entire script, but you can probably shorten more code.

1 Like