local UserInputService = game:GetService("UserInputService") local Players = game:GetService("Players") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera print("Aimlock script started") if not UserInputService.TouchEnabled then print("Not a mobile device, exiting") return end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "AimlockGui" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") print("ScreenGui created") local Frame = Instance.new("Frame") Frame.Size = UDim2.new(0.2, 0, 0.05, 0) Frame.Position = UDim2.new(0.4, 0, 0.3, 0) -- Higher on screen (30% down) Frame.BackgroundColor3 = Color3.new(0, 0, 0) Frame.BackgroundTransparency = 0.5 Frame.BorderSizePixel = 0 Frame.Parent = ScreenGui print("Frame created") local UIGradient = Instance.new("UIGradient") UIGradient.Color = ColorSequence.new{ ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 255)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 255)) } UIGradient.Rotation = 45 UIGradient.Parent = Frame local Button = Instance.new("TextButton") Button.Size = UDim2.new(1, 0, 1, 0) Button.BackgroundTransparency = 1 Button.Text = "Aimlock" Button.TextSize = 18 Button.TextColor3 = Color3.new(1, 1, 1) Button.Font = Enum.Font.Code Button.Parent = Frame print("Button created") spawn(function() while true do for hue = 0, 1, 0.01 do Button.TextColor3 = Color3.fromHSV(hue, 1, 1) wait(0.01) end end end) local selectedTarget = nil -- Stores target Model (player or NPC) local locked = false local highlight = Instance.new("Highlight") highlight.FillColor = Color3.fromRGB(255, 0, 0) highlight.FillTransparency = 0.5 highlight.OutlineColor = Color3.fromRGB(255, 255, 255) highlight.OutlineTransparency = 0 local cameraDistance = 10 -- Distance behind player local cameraUpOffset = 2 -- Upward offset (studs) for shiftlock local cameraRightOffset = 1 -- Rightward offset (studs) for shiftlock local dragging = false local dragStart = nil local startPos = nil UserInputService.InputBegan:Connect(function(input, processed) if processed then return end if input.UserInputType == Enum.UserInputType.Touch then local pos = input.Position local guiPos = Frame.AbsolutePosition local guiSize = Frame.AbsoluteSize if pos.X >= guiPos.X and pos.X <= guiPos.X + guiSize.X and pos.Y >= guiPos.Y and pos.Y <= guiPos.Y + guiSize.Y then dragging = true dragStart = pos startPos = Frame.Position print("Dragging started") else local ray = Camera:ScreenPointToRay(pos.X, pos.Y) local params = RaycastParams.new() params.FilterDescendantsInstances = {LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()} params.FilterType = Enum.RaycastFilterType.Exclude local result = workspace:Raycast(ray.Origin, ray.Direction * 1000, params) if result and result.Instance then local char = result.Instance:FindFirstAncestorOfClass("Model") if char and char:FindFirstChild("Humanoid") and char:FindFirstChild("HumanoidRootPart") then selectedTarget = char local targetName = Players:GetPlayerFromCharacter(char) and Players:GetPlayerFromCharacter(char).Name or char.Name Button.Text = "Target: " .. targetName print("Selected target: " .. targetName) wait(1) Button.Text = "Aimlock" end end end end end) UserInputService.InputChanged:Connect(function(input, processed) if processed then return end if input.UserInputType == Enum.UserInputType.Touch and dragging then local delta = input.Position - dragStart local newPos = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) Frame.Position = newPos end end) UserInputService.InputEnded:Connect(function(input, processed) if input.UserInputType == Enum.UserInputType.Touch and dragging then dragging = false print("Dragging ended") end end) Button.Activated:Connect(function() if selectedTarget and selectedTarget:FindFirstChild("HumanoidRootPart") then locked = not locked print("Aimlock toggled: " .. tostring(locked)) if locked then highlight.Parent = selectedTarget Camera.CameraType = Enum.CameraType.Scriptable print("Camera set to Scriptable") else highlight.Parent = nil Camera.CameraType = Enum.CameraType.Custom Camera.CameraSubject = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid") print("Camera reset to Custom") end else print("No valid target or HumanoidRootPart") end end) RunService.RenderStepped:Connect(function() if locked and selectedTarget and selectedTarget:FindFirstChild("HumanoidRootPart") and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then local playerPos = LocalPlayer.Character.HumanoidRootPart.Position local targetPos = selectedTarget.HumanoidRootPart.Position local direction = (targetPos - playerPos).Unit local rightVector = direction:Cross(Vector3.new(0, 1, 0)).Unit local cameraPos = playerPos - (direction * cameraDistance) + Vector3.new(0, cameraUpOffset, 0) + (rightVector * cameraRightOffset) Camera.CFrame = CFrame.new(cameraPos, targetPos) end end) LocalPlayer.CharacterAdded:Connect(function() if locked then locked = false highlight.Parent = nil Camera.CameraType = Enum.CameraType.Custom Camera.CameraSubject = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid") print("Local player respawned, aimlock disabled") end end) RunService.Heartbeat:Connect(function() if locked and selectedTarget and not selectedTarget:FindFirstChild("HumanoidRootPart") then locked = false highlight.Parent = nil Camera.CameraType = Enum.CameraType.Custom Camera.CameraSubject = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid") print("Target despawned, aimlock disabled") end end)