-- Services declaration local playersService = game:GetService("Players") local lightingService = game:GetService("Lighting") local userInputService = game:GetService("UserInputService") local runService = game:GetService("RunService") local replicatedStorage = game:GetService("ReplicatedStorage") local materialService = game:GetService("MaterialService") local workspaceService = game:GetService("Workspace") local statsService = game:GetService("Stats") local debrisService = game:GetService("Debris") local textChatService = game:GetService("TextChatService") -- Client references local clientPlayer = playersService.LocalPlayer local PlayerGui = clientPlayer:WaitForChild("PlayerGui", 10) -- Load WindUI library local WindUI = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))() -- Create main window local Window = WindUI:CreateWindow({ Title = "GlovSaken", Icon = "sparkle", Author = "By GlovDev", Folder = "GlovSakenScript", Size = UDim2.fromOffset(350, 300), Transparent = false, Theme = "Dark", Resizable = false, SideBarWidth = 150, HideSearchBar = true, ScrollBarEnabled = false, }) -- Window toggle key Window:SetToggleKey(Enum.KeyCode.K) -- Window text font WindUI:SetFont("rbxasset://fonts/families/AccanthisADFStd.json") -- Mobile open button configuration Window:EditOpenButton({ Title = "GlovSaken", Icon = "sparkle", CornerRadius = UDim.new(0,16), StrokeThickness = 0, Color = ColorSequence.new( Color3.fromHex("000000"), Color3.fromHex("000000") ), OnlyMobile = true, Enabled = true, Draggable = true, }) ---------------------------------------------------------------- -- Sentinel Tab ---------------------------------------------------------------- local SentinelTab = Window:Tab({ Title = "Sentinel", Icon = "shield", }) ---------------------------------------------------------------- -- Guest1337 Section ---------------------------------------------------------------- local GuestSection = SentinelTab:Section({ Title = "Guest1337", Opened = true, }) -- Guest variables local guestAutoBlockAudioOn = false local guestAutoPunchOn = false local guestVerifyFacingCheckOn = false local guestShowVisionRange = false local guestDetectionRange = 15 local guestDetectionRangeSq = guestDetectionRange * guestDetectionRange local guestVisionRange = 15 local guestVisionAngle = 90 local guestAimPunchActive = false local guestPunchPrediction = 4 local guestAimPunchDuration = 0.8 local guestCenterPart, guestLeftPart, guestRightPart, guestLeftToTargetPart, guestRightToTargetPart, guestLeftToCenterPart, guestCenterToRightPart = nil, nil, nil, nil, nil, nil, nil -- Sound IDs that trigger auto-block local guestAutoBlockTriggerSounds = { ["609342351"] = true, ["128251761326882"] = true, ["73067410027916"] = true } -- Animation IDs that trigger auto-block (new table for block triggers, using the provided anim list) local guestAutoBlockTriggerAnimations = { ["122004214855103"] = true, ["129086720270183"] = true, ["105018679651616"] = true, ["140028835012289"] = true, ["138386253518573"] = true, ["78844120285210"] = true, ["117991143485398"] = true, ["72036716319034"] = true, ["109073770803138"] = true, ["83315617640528"] = true, ["108438446017492"] = true, ["92343089184929"] = true, ["99034624022081"] = true } -- Punch animations to track for aim punch (kept separate, as original) local guestTrackedPunchAnimations = { ["140028835012289"] = true, ["109073770803138"] = true, ["92343089184929"] = true, ["72036716319034"] = true, ["117991143485398"] = true, ["105018679651616"] = true, ["117991143485398"] = true, ["72036716319034"] = true, ["92343089184929"] = true, ["140028835012289"] = true, ["105018679651616"] = true, ["109073770803138"] = true, ["83315617640528"] = true, ["108438446017492"] = true, ["122004214855103"] = true, ["78844120285210"] = true, ["99034624022081"] = true, } local guestHumanoid, guestHRP = nil, nil local guestPunchAiming = false local guestPunchLastTriggerTime = 0 local guestOriginalWS, guestOriginalJP, guestOriginalAutoRotate = nil, nil, nil local guestAimConnection = nil local guestSoundHooks = {} local guestAnimationHooks = {} local guestSoundBlockedUntil = {} local guestAnimationBlockedUntil = {} local guestLastLocalBlockTime = 0 local guestLocalBlockCooldown = 0.2 local guestAutoPunchDelay = 0.2 local guestSoundBlockDuration = 0.2 local guestAnimationBlockDuration = 0.2 local remotesFolder = replicatedStorage:WaitForChild("remotes") local useMoveRemote = remotesFolder:WaitForChild("usemove") -- Spy GUI toggle local guestShowSpyGui = false local spyGui = nil -- New variables for speed boost local guestSpeedBoostActive = false local guestSpeedBoostAnimId = "125490635846780" local guestSpeedBoostSpeed = 28 -- studs per second -- New variables for targeting local guestAutoNearestTarget = true local guestSelectedTargetPlayer = nil -- will store the selected Player object -- Spy blocked lists local blockedAnimations = {} local blockedSounds = {} -- Get target HRP and Humanoid local function guestGetTarget() local myChar = playersService.LocalPlayer.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return nil, nil end if guestAutoNearestTarget then local closestDist = math.huge local closestHRP, closestHumanoid = nil, nil for _, player in ipairs(playersService:GetPlayers()) do if player ~= playersService.LocalPlayer then local char = player.Character if char then local hrp = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChild("Humanoid") if hrp and hum and hum.Health > 0 then local dist = (hrp.Position - myRoot.Position).Magnitude if dist < closestDist then closestDist = dist closestHRP = hrp closestHumanoid = hum end end end end end return closestHRP, closestHumanoid else if guestSelectedTargetPlayer then local char = guestSelectedTargetPlayer.Character if char then local hrp = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChild("Humanoid") if hrp and hum and hum.Health > 0 then return hrp, hum end end end return nil, nil -- No target if selected is invalid end end -- Fire block ability local function guestFireRemoteBlock() local args = { "block", Enum.KeyCode.Q, true } useMoveRemote:FireServer(unpack(args)) end -- Fire punch ability local function guestFireRemotePunch() local args = { "punch", Enum.KeyCode.R, true } useMoveRemote:FireServer(unpack(args)) end -- Attempt to block (and optionally punch) local function guestAttemptBlock(char, hrp) if not guestAutoBlockAudioOn then return end local t = tick() if t < guestLastLocalBlockTime + guestLocalBlockCooldown then return end local myChar = playersService.LocalPlayer.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot or not hrp then return end guestFireRemoteBlock() guestLastLocalBlockTime = t if guestAutoPunchOn then task.delay(guestAutoPunchDelay, guestFireRemotePunch) end end -- Create a visual sphere part for vision cone local function guestCreateVisionPart() local part = Instance.new("Part") part.Size = Vector3.new(1, 1, 1) part.Shape = Enum.PartType.Ball part.Anchored = true part.CanCollide = false part.Transparency = 0.5 part.Color = Color3.fromRGB(255, 0, 0) part.Parent = workspaceService return part end -- Create a line part for vision cone connections local function guestCreateConnectionPart() local part = Instance.new("Part") part.Size = Vector3.new(0.2, 0.2, 1) part.Anchored = true part.CanCollide = false part.Transparency = 0.5 part.Color = Color3.fromRGB(255, 0, 0) part.Parent = workspaceService return part end -- Update size and orientation of a connection line local function guestUpdateConnectionPart(part, startPos, endPos) if not part or not startPos or not endPos then return end local distance = (endPos - startPos).Magnitude part.Size = Vector3.new(0.2, 0.2, distance) part.CFrame = CFrame.new((startPos + endPos) / 2, endPos) end -- Update visual representation of target vision cone local function guestUpdateVisionCone() if not guestShowVisionRange then if guestCenterPart then guestCenterPart.Position = Vector3.new(0, -1000, 0) end if guestLeftPart then guestLeftPart.Position = Vector3.new(0, -1000, 0) end if guestRightPart then guestRightPart.Position = Vector3.new(0, -1000, 0) end if guestLeftToTargetPart then guestLeftToTargetPart.Position = Vector3.new(0, -1000, 0) end if guestRightToTargetPart then guestRightToTargetPart.Position = Vector3.new(0, -1000, 0) end if guestLeftToCenterPart then guestLeftToCenterPart.Position = Vector3.new(0, -1000, 0) end if guestCenterToRightPart then guestCenterToRightPart.Position = Vector3.new(0, -1000, 0) end return end local targetHRP, _ = guestGetTarget() if not targetHRP then if guestCenterPart then guestCenterPart.Position = Vector3.new(0, -1000, 0) end if guestLeftPart then guestLeftPart.Position = Vector3.new(0, -1000, 0) end if guestRightPart then guestRightPart.Position = Vector3.new(0, -1000, 0) end if guestLeftToTargetPart then guestLeftToTargetPart.Position = Vector3.new(0, -1000, 0) end if guestRightToTargetPart then guestRightToTargetPart.Position = Vector3.new(0, -1000, 0) end if guestLeftToCenterPart then guestLeftToCenterPart.Position = Vector3.new(0, -1000, 0) end if guestCenterToRightPart then guestCenterToRightPart.Position = Vector3.new(0, -1000, 0) end return end pcall(function() local look = targetHRP.CFrame.LookVector local right = targetHRP.CFrame.RightVector local centerPos = targetHRP.Position + look * guestVisionRange local halfAngle = math.rad(guestVisionAngle / 2) local leftDir = (look * math.cos(halfAngle) - right * math.sin(halfAngle)) local rightDir = (look * math.cos(halfAngle) + right * math.sin(halfAngle)) local leftPos = targetHRP.Position + leftDir * guestVisionRange local rightPos = targetHRP.Position + rightDir * guestVisionRange if not guestCenterPart then guestCenterPart = guestCreateVisionPart() end if not guestLeftPart then guestLeftPart = guestCreateVisionPart() end if not guestRightPart then guestRightPart = guestCreateVisionPart() end if not guestLeftToTargetPart then guestLeftToTargetPart = guestCreateConnectionPart() end if not guestRightToTargetPart then guestRightToTargetPart = guestCreateConnectionPart() end if not guestLeftToCenterPart then guestLeftToCenterPart = guestCreateConnectionPart() end if not guestCenterToRightPart then guestCenterToRightPart = guestCreateConnectionPart() end guestCenterPart.Position = centerPos guestLeftPart.Position = leftPos guestRightPart.Position = rightPos guestUpdateConnectionPart(guestLeftToTargetPart, leftPos, targetHRP.Position) guestUpdateConnectionPart(guestRightToTargetPart, rightPos, targetHRP.Position) guestUpdateConnectionPart(guestLeftToCenterPart, leftPos, centerPos) guestUpdateConnectionPart(guestCenterToRightPart, centerPos, rightPos) end) end -- Remove all vision cone parts local function guestCleanupVisionCone() if guestCenterPart then guestCenterPart:Destroy(); guestCenterPart = nil end if guestLeftPart then guestLeftPart:Destroy(); guestLeftPart = nil end if guestRightPart then guestRightPart:Destroy(); guestRightPart = nil end if guestLeftToTargetPart then guestLeftToTargetPart:Destroy(); guestLeftToTargetPart = nil end if guestRightToTargetPart then guestRightToTargetPart:Destroy(); guestRightToTargetPart = nil end if guestLeftToCenterPart then guestLeftToCenterPart:Destroy(); guestLeftToCenterPart = nil end if guestCenterToRightPart then guestCenterToRightPart:Destroy(); guestCenterToRightPart = nil end end -- Extract numeric ID from SoundId string local function guestExtractNumericSoundId(sound) if not sound or not sound.SoundId then return nil end local sid = tostring(sound.SoundId) local num = sid:match("%d+") if num then return num end local hash = sid:match("[&%?]hash=([^&]+)") if hash then return "&hash="..hash end local path = sid:match("rbxasset://sounds/.+") if path then return path end return nil end -- Get world position of a sound local function guestGetSoundWorldPosition(sound) if not sound then return nil end if sound.Parent and sound.Parent:IsA("BasePart") then return sound.Parent.Position, sound.Parent end if sound.Parent and sound.Parent:IsA("Attachment") and sound.Parent.Parent and sound.Parent.Parent:IsA("BasePart") then return sound.Parent.Parent.Position, sound.Parent.Parent end local found = sound.Parent and sound.Parent:FindFirstChildWhichIsA("BasePart", true) if found then return found.Position, found end return nil, nil end -- Get character model from any descendant local function guestGetCharacterFromDescendant(inst) if not inst then return nil end local model = inst:FindFirstAncestorOfClass("Model") if model and model:FindFirstChildOfClass("Humanoid") then return model end return nil end -- Try to block when a dangerous sound plays local function guestAttemptBlockForSound(sound, preId) if not guestAutoBlockAudioOn then return end if not sound or not sound:IsA("Sound") then return end local id = preId or guestExtractNumericSoundId(sound) if not id or not guestAutoBlockTriggerSounds[id] then return end local t = tick() if guestSoundBlockedUntil[sound] and t < guestSoundBlockedUntil[sound] then return end if t < guestLastLocalBlockTime + guestLocalBlockCooldown then return end local myChar = playersService.LocalPlayer.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return end local _, soundPart = guestGetSoundWorldPosition(sound) if not soundPart then return end local char = guestGetCharacterFromDescendant(soundPart) local plr = char and playersService:GetPlayerFromCharacter(char) if not plr or plr == playersService.LocalPlayer then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local distSq = (hrp.Position - myRoot.Position).Magnitude^2 local pingComp = 0.2 * guestDetectionRange if distSq > guestDetectionRangeSq + pingComp then return end if guestVerifyFacingCheckOn then local success, result = pcall(function() local dirToPlayer = (myRoot.Position - hrp.Position).Unit local dot = hrp.CFrame.LookVector:Dot(dirToPlayer) local cosAngle = math.cos(math.rad(guestVisionAngle / 2)) local close = distSq < 25 return close or dot >= cosAngle end) if not success or not result then return end end guestAttemptBlock(char, hrp) guestSoundBlockedUntil[sound] = t + guestSoundBlockDuration end -- Try to block when a dangerous animation plays (new function) local function guestAttemptBlockForAnimation(animator, animId, char) if not guestAutoBlockAudioOn then return end if not animId or not guestAutoBlockTriggerAnimations[animId] then return end local t = tick() if guestAnimationBlockedUntil[animator] and t < guestAnimationBlockedUntil[animator] then return end if t < guestLastLocalBlockTime + guestLocalBlockCooldown then return end local myChar = playersService.LocalPlayer.Character local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local distSq = (hrp.Position - myRoot.Position).Magnitude^2 local pingComp = 0.2 * guestDetectionRange if distSq > guestDetectionRangeSq + pingComp then return end if guestVerifyFacingCheckOn then local success, result = pcall(function() local dirToPlayer = (myRoot.Position - hrp.Position).Unit local dot = hrp.CFrame.LookVector:Dot(dirToPlayer) local cosAngle = math.cos(math.rad(guestVisionAngle / 2)) local close = distSq < 25 return close or dot >= cosAngle end) if not success or not result then return end end guestAttemptBlock(char, hrp) guestAnimationBlockedUntil[animator] = t + guestAnimationBlockDuration end -- Hook a newly created sound local function guestHookSound(sound) if not sound or not sound:IsA("Sound") or guestSoundHooks[sound] then return end local preId = guestExtractNumericSoundId(sound) if not preId then return end local playedConn = sound.Played:Connect(function() if guestAutoBlockAudioOn then task.spawn(guestAttemptBlockForSound, sound, preId) end end) local propConn = sound:GetPropertyChangedSignal("IsPlaying"):Connect(function() if sound.IsPlaying and guestAutoBlockAudioOn then task.spawn(guestAttemptBlockForSound, sound, preId) end end) local destroyConn = sound.Destroying:Connect(function() if playedConn.Connected then playedConn:Disconnect() end if propConn.Connected then propConn:Disconnect() end if destroyConn.Connected then destroyConn:Disconnect() end guestSoundHooks[sound] = nil guestSoundBlockedUntil[sound] = nil end) guestSoundHooks[sound] = {playedConn, propConn, destroyConn, id = preId} if sound.IsPlaying then task.spawn(guestAttemptBlockForSound, sound, preId) end end -- Hook a newly created animator for animations local function guestHookAnimator(animator, char) if not animator or guestAnimationHooks[animator] then return end local playedConn = animator.AnimationPlayed:Connect(function(track) local animId = track.Animation.AnimationId:match("%d+") if animId and guestAutoBlockAudioOn then task.spawn(guestAttemptBlockForAnimation, animator, animId, char) end end) local destroyConn = animator.Destroying:Connect(function() if playedConn.Connected then playedConn:Disconnect() end if destroyConn.Connected then destroyConn:Disconnect() end guestAnimationHooks[animator] = nil guestAnimationBlockedUntil[animator] = nil end) guestAnimationHooks[animator] = {playedConn, destroyConn} end -- Hook all existing sounds and animators in workspace local function guestHookExisting() for _, desc in ipairs(workspaceService:GetDescendants()) do if desc:IsA("Sound") then pcall(guestHookSound, desc) elseif desc:IsA("Animator") then local char = desc:FindFirstAncestorOfClass("Model") if char and char:FindFirstChild("Humanoid") then pcall(guestHookAnimator, desc, char) end end end end -- Setup sound and animation monitoring on workspace local function guestSetupHooks() guestHookExisting() workspaceService.DescendantAdded:Connect(function(desc) if desc:IsA("Sound") then pcall(guestHookSound, desc) elseif desc:IsA("Animator") then local char = desc:FindFirstAncestorOfClass("Model") if char and char:FindFirstChild("Humanoid") then pcall(guestHookAnimator, desc, char) end end end) end -- Setup local character references local function guestSetupCharacter(char) guestHumanoid = char:FindFirstChild("Humanoid") guestHRP = char:FindFirstChild("HumanoidRootPart") if guestAimConnection then guestAimConnection:Disconnect() guestAimConnection = nil end local animator = guestHumanoid and guestHumanoid:FindFirstChildOfClass("Animator") if animator and guestAimPunchActive then guestAimConnection = animator.AnimationPlayed:Connect(function(track) local animId = track.Animation.AnimationId:match("%d+") if guestAimPunchActive and guestTrackedPunchAnimations[animId] then guestPunchLastTriggerTime = tick() guestPunchAiming = true end end) end end -- Initial setup guestSetupHooks() -- Character respawn handling playersService.LocalPlayer.CharacterAdded:Connect(function(char) task.delay(0.5, function() guestCleanupVisionCone() guestSetupCharacter(char) end) end) if playersService.LocalPlayer.Character then guestSetupCharacter(playersService.LocalPlayer.Character) end -- Function to check if local player is playing specific anim local function isPlayingSpecificAnim(animator, targetAnimId) if not animator then return false end local tracks = animator:GetPlayingAnimationTracks() for _, track in ipairs(tracks) do local animId = track.Animation.AnimationId:match("%d+") if animId == targetAnimId then return true end end return false end -- Main per-frame loop runService.RenderStepped:Connect(function(dt) if guestAimPunchActive and guestHumanoid and guestHRP and guestPunchAiming then local elapsed = tick() - guestPunchLastTriggerTime if elapsed > guestAimPunchDuration then guestPunchAiming = false if guestOriginalWS then guestHumanoid.WalkSpeed = guestOriginalWS guestHumanoid.JumpPower = guestOriginalJP guestHumanoid.AutoRotate = guestOriginalAutoRotate guestOriginalWS, guestOriginalJP, guestOriginalAutoRotate = nil, nil, nil end return end if not guestOriginalWS then guestOriginalWS = guestHumanoid.WalkSpeed guestOriginalJP = guestHumanoid.JumpPower guestOriginalAutoRotate = guestHumanoid.AutoRotate end guestHumanoid.AutoRotate = false guestHRP.AssemblyAngularVelocity = Vector3.zero local targetHRP, _ = guestGetTarget() if targetHRP then local predictPos = targetHRP.Velocity.Magnitude > 0.5 and (targetHRP.Position + targetHRP.Velocity * (guestPunchPrediction / 60)) or targetHRP.Position local dir = (predictPos - guestHRP.Position).Unit local yaw = math.atan2(-dir.X, -dir.Z) guestHRP.CFrame = CFrame.new(guestHRP.Position) * CFrame.Angles(0, yaw, 0) end end -- Speed boost logic if guestSpeedBoostActive and guestHumanoid and guestHRP then local localAnimator = guestHumanoid:FindFirstChildOfClass("Animator") if localAnimator and isPlayingSpecificAnim(localAnimator, guestSpeedBoostAnimId) then local targetHRP, _ = guestGetTarget() if targetHRP then local dir = (targetHRP.Position - guestHRP.Position).Unit guestHRP.Velocity = dir * guestSpeedBoostSpeed end end end pcall(guestUpdateVisionCone) end) -- Function to convert table to formatted string local function tableToFormattedString(tbl, varName) local str = "local " .. varName .. " = { " for k, v in pairs(tbl) do str = str .. '["' .. k .. '"] = true, ' end str = str:sub(1, -3) .. " }" return str end -- Spy GUI code integrated local function createSpyGui() local gui = Instance.new("ScreenGui") gui.Name = "AnimationSpy" gui.ResetOnSpawn = false gui.Parent = game.Players.LocalPlayer:WaitForChild("PlayerGui") -- Main container with modern dark theme local frame = Instance.new("Frame") frame.Size = UDim2.new(0.4, 0, 0.5, 0) frame.Position = UDim2.new(0.3, 0, 0.25, 0) frame.BackgroundColor3 = Color3.fromRGB(37, 36, 38) frame.BorderSizePixel = 0 frame.Parent = gui frame.Draggable = true frame.Active = true -- Top bar (like SimpleSpy) local topBar = Instance.new("Frame") topBar.Size = UDim2.new(1, 0, 0, 25) topBar.BackgroundColor3 = Color3.fromRGB(37, 35, 38) topBar.BorderSizePixel = 0 topBar.Parent = frame local titleLabel = Instance.new("TextLabel") titleLabel.Size = UDim2.new(1, -80, 1, 0) titleLabel.Position = UDim2.new(0, 8, 0, 0) titleLabel.BackgroundTransparency = 1 titleLabel.Text = "Animation & Sound Spy" titleLabel.Font = Enum.Font.SourceSansBold titleLabel.TextColor3 = Color3.new(1, 1, 1) titleLabel.TextSize = 16 titleLabel.TextXAlignment = Enum.TextXAlignment.Left titleLabel.Parent = topBar -- Close button (styled like SimpleSpy) local closeButton = Instance.new("TextButton") closeButton.Name = "CloseButton" closeButton.BackgroundColor3 = Color3.fromRGB(37, 36, 38) closeButton.BorderSizePixel = 0 closeButton.Position = UDim2.new(1, -25, 0, 0) closeButton.Size = UDim2.new(0, 25, 0, 25) closeButton.Font = Enum.Font.SourceSans closeButton.Text = "" closeButton.TextColor3 = Color3.new(0, 0, 0) closeButton.TextSize = 14 closeButton.Parent = topBar local closeIcon = Instance.new("ImageLabel") closeIcon.Name = "CloseIcon" closeIcon.BackgroundColor3 = Color3.new(1, 1, 1) closeIcon.BackgroundTransparency = 1 closeIcon.Position = UDim2.new(0, 8, 0, 8) closeIcon.Size = UDim2.new(0, 9, 0, 9) closeIcon.Image = "http://www.roblox.com/asset/?id=5597086202" closeIcon.Parent = closeButton -- Tab buttons local animationTab = Instance.new("TextButton") animationTab.Size = UDim2.new(0.3, 0, 0, 25) animationTab.Position = UDim2.new(0.05, 0, 0, 30) animationTab.BackgroundColor3 = Color3.fromRGB(99, 86, 245) animationTab.BorderSizePixel = 0 animationTab.Text = "Animations" animationTab.TextColor3 = Color3.new(1, 1, 1) animationTab.TextSize = 14 animationTab.Font = Enum.Font.SourceSans animationTab.Parent = frame local soundTab = Instance.new("TextButton") soundTab.Size = UDim2.new(0.3, 0, 0, 25) soundTab.Position = UDim2.new(0.375, 0, 0, 30) soundTab.BackgroundColor3 = Color3.fromRGB(53, 52, 55) soundTab.BorderSizePixel = 0 soundTab.Text = "Sounds" soundTab.TextColor3 = Color3.new(1, 1, 1) soundTab.TextSize = 14 soundTab.Font = Enum.Font.SourceSans soundTab.Parent = frame -- Clear button local clearButton = Instance.new("TextButton") clearButton.Size = UDim2.new(0.25, 0, 0, 25) clearButton.Position = UDim2.new(0.7, 0, 0, 30) clearButton.BackgroundColor3 = Color3.fromRGB(53, 52, 55) clearButton.BorderSizePixel = 0 clearButton.Text = "Clear All" clearButton.TextColor3 = Color3.new(1, 1, 1) clearButton.TextSize = 14 clearButton.Font = Enum.Font.SourceSans clearButton.Parent = frame -- Animation content area local animationScrollFrame = Instance.new("ScrollingFrame") animationScrollFrame.Size = UDim2.new(1, 0, 1, -65) animationScrollFrame.Position = UDim2.new(0, 0, 0, 65) animationScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) animationScrollFrame.ScrollBarThickness = 8 animationScrollFrame.BackgroundColor3 = Color3.fromRGB(53, 52, 55) animationScrollFrame.BorderSizePixel = 0 animationScrollFrame.Visible = true animationScrollFrame.Parent = frame local animationLayout = Instance.new("UIListLayout") animationLayout.Parent = animationScrollFrame animationLayout.SortOrder = Enum.SortOrder.LayoutOrder animationLayout.Padding = UDim.new(0, 2) -- Sound content area local soundScrollFrame = Instance.new("ScrollingFrame") soundScrollFrame.Size = UDim2.new(1, 0, 1, -65) soundScrollFrame.Position = UDim2.new(0, 0, 0, 65) soundScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) soundScrollFrame.ScrollBarThickness = 8 soundScrollFrame.BackgroundColor3 = Color3.fromRGB(53, 52, 55) soundScrollFrame.BorderSizePixel = 0 soundScrollFrame.Visible = false soundScrollFrame.Parent = frame local soundLayout = Instance.new("UIListLayout") soundLayout.Parent = soundScrollFrame soundLayout.SortOrder = Enum.SortOrder.LayoutOrder soundLayout.Padding = UDim.new(0, 2) -- Close button functionality closeButton.MouseButton1Click:Connect(function() gui.Enabled = false end) closeButton.TouchTap:Connect(function() gui.Enabled = false end) -- Hover effects for close button closeButton.MouseEnter:Connect(function() game:GetService("TweenService"):Create(closeButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(255, 60, 60)}):Play() end) closeButton.MouseLeave:Connect(function() game:GetService("TweenService"):Create(closeButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(37, 36, 38)}):Play() end) -- Tab switching functionality local function switchToAnimations() animationTab.BackgroundColor3 = Color3.fromRGB(99, 86, 245) soundTab.BackgroundColor3 = Color3.fromRGB(53, 52, 55) animationScrollFrame.Visible = true soundScrollFrame.Visible = false end local function switchToSounds() animationTab.BackgroundColor3 = Color3.fromRGB(53, 52, 55) soundTab.BackgroundColor3 = Color3.fromRGB(99, 86, 245) animationScrollFrame.Visible = false soundScrollFrame.Visible = true end animationTab.MouseButton1Click:Connect(switchToAnimations) soundTab.MouseButton1Click:Connect(switchToSounds) -- Animation tracking local loggedAnimations = {} local loggedSounds = {} -- Function to create stylish buttons local function createActionButton(text, color, size) local button = Instance.new("TextButton") button.Size = size button.BackgroundColor3 = color button.BorderSizePixel = 0 button.Text = text button.TextColor3 = Color3.new(1, 1, 1) button.TextSize = 12 button.Font = Enum.Font.SourceSans button.AutoButtonColor = false -- Hover effect button.MouseEnter:Connect(function() game:GetService("TweenService"):Create(button, TweenInfo.new(0.2), {BackgroundTransparency = 0.3}):Play() end) button.MouseLeave:Connect(function() game:GetService("TweenService"):Create(button, TweenInfo.new(0.2), {BackgroundTransparency = 0}):Play() end) return button end -- Function to extract numeric sound ID local function extractNumericSoundId(sound) if not sound then return nil end local sid = sound.SoundId if not sid then return nil end sid = (type(sid) == "string") and sid or tostring(sid) local num = string.match(sid, "rbxassetid://(%d+)") or string.match(sid, "://(%d+)") or string.match(sid, "^(%d+)$") return num end local function logAnimation(playerName, animationId) local numericId = tostring(animationId:match("%d+")) if not numericId or loggedAnimations[numericId] or blockedAnimations[numericId] then return end loggedAnimations[numericId] = true -- Create log entry container local logEntry = Instance.new("Frame") logEntry.Size = UDim2.new(0.95, 0, 0, 70) logEntry.BackgroundColor3 = Color3.fromRGB(45, 44, 47) logEntry.BorderSizePixel = 0 logEntry.Parent = animationScrollFrame -- Left color bar (like SimpleSpy) local colorBar = Instance.new("Frame") colorBar.Size = UDim2.new(0, 4, 1, 0) colorBar.BackgroundColor3 = Color3.fromRGB(99, 86, 245) colorBar.BorderSizePixel = 0 colorBar.Parent = logEntry -- Animation info local infoLabel = Instance.new("TextLabel") infoLabel.Size = UDim2.new(1, -10, 0.5, -5) infoLabel.Position = UDim2.new(0, 10, 0, 5) infoLabel.BackgroundTransparency = 1 infoLabel.Text = string.format("%s\nAnimation ID: %s", playerName, numericId) infoLabel.TextWrapped = true infoLabel.Font = Enum.Font.SourceSans infoLabel.TextColor3 = Color3.new(1, 1, 1) infoLabel.TextSize = 14 infoLabel.TextXAlignment = Enum.TextXAlignment.Left infoLabel.Parent = logEntry -- Button container local buttonContainer = Instance.new("Frame") buttonContainer.Size = UDim2.new(1, -10, 0.5, -5) buttonContainer.Position = UDim2.new(0, 10, 0.5, 0) buttonContainer.BackgroundTransparency = 1 buttonContainer.Parent = logEntry -- Create action buttons local copyBtn = createActionButton("Copy", Color3.fromRGB(65, 105, 225), UDim2.new(0.19, 0, 0.8, 0)) copyBtn.Position = UDim2.new(0, 0, 0.1, 0) copyBtn.Parent = buttonContainer local addBtn = createActionButton("Add", Color3.fromRGB(34, 139, 34), UDim2.new(0.19, 0, 0.8, 0)) addBtn.Position = UDim2.new(0.2, 0, 0.1, 0) addBtn.Parent = buttonContainer local removeBtn = createActionButton("Remove", Color3.fromRGB(178, 34, 34), UDim2.new(0.19, 0, 0.8, 0)) removeBtn.Position = UDim2.new(0.4, 0, 0.1, 0) removeBtn.Parent = buttonContainer local playBtn = createActionButton("Play", Color3.fromRGB(218, 165, 32), UDim2.new(0.19, 0, 0.8, 0)) playBtn.Position = UDim2.new(0.6, 0, 0.1, 0) playBtn.Parent = buttonContainer local blockBtn = createActionButton("Block", Color3.fromRGB(139, 0, 0), UDim2.new(0.19, 0, 0.8, 0)) blockBtn.Position = UDim2.new(0.8, 0, 0.1, 0) blockBtn.Parent = buttonContainer -- Button functionalities copyBtn.MouseButton1Click:Connect(function() setclipboard(numericId) end) addBtn.MouseButton1Click:Connect(function() guestAutoBlockTriggerAnimations[numericId] = true end) removeBtn.MouseButton1Click:Connect(function() guestAutoBlockTriggerAnimations[numericId] = nil end) playBtn.MouseButton1Click:Connect(function() local char = game.Players.LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then local animator = hum:FindFirstChildOfClass("Animator") if animator then local newAnim = Instance.new("Animation") newAnim.AnimationId = "rbxassetid://" .. numericId local newTrack = animator:LoadAnimation(newAnim) newTrack:Play() end end end end) blockBtn.MouseButton1Click:Connect(function() blockedAnimations[numericId] = true loggedAnimations[numericId] = nil logEntry:Destroy() end) -- Update canvas size animationScrollFrame.CanvasSize = UDim2.new(0, 0, 0, animationLayout.AbsoluteContentSize.Y) end local function logSound(playerName, soundId) local numericId = tostring(soundId:match("%d+")) if not numericId or loggedSounds[numericId] or blockedSounds[numericId] then return end loggedSounds[numericId] = true -- Create log entry container local logEntry = Instance.new("Frame") logEntry.Size = UDim2.new(0.95, 0, 0, 70) logEntry.BackgroundColor3 = Color3.fromRGB(45, 44, 47) logEntry.BorderSizePixel = 0 logEntry.Parent = soundScrollFrame -- Left color bar (different color for sounds) local colorBar = Instance.new("Frame") colorBar.Size = UDim2.new(0, 4, 1, 0) colorBar.BackgroundColor3 = Color3.fromRGB(255, 140, 0) colorBar.BorderSizePixel = 0 colorBar.Parent = logEntry -- Sound info local infoLabel = Instance.new("TextLabel") infoLabel.Size = UDim2.new(1, -10, 0.5, -5) infoLabel.Position = UDim2.new(0, 10, 0, 5) infoLabel.BackgroundTransparency = 1 infoLabel.Text = string.format("%s\nSound ID: %s", playerName, numericId) infoLabel.TextWrapped = true infoLabel.Font = Enum.Font.SourceSans infoLabel.TextColor3 = Color3.new(1, 1, 1) infoLabel.TextSize = 14 infoLabel.TextXAlignment = Enum.TextXAlignment.Left infoLabel.Parent = logEntry -- Button container local buttonContainer = Instance.new("Frame") buttonContainer.Size = UDim2.new(1, -10, 0.5, -5) buttonContainer.Position = UDim2.new(0, 10, 0.5, 0) buttonContainer.BackgroundTransparency = 1 buttonContainer.Parent = logEntry -- Create action buttons for sounds local copyBtn = createActionButton("Copy", Color3.fromRGB(65, 105, 225), UDim2.new(0.19, 0, 0.8, 0)) copyBtn.Position = UDim2.new(0, 0, 0.1, 0) copyBtn.Parent = buttonContainer local addBtn = createActionButton("Add", Color3.fromRGB(34, 139, 34), UDim2.new(0.19, 0, 0.8, 0)) addBtn.Position = UDim2.new(0.2, 0, 0.1, 0) addBtn.Parent = buttonContainer local removeBtn = createActionButton("Remove", Color3.fromRGB(178, 34, 34), UDim2.new(0.19, 0, 0.8, 0)) removeBtn.Position = UDim2.new(0.4, 0, 0.1, 0) removeBtn.Parent = buttonContainer local playBtn = createActionButton("Play", Color3.fromRGB(218, 165, 32), UDim2.new(0.19, 0, 0.8, 0)) playBtn.Position = UDim2.new(0.6, 0, 0.1, 0) playBtn.Parent = buttonContainer local blockBtn = createActionButton("Block", Color3.fromRGB(139, 0, 0), UDim2.new(0.19, 0, 0.8, 0)) blockBtn.Position = UDim2.new(0.8, 0, 0.1, 0) blockBtn.Parent = buttonContainer -- Button functionalities for sounds copyBtn.MouseButton1Click:Connect(function() setclipboard(numericId) end) addBtn.MouseButton1Click:Connect(function() guestAutoBlockTriggerSounds[numericId] = true end) removeBtn.MouseButton1Click:Connect(function() guestAutoBlockTriggerSounds[numericId] = nil end) playBtn.MouseButton1Click:Connect(function() local sound = Instance.new("Sound") sound.SoundId = "rbxassetid://" .. numericId sound.Parent = workspace sound:Play() game:GetService("Debris"):AddItem(sound, 10) end) blockBtn.MouseButton1Click:Connect(function() blockedSounds[numericId] = true loggedSounds[numericId] = nil logEntry:Destroy() end) -- Update canvas size soundScrollFrame.CanvasSize = UDim2.new(0, 0, 0, soundLayout.AbsoluteContentSize.Y) end -- Clear function local function clearLog() if animationScrollFrame.Visible then -- Clear animations for _, child in ipairs(animationScrollFrame:GetChildren()) do if child:IsA("Frame") then child:Destroy() end end loggedAnimations = {} animationScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) else -- Clear sounds for _, child in ipairs(soundScrollFrame:GetChildren()) do if child:IsA("Frame") then child:Destroy() end end loggedSounds = {} soundScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) end end clearButton.MouseButton1Click:Connect(clearLog) clearButton.TouchTap:Connect(clearLog) -- Auto-update canvas size animationLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() animationScrollFrame.CanvasSize = UDim2.new(0, 0, 0, animationLayout.AbsoluteContentSize.Y) end) soundLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() soundScrollFrame.CanvasSize = UDim2.new(0, 0, 0, soundLayout.AbsoluteContentSize.Y) end) -- Copy entire table buttons local copyAnimTableBtn = Instance.new("TextButton") copyAnimTableBtn.Size = UDim2.new(0.3, 0, 0, 25) copyAnimTableBtn.Position = UDim2.new(0.05, 0, 0, 0) copyAnimTableBtn.BackgroundColor3 = Color3.fromRGB(53, 52, 55) copyAnimTableBtn.BorderSizePixel = 0 copyAnimTableBtn.Text = "Copy Anim Table" copyAnimTableBtn.TextColor3 = Color3.new(1, 1, 1) copyAnimTableBtn.TextSize = 14 copyAnimTableBtn.Font = Enum.Font.SourceSans copyAnimTableBtn.Parent = animationScrollFrame -- Place in animation tab copyAnimTableBtn.MouseButton1Click:Connect(function() local formatted = tableToFormattedString(guestAutoBlockTriggerAnimations, "guestAutoBlockTriggerAnimations") setclipboard(formatted) end) local copySoundTableBtn = Instance.new("TextButton") copySoundTableBtn.Size = UDim2.new(0.3, 0, 0, 25) copySoundTableBtn.Position = UDim2.new(0.05, 0, 0, 0) copySoundTableBtn.BackgroundColor3 = Color3.fromRGB(53, 52, 55) copySoundTableBtn.BorderSizePixel = 0 copySoundTableBtn.Text = "Copy Sound Table" copySoundTableBtn.TextColor3 = Color3.new(1, 1, 1) copySoundTableBtn.TextSize = 14 copySoundTableBtn.Font = Enum.Font.SourceSans copySoundTableBtn.Parent = soundScrollFrame -- Place in sound tab copySoundTableBtn.MouseButton1Click:Connect(function() local formatted = tableToFormattedString(guestAutoBlockTriggerSounds, "guestAutoBlockTriggerSounds") setclipboard(formatted) end) -- Sound hooking system for spy local spySoundHooks = {} local function spyHookSound(sound, playerName) if not sound or not sound:IsA("Sound") then return end if spySoundHooks[sound] then return end spySoundHooks[sound] = true local function handleSoundPlay() local soundId = extractNumericSoundId(sound) if soundId then logSound(playerName, soundId) end end -- Connect to sound events local playedConn = sound.Played:Connect(handleSoundPlay) local propConn = sound:GetPropertyChangedSignal("IsPlaying"):Connect(function() if sound.IsPlaying then handleSoundPlay() end end) -- Clean up when sound is destroyed local destroyConn = sound.Destroying:Connect(function() if playedConn then playedConn:Disconnect() end if propConn then propConn:Disconnect() end if destroyConn then destroyConn:Disconnect() end spySoundHooks[sound] = nil end) -- Check if currently playing if sound.IsPlaying then handleSoundPlay() end end -- Detection loops for spy (for all players except local) task.spawn(function() -- Animation detection loop while task.wait(0.1) do for _, player in ipairs(playersService:GetPlayers()) do if player ~= playersService.LocalPlayer then local char = player.Character if char then local hum = char:FindFirstChild("Humanoid") if hum then local animator = hum:FindFirstChildOfClass("Animator") if animator then local tracks = animator:GetPlayingAnimationTracks() for _, track in ipairs(tracks) do local animId = tostring(track.Animation.AnimationId):match("%d+") if animId then logAnimation(player.Name, animId) end end end end end end end end end) task.spawn(function() -- Sound detection loop while task.wait(0.2) do for _, player in ipairs(playersService:GetPlayers()) do if player ~= playersService.LocalPlayer then local char = player.Character if char then for _, desc in ipairs(char:GetDescendants()) do if desc:IsA("Sound") then pcall(function() spyHookSound(desc, player.Name) end) end end -- Hook future sounds char.DescendantAdded:Connect(function(desc) if desc:IsA("Sound") then pcall(function() spyHookSound(desc, player.Name) end) end end) end end end end end) return gui end -- Toggle spy GUI local function toggleSpyGui(state) guestShowSpyGui = state if state then if not spyGui then spyGui = createSpyGui() end spyGui.Enabled = true else if spyGui then spyGui.Enabled = false end end end -- Function to get player list for dropdown local function getPlayerList() local list = {} for _, player in ipairs(playersService:GetPlayers()) do if player ~= playersService.LocalPlayer then table.insert(list, player.DisplayName .. " (@" .. player.Name .. ")") end end return list end -- Function to get player from display string local function getPlayerFromDisplay(str) local username = str:match("%(@(.-)%)") if username then return playersService:FindFirstChild(username) end return nil end -- UI Controls (Clean & Minimal) GuestSection:Toggle({ Title = "Auto Block", Type = "Checkbox", Default = false, Callback = function(state) guestAutoBlockAudioOn = state end }) GuestSection:Slider({ Title = "Auto Block Radius", Step = 1, Value = { Min = 1, Max = 20, Default = 15 }, Callback = function(value) guestDetectionRange = value guestDetectionRangeSq = value * value end }) GuestSection:Divider() GuestSection:Toggle({ Title = "Verify Facing Check", Type = "Checkbox", Default = false, Callback = function(state) guestVerifyFacingCheckOn = state end }) GuestSection:Slider({ Title = "Set Vision Range", Step = 1, Value = { Min = 1, Max = 20, Default = 15 }, Callback = function(value) guestVisionRange = value end }) GuestSection:Slider({ Title = "Set Vision Angle", Step = 1, Value = { Min = 1, Max = 200, Default = 90 }, Callback = function(value) guestVisionAngle = value end }) GuestSection:Toggle({ Title = "Show Vision Range", Type = "Checkbox", Default = false, Callback = function(state) guestShowVisionRange = state if not state then guestCleanupVisionCone() end end }) GuestSection:Divider() GuestSection:Toggle({ Title = "Auto Punch", Type = "Checkbox", Default = false, Callback = function(state) guestAutoPunchOn = state end }) GuestSection:Toggle({ Title = "Aim Punch", Type = "Checkbox", Default = false, Callback = function(state) guestAimPunchActive = state if state and playersService.LocalPlayer.Character then guestSetupCharacter(playersService.LocalPlayer.Character) end end }) GuestSection:Slider({ Title = "Punch Prediction", Step = 1, Value = { Min = 0, Max = 10, Default = 4 }, Callback = function(value) guestPunchPrediction = value end }) GuestSection:Divider() GuestSection:Toggle({ Title = "Speed Boost on Anim", Type = "Checkbox", Default = false, Callback = function(state) guestSpeedBoostActive = state end }) GuestSection:Divider() GuestSection:Toggle({ Title = "Auto Nearest Target", Type = "Checkbox", Default = true, Callback = function(state) guestAutoNearestTarget = state end }) -- Dropdown for manual target selection local playerList = getPlayerList() GuestSection:Dropdown({ Title = "Select Target", Values = playerList, Default = playerList[1] or "None", Callback = function(value) guestSelectedTargetPlayer = getPlayerFromDisplay(value) end }) -- Refresh dropdown on player join/leave playersService.PlayerAdded:Connect(function() -- Update dropdown if UI library supports, else ignore or recreate end) playersService.PlayerRemoving:Connect(function(player) if player == guestSelectedTargetPlayer then guestSelectedTargetPlayer = nil end -- Update dropdown end) GuestSection:Divider() GuestSection:Toggle({ Title = "Show Spy GUI", Type = "Checkbox", Default = false, Callback = function(state) toggleSpyGui(state) end }) ---------------------------------------------------------------- -- Interface Tab ---------------------------------------------------------------- local InterfaceTab = Window:Tab({ Title = "Interface", Icon = "scan", Locked = false, }) ---------------------------------------------------------------- -- UI Functions Section ---------------------------------------------------------------- local UIFunctionsSection = InterfaceTab:Section({ Title = "UI Functions", Opened = true, }) -- Close UI InterfaceTab:Button({ Title = "Close UI", Locked = false, Callback = function() Window:Destroy() end })