-- ===== SERVICIOS ===== local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local localPlayer = Players.LocalPlayer -- ===== ESTADOS ===== local loopTP = false local loopIndex = 1 -- ===== GUI ===== local gui = Instance.new("ScreenGui") gui.Name = "WatcherGUI" gui.ResetOnSpawn = false gui.Parent = localPlayer:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 360, 0, 180) frame.Position = UDim2.new(0.5, -180, 0.25, 0) frame.BackgroundColor3 = Color3.new(0,0,0) frame.BorderSizePixel = 0 frame.Parent = gui -- ===== DRAG ===== local dragging, dragStart, startPos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = frame.Position end end) frame.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart frame.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) -- ===== BOTÓN SEE EVERYONE (solo visual por ahora) ===== local seeBtn = Instance.new("TextButton") seeBtn.Size = UDim2.new(1, -20, 0, 50) seeBtn.Position = UDim2.new(0, 10, 0, 10) seeBtn.BackgroundColor3 = Color3.fromRGB(255,0,0) seeBtn.Text = "see everyone" seeBtn.TextScaled = true seeBtn.Font = Enum.Font.FredokaOne seeBtn.TextColor3 = Color3.new(0,0,0) seeBtn.Parent = frame seeBtn.MouseButton1Click:Connect(function() -- ===== SERVICIOS ===== local Players = game:GetService("Players") local RunService = game:GetService("RunService") local localPlayer = Players.LocalPlayer -- ===== CONFIG ===== local VELOCIDAD = 12 local MIRADA_UMBRAL = 0.85 -- ===== TABLA DE PARTES ===== local partesPorJugador = {} -- 🔥 NUEVO -- ===== FUNCIÓN ===== local function crearParteParaJugador(jugador) if jugador == localPlayer then return end local parte = Instance.new("Part") parte.Size = Vector3.new(3, 3, 6) parte.Anchored = true parte.CanCollide = false parte.Material = Enum.Material.SmoothPlastic parte.Transparency = 0.5 parte.Color = Color3.new(1, 1, 1) parte.Name = "Watcher_" .. jugador.Name parte.Parent = workspace partesPorJugador[jugador] = parte -- 🔥 NUEVO -- DECAL FRENTE local frente = Instance.new("Decal") frente.Face = Enum.NormalId.Front frente.Texture = "rbxassetid://6319951708" frente.Parent = parte -- DECAL ESPALDA local espalda = Instance.new("Decal") espalda.Face = Enum.NormalId.Back espalda.Texture = "rbxassetid://17589872023" espalda.Parent = parte -- LOOP RunService.RenderStepped:Connect(function(dt) if not parte or not parte.Parent then return end local char = jugador.Character local localChar = localPlayer.Character if not char or not localChar then return end local hrp = char:FindFirstChild("HumanoidRootPart") local localHrp = localChar:FindFirstChild("HumanoidRootPart") local head = char:FindFirstChild("Head") if not hrp or not localHrp or not head then return end -- POSICIÓN: 3 studs delante de la cabeza local origen = head.Position + head.CFrame.LookVector * 3 local posSuave = parte.Position:Lerp(origen, dt * VELOCIDAD) -- ROTACIÓN parte.CFrame = CFrame.lookAt( posSuave, posSuave + hrp.CFrame.LookVector ) -- DETECTAR SI TE MIRA local direccionAlLocal = (localHrp.Position - hrp.Position).Unit local mirada = hrp.CFrame.LookVector:Dot(direccionAlLocal) if mirada > MIRADA_UMBRAL then parte.Color = Color3.fromRGB(255, 0, 0) else parte.Color = Color3.new(1, 1, 1) end end) end -- 🔥 NUEVO: eliminar parte cuando el jugador se va Players.PlayerRemoving:Connect(function(jugador) local parte = partesPorJugador[jugador] if parte then parte:Destroy() partesPorJugador[jugador] = nil end end) -- JUGADORES EXISTENTES for _, jugador in ipairs(Players:GetPlayers()) do crearParteParaJugador(jugador) end -- NUEVOS JUGADORES Players.PlayerAdded:Connect(crearParteParaJugador) end) -- ===== LOOP TP ===== local loopBtn = Instance.new("TextButton") loopBtn.Size = UDim2.new(0.48, 0, 0, 45) loopBtn.Position = UDim2.new(0.02, 0, 0, 80) loopBtn.BackgroundColor3 = Color3.fromRGB(255,0,0) loopBtn.TextScaled = true loopBtn.Font = Enum.Font.FredokaOne loopBtn.TextColor3 = Color3.new(0,0,0) loopBtn.Text = "loop tp (off)" loopBtn.Parent = frame -- ===== OFF / ON ===== local offBtn = Instance.new("TextButton") offBtn.Size = UDim2.new(0.48, 0, 0, 45) offBtn.Position = UDim2.new(0.5, 0, 0, 80) offBtn.BackgroundColor3 = Color3.fromRGB(255,0,0) offBtn.TextScaled = true offBtn.Font = Enum.Font.FredokaOne offBtn.TextColor3 = Color3.new(0,0,0) offBtn.Text = "off" offBtn.Parent = frame -- ===== LOOP TP FUNCIÓN ===== task.spawn(function() while true do task.wait(0.1) if loopTP then local char = localPlayer.Character if char and char:FindFirstChild("HumanoidRootPart") then char.HumanoidRootPart.CFrame = CFrame.new(52, 34, -80) end end end end) -- ===== BOTÓN LOOP TP ===== loopBtn.MouseButton1Click:Connect(function() loopTP = not loopTP loopBtn.Text = loopTP and "loop tp (on)" or "loop tp (off)" offBtn.Text = loopTP and "on" or "off" end) -- ===== BOTÓN OFF ===== offBtn.MouseButton1Click:Connect(function() loopTP = false loopBtn.Text = "loop tp (off)" offBtn.Text = "off" end)