local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer -- Config local FRICTION, GRAVITY, JUMP_IMPULSE, CLIMB_SPEED = 8, 120, 55, 0.7 local RESET_INTERVAL = 10 -- State local isToggled = false local targets = {} local excludedPlayers = {} local ghostFolder = nil local modes = {"BLOB", "TIGHT CLUSTER", "GRID"} local currentModeIdx = 1 local teamFilter, friendFilter, chamsEnabled = "OTHERS", true, true local minimized = false local lastResetTime = tick() local lockedBaseCFrame = nil -- This will store the permanent spot for the session -- UI Helpers local function createButton(name, text, pos, size, color) local btn = Instance.new("TextButton") btn.Name, btn.Position, btn.Size = name, pos, size btn.BackgroundColor3 = color or Color3.fromRGB(30, 30, 35) btn.BackgroundTransparency = 0.1 btn.Text, btn.TextColor3 = text, Color3.new(1, 1, 1) btn.Font, btn.TextSize = Enum.Font.GothamBold, 10 btn.TextScaled = true Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4) local stroke = Instance.new("UIStroke", btn) stroke.ApplyStrokeMode, stroke.Transparency = Enum.ApplyStrokeMode.Border, 0.8 return btn end -- Draggable Logic local function makeDraggable(frame) local dragging, dragInput, dragStart, startPos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) frame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then dragInput = input end end) RunService.RenderStepped:Connect(function() if dragging and dragInput then local delta = dragInput.Position - dragStart frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end) end local screenGui, mainFrame, mainBtn, modeBtn, teamBtn, friendBtn, ghostBtn, excludeBtn, listContainer, searchBar, contentFrame local function updateUIStrings() if not mainBtn then return end mainBtn.Text = isToggled and "SYSTEM ACTIVE [U]" or "FREEZER V1: READY [U]" mainBtn.BackgroundColor3 = isToggled and Color3.fromRGB(150, 0, 0) or Color3.fromRGB(30, 30, 35) modeBtn.Text = "MODE: " .. modes[currentModeIdx] teamBtn.Text = "TEAM: " .. teamFilter friendBtn.Text = friendFilter and "SKIP FRIENDS" or "ALL FRIENDS" ghostBtn.Text = chamsEnabled and "CHAMS: ON" or "CHAMS: OFF" end local function refreshExclusionList() if not listContainer or not listContainer:FindFirstChild("Scroll") then return end local scroll = listContainer.Scroll scroll:ClearAllChildren() Instance.new("UIListLayout", scroll).Padding = UDim.new(0, 4) local searchText = searchBar.Text:lower() for _, p in ipairs(Players:GetPlayers()) do if p == LocalPlayer then continue end if searchText ~= "" and not p.Name:lower():find(searchText) then continue end local isExcluded = excludedPlayers[p.UserId] local pBtn = createButton("ExP", p.Name, UDim2.new(0,0,0,0), UDim2.new(1, -10, 0, 25), isExcluded and Color3.fromRGB(100, 30, 30) or Color3.fromRGB(30, 100, 30)) pBtn.Parent = scroll pBtn.MouseButton1Click:Connect(function() excludedPlayers[p.UserId] = not excludedPlayers[p.UserId] refreshExclusionList() end) end scroll.CanvasSize = UDim2.new(0, 0, 0, #scroll:GetChildren() * 30) end local function setupUI() local pGui = LocalPlayer:WaitForChild("PlayerGui") if pGui:FindFirstChild("FreezerV1") then pGui.FreezerV1:Destroy() end screenGui = Instance.new("ScreenGui", pGui) screenGui.Name = "FreezerV1" screenGui.ResetOnSpawn = false mainFrame = Instance.new("Frame", screenGui) mainFrame.Size, mainFrame.Position, mainFrame.BackgroundColor3 = UDim2.new(0, 520, 0, 150), UDim2.new(0.5, -260, 0, 60), Color3.fromRGB(20, 20, 20) mainFrame.BackgroundTransparency = 0.1 Instance.new("UICorner", mainFrame) makeDraggable(mainFrame) local title = Instance.new("TextLabel", mainFrame) title.Text, title.Size, title.Position = " FREEZER V1", UDim2.new(0, 100, 0, 25), UDim2.new(0, 0, 0, 0) title.BackgroundTransparency, title.TextColor3, title.Font, title.TextSize, title.TextXAlignment = 1, Color3.new(1,1,1), Enum.Font.GothamBold, 10, Enum.TextXAlignment.Left local minBtn = createButton("Min", "-", UDim2.new(1, -25, 0, 5), UDim2.new(0, 20, 0, 20), Color3.fromRGB(50, 50, 50)) minBtn.Parent = mainFrame contentFrame = Instance.new("Frame", mainFrame) contentFrame.Size, contentFrame.Position, contentFrame.BackgroundTransparency = UDim2.new(1, -10, 1, -35), UDim2.new(0, 5, 0, 30), 1 mainBtn = createButton("MainBtn", "", UDim2.new(0, 0, 0, 0), UDim2.new(1, 0, 0, 45)) mainBtn.Parent = contentFrame local btnW = 0.19 modeBtn = createButton("ModeBtn", "", UDim2.new(0, 0, 0, 50), UDim2.new(btnW, 0, 0, 35)) teamBtn = createButton("TeamBtn", "", UDim2.new(0.2, 2, 0, 50), UDim2.new(btnW, 0, 0, 35)) friendBtn = createButton("FriendBtn", "", UDim2.new(0.4, 4, 0, 50), UDim2.new(btnW, 0, 0, 35)) ghostBtn = createButton("GhostBtn", "", UDim2.new(0.6, 6, 0, 50), UDim2.new(btnW, 0, 0, 35)) excludeBtn = createButton("ExcludeBtn", "EXCLUDE", UDim2.new(0.8, 8, 0, 50), UDim2.new(0.18, 0, 0, 35)) for _, b in ipairs({modeBtn, teamBtn, friendBtn, ghostBtn, excludeBtn}) do b.Parent = contentFrame end local disclaimer = Instance.new("TextLabel", contentFrame) disclaimer.Text = "Physics-simulated Chams; offsets may occur." disclaimer.Size, disclaimer.Position = UDim2.new(1, 0, 0, 15), UDim2.new(0, 0, 1, -10) disclaimer.BackgroundTransparency, disclaimer.TextColor3, disclaimer.Font, disclaimer.TextSize = 1, Color3.fromRGB(200, 80, 80), Enum.Font.Gotham, 9 listContainer = Instance.new("Frame", mainFrame) listContainer.Size, listContainer.Position = UDim2.new(0, 180, 0, 250), UDim2.new(1, 10, 0, 0) listContainer.BackgroundColor3, listContainer.Visible = Color3.fromRGB(25, 25, 25), false Instance.new("UICorner", listContainer) searchBar = Instance.new("TextBox", listContainer) searchBar.Size, searchBar.Position, searchBar.PlaceholderText = UDim2.new(1, -10, 0, 25), UDim2.new(0, 5, 0, 5), "Search..." searchBar.BackgroundColor3, searchBar.TextColor3, searchBar.Font, searchBar.Text = Color3.fromRGB(40, 40, 45), Color3.new(1,1,1), Enum.Font.Gotham, "" Instance.new("UICorner", searchBar) searchBar:GetPropertyChangedSignal("Text"):Connect(refreshExclusionList) local bulk = Instance.new("Frame", listContainer) bulk.Size, bulk.Position, bulk.BackgroundTransparency = UDim2.new(1, 0, 0, 25), UDim2.new(0, 0, 0, 35), 1 local cA = createButton("C", "NONE", UDim2.new(0, 5, 0, 0), UDim2.new(0.45, 0, 1, 0)) local aA = createButton("A", "ALL", UDim2.new(0.52, 0, 0, 0), UDim2.new(0.45, 0, 1, 0)) cA.Parent, aA.Parent = bulk, bulk local scroll = Instance.new("ScrollingFrame", listContainer) scroll.Name, scroll.Size, scroll.Position = "Scroll", UDim2.new(1, -10, 1, -70), UDim2.new(0, 5, 0, 65) scroll.BackgroundTransparency, scroll.ScrollBarThickness = 1, 2 minBtn.MouseButton1Click:Connect(function() minimized = not minimized contentFrame.Visible, mainFrame.Size = not minimized, minimized and UDim2.new(0, 120, 0, 30) or UDim2.new(0, 520, 0, 150) minBtn.Text, listContainer.Visible = minimized and "+" or "-", false end) mainBtn.MouseButton1Click:Connect(function() toggleLogic() end) modeBtn.MouseButton1Click:Connect(function() currentModeIdx = (currentModeIdx % #modes) + 1 updateUIStrings() end) teamBtn.MouseButton1Click:Connect(function() teamFilter = (teamFilter == "OTHERS") and "ALL" or "OTHERS" updateUIStrings() end) friendBtn.MouseButton1Click:Connect(function() friendFilter = not friendFilter updateUIStrings() end) ghostBtn.MouseButton1Click:Connect(function() chamsEnabled = not chamsEnabled updateUIStrings() end) excludeBtn.MouseButton1Click:Connect(function() listContainer.Visible = not listContainer.Visible refreshExclusionList() end) cA.MouseButton1Click:Connect(function() excludedPlayers = {} refreshExclusionList() end) aA.MouseButton1Click:Connect(function() for _,p in pairs(Players:GetPlayers()) do if p ~= LocalPlayer then excludedPlayers[p.UserId] = true end end refreshExclusionList() end) updateUIStrings() end local function cleanup() for id, data in pairs(targets) do local p = Players:GetPlayerByUserId(id) local root = p and p.Character and p.Character:FindFirstChild("HumanoidRootPart") if root then root.CFrame = data.trueCFrame for _, v in ipairs(p.Character:GetDescendants()) do if v:IsA("BasePart") then v.Anchored = false end end end end if ghostFolder then ghostFolder:Destroy() end targets = {} lockedBaseCFrame = nil -- Clear the position lock when toggled off end function toggleLogic(isReset) if not isReset then isToggled = not isToggled end if isToggled then local root = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") if not root then if not isReset then isToggled = false end return end -- FIX: Lock the position only once per toggle if not lockedBaseCFrame then lockedBaseCFrame = root.CFrame * CFrame.new(0, 1.5, -12) end if isReset then cleanup_soft() end -- Using a soft cleanup to avoid flashing ghosts ghostFolder = ghostFolder or Instance.new("Folder", workspace) ghostFolder.Name = "FreezerGhosts" local count = 0 for _, p in ipairs(Players:GetPlayers()) do if p == LocalPlayer or excludedPlayers[p.UserId] then continue end if (teamFilter == "OTHERS" and p.Team == LocalPlayer.Team) or (friendFilter and p:IsFriendsWith(LocalPlayer.UserId)) then continue end local pRoot, pHum = p.Character and p.Character:FindFirstChild("HumanoidRootPart"), p.Character and p.Character:FindFirstChild("Humanoid") if pRoot and pHum then -- Re-use or Create Ghost logic if not targets[p.UserId] then local ghostPart = Instance.new("Part", ghostFolder) ghostPart.Size, ghostPart.Transparency, ghostPart.CanCollide, ghostPart.Anchored = Vector3.new(2, 5, 1), 1, false, true ghostPart.CFrame = pRoot.CFrame local cham = Instance.new("BoxHandleAdornment", ghostPart) cham.Size, cham.AlwaysOnTop, cham.ZIndex, cham.Adornee = Vector3.new(2.2, 5.2, 1.2), true, 5, ghostPart cham.Color3, cham.Transparency = Color3.fromRGB(0, 255, 150), 0.5 local b = Instance.new("BillboardGui", ghostPart) b.Size, b.AlwaysOnTop, b.ExtentsOffset = UDim2.new(0,80,0,40), true, Vector3.new(0,3,0) local l = Instance.new("TextLabel", b) l.Size, l.BackgroundTransparency, l.TextColor3, l.Font, l.TextSize = UDim2.new(1,0,1,0), 1, Color3.new(1,1,1), Enum.Font.GothamBold, 9 targets[p.UserId] = {trueCFrame = pRoot.CFrame, lastVel = Vector3.zero, verticalVel = 0, floorLevel = pRoot.CFrame.Y, ghostPart = ghostPart, label = l, humanoid = pHum, cham = cham} end local offset = Vector3.zero if modes[currentModeIdx] == "GRID" then local r, c = math.floor(count / 3), count % 3 offset = Vector3.new(c * 5 - 5, 0, r * -5) elseif modes[currentModeIdx] == "BLOB" then offset = Vector3.zero else offset = Vector3.new(math.random(-15,15)/10, 0, math.random(-15,15)/10) end targets[p.UserId].target = lockedBaseCFrame * CFrame.new(offset) count = count + 1 end end else cleanup() end updateUIStrings() lastResetTime = tick() end -- Soft cleanup removes only target data, not the chams/folders to prevent flicker function cleanup_soft() for id, data in pairs(targets) do local p = Players:GetPlayerByUserId(id) if not p or not p.Character then if data.ghostPart then data.ghostPart:Destroy() end targets[id] = nil end end end UserInputService.InputBegan:Connect(function(i, g) if not g and i.KeyCode == Enum.KeyCode.U then toggleLogic() end end) RunService.Heartbeat:Connect(function(dt) if not screenGui or not screenGui.Parent then setupUI() end if isToggled and (tick() - lastResetTime >= RESET_INTERVAL) then toggleLogic(true) end if not isToggled then return end local myPos = (LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")) and LocalPlayer.Character.HumanoidRootPart.Position or Vector3.zero for id, data in pairs(targets) do local p = Players:GetPlayerByUserId(id) local root = p and p.Character and p.Character:FindFirstChild("HumanoidRootPart") if root and data.humanoid then local moveDir = data.humanoid.MoveDirection if data.humanoid:GetState() == Enum.HumanoidStateType.Climbing then data.verticalVel = data.ghostPart.CFrame.LookVector:Dot(moveDir) * (data.humanoid.WalkSpeed * CLIMB_SPEED) data.lastVel, data.floorLevel = Vector3.zero, data.trueCFrame.Y else local targetVel = moveDir * data.humanoid.WalkSpeed if targetVel.Magnitude > 0 then data.lastVel = targetVel else data.lastVel = data.lastVel * (1 - (FRICTION * dt)) end if data.humanoid.Jump and math.abs(data.trueCFrame.Y - data.floorLevel) < 0.1 then data.verticalVel = JUMP_IMPULSE end data.verticalVel = data.verticalVel - (GRAVITY * dt) end local nextPos = data.trueCFrame.Position + (data.lastVel * dt) + Vector3.new(0, data.verticalVel * dt, 0) if nextPos.Y < data.floorLevel then nextPos = Vector3.new(nextPos.X, data.floorLevel, nextPos.Z) data.verticalVel = 0 end data.trueCFrame = (moveDir.Magnitude > 0.1) and CFrame.lookAt(nextPos, nextPos + moveDir) or CFrame.new(nextPos) * data.trueCFrame.Rotation data.ghostPart.CFrame, data.cham.Visible = data.trueCFrame, chamsEnabled data.label.Text = string.format("%s\n%d Studs", p.Name, math.floor((data.trueCFrame.Position - myPos).Magnitude)) -- Keep them locked at the Original Position (lockedBaseCFrame) root.CFrame = data.target for _, v in ipairs(p.Character:GetDescendants()) do if v:IsA("BasePart") then v.Anchored = true end end end end end) setupUI()