function Gamepad.Enable(G)local n=0 local Q=0 local H=0 local g=0 local x=LocalPlayer.Move local m=UserInputService.GamepadSupports local T=function(G,n,Q)if n==Enum.UserInputState.Cancel then MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(0,0,0)return end if activateGamepad~=Q.UserInputType then return end if Q.KeyCode~=Enum.KeyCode.Thumbstick1 then return end if Q.Position.magnitude>thumbstickDeadzone then MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(Q.Position.X,0,-Q.Position.Y)MasterControl:AddToPlayerMovement(currentMoveVector)else MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(0,0,0)end end local V=function(G,n,Q)if n==Enum.UserInputState.Cancel then MasterControl:SetIsJumping(false)return end if activateGamepad~=Q.UserInputType then return end if Q.KeyCode~=Enum.KeyCode.ButtonA then return end MasterControl:SetIsJumping(Q.UserInputState==Enum.UserInputState.Begin)end local p=function(G)if LocalPlayer and LocalPlayer.Character then MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(H+g,0,n+Q)MasterControl:AddToPlayerMovement(currentMoveVector)end end local R=function(G,Q,H)if Q==Enum.UserInputState.End then n=-1 elseif Q==Enum.UserInputState.Begin or Q==Enum.UserInputState.Cancel then n=0 end p(H.UserInputType)end local X=function(G,n,H)if n==Enum.UserInputState.End then Q=1 elseif n==Enum.UserInputState.Begin or n==Enum.UserInputState.Cancel then Q=0 end p(H.UserInputType)end local w=function(G,n,Q)if n==Enum.UserInputState.End then H=-1 elseif n==Enum.UserInputState.Begin or n==Enum.UserInputState.Cancel then H=0 end p(Q.UserInputType)end local z=function(G,n,Q)if n==Enum.UserInputState.End then g=1 elseif n==Enum.UserInputState.Begin or n==Enum.UserInputState.Cancel then g=0 end p(Q.UserInputType)end local function b()if activateGamepad then ContextActionService:UnbindActivate(activateGamepad,Enum.KeyCode.ButtonR2)end assignActivateGamepad()if activateGamepad then ContextActionService:BindActivate(activateGamepad,Enum.KeyCode.ButtonR2)end end ContextActionService:BindAction("\074\117\109\112\066\117\116\116\111\110",V,false,Enum.KeyCode.ButtonA)ContextActionService:BindAction("\077\111\118\101\084\104\117\109\098\115\116\105\099\107",T,false,Enum.KeyCode.Thumbstick1)b()if not m(UserInputService,activateGamepad,Enum.KeyCode.Thumbstick1)then ContextActionService:BindAction("\102\111\114\119\097\114\100\068\112\097\100",R,false,Enum.KeyCode.DPadUp)ContextActionService:BindAction("\098\097\099\107\119\097\114\100\068\112\097\100",X,false,Enum.KeyCode.DPadDown)ContextActionService:BindAction("\108\101\102\116\068\112\097\100",w,false,Enum.KeyCode.DPadLeft)ContextActionService:BindAction("\114\105\103\104\116\068\112\097\100",z,false,Enum.KeyCode.DPadRight)end gamepadConnectedCon=UserInputService.GamepadDisconnected:connect(function(G)if activateGamepad~=G then return end MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(0,0,0)activateGamepad=nil b()end)gamepadDisconnectedCon=UserInputService.GamepadConnected:connect(function(G)if activateGamepad==nil then b()end end)end function Gamepad.Disable(G)ContextActionService:UnbindAction("\102\111\114\119\097\114\100\068\112\097\100")ContextActionService:UnbindAction("\098\097\099\107\119\097\114\100\068\112\097\100")ContextActionService:UnbindAction("\108\101\102\116\068\112\097\100")ContextActionService:UnbindAction("\114\105\103\104\116\068\112\097\100")ContextActionService:UnbindAction("\077\111\118\101\084\104\117\109\098\115\116\105\099\107")ContextActionService:UnbindAction("\074\117\109\112\066\117\116\116\111\110")ContextActionService:UnbindActivate(activateGamepad,Enum.KeyCode.ButtonR2)if gamepadConnectedCon then gamepadConnectedCon:disconnect()end if gamepadDisconnectedCon then gamepadDisconnectedCon:disconnect()end activateGamepad=nil MasterControl:AddToPlayerMovement(-currentMoveVector)currentMoveVector=Vector3.new(0,0,0)MasterControl:SetIsJumping(false)end return Gamepad
--[[ Public API ]]
--
function Gamepad:Enable()
	local forwardValue = 0
	local backwardValue = 0
	local leftValue = 0
	local rightValue = 0

	local moveFunc = LocalPlayer.Move
	local gamepadSupports = UserInputService.GamepadSupports

	local controlCharacterGamepad = function(actionName, inputState, inputObject)
		if inputState == Enum.UserInputState.Cancel then
			MasterControl:AddToPlayerMovement(-currentMoveVector)
			currentMoveVector = Vector3.new(0, 0, 0)
			return
		end

		if activateGamepad ~= inputObject.UserInputType then
			return
		end
		if inputObject.KeyCode ~= Enum.KeyCode.Thumbstick1 then
			return
		end

		if inputObject.Position.magnitude > thumbstickDeadzone then
			MasterControl:AddToPlayerMovement(-currentMoveVector)
			currentMoveVector = Vector3.new(inputObject.Position.X, 0, -inputObject.Position.Y)
			MasterControl:AddToPlayerMovement(currentMoveVector)
		else
			MasterControl:AddToPlayerMovement(-currentMoveVector)
			currentMoveVector = Vector3.new(0, 0, 0)
		end
	end

	local jumpCharacterGamepad = function(actionName, inputState, inputObject)
		if inputState == Enum.UserInputState.Cancel then
			MasterControl:SetIsJumping(false)
			return
		end

		if activateGamepad ~= inputObject.UserInputType then
			return
		end
		if inputObject.KeyCode ~= Enum.KeyCode.ButtonA then
			return
		end

		MasterControl:SetIsJumping(inputObject.UserInputState == Enum.UserInputState.Begin)
	end

	local doDpadMoveUpdate = function(userInputType)
		if LocalPlayer and LocalPlayer.Character then
			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.End then
			forwardValue = -1
		elseif inputState == Enum.UserInputState.Begin or inputState == Enum.UserInputState.Cancel then
			forwardValue = 0
		end

		doDpadMoveUpdate(inputObject.UserInputType)
	end

	local moveBackwardFunc = function(actionName, inputState, inputObject)
		if inputState == Enum.UserInputState.End then
			backwardValue = 1
		elseif inputState == Enum.UserInputState.Begin or inputState == Enum.UserInputState.Cancel then
			backwardValue = 0
		end

		doDpadMoveUpdate(inputObject.UserInputType)
	end

	local moveLeftFunc = function(actionName, inputState, inputObject)
		if inputState == Enum.UserInputState.End then
			leftValue = -1
		elseif inputState == Enum.UserInputState.Begin or inputState == Enum.UserInputState.Cancel then
			leftValue = 0
		end

		doDpadMoveUpdate(inputObject.UserInputType)
	end

	local moveRightFunc = function(actionName, inputState, inputObject)
		if inputState == Enum.UserInputState.End then
			rightValue = 1
		elseif inputState == Enum.UserInputState.Begin or inputState == Enum.UserInputState.Cancel then
			rightValue = 0
		end

		doDpadMoveUpdate(inputObject.UserInputType)
	end

	local function setActivateGamepad()
		if activateGamepad then
			ContextActionService:UnbindActivate(activateGamepad, Enum.KeyCode.ButtonR2)
		end
		assignActivateGamepad()
		if activateGamepad then
			ContextActionService:BindActivate(activateGamepad, Enum.KeyCode.ButtonR2)
		end
	end

	ContextActionService:BindAction("JumpButton", jumpCharacterGamepad, false, Enum.KeyCode.ButtonA)
	ContextActionService:BindAction("MoveThumbstick", controlCharacterGamepad, false, Enum.KeyCode.Thumbstick1)

	setActivateGamepad()

	if not gamepadSupports(UserInputService, activateGamepad, Enum.KeyCode.Thumbstick1) then
		-- if the gamepad supports thumbsticks, theres no point in having the dpad buttons getting eaten up by these actions
		ContextActionService:BindAction("forwardDpad", moveForwardFunc, false, Enum.KeyCode.DPadUp)
		ContextActionService:BindAction("backwardDpad", moveBackwardFunc, false, Enum.KeyCode.DPadDown)
		ContextActionService:BindAction("leftDpad", moveLeftFunc, false, Enum.KeyCode.DPadLeft)
		ContextActionService:BindAction("rightDpad", moveRightFunc, false, Enum.KeyCode.DPadRight)
	end

	gamepadConnectedCon = UserInputService.GamepadDisconnected:connect(function(gamepadEnum)
		if activateGamepad ~= gamepadEnum then
			return
		end

		MasterControl:AddToPlayerMovement(-currentMoveVector)
		currentMoveVector = Vector3.new(0, 0, 0)

		activateGamepad = nil
		setActivateGamepad()
	end)

	gamepadDisconnectedCon = UserInputService.GamepadConnected:connect(function(gamepadEnum)
		if activateGamepad == nil then
			setActivateGamepad()
		end
	end)
end

function Gamepad:Disable()
	ContextActionService:UnbindAction("forwardDpad")
	ContextActionService:UnbindAction("backwardDpad")
	ContextActionService:UnbindAction("leftDpad")
	ContextActionService:UnbindAction("rightDpad")

	ContextActionService:UnbindAction("MoveThumbstick")
	ContextActionService:UnbindAction("JumpButton")
	ContextActionService:UnbindActivate(activateGamepad, Enum.KeyCode.ButtonR2)

	if gamepadConnectedCon then
		gamepadConnectedCon:disconnect()
	end
	if gamepadDisconnectedCon then
		gamepadDisconnectedCon:disconnect()
	end

	activateGamepad = nil
	MasterControl:AddToPlayerMovement(-currentMoveVector)
	currentMoveVector = Vector3.new(0, 0, 0)
	MasterControl:SetIsJumping(false)
end

return Gamepad
