176 lines
5.7 KiB
Lua
176 lines
5.7 KiB
Lua
--[[
|
|
// FileName: ComputerMovementKeyboardMovement
|
|
// Version 1.2
|
|
// Written by: jeditkacheff/jmargh
|
|
// Description: Implements movement controls for keyboard devices
|
|
--]]
|
|
local Players = game:GetService('Players')
|
|
local UserInputService = game:GetService('UserInputService')
|
|
local ContextActionService = game:GetService('ContextActionService')
|
|
local StarterPlayer = game:GetService('StarterPlayer')
|
|
local Settings = UserSettings()
|
|
local GameSettings = Settings.GameSettings
|
|
|
|
local KeyboardMovement = {}
|
|
|
|
while not Players.LocalPlayer do
|
|
wait()
|
|
end
|
|
local LocalPlayer = Players.LocalPlayer
|
|
local CachedHumanoid = nil
|
|
local SeatJumpCn = nil
|
|
local TextFocusReleasedCn = nil
|
|
local TextFocusGainedCn = nil
|
|
local WindowFocusReleasedCn = nil
|
|
|
|
local MasterControl = require(script.Parent)
|
|
local currentMoveVector = Vector3.new(0,0,0)
|
|
|
|
--[[ Local Functions ]]--
|
|
local function getHumanoid()
|
|
local character = LocalPlayer and LocalPlayer.Character
|
|
if character then
|
|
if CachedHumanoid and CachedHumanoid.Parent == character then
|
|
return CachedHumanoid
|
|
else
|
|
CachedHumanoid = nil
|
|
for _,child in pairs(character:GetChildren()) do
|
|
if child:IsA('Humanoid') then
|
|
CachedHumanoid = child
|
|
return CachedHumanoid
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[ Public API ]]--
|
|
function KeyboardMovement:Enable()
|
|
if not UserInputService.KeyboardEnabled then
|
|
return
|
|
end
|
|
|
|
local forwardValue = 0
|
|
local backwardValue = 0
|
|
local leftValue = 0
|
|
local rightValue = 0
|
|
|
|
local updateMovement = function(inputState)
|
|
if inputState == Enum.UserInputState.Cancel then
|
|
MasterControl:AddToPlayerMovement(-currentMoveVector)
|
|
currentMoveVector = Vector3.new(0, 0, 0)
|
|
else
|
|
MasterControl:AddToPlayerMovement(-currentMoveVector)
|
|
currentMoveVector = Vector3.new(leftValue + rightValue,0,forwardValue + backwardValue)
|
|
MasterControl:AddToPlayerMovement(currentMoveVector)
|
|
end
|
|
end
|
|
|
|
local moveForwardFunc = function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.Begin then
|
|
forwardValue = -1
|
|
elseif inputState == Enum.UserInputState.End or inputState == Enum.UserInputState.Cancel then
|
|
forwardValue = 0
|
|
end
|
|
updateMovement(inputState)
|
|
end
|
|
|
|
local moveBackwardFunc = function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.Begin then
|
|
backwardValue = 1
|
|
elseif inputState == Enum.UserInputState.End or inputState == Enum.UserInputState.Cancel then
|
|
backwardValue = 0
|
|
end
|
|
updateMovement(inputState)
|
|
end
|
|
|
|
local moveLeftFunc = function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.Begin then
|
|
leftValue = -1
|
|
elseif inputState == Enum.UserInputState.End or inputState == Enum.UserInputState.Cancel then
|
|
leftValue = 0
|
|
end
|
|
updateMovement(inputState)
|
|
end
|
|
|
|
local moveRightFunc = function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.Begin then
|
|
rightValue = 1
|
|
elseif inputState == Enum.UserInputState.End or inputState == Enum.UserInputState.Cancel then
|
|
rightValue = 0
|
|
end
|
|
updateMovement(inputState)
|
|
end
|
|
|
|
local jumpFunc = function(actionName, inputState, inputObject)
|
|
MasterControl:SetIsJumping(inputState == Enum.UserInputState.Begin)
|
|
end
|
|
|
|
-- TODO: remove up and down arrows, these seem unnecessary
|
|
ContextActionService:BindActionToInputTypes("forwardMovement", moveForwardFunc, false, Enum.PlayerActions.CharacterForward)
|
|
ContextActionService:BindActionToInputTypes("backwardMovement", moveBackwardFunc, false, Enum.PlayerActions.CharacterBackward)
|
|
ContextActionService:BindActionToInputTypes("leftMovement", moveLeftFunc, false, Enum.PlayerActions.CharacterLeft)
|
|
ContextActionService:BindActionToInputTypes("rightMovement", moveRightFunc, false, Enum.PlayerActions.CharacterRight)
|
|
ContextActionService:BindActionToInputTypes("jumpAction", jumpFunc, false, Enum.PlayerActions.CharacterJump)
|
|
-- TODO: make sure we check key state before binding to check if key is already down
|
|
|
|
local function onFocusReleased()
|
|
local humanoid = getHumanoid()
|
|
if humanoid then
|
|
MasterControl:AddToPlayerMovement(-currentMoveVector)
|
|
currentMoveVector = Vector3.new(0, 0, 0)
|
|
forwardValue, backwardValue, leftValue, rightValue = 0, 0, 0, 0
|
|
MasterControl:SetIsJumping(false)
|
|
end
|
|
end
|
|
|
|
local function onTextFocusGained(textboxFocused)
|
|
MasterControl:SetIsJumping(false)
|
|
end
|
|
|
|
SeatJumpCn = UserInputService.InputBegan:connect(function(inputObject, isProcessed)
|
|
if inputObject.KeyCode == Enum.KeyCode.Backspace and not isProcessed then
|
|
local humanoid = getHumanoid()
|
|
if humanoid and (humanoid.Sit or humanoid.PlatformStand) then
|
|
MasterControl:DoJump()
|
|
end
|
|
end
|
|
end)
|
|
|
|
TextFocusReleasedCn = UserInputService.TextBoxFocusReleased:connect(onFocusReleased)
|
|
TextFocusGainedCn = UserInputService.TextBoxFocused:connect(onTextFocusGained)
|
|
-- TODO: remove pcall when API is live
|
|
WindowFocusReleasedCn = UserInputService.WindowFocusReleased:connect(onFocusReleased)
|
|
end
|
|
|
|
function KeyboardMovement:Disable()
|
|
ContextActionService:UnbindAction("forwardMovement")
|
|
ContextActionService:UnbindAction("backwardMovement")
|
|
ContextActionService:UnbindAction("leftMovement")
|
|
ContextActionService:UnbindAction("rightMovement")
|
|
ContextActionService:UnbindAction("jumpAction")
|
|
|
|
if SeatJumpCn then
|
|
SeatJumpCn:disconnect()
|
|
SeatJumpCn = nil
|
|
end
|
|
if TextFocusReleasedCn then
|
|
TextFocusReleasedCn:disconnect()
|
|
TextFocusReleasedCn = nil
|
|
end
|
|
if TextFocusGainedCn then
|
|
TextFocusGainedCn:disconnect()
|
|
TextFocusGainedCn = nil
|
|
end
|
|
if WindowFocusReleasedCn then
|
|
WindowFocusReleasedCn:disconnect()
|
|
WindowFocusReleasedCn = nil
|
|
end
|
|
|
|
MasterControl:AddToPlayerMovement(-currentMoveVector)
|
|
currentMoveVector = Vector3.new(0,0,0)
|
|
MasterControl:SetIsJumping(false)
|
|
end
|
|
|
|
return KeyboardMovement
|