Hey,
I am making 1st person game and I want sprint, crouch and smooth movements. Movement looks perfect. I haven’t started making the sprint system but I tried to make shift system but it is not working as I want.
Problems:
- Crouch animation does not start playing when holding shift-button
- Camera is not going down when crouch and up when not holding shift-button
- Crouch animation not showing to other players (I may already have solution for this but you can help me with this also if you want to.)
Codes are here:
Smooth Walk (local script):
local Player = game:GetService("Players").LocalPlayer
local Mouse = Player:GetMouse()
local Camera = game:GetService("Workspace").CurrentCamera
local UserInputService = game:GetService("UserInputService")
local Humanoid = Player.Character:WaitForChild("Humanoid")
local shift = false
local bobbing = nil
local func1 = 0
local func2 = 0
local func3 = 0
local func4 = 0
local val = 0
local val2 = 0
local int = 5
local int2 = 5
local vect3 = Vector3.new()
local m = Player:GetMouse()
m.Icon = "http://www.roblox.com/asset/?id=569021388"
--UserInputService.MouseIconEnabled = false
function lerp(a, b, c)
return a + (b - a) * c
end
bobbing = game:GetService("RunService").RenderStepped:Connect(function(deltaTime)
deltaTime = deltaTime * 30
if Humanoid.Health <= 0 then
bobbing:Disconnect()
return
end
local rootMagnitude = Humanoid.RootPart and Vector3.new(Humanoid.RootPart.Velocity.X, 0, Humanoid.RootPart.Velocity.Z).Magnitude or 0
local calcRootMagnitude = math.min(rootMagnitude, 25)
if deltaTime > 1.5 then
func1 = 0
func2 = 0
else
func1 = lerp(func1, math.cos(tick() * 0.5 * math.random(7.5, 10)) * (math.random(6, 10) / 100) * deltaTime, 0.05 * deltaTime)
func2 = lerp(func2, math.cos(tick() * 0.5 * math.random(5, 9)) * (math.random(1, 5) / 100) * deltaTime, 0.05 * deltaTime)
end
Camera.CFrame = Camera.CFrame * (CFrame.fromEulerAnglesXYZ(0, 0, math.rad(func3)) * CFrame.fromEulerAnglesXYZ(math.rad(func4 * deltaTime), math.rad(val * deltaTime), val2) * CFrame.Angles(0, 0, math.rad(func4 * deltaTime * (calcRootMagnitude / 5))) * CFrame.fromEulerAnglesXYZ(math.rad(func1), math.rad(func2), math.rad(func2 * 10)))
val2 = math.clamp(lerp(val2, -Camera.CFrame:VectorToObjectSpace((Humanoid.RootPart and Humanoid.RootPart.Velocity or Vector3.new()) / math.max(Humanoid.WalkSpeed, 0.01)).X * 0.04, 0.1 * deltaTime), -0.12, 0.1)
func3 = lerp(func3, math.clamp(UserInputService:GetMouseDelta().X, -2.5, 2.5), 0.25 * deltaTime)
func4 = lerp(func4, math.sin(tick() * int) / 5 * math.min(1, int2 / 10), 0.25 * deltaTime)
if rootMagnitude > 1 then
val = lerp(val, math.cos(tick() * 0.5 * math.floor(int)) * (int / 200), 0.25 * deltaTime)
else
val = lerp(val, 0, 0.05 * deltaTime)
end
if rootMagnitude > 6 then
int = 10
int2 = 9
elseif rootMagnitude > 0.1 then
int = 6
int2 = 7
else
int2 = 0
end
Player.CameraMaxZoomDistance = 128
Player.CameraMinZoomDistance = 0.5
vect3 = lerp(vect3, Camera.CFrame.LookVector, 0.125 * deltaTime)
end)
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
if not gameProcessedEvent then
if input.KeyCode == Enum.KeyCode.LeftShift or input.KeyCode == Enum.KeyCode.RightShift then
Camera.CFrame = Camera.CFrame * CFrame.new(0, -2, 0)
end
end
end)
UserInputService.InputEnded:Connect(function(input, gameProcessedEvent)
if not gameProcessedEvent then
if input.KeyCode == Enum.KeyCode.LeftShift or input.KeyCode == Enum.KeyCode.RightShift then
Camera.CFrame = Camera.CFrame * CFrame.new(0, 2, 0)
end
end
end)
Crouch (local script):
local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local crouchAnimation = game.ReplicatedStorage.crouch
local walkAnimation = game.ReplicatedStorage.CrouchLoop
local crouchIdleAnimation = game.ReplicatedStorage.CrouchIdle
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local AnimationID = "15411945306"
local CameraOffsetOn = Vector3.new(0, 0, 0)
local CameraOffsetOff = Vector3.new(0, 0, 0)
local WalkSpeedCrouched = 8 --CROUCH SPEED
local WalkSpeedStanding = 16
local PlaybackSpeedCrouched = 1
local PlaybackSpeedStanding = 1
local CrouchAnimation = Humanoid:LoadAnimation(walkAnimation)
local CrouchIdleAnimation = Humanoid:LoadAnimation(crouchIdleAnimation)
local Crouching = false
local function setCrouchState(isCrouching)
Crouching = isCrouching
if isCrouching then
--Humanoid.WalkSpeed = WalkSpeedCrouched
TweenService:Create(Humanoid, TweenInfo.new(0.25), { CameraOffset = CameraOffsetOn }):Play()
--Character.HumanoidRootPart.Running.PlaybackSpeed = PlaybackSpeedCrouched
--Character.HumanoidRootPart.CanCollide = false
else
Humanoid.WalkSpeed = WalkSpeedStanding
TweenService:Create(Humanoid, TweenInfo.new(0.25), { CameraOffset = CameraOffsetOff }):Play()
--Character.HumanoidRootPart.Running.PlaybackSpeed = PlaybackSpeedStanding
--Character.HumanoidRootPart.CanCollide = true
CrouchIdleAnimation:Stop()
CrouchAnimation:Stop()
end
end
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
if not gameProcessedEvent then
if input.KeyCode == Enum.KeyCode.LeftShift or input.KeyCode == Enum.KeyCode.RightShift then
setCrouchState(true)
end
end
end)
UserInputService.InputEnded:Connect(function(input, gameProcessedEvent)
if not gameProcessedEvent then
if input.KeyCode == Enum.KeyCode.LeftShift or input.KeyCode == Enum.KeyCode.RightShift then
setCrouchState(false)
end
end
end)
Humanoid.Running:Connect(function(speed)
if Crouching then
if speed > 0 then
CrouchAnimation:Play()
CrouchIdleAnimation:Stop()
else
CrouchIdleAnimation:Play()
CrouchAnimation:Stop()
end
end
end)