I have a stamina system in my game but for some reason when you stop pressing shift before all of the stamina is gone you get stuck in place and can only jump. I don't get any errors from the scripts.

The script has 2 parts, 1 for the server and 1 for the client.

Here is the client one:

local UserInputService = game:GetService("UserInputService")
local ReplicaitedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")

UserInputService.InputBegan:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.LeftShift then
		ReplicaitedStorage.RemoteEvents.Sprint:FireServer("Began")
	end
end)

UserInputService.InputEnded:Connect(function(input)
	if input.KeyCode == Enum.KeyCode.LeftShift then
		ReplicaitedStorage.RemoteEvents.Sprint:FireServer("Ended")
	end
end)


ReplicaitedStorage.RemoteEvents.StaminaUpdate.OnClientEvent:Connect(function(stamina, maxStamina)
	Players.LocalPlayer.PlayerGui.Stamina.Bar.Size = UDim2.new((stamina / maxStamina) * .2, 78, 0.037, 0)
end)

Here is the server one:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local players = game:GetService("Players")
local RunService = game:GetService("RunService")

local MaxStamina = 700
local staminaRegen = 0.5

local SprintModifer = 1.5
local sprintStaminaCost = 3

local sprintingPlayers = {}


players.PlayerAdded:Connect(function(player)
	local stamina = Instance.new("IntValue" , players)
	stamina.Value = MaxStamina
	stamina.Name = "Stamina"
	
	
	stamina.Changed:Connect(function(property)
		ReplicatedStorage.RemoteEvents.StaminaUpdate:FireClient(player, stamina.Value, MaxStamina)
	end)
end)

ReplicatedStorage.RemoteEvents.Sprint.OnServerEvent:Connect(function(player, state)
	local humanoid = player.Character.Humanoid
	
	if state == "Began" and humanoid:GetState() == Enum.HumanoidStateType.RunningNoPhysics and humanoid.MoveDirection.Magnitude > 0 then
		sprintingPlayers[player.name] = humanoid.WalkSpeed
		humanoid.WalkSpeed = humanoid.WalkSpeed * SprintModifer
	elseif state == "Ended" and sprintingPlayers[player.Name] then
		humanoid.WalkSpeed = sprintingPlayers[players.Name]
		sprintingPlayers[player.name] = nil
		
	
	end
end)

RunService.Heartbeat:Connect(function()
	for index, player in pairs(players:GetChildren()) do
		local stamina = players.Stamina
		local name = player.name
		
		if not sprintingPlayers[name] then
			if stamina.Value > MaxStamina then
				stamina.Value = MaxStamina
			elseif stamina.Value < MaxStamina then
				stamina.Value = stamina.Value + staminaRegen
			end
		else
			if stamina.Value >= sprintStaminaCost then
				stamina.Value = stamina.Value - sprintStaminaCost
			else
				player.Character.Humanoid.WalkSpeed = sprintingPlayers[name]
				sprintingPlayers[name] = nil
			end
		end		
	end
end)


If you could also give a detailed explanation of the solution that would be great. I'm pretty new to scripting with Lua, I only started in March, so please bear with me.

Re-edited by JesseSong!