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!
