-- DA UPHILL CAMLOCK -- LocalScript -- StarterPlayer > StarterPlayerScripts local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera -------------------------------------------------- -- SETTINGS -------------------------------------------------- local CamlockEnabled = false -- Manual target selected from the menu. -- nil = automatic camera targeting. local ManualTarget = nil -- The player currently being camlocked. local CurrentTarget = nil local Highlight = nil local MenuOpen = true -------------------------------------------------- -- GUI -------------------------------------------------- local Gui = Instance.new("ScreenGui") Gui.Name = "DaUphillCamlock" Gui.ResetOnSpawn = false Gui.Parent = LocalPlayer:WaitForChild("PlayerGui") -------------------------------------------------- -- TARGET LABEL -------------------------------------------------- local TargetLabel = Instance.new("TextLabel") TargetLabel.Name = "TargetLabel" TargetLabel.Size = UDim2.new(0, 300, 0, 42) TargetLabel.Position = UDim2.new(0.5, -150, 0, 20) TargetLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 25) TargetLabel.BackgroundTransparency = 0.1 TargetLabel.Text = "Camlocking: Nobody" TargetLabel.TextColor3 = Color3.new(1, 1, 1) TargetLabel.TextSize = 17 TargetLabel.Font = Enum.Font.GothamBold TargetLabel.Parent = Gui Instance.new("UICorner", TargetLabel).CornerRadius = UDim.new(0, 10) -------------------------------------------------- -- CAMLOCK BUTTON -------------------------------------------------- local CamlockButton = Instance.new("TextButton") CamlockButton.Name = "CamlockButton" CamlockButton.Size = UDim2.new(0, 155, 0, 50) CamlockButton.Position = UDim2.new(1, -175, 1, -75) CamlockButton.BackgroundColor3 = Color3.fromRGB(180, 50, 50) CamlockButton.Text = "CAMLOCK: OFF" CamlockButton.TextColor3 = Color3.new(1, 1, 1) CamlockButton.TextSize = 15 CamlockButton.Font = Enum.Font.GothamBold CamlockButton.Parent = Gui Instance.new("UICorner", CamlockButton).CornerRadius = UDim.new(0, 12) -------------------------------------------------- -- PLAYER MENU -------------------------------------------------- local PlayerMenu = Instance.new("Frame") PlayerMenu.Name = "PlayerMenu" PlayerMenu.Size = UDim2.new(0, 270, 0, 350) PlayerMenu.Position = UDim2.new(0, 20, 0.5, -175) PlayerMenu.BackgroundColor3 = Color3.fromRGB(25, 25, 25) PlayerMenu.BorderSizePixel = 0 PlayerMenu.Parent = Gui Instance.new("UICorner", PlayerMenu).CornerRadius = UDim.new(0, 12) -------------------------------------------------- -- TITLE -------------------------------------------------- local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, -50, 0, 42) Title.Position = UDim2.new(0, 10, 0, 0) Title.BackgroundTransparency = 1 Title.Text = "PLAYER CAMLOCK" Title.TextColor3 = Color3.new(1, 1, 1) Title.TextSize = 17 Title.Font = Enum.Font.GothamBold Title.TextXAlignment = Enum.TextXAlignment.Left Title.Parent = PlayerMenu -------------------------------------------------- -- TOP ARROW -------------------------------------------------- local TopArrow = Instance.new("TextButton") TopArrow.Name = "TopArrow" TopArrow.Size = UDim2.new(0, 40, 0, 40) TopArrow.Position = UDim2.new(1, -45, 0, 2) TopArrow.BackgroundTransparency = 1 TopArrow.Text = "▼" TopArrow.TextColor3 = Color3.new(1, 1, 1) TopArrow.TextSize = 22 TopArrow.Font = Enum.Font.GothamBold TopArrow.Parent = PlayerMenu -------------------------------------------------- -- SEARCH BOX -------------------------------------------------- local SearchBox = Instance.new("TextBox") SearchBox.Name = "SearchBox" SearchBox.Size = UDim2.new(1, -20, 0, 38) SearchBox.Position = UDim2.new(0, 10, 0, 48) SearchBox.BackgroundColor3 = Color3.fromRGB(45, 45, 45) SearchBox.PlaceholderText = "Search username..." SearchBox.PlaceholderColor3 = Color3.fromRGB(170, 170, 170) SearchBox.Text = "" SearchBox.TextColor3 = Color3.new(1, 1, 1) SearchBox.TextSize = 14 SearchBox.Font = Enum.Font.Gotham SearchBox.ClearTextOnFocus = false SearchBox.Parent = PlayerMenu Instance.new("UICorner", SearchBox).CornerRadius = UDim.new(0, 8) -------------------------------------------------- -- PLAYER LIST -------------------------------------------------- local PlayerList = Instance.new("ScrollingFrame") PlayerList.Name = "PlayerList" PlayerList.Size = UDim2.new(1, -20, 1, -105) PlayerList.Position = UDim2.new(0, 10, 0, 95) PlayerList.BackgroundTransparency = 1 PlayerList.BorderSizePixel = 0 PlayerList.ScrollBarThickness = 5 PlayerList.Parent = PlayerMenu local Layout = Instance.new("UIListLayout") Layout.Padding = UDim.new(0, 6) Layout.Parent = PlayerList -------------------------------------------------- -- BOTTOM ARROW -------------------------------------------------- local BottomArrow = Instance.new("TextButton") BottomArrow.Name = "BottomArrow" BottomArrow.Size = UDim2.new(1, 0, 0, 35) BottomArrow.Position = UDim2.new(0, 0, 1, -35) BottomArrow.BackgroundTransparency = 1 BottomArrow.Text = "▲" BottomArrow.TextColor3 = Color3.new(1, 1, 1) BottomArrow.TextSize = 20 BottomArrow.Font = Enum.Font.GothamBold BottomArrow.Parent = PlayerMenu -------------------------------------------------- -- HIGHLIGHT -------------------------------------------------- local function RemoveHighlight() if Highlight then Highlight:Destroy() Highlight = nil end end local function HighlightPlayer(Player) RemoveHighlight() if not Player then return end if not Player.Character then return end Highlight = Instance.new("Highlight") Highlight.Name = "CurrentCamlockTarget" Highlight.Adornee = Player.Character Highlight.FillTransparency = 1 Highlight.OutlineTransparency = 0 Highlight.OutlineColor = Color3.fromRGB(255, 255, 255) Highlight.Parent = Player.Character end -------------------------------------------------- -- UPDATE CURRENT TARGET -------------------------------------------------- local function UpdateTarget(Player) if CurrentTarget == Player then return end -- Remove old player's highlight FIRST. RemoveHighlight() CurrentTarget = Player if Player then TargetLabel.Text = "Camlocking: " .. Player.DisplayName HighlightPlayer(Player) else TargetLabel.Text = "Camlocking: Nobody" end end -------------------------------------------------- -- CLOSEST TO CAMERA -------------------------------------------------- local function GetClosestToCamera() local ClosestPlayer = nil local ClosestDistance = math.huge local Viewport = Camera.ViewportSize local CameraCenter = Vector2.new( Viewport.X / 2, Viewport.Y / 2 ) for _, Player in ipairs( Players:GetPlayers() ) do if Player ~= LocalPlayer then local Character = Player.Character if Character then local Humanoid = Character:FindFirstChildOfClass( "Humanoid" ) local Root = Character:FindFirstChild( "HumanoidRootPart" ) if Humanoid and Root and Humanoid.Health > 0 then local ScreenPosition, OnScreen = Camera:WorldToViewportPoint( Root.Position ) if OnScreen then local Point = Vector2.new( ScreenPosition.X, ScreenPosition.Y ) local Distance = ( Point - CameraCenter ).Magnitude if Distance < ClosestDistance then ClosestDistance = Distance ClosestPlayer = Player end end end end end end return ClosestPlayer end -------------------------------------------------- -- REFRESH PLAYER LIST -------------------------------------------------- local function RefreshPlayers() for _, Child in ipairs( PlayerList:GetChildren() ) do if Child:IsA("TextButton") then Child:Destroy() end end local Search = string.lower( SearchBox.Text ) for _, Player in ipairs( Players:GetPlayers() ) do if Player ~= LocalPlayer then local Username = string.lower( Player.Name ) local DisplayName = string.lower( Player.DisplayName ) local Matches = Search == "" or string.find( Username, Search, 1, true ) or string.find( DisplayName, Search, 1, true ) if Matches then local Button = Instance.new( "TextButton" ) Button.Size = UDim2.new( 1, -5, 0, 42 ) Button.BackgroundColor3 = Color3.fromRGB( 50, 50, 50 ) Button.TextColor3 = Color3.new( 1, 1, 1 ) Button.Text = Player.DisplayName .. " @" .. Player.Name Button.TextSize = 14 Button.Font = Enum.Font.Gotham Button.Parent = PlayerList Instance.new( "UICorner", Button ).CornerRadius = UDim.new(0, 8) Button.Activated:Connect( function() -- Manual selection. ManualTarget = Player UpdateTarget( Player ) end ) end end end PlayerList.CanvasSize = UDim2.new( 0, 0, 0, Layout.AbsoluteContentSize.Y + 10 ) end SearchBox:GetPropertyChangedSignal( "Text" ):Connect( RefreshPlayers ) Players.PlayerAdded:Connect( RefreshPlayers ) Players.PlayerRemoving:Connect( function(Player) if ManualTarget == Player then ManualTarget = nil end if CurrentTarget == Player then UpdateTarget(nil) end RefreshPlayers() end ) RefreshPlayers() -------------------------------------------------- -- MENU OPEN -------------------------------------------------- local function OpenMenu() MenuOpen = true PlayerMenu.Size = UDim2.new( 0, 270, 0, 350 ) SearchBox.Visible = true PlayerList.Visible = true BottomArrow.Visible = true TopArrow.Text = "▼" end -------------------------------------------------- -- MENU CLOSE -------------------------------------------------- local function CloseMenu() MenuOpen = false PlayerMenu.Size = UDim2.new( 0, 270, 0, 50 ) SearchBox.Visible = false PlayerList.Visible = false BottomArrow.Visible = false TopArrow.Text = "▲" end -------------------------------------------------- -- ARROWS -------------------------------------------------- TopArrow.Activated:Connect( function() if MenuOpen then CloseMenu() else OpenMenu() end end ) BottomArrow.Activated:Connect( CloseMenu ) -------------------------------------------------- -- CAMLOCK TOGGLE -------------------------------------------------- CamlockButton.Activated:Connect( function() CamlockEnabled = not CamlockEnabled if CamlockEnabled then CamlockButton.Text = "CAMLOCK: ON" CamlockButton.BackgroundColor3 = Color3.fromRGB( 50, 180, 80 ) else CamlockButton.Text = "CAMLOCK: OFF" CamlockButton.BackgroundColor3 = Color3.fromRGB( 180, 50, 50 ) -- Remove highlight when disabled. UpdateTarget(nil) end end ) -------------------------------------------------- -- MAIN CAMLOCK LOOP -------------------------------------------------- RunService.RenderStepped:Connect( function() if not CamlockEnabled then return end -------------------------------------------------- -- MANUAL TARGET -------------------------------------------------- if ManualTarget then if not ManualTarget.Parent then ManualTarget = nil UpdateTarget(nil) else UpdateTarget( ManualTarget ) end -------------------------------------------------- -- AUTOMATIC TARGET -------------------------------------------------- else local AutomaticTarget = GetClosestToCamera() UpdateTarget( AutomaticTarget ) end -------------------------------------------------- -- CAMERA -------------------------------------------------- if not CurrentTarget then return end if not CurrentTarget.Character then UpdateTarget(nil) return end local Root = CurrentTarget.Character: FindFirstChild( "HumanoidRootPart" ) if not Root then return end Camera.CFrame = CFrame.lookAt( Camera.CFrame.Position, Root.Position ) end ) -------------------------------------------------- -- DRAGGING -------------------------------------------------- local function MakeDraggable(Object) local Dragging = false local DragStart local StartPosition Object.InputBegan:Connect( function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = true DragStart = Input.Position StartPosition = Object.Position end end ) UserInputService.InputChanged:Connect( function(Input) if not Dragging then return end if Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch then local Delta = Input.Position - DragStart Object.Position = UDim2.new( StartPosition.X.Scale, StartPosition.X.Offset + Delta.X, StartPosition.Y.Scale, StartPosition.Y.Offset + Delta.Y ) end end ) UserInputService.InputEnded:Connect( function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = false end end ) end -------------------------------------------------- -- MAKE UI MOVABLE -------------------------------------------------- MakeDraggable(PlayerMenu) MakeDraggable(CamlockButton) -------------------------------------------------- -- RE-HIGHLIGHT AFTER RESPAWN -------------------------------------------------- Players.PlayerAdded:Connect( function(Player) Player.CharacterAdded:Connect( function() task.wait(0.2) if CurrentTarget == Player then HighlightPlayer( Player ) end end ) end )