-- Camera Snap to Nearest Player Script with UI for Lock Mode Selection, Background, Minimize, and Close Buttons local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local localPlayer = Players.LocalPlayer local camera = game.Workspace.CurrentCamera local enabled = false -- Toggle state local lockedTarget = nil -- Stores the locked-on player local lockMode = "Nearest" -- Default lock mode ("Nearest" or "Camera") -- Create UI local screenGui = Instance.new("ScreenGui") screenGui.Parent = localPlayer:FindFirstChildOfClass("PlayerGui") -- Background frame for the UI local backgroundFrame = Instance.new("Frame") backgroundFrame.Size = UDim2.new(0, 200, 0, 100) backgroundFrame.Position = UDim2.new(0, 10, 0, 10) backgroundFrame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) backgroundFrame.BackgroundTransparency = 0.5 backgroundFrame.Parent = screenGui -- Header bar for dragging the UI local dragBar = Instance.new("Frame") dragBar.Size = UDim2.new(1, 0, 0, 30) -- Full width, 30px height dragBar.BackgroundColor3 = Color3.fromRGB(50, 50, 50) dragBar.Parent = backgroundFrame -- Close Button (X) local closeButton = Instance.new("TextButton") closeButton.Size = UDim2.new(0, 30, 0, 30) closeButton.Position = UDim2.new(1, -35, 0, 5) closeButton.Text = "X" closeButton.TextColor3 = Color3.fromRGB(255, 255, 255) closeButton.BackgroundTransparency = 1 closeButton.Parent = dragBar -- Minimize Button (-) local minimizeButton = Instance.new("TextButton") minimizeButton.Size = UDim2.new(0, 30, 0, 30) minimizeButton.Position = UDim2.new(1, -70, 0, 5) minimizeButton.Text = "-" minimizeButton.TextColor3 = Color3.fromRGB(255, 255, 255) minimizeButton.BackgroundTransparency = 1 minimizeButton.Parent = dragBar -- Minimize Button functionality local minimized = false local minimizeButtonClicked = false local minimizeIcon = Instance.new("TextButton") minimizeIcon.Size = UDim2.new(0, 30, 0, 30) minimizeIcon.Position = UDim2.new(0, 10, 0, 10) minimizeIcon.Text = "+" minimizeIcon.TextColor3 = Color3.fromRGB(255, 255, 255) minimizeIcon.BackgroundTransparency = 1 minimizeIcon.Visible = false minimizeIcon.Parent = screenGui minimizeButton.MouseButton1Click:Connect(function() if minimized then backgroundFrame.Visible = true minimizeIcon.Visible = false else backgroundFrame.Visible = false minimizeIcon.Visible = true end minimized = not minimized end) minimizeIcon.MouseButton1Click:Connect(function() backgroundFrame.Visible = true minimizeIcon.Visible = false minimized = false end) -- Lock Mode Dropdown button local lockModeDropdown = Instance.new("TextButton") lockModeDropdown.Size = UDim2.new(0, 180, 0, 50) lockModeDropdown.Position = UDim2.new(0, 10, 0, 40) lockModeDropdown.Text = "Lock Mode: Nearest" lockModeDropdown.TextColor3 = Color3.fromRGB(255, 255, 255) lockModeDropdown.Parent = backgroundFrame local function getNearestPlayerToCenter() local nearestPlayer = nil local nearestDistance = math.huge local screenCenter = Vector2.new(camera.ViewportSize.X / 2, camera.ViewportSize.Y / 2) for _, player in ipairs(Players:GetPlayers()) do if player ~= localPlayer and player.Character and player.Character:FindFirstChild("Head") then local part = player.Character["Head"] local screenPoint, onScreen = camera:WorldToViewportPoint(part.Position) if onScreen then local distance = (Vector2.new(screenPoint.X, screenPoint.Y) - screenCenter).Magnitude if distance < nearestDistance then nearestDistance = distance nearestPlayer = part end end end end return nearestPlayer end local function getNearestPlayerToMe() local nearestPlayer = nil local nearestDistance = math.huge for _, player in ipairs(Players:GetPlayers()) do if player ~= localPlayer and player.Character and player.Character:FindFirstChild("Head") then local part = player.Character["Head"] local distance = (localPlayer.Character.HumanoidRootPart.Position - part.Position).Magnitude if distance < nearestDistance then nearestDistance = distance nearestPlayer = part end end end return nearestPlayer end local function snapCameraToTarget() if enabled then if lockMode == "Nearest" then -- Lock to nearest player to the local player lockedTarget = getNearestPlayerToMe() if lockedTarget then camera.CFrame = CFrame.new(camera.CFrame.Position, lockedTarget.Position) end elseif lockMode == "Camera" then -- Lock to nearest player to the center of the screen if lockedTarget == nil then lockedTarget = getNearestPlayerToCenter() -- Lock on first time when camera mode is selected end if lockedTarget then camera.CFrame = CFrame.new(camera.CFrame.Position, lockedTarget.Position) end end end end -- Lock Mode selection functionality lockModeDropdown.MouseButton1Click:Connect(function() -- Toggle between "Nearest" and "Camera" if lockMode == "Nearest" then lockMode = "Camera" lockModeDropdown.Text = "Lock Mode: Camera" else lockMode = "Nearest" lockModeDropdown.Text = "Lock Mode: Nearest" lockedTarget = nil -- Reset locked target when switching to Nearest end end) -- Draggable UI logic local dragging = false local dragStart = nil local startPos = nil dragBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = backgroundFrame.Position end end) dragBar.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then local delta = input.Position - dragStart backgroundFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end) dragBar.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) -- Close button behavior (X) closeButton.MouseButton1Click:Connect(function() screenGui:Destroy() -- Close the entire script/UI end) UIS.InputBegan:Connect(function(input, gameProcessed) if not gameProcessed and input.KeyCode == Enum.KeyCode.T then -- Toggle with 'T' enabled = not enabled if not enabled then lockedTarget = nil -- Release lock when toggling off end end end) RunService.RenderStepped:Connect(snapCameraToTarget)