Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Players = game:GetService("Players")
- local RunService = game:GetService("RunService")
- local UserInputService = game:GetService("UserInputService")
- local ContextActionService = game:GetService("ContextActionService")
- local camera = nil
- local cameraUpdateConn = nil
- local controlUpdateConn = nil
- local inputConn = nil
- local leftValue = 0
- local rightValue = 0
- local forwardValue = 0
- local backwardValue = 0
- local function updateCamera()
- if camera.CameraType == Enum.CameraType.Scriptable then
- local subject = camera.CameraSubject
- if subject then
- if subject:IsA("Humanoid") then
- local root = subject.Torso
- if root and root:IsA("BasePart") then
- camera.Focus = CFrame.new(root.CFrame.p)
- camera.CoordinateFrame = CFrame.new(camera.Focus.p + Vector3.new(0, 30, -5), camera.Focus.p)
- end
- end
- end
- end
- end
- local function updateControl()
- local player = Players.LocalPlayer
- if player and player.Character then
- player:Move(Vector3.new(leftValue - rightValue, 0, forwardValue - backwardValue))
- end
- end
- local function moveLeft(action, inputState, inputObject)
- if inputState == Enum.UserInputState.Begin then
- leftValue = 1
- elseif inputState == Enum.UserInputState.End then
- leftValue = 0
- end
- end
- local function moveRight(action, inputState, inputObject)
- if inputState == Enum.UserInputState.Begin then
- rightValue = 1
- elseif inputState == Enum.UserInputState.End then
- rightValue = 0
- end
- end
- local function moveForward(action, inputState, inputObject)
- if inputState == Enum.UserInputState.Begin then
- forwardValue = 1
- elseif inputState == Enum.UserInputState.End then
- forwardValue = 0
- end
- end
- local function moveBackward(action, inputState, inputObject)
- if inputState == Enum.UserInputState.Begin then
- backwardValue = 1
- elseif inputState == Enum.UserInputState.End then
- backwardValue = 0
- end
- end
- local function bindCameraUpdate()
- RunService:BindToRenderStep("cameraStep", Enum.RenderPriority.Camera.Value, updateCamera)
- end
- local function bindControlUpdate()
- RunService:BindToRenderStep("controlStep", Enum.RenderPriority.Input.Value, updateControl)
- end
- local function onPlayerAdded()
- local bound = pcall(bindCameraUpdate)
- if not bound then
- if cameraUpdateConn then
- cameraUpdateConn:disconnect()
- end
- cameraUpdateConn = RunService.RenderStepped:connect(updateCamera)
- end
- camera = workspace.CurrentCamera
- camera.CameraType = Enum.CameraType.Scriptable.Value
- end
- local function onInputEnabled()
- if not UserInputService.KeyboardEnabled or not UserInputService.MouseEnabled then
- -- TODO: Notify that mouse and keyboard are required.
- if not inputConn then
- inputConn = UserInputService.Changed:connect(onInputEnabled)
- end
- else
- if inputConn then inputConn:disconnect() end
- -- TODO: Remove notification.
- local bound = pcall(bindControlUpdate)
- if not bound then
- if controlUpdateConn then
- controlUpdateConn:disconnect()
- end
- controlUpdateConn = RunService.RenderStepped:connect(updateControl)
- end
- ContextActionService:BindActionToInputTypes("forwardMovement", moveForward, false, Enum.PlayerActions.CharacterForward)
- ContextActionService:BindActionToInputTypes("backwardMovement", moveBackward, false, Enum.PlayerActions.CharacterBackward)
- ContextActionService:BindActionToInputTypes("leftMovement", moveLeft, false, Enum.PlayerActions.CharacterLeft)
- ContextActionService:BindActionToInputTypes("rightMovement", moveRight, false, Enum.PlayerActions.CharacterRight)
- end
- end
- while Players.LocalPlayer == nil do wait() end
- onPlayerAdded()
- while not UserInputService.KeyboardEnabled and not UserInputService.TouchEnabled and not UserInputService.GamepadEnabled and not UserInputService.MouseEnabled do wait() end
- onInputEnabled()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement