Hello, So I’m making a game and I implemented a force shift lock system. It works but I tried to add it so when you hold down left alt you go out of the shift lock and when you release it you go back into shift lock and it doesn’t work.
My code (In a localscript in StarterCharacterScripts):
local RunService = game:GetService(“RunService”)
local UserInputService = game:GetService(“UserInputService”)
RunService:BindToRenderStep(“MouseLock”, Enum.RenderPriority.Last.Value + 1, function()
UserInputService.InputBegan:Connect(function(Input, GPE)
if GPE then return end
if UserInputService:IsKeyDown(Enum.KeyCode.LeftAlt) then
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
elseif not UserInputService:IsKeyDown(Enum.KeyCode.LeftAlt) then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
end
end)
end)
RunService:BindToRenderStep(“ForceShiftlock”, Enum.RenderPriority.Camera.Value + 1, function()
UserSettings():GetService(“UserGameSettings”).RotationType = Enum.RotationType.CameraRelative
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
if (currentCamera.Focus.Position - currentCamera.CFrame.Position).Magnitude >= 0.99 then
currentCamera.CFrame = currentCamera.CFrame*CFrame.new(1.75, 0, 0)
currentCamera.Focus = CFrame.fromMatrix(currentCamera.Focus.Position, currentCamera.CFrame.RightVector, currentCamera.CFrame.UpVector)*CFrame.new(1.75, 0, 0)
end
end)
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
RunService:BindToRenderStep("MouseLock", Enum.RenderPriority.Last.Value + 1, function()
UserInputService.InputBegan:Connect(function(Input, GPE)
if GPE then return end
if UserInputService:IsKeyDown(Enum.KeyCode.LeftAlt) then
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
elseif not UserInputService:IsKeyDown(Enum.KeyCode.LeftAlt) then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
end
end)
end)
RunService:BindToRenderStep("ForceShiftlock", Enum.RenderPriority.Camera.Value + 1, function()
UserSettings():GetService("UserGameSettings").RotationType = Enum.RotationType.CameraRelative
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
if (currentCamera.Focus.Position - currentCamera.CFrame.Position).Magnitude >= 0.99 then
currentCamera.CFrame = currentCamera.CFrame*CFrame.new(1.75, 0, 0)
currentCamera.Focus = CFrame.fromMatrix(currentCamera.Focus.Position, currentCamera.CFrame.RightVector, currentCamera.CFrame.UpVector)*CFrame.new(1.75, 0, 0)
end
end)
I just want it so your in shift lock all of the time and if you hold left alt it goes out of shift lock and when you let go of the left alt key it goes back into shift lock.
Alright, I’ll create a force shiftlock script, in the mean time - use this script to toggle your shiftlock on and off with a custom keybind. Assuming that you’re trying to change that as well.
LocalScripts are usually placed in StarterPlayer or StarterGUI. It depends on what they’re meant to preform, if they’re for the character - StarterCharacterScripts, but our case, it’s used for the player - meaning, you place it in StarterPlayerScripts.
Alright then, I managed to get something similar to shiftlock and what you wanted, though it’s not yet ready. Read both scripts and try to fully modify it as you desire. Anyway, here’s the place. Example.rbxl (22.4 KB)
local Players = game:GetService("Players")
local ContextActionService = game:GetService("ContextActionService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local camera = workspace.CurrentCamera
local cameraOffset = Vector3.new(2, 2, 8)
local player = Players.LocalPlayer
player.CharacterAdded:Connect(function(character)
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")
humanoid.AutoRotate = false
local cameraAngleX = 0
local cameraAngleY = 0
local function playerInput(actionName, inputState, inputObject)
-- Calculate camera/player rotation on input change
if inputState == Enum.UserInputState.Change then
cameraAngleX = cameraAngleX - inputObject.Delta.X
-- Reduce vertical mouse/touch sensitivity and clamp vertical axis
cameraAngleY = math.clamp(cameraAngleY-inputObject.Delta.Y*0.4, -75, 75)
-- Rotate root part CFrame by X delta
rootPart.CFrame = rootPart.CFrame * CFrame.Angles(0, math.rad(-inputObject.Delta.X), 0)
end
end
ContextActionService:BindAction("PlayerInput", playerInput, false, Enum.UserInputType.MouseMovement, Enum.UserInputType.Touch)
RunService.RenderStepped:Connect(function()
if camera.CameraType ~= Enum.CameraType.Scriptable then
camera.CameraType = Enum.CameraType.Scriptable
end
local startCFrame = CFrame.new((rootPart.CFrame.Position)) * CFrame.Angles(0, math.rad(cameraAngleX), 0) * CFrame.Angles(math.rad(cameraAngleY), 0, 0)
local cameraCFrame = startCFrame:ToWorldSpace(CFrame.new(cameraOffset.X, cameraOffset.Y, cameraOffset.Z))
local cameraFocus = startCFrame:ToWorldSpace(CFrame.new(cameraOffset.X, cameraOffset.Y, -10000))
camera.CFrame = CFrame.new(cameraCFrame.Position, cameraFocus.Position)
end)
end)
local function focusControl(actionName, inputState, inputObject)
-- Lock and hide mouse icon on input began
if inputState == Enum.UserInputState.Begin then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseIconEnabled = false
ContextActionService:UnbindAction("FocusControl", focusControl, false, Enum.UserInputType.MouseButton1, Enum.UserInputType.Touch, Enum.UserInputType.Focus)
end
end
ContextActionService:BindAction("FocusControl", focusControl, false, Enum.UserInputType.MouseButton1, Enum.UserInputType.Touch, Enum.UserInputType.Focus)