175 lines
4.3 KiB
Lua
175 lines
4.3 KiB
Lua
--[[
|
|
// FileName: MasterControl
|
|
// Version 1.0
|
|
// Written by: jeditkacheff
|
|
// Description: All character control scripts go thru this script, this script makes sure all actions are performed
|
|
--]]
|
|
|
|
-- [[ Constants ]]--
|
|
local ZERO_VECTOR3 = Vector3.new(0, 0, 0)
|
|
local STATE_JUMPING = Enum.HumanoidStateType.Jumping
|
|
local STATE_FREEFALL = Enum.HumanoidStateType.Freefall
|
|
local STATE_LANDED = Enum.HumanoidStateType.Landed
|
|
|
|
--[[ Local Variables ]]--
|
|
local MasterControl = {}
|
|
|
|
local Players = game:GetService('Players')
|
|
local RunService = game:GetService('RunService')
|
|
|
|
while not Players.LocalPlayer do
|
|
Players.PlayerAdded:wait()
|
|
end
|
|
local LocalPlayer = Players.LocalPlayer
|
|
local LocalCharacter = LocalPlayer.Character
|
|
local CachedHumanoid = nil
|
|
|
|
local isJumping = false
|
|
local moveValue = Vector3.new(0, 0, 0)
|
|
|
|
local isJumpEnabled = true
|
|
local areControlsEnabled = true
|
|
|
|
local clickToMoveFailStateChanged = Instance.new("BindableEvent")
|
|
clickToMoveFailStateChanged.Name = "ClickToMoveFailStateChanged"
|
|
|
|
--[[ Local Functions ]]--
|
|
function MasterControl:GetHumanoid()
|
|
if LocalCharacter then
|
|
if CachedHumanoid then
|
|
return CachedHumanoid
|
|
else
|
|
CachedHumanoid = LocalCharacter:FindFirstChildOfClass("Humanoid")
|
|
return CachedHumanoid
|
|
end
|
|
end
|
|
end
|
|
|
|
local characterAncestryChangedConn = nil
|
|
local characterChildRemovedConn = nil
|
|
local function characterAdded(character)
|
|
if characterAncestryChangedConn then
|
|
characterAncestryChangedConn:disconnect()
|
|
end
|
|
|
|
if characterChildRemovedConn then
|
|
characterChildRemovedConn:disconnect()
|
|
end
|
|
|
|
LocalCharacter = character
|
|
CachedHumanoid = LocalCharacter:FindFirstChildOfClass("Humanoid")
|
|
characterAncestryChangedConn = character.AncestryChanged:connect(function()
|
|
if character.Parent == nil then
|
|
LocalCharacter = nil
|
|
else
|
|
LocalCharacter = character
|
|
end
|
|
end)
|
|
|
|
characterChildRemovedConn = character.ChildRemoved:connect(function(child)
|
|
if child == CachedHumanoid then
|
|
CachedHumanoid = nil
|
|
end
|
|
end)
|
|
end
|
|
|
|
if LocalCharacter then
|
|
characterAdded(LocalCharacter)
|
|
end
|
|
LocalPlayer.CharacterAdded:connect(characterAdded)
|
|
|
|
|
|
local getHumanoid = MasterControl.GetHumanoid
|
|
local moveFunc = LocalPlayer.Move
|
|
local updateMovement = function()
|
|
|
|
if not areControlsEnabled then return end
|
|
|
|
local humanoid = getHumanoid()
|
|
if not humanoid then return end
|
|
|
|
if isJumpEnabled and isJumping and not humanoid.PlatformStand then
|
|
local state = humanoid:GetState()
|
|
if state ~= STATE_JUMPING and state ~= STATE_FREEFALL and state ~= STATE_LANDED then
|
|
humanoid.Jump = isJumping
|
|
end
|
|
end
|
|
|
|
moveFunc(LocalPlayer, moveValue, true)
|
|
end
|
|
|
|
--[[ Public API ]]--
|
|
function MasterControl:Init()
|
|
RunService:BindToRenderStep("MasterControlStep", Enum.RenderPriority.Input.Value, updateMovement)
|
|
end
|
|
|
|
function MasterControl:Enable()
|
|
areControlsEnabled = true
|
|
isJumpEnabled = true
|
|
|
|
if self.ControlState.Current then
|
|
self.ControlState.Current:Enable()
|
|
end
|
|
end
|
|
|
|
function MasterControl:Disable()
|
|
|
|
if self.ControlState.Current then
|
|
self.ControlState.Current:Disable()
|
|
end
|
|
|
|
--After current control state is disabled, moveValue has been set to zero,
|
|
--Call updateMovement one last time to make sure this propagates to the engine -
|
|
--Otherwise if disabled while humanoid is moving, humanoid won't stop moving.
|
|
updateMovement()
|
|
|
|
isJumping = false
|
|
areControlsEnabled = false
|
|
end
|
|
|
|
function MasterControl:EnableJump()
|
|
isJumpEnabled = true
|
|
if areControlsEnabled and self.ControlState:IsTouchJumpModuleUsed() then
|
|
self.TouchJumpModule:Enable()
|
|
end
|
|
end
|
|
|
|
function MasterControl:DisableJump()
|
|
isJumpEnabled = false
|
|
if self.ControlState:IsTouchJumpModuleUsed() then
|
|
self.TouchJumpModule:Disable()
|
|
end
|
|
end
|
|
|
|
function MasterControl:AddToPlayerMovement(playerMoveVector)
|
|
moveValue = Vector3.new(moveValue.X + playerMoveVector.X, moveValue.Y + playerMoveVector.Y, moveValue.Z + playerMoveVector.Z)
|
|
end
|
|
|
|
function MasterControl:GetMoveVector()
|
|
return moveValue
|
|
end
|
|
|
|
function MasterControl:SetIsJumping(jumping)
|
|
if not isJumpEnabled then return end
|
|
isJumping = jumping
|
|
local humanoid = self:GetHumanoid()
|
|
if humanoid and not humanoid.PlatformStand then
|
|
humanoid.Jump = isJumping
|
|
end
|
|
end
|
|
|
|
function MasterControl:DoJump()
|
|
if not isJumpEnabled then return end
|
|
local humanoid = self:GetHumanoid()
|
|
if humanoid then
|
|
humanoid.Jump = true
|
|
end
|
|
end
|
|
|
|
function MasterControl:GetClickToMoveFailStateChanged()
|
|
return clickToMoveFailStateChanged
|
|
end
|
|
|
|
return MasterControl
|
|
|