Mind that the lockRotationX are not functions, but variables. You have to set a state to them. If they would be functions you would be missing () as well.
The lines you had there before, just returned the state of the axis lock and didn’t execute anything. Not sure if that was your intention or just some work in progress. Commenting that just in case
You are missing also a SyncedTransform setup. But you say your players do move, so let’s see if that was just the local input or if you’ve setup the synced transform somewhere else.
You can also reference that, the script is bit large tho.
There is also the open world sample which is quite older sample that is very similar to your concept, but i’m unsure about the state. We’ll have to polish it up to work again probably.
Understanding how Needle is used helps us in improving and making it more friendly to developers. Let us know what feels too complicated then it should be Or what through your journey was the key information that made certain aspect clear.