local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local ContentProvider = game:GetService("ContentProvider") local player = Players.LocalPlayer local camera = workspace.CurrentCamera -------------------------------------------------- -- SETTINGS -------------------------------------------------- local sensitivity = 0.2 local yaw = 0 local pitch = 0 local camConnection local moveTime = 0 local battery = 100 local trackingGlitch = false -------------------------------------------------- -- CLEAN OLD GUI -------------------------------------------------- local old = player:WaitForChild("PlayerGui"):FindFirstChild("BodyCamUI") if old then old:Destroy() end -------------------------------------------------- -- GUI ROOT -------------------------------------------------- local gui = Instance.new("ScreenGui") gui.Name = "BodyCamUI" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = player.PlayerGui -------------------------------------------------- -- RIGHT SIDE INFO -------------------------------------------------- local infoLabel = Instance.new("TextLabel") infoLabel.Size = UDim2.fromScale(0.3,0.12) infoLabel.Position = UDim2.fromScale(0.65,0.02) infoLabel.BackgroundTransparency = 1 infoLabel.TextColor3 = Color3.new(1,1,1) infoLabel.TextScaled = true infoLabel.Font = Enum.Font.Code infoLabel.TextXAlignment = Enum.TextXAlignment.Right infoLabel.Parent = gui -------------------------------------------------- -- REC INDICATOR -------------------------------------------------- local recDot = Instance.new("Frame") recDot.Size = UDim2.fromScale(0.015,0.03) recDot.Position = UDim2.fromScale(0.62,0.035) recDot.BackgroundColor3 = Color3.new(1,0,0) recDot.BorderSizePixel = 0 recDot.Parent = gui local recText = Instance.new("TextLabel") recText.Size = UDim2.fromScale(0.05,0.05) recText.Position = UDim2.fromScale(0.64,0.02) recText.BackgroundTransparency = 1 recText.Text = "REC" recText.TextColor3 = Color3.new(1,0,0) recText.TextScaled = true recText.Font = Enum.Font.Code recText.TextXAlignment = Enum.TextXAlignment.Left recText.Parent = gui task.spawn(function() while true do recDot.Visible = not recDot.Visible task.wait(0.6) end end) -------------------------------------------------- -- FILM GRAIN -------------------------------------------------- local grain = Instance.new("Frame") grain.Size = UDim2.fromScale(1,1) grain.BackgroundColor3 = Color3.new(1,1,1) grain.BackgroundTransparency = 0.94 grain.BorderSizePixel = 0 grain.Parent = gui -------------------------------------------------- -- VIGNETTE -------------------------------------------------- local function makeEdge(pos, size, rotation) local edge = Instance.new("Frame") edge.Size = size edge.Position = pos edge.BackgroundColor3 = Color3.new(0,0,0) edge.BorderSizePixel = 0 edge.Parent = gui local gradient = Instance.new("UIGradient") gradient.Color = ColorSequence.new(Color3.new(0,0,0), Color3.new(0,0,0)) gradient.Transparency = NumberSequence.new{ NumberSequenceKeypoint.new(0, 0.7), NumberSequenceKeypoint.new(1, 1) } gradient.Rotation = rotation gradient.Parent = edge end makeEdge(UDim2.fromScale(0,0), UDim2.fromScale(1,0.1), 90) makeEdge(UDim2.fromScale(0,0.9), UDim2.fromScale(1,0.1), -90) makeEdge(UDim2.fromScale(0,0), UDim2.fromScale(0.1,1), 0) makeEdge(UDim2.fromScale(0.9,0), UDim2.fromScale(0.1,1), 180) -------------------------------------------------- -- NO SIGNAL -------------------------------------------------- local noSignal = Instance.new("Frame") noSignal.Size = UDim2.fromScale(1,1) noSignal.BackgroundColor3 = Color3.new(0,0,0) noSignal.Visible = false noSignal.BorderSizePixel = 0 noSignal.ZIndex = 20 noSignal.Parent = gui local signalText = Instance.new("TextLabel") signalText.Size = UDim2.fromScale(1,0.2) signalText.Position = UDim2.fromScale(0,0.4) signalText.BackgroundTransparency = 1 signalText.Text = "NO SIGNAL" signalText.TextColor3 = Color3.new(1,1,1) signalText.TextScaled = true signalText.Font = Enum.Font.Arcade signalText.ZIndex = 21 signalText.Parent = noSignal -------------------------------------------------- -- WHITE NOISE STATIC -------------------------------------------------- local staticSound = Instance.new("Sound") staticSound.SoundId = "rbxassetid://76866707921480" staticSound.Volume = 0.8 staticSound.Looped = true staticSound.Parent = gui ContentProvider:PreloadAsync({staticSound}) -------------------------------------------------- -- VHS TRACKING ERROR -------------------------------------------------- local function triggerTrackingError() if trackingGlitch then return end trackingGlitch = true local duration = 0.4 local start = tick() while tick() - start < duration do task.wait() local offsetX = math.random(-6,6)/100 local offsetY = math.random(-3,3)/100 camera.CFrame *= CFrame.new(offsetX, offsetY, 0) end trackingGlitch = false end -------------------------------------------------- -- CAMERA SYSTEM -------------------------------------------------- local function startBodyCam(character) local humanoid = character:WaitForChild("Humanoid") local root = character:WaitForChild("HumanoidRootPart") local torso = character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso") camera.CameraType = Enum.CameraType.Scriptable camera.FieldOfView = 70 UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter UserInputService.MouseIconEnabled = false humanoid.AutoRotate = false yaw = 0 pitch = 0 moveTime = 0 battery = 100 local lastHealth = humanoid.Health if camConnection then camConnection:Disconnect() end camConnection = RunService.RenderStepped:Connect(function(dt) if humanoid.Health <= 0 then return end -- Mouse local delta = UserInputService:GetMouseDelta() yaw -= delta.X * sensitivity pitch -= delta.Y * sensitivity pitch = math.clamp(pitch, -75, 75) -- Rotate body (updated) local state = humanoid:GetState() if state ~= Enum.HumanoidStateType.Physics and state ~= Enum.HumanoidStateType.FallingDown and state ~= Enum.HumanoidStateType.Ragdoll then root.CFrame = CFrame.new(root.Position) * CFrame.Angles(0, math.rad(yaw), 0) end -- Movement sway local speed = root.Velocity.Magnitude local swayX, swayY = 0, 0 if speed > 1 then moveTime += dt * 6 swayX = math.sin(moveTime) * 0.03 swayY = math.abs(math.cos(moveTime)) * 0.03 end -- Damage glitch local glitchOffset = Vector3.new(0,0,0) if humanoid.Health < lastHealth then glitchOffset = Vector3.new( math.random(-2,2)/100, math.random(-2,2)/100, 0 ) end lastHealth = humanoid.Health local camCF = torso.CFrame * CFrame.new(swayX, 0.4 + swayY, -0.75) * CFrame.Angles(math.rad(pitch), 0, 0) * CFrame.new(glitchOffset) camera.CFrame = camCF -- Film grain flicker grain.BackgroundTransparency = 0.93 + math.random() * 0.03 -- Battery drain (1% per minute) battery -= (1/60) * dt battery = math.clamp(battery, 0, 100) -- Low battery color if battery <= 15 then infoLabel.TextColor3 = Color3.new(1,0,0) else infoLabel.TextColor3 = Color3.new(1,1,1) end -- Random VHS tracking error if not trackingGlitch then local chance = 0.001 if battery < 20 then chance = 0.005 end if math.random() < chance then task.spawn(triggerTrackingError) end end local dateNow = os.date("%d/%m/%Y") local timeNow = os.date("%H:%M:%S") infoLabel.Text = "BAT "..math.floor(battery).."%\n" ..dateNow.."\n" ..timeNow -- Battery death if battery <= 0 then noSignal.Visible = true staticSound:Play() camConnection:Disconnect() end end) humanoid.Died:Connect(function() noSignal.Visible = true staticSound:Play() end) end -------------------------------------------------- -- RESPAWN -------------------------------------------------- player.CharacterAdded:Connect(function(character) noSignal.Visible = false staticSound:Stop() startBodyCam(character) end) if player.Character then startBodyCam(player.Character) end