-- Services
local input = game:GetService("UserInputService") -- Gets input from player's keyboard
local rs = game:GetService("RunService") -- Handles the runtime of the game
local camera = game.Workspace.CurrentCamera
-- Player
local player = game:GetService("Players").LocalPlayer -- Player
local character -- Player's character
local root -- Character's HumanoidRootPart
local humanoid -- Character's Humanoid
player.CharacterAdded:connect(function(Char)
character = Char
root = Char:WaitForChild("HumanoidRootPart")
humanoid = Char:WaitForChild("Humanoid")
end)
-- Body Properties
local bodyVel = Instance.new("BodyVelocity", script) -- Create "BodyVelocity" in rootpart
bodyVel.MaxForce = Vector3.new(math.huge, math.huge, math.huge) -- Infinite potential forces
bodyVel.Velocity = Vector3.new() -- No velocity / not moving
-- Directional Values
local xDelta = 0 -- 1/0/-1 = left/not moving/right
local lastXDelta = 0
local zDelta = 0 -- 1/0/-1 = forwards/not moving/backwards
local lastZDelta = 0
-- Speed Settings
local maxSpeed = 200 -- Maximum total speed
local currentSpeed = 0 -- Current flying speed
-- Current Flying Status
local flying = false
-- Activate/Deactivate Flying
input.InputBegan:connect(function(keyPut)
local key = keyPut.KeyCode -- What key was pressed
if key == Enum.KeyCode.F and flying == false then
bodyVel.Parent = root
bodyVel.Velocity = root.Velocity
flying = true -- Activate flying
elseif key == Enum.KeyCode.F and flying == true then
bodyVel.Parent = script
flying = false
end
end)
-- Flying controls
input.InputBegan:connect(function(keyPut)
local key = keyPut.KeyCode
if key == Enum.KeyCode.W then -- Forward Movement
zDelta = zDelta - 1
elseif key == Enum.KeyCode.A then -- Left Movement
xDelta = xDelta - 1
elseif key == Enum.KeyCode.S then -- Backwards Movement
zDelta = zDelta + 1
elseif key == Enum.KeyCode.D then -- Right Movement
xDelta = xDelta + 1
end
end)
input.InputEnded:connect(function(keyPut)
local key = keyPut.KeyCode
if key == Enum.KeyCode.W then
zDelta = zDelta + 1
elseif key == Enum.KeyCode.A then
xDelta = xDelta + 1
elseif key == Enum.KeyCode.S then
zDelta = zDelta - 1
elseif key == Enum.KeyCode.D then
xDelta = xDelta - 1
end
end)
-- Are you flying?
rs.RenderStepped:connect(function()
if flying then
if xDelta ~= 0 or zDelta ~= 0 then
lastXDelta = xDelta
local direction = CFrame.new(camera.CFrame.p, (camera.CFrame * CFrame.new(xDelta, 0, zDelta)).p)
if currentSpeed < (maxSpeed - 5) then
currentSpeed = currentSpeed + (0.01 * maxSpeed)
elseif math.floor(currentSpeed) == maxSpeed or currentSpeed > maxSpeed then
currentSpeed = maxSpeed
end
bodyVel.Velocity = direction.LookVector * currentSpeed
else
if currentSpeed > 5 then
bodyVel.Velocity = bodyVel.Velocity / currentSpeed
currentSpeed = currentSpeed - (.02 * currentSpeed)
bodyVel.Velocity = bodyVel.Velocity * currentSpeed
else
currentSpeed = 0
end
end
end
end)
My script might be too rigid for what I'm trying to do but I can redo it if I learn the method on how to achieve momentum physics for a more realistic flying.
