Can't Detect Shiftlock

I cannot seem to find any way to Detect if ShiftLock is enabled without using MouseBehaviour. My 100% scripted camera manually sets MouseBehaviour so using MouseBehaviour is useless bc if the zoom is 0 then its forced to be on and else then its off I wanna be able to detect shift lock without the MouseBehaviour.


It’s possible that I’m overlooking a simpler way of accessing this information, but it seems like “Shift Lock” is implemented entirely via Lua in the default player control scripts. To access this information, the default CameraModule will need to be forked.

If you already know how to fork the default player scripts, you can skip this paragraph, but if you don’t know, you do this by “running” the game and copying the PlayerModule that shows up in StarterPlayer.StarterPlayerScripts. Stop the game and paste these scripts back into the StarterPlayer.StarterPlayerScripts folder. From now on, when you run the game, your game will use these scripts instead of the default ones.

The lines you need to change are in the CameraModule module at the very end. Replace the following lines…

local cameraModuleObject =
local cameraApi = {}

if FFlagUserRemoveTheCameraApi then
	return cameraApi
	return cameraModuleObject

…with just…


This will expose the camera controllers when you access the object returned when you require the top-level PlayerModule module, meaning you can connect to the event that triggers when a player toggles “Shift Lock” as well as read the value it is set to. This code snippet demonstrates how to do so and will print whether or not “Shift Lock” is on every time the player toggles the script.

local player_object = require(game:GetService("Players").LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("PlayerModule"))

local shift_lock_controller = player_object:GetCameras().activeMouseLockController

local shift_lock_on
	shift_lock_on = shift_lock_controller:IsMouseLocked()
	print("SHIFT LOCK TOGGLED:",shift_lock_on)

Again, this method works, but I don’t know if it is the only/best method, since it requires forking the control scripts.


This method is simpler but can have a flase positive if somthing else is changing the mouse icon to the ShiftLock icon.

local Mouse = game:GetService("Players").LocalPlayer:GetMouse()

	if Mouse.Icon == "rbxasset://textures/MouseLockedCursor.png" then
		print("Shift lock just got enabled!")

I just had a 100% scriptable method and implemented it so its fine now

1 Like

thats a nice solution but i use a metatable mouse so using getpropertychangedsignal wont work.