farm NO BAN IF YOU USE PRIVATE SERVER
Key Required

farm NO BAN IF YOU USE PRIVATE SERVER

[G4, Detainer!] Bathtub Universeartenkovanartenkovan 4K views 3K executesUpdated Apr 11, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•749 lines (30696 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local VirtualUser = game:GetService("VirtualUser")
local VIM = game:GetService("VirtualInputManager")

local LocalPlayer = Players.LocalPlayer

local ToolSequence = {
    "Melee",
    "Machine Gun",
    "Laser",
    "Rocket Launchers"
}

local Config = {
    StopScripts = false,
    
    -- Farm & Basic
    TargetToolName = "", AutoEquip = false,
    MultiAutoEquip = false, MultiEquipDelay = 1,
    CoordX = 0, CoordY = 0, CoordZ = 0, TpDelay = 1, AutoTp = false,
    AutoAttack = false, AutoSpawn = false, AntiAfk = false,
    
    -- Auto Farm (Behind TP)
    AutoFarm = false, FarmDistance = 5,
    
    -- Speed
    SpeedMult = 2, AutoSpeed = false, HoldQSpeed = false, IsQHeld = false,
    
    -- Orbit
    OrbitCenter = Vector3.new(0, 50, 0), OrbitRadius = 20, OrbitSpeed = 2, OrbitEnabled = false, OrbitClockwise = true, OrbitConnection = nil, OrbitAngle = 0,
    
    -- Aim
    AimToiletAuto = false, AimToiletHoldE = false,
    AimPlayerAuto = false, AimPlayerHoldE = false, IsEHeld = false,
    
    -- ESP
    EspPlayer = false, EspToilet = false
}

local CachedToilets = {}
task.spawn(function()
    while true do
        if Config.StopScripts then break end
        
        local tempCache = {}
        -- Ищем папку с мобами в Workspace
        local enemyFolder = workspace:FindFirstChild("Enemies") or workspace:FindFirstChild("Toilets")
        
        if enemyFolder then
            for _, obj in pairs(enemyFolder:GetDescendants()) do
                if obj:IsA("Model") and obj ~= LocalPlayer.Character then
                    -- Проверяем наличие Humanoid, чтобы избежать захвата мусорных моделей
                    if obj:FindFirstChild("Humanoid") then
                        table.insert(tempCache, obj)
                    end
                end
            end
        end
        
        CachedToilets = tempCache
        task.wait(1)
    end
end)

local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "ProHub_Ultimate"
ScreenGui.ResetOnSpawn = false
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
pcall(function() ScreenGui.Parent = game:GetService("CoreGui") end)
if not ScreenGui.Parent then ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") end

local MainFrame = Instance.new("Frame")
MainFrame.Size = UDim2.new(0, 380, 0, 500)
MainFrame.Position = UDim2.new(0.5, -190, 0.5, -250)
MainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
MainFrame.BorderSizePixel = 0
MainFrame.ClipsDescendants = true
MainFrame.Parent = ScreenGui
Instance.new("UICorner", MainFrame).CornerRadius = UDim.new(0, 8)

local Header = Instance.new("Frame")
Header.Size = UDim2.new(1, 0, 0, 45)
Header.BackgroundColor3 = Color3.fromRGB(40, 40, 50)
Header.BorderSizePixel = 0
Header.Parent = MainFrame

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, -100, 1, 0)
Title.Position = UDim2.new(0, 15, 0, 0)
Title.Text = "🛁 Pro Hub Ultimate"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.BackgroundTransparency = 1
Title.Font = Enum.Font.GothamBold
Title.TextSize = 16
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.Parent = Header

local MinBtn = Instance.new("TextButton")
MinBtn.Size = UDim2.new(0, 40, 1, 0)
MinBtn.Position = UDim2.new(1, -80, 0, 0)
MinBtn.BackgroundTransparency = 1
MinBtn.Text = "−"
MinBtn.Font = Enum.Font.GothamBold
MinBtn.TextSize = 24
MinBtn.TextColor3 = Color3.fromRGB(200, 200, 200)
MinBtn.Parent = Header

local CloseBtn = Instance.new("TextButton")
CloseBtn.Size = UDim2.new(0, 40, 1, 0)
CloseBtn.Position = UDim2.new(1, -40, 0, 0)
CloseBtn.BackgroundTransparency = 1
CloseBtn.Text = "×"
CloseBtn.Font = Enum.Font.GothamBold
CloseBtn.TextSize = 24
CloseBtn.TextColor3 = Color3.fromRGB(255, 100, 100)
CloseBtn.Parent = Header

local Holder = Instance.new("ScrollingFrame")
Holder.Size = UDim2.new(1, -20, 1, -55)
Holder.Position = UDim2.new(0, 10, 0, 50)
Holder.BackgroundTransparency = 1
Holder.BorderSizePixel = 0
Holder.ScrollBarThickness = 4
Holder.AutomaticCanvasSize = Enum.AutomaticSize.Y
Holder.Parent = MainFrame

local UIListLayout = Instance.new("UIListLayout")
UIListLayout.Padding = UDim.new(0, 8)
UIListLayout.Parent = Holder

local function CreateSection(title)
    local Section = Instance.new("Frame")
    Section.Size = UDim2.new(1, 0, 0, 0)
    Section.BackgroundTransparency = 1
    Section.AutomaticSize = Enum.AutomaticSize.Y
    Section.Parent = Holder
    
    local Label = Instance.new("TextLabel")
    Label.Size = UDim2.new(1, 0, 0, 25)
    Label.Text = title
    Label.TextColor3 = Color3.fromRGB(150, 150, 180)
    Label.BackgroundTransparency = 1
    Label.Font = Enum.Font.GothamBold
    Label.TextSize = 12
    Label.TextXAlignment = Enum.TextXAlignment.Left
    Label.Parent = Section
    
    local Container = Instance.new("Frame")
    Container.Size = UDim2.new(1, 0, 0, 0)
    Container.Position = UDim2.new(0, 0, 0, 25)
    Container.BackgroundTransparency = 1
    Container.AutomaticSize = Enum.AutomaticSize.Y
    Container.Parent = Section
    
    local Layout = Instance.new("UIListLayout")
    Layout.Padding = UDim.new(0, 5)
    Layout.Parent = Container
    return Container
end

local function CreateToggle(parent, name, defaultState, callback)
    local Frame = Instance.new("Frame")
    Frame.Size = UDim2.new(1, 0, 0, 40)
    Frame.BackgroundColor3 = Color3.fromRGB(35, 35, 40)
    Frame.BorderSizePixel = 0
    Frame.Parent = parent
    
    local Label = Instance.new("TextLabel")
    Label.Size = UDim2.new(1, -60, 1, 0)
    Label.Position = UDim2.new(0, 10, 0, 0)
    Label.Text = name
    Label.TextColor3 = Color3.fromRGB(220, 220, 220)
    Label.BackgroundTransparency = 1
    Label.Font = Enum.Font.Gotham
    Label.TextSize = 14
    Label.TextXAlignment = Enum.TextXAlignment.Left
    Label.Parent = Frame
    
    local Btn = Instance.new("TextButton")
    Btn.Size = UDim2.new(0, 40, 0, 20)
    Btn.Position = UDim2.new(1, -50, 0.5, -10)
    Btn.Text = ""
    Btn.BackgroundColor3 = Color3.fromRGB(60, 60, 65)
    Btn.BorderSizePixel = 0
    Btn.Parent = Frame
    
    local Indicator = Instance.new("Frame")
    Indicator.Size = UDim2.new(0, 16, 0, 16)
    Indicator.Position = UDim2.new(0, 2, 0.5, -8)
    Indicator.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    Indicator.BorderSizePixel = 0
    Indicator.Parent = Btn
    
    local state = defaultState or false
    Btn.BackgroundColor3 = state and Color3.fromRGB(70, 180, 100) or Color3.fromRGB(60, 60, 65)
    Indicator.Position = state and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8)
    
    Btn.MouseButton1Click:Connect(function()
        state = not state
        Btn.BackgroundColor3 = state and Color3.fromRGB(70, 180, 100) or Color3.fromRGB(60, 60, 65)
        Indicator.Position = state and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8)
        callback(state)
    end)
    return Frame
end

local function CreateInput(parent, placeholder, defaultText, callback)
    local Input = Instance.new("TextBox")
    Input.Size = UDim2.new(1, 0, 0, 35)
    Input.BackgroundColor3 = Color3.fromRGB(35, 35, 40)
    Input.BorderSizePixel = 0
    Input.Text = defaultText or ""
    Input.PlaceholderText = placeholder
    Input.Font = Enum.Font.Gotham
    Input.TextSize = 13
    Input.TextColor3 = Color3.fromRGB(255, 255, 255)
    Input.ClearTextOnFocus = false
    Input.Parent = parent
    Input.FocusLost:Connect(function() callback(Input.Text, Input) end)
    return Input
end

local function CreateButton(parent, text, callback)
    local Btn = Instance.new("TextButton")
    Btn.Size = UDim2.new(1, 0, 0, 35)
    Btn.BackgroundColor3 = Color3.fromRGB(50, 50, 60)
    Btn.Text = text
    Btn.Font = Enum.Font.GothamBold
    Btn.TextSize = 13
    Btn.TextColor3 = Color3.fromRGB(255, 255, 255)
    Btn.BorderSizePixel = 0
    Btn.Parent = parent
    Btn.MouseButton1Click:Connect(callback)
    return Btn
end

local BaseSec = CreateSection("⚔️ FARM & COMBAT")

CreateInput(BaseSec, "Farm Distance (Studs)", tostring(Config.FarmDistance), function(txt, obj) 
    local val = tonumber(txt)
    if val then Config.FarmDistance = val else obj.Text = tostring(Config.FarmDistance) end 
end)
CreateToggle(BaseSec, "🤖 Auto Farm (TP Behind)", Config.AutoFarm, function(state) Config.AutoFarm = state end)

CreateInput(BaseSec, "Single Tool Name", "", function(txt) Config.TargetToolName = txt end)
CreateToggle(BaseSec, "⚡ Single Auto-Equip", Config.AutoEquip, function(state) Config.AutoEquip = state end)

CreateInput(BaseSec, "Multi-Equip Delay (sec)", tostring(Config.MultiEquipDelay), function(txt, obj) local val = tonumber(txt); if val then Config.MultiEquipDelay = val else obj.Text = tostring(Config.MultiEquipDelay) end end)
CreateToggle(BaseSec, "🔄 Multi Auto-Equip", Config.MultiAutoEquip, function(state) Config.MultiAutoEquip = state end)

CreateToggle(BaseSec, "⚔️ Auto Attack", Config.AutoAttack, function(state) Config.AutoAttack = state end)
CreateToggle(BaseSec, "♻️ Auto Spawn", Config.AutoSpawn, function(state) Config.AutoSpawn = state end)


local TpSec = CreateSection("📍 TELEPORT (COORDS)")
CreateInput(TpSec, "X Coordinate", tostring(Config.CoordX), function(txt, obj) local val = tonumber(txt); if val then Config.CoordX = val else obj.Text = tostring(Config.CoordX) end end)
CreateInput(TpSec, "Y Coordinate", tostring(Config.CoordY), function(txt, obj) local val = tonumber(txt); if val then Config.CoordY = val else obj.Text = tostring(Config.CoordY) end end)
CreateInput(TpSec, "Z Coordinate", tostring(Config.CoordZ), function(txt, obj) local val = tonumber(txt); if val then Config.CoordZ = val else obj.Text = tostring(Config.CoordZ) end end)
CreateInput(TpSec, "Delay (seconds)", tostring(Config.TpDelay), function(txt, obj) local val = tonumber(txt); if val then Config.TpDelay = val else obj.Text = tostring(Config.TpDelay) end end)
CreateButton(TpSec, "📍 Телепортироваться", function()
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
        LocalPlayer.Character.HumanoidRootPart.CFrame = CFrame.new(Config.CoordX, Config.CoordY, Config.CoordZ)
    end
end)
CreateToggle(TpSec, "Авто TP (с задержкой)", Config.AutoTp, function(state) Config.AutoTp = state end)

local SpeedSec = CreateSection("⚡ PLAYER SPEED")
CreateInput(SpeedSec, "Speed Multiplier", tostring(Config.SpeedMult), function(txt, obj) local val = tonumber(txt); if val then Config.SpeedMult = val else obj.Text = tostring(Config.SpeedMult) end end)
CreateToggle(SpeedSec, "🏃 Auto Speed", Config.AutoSpeed, function(state) Config.AutoSpeed = state end)
CreateToggle(SpeedSec, "⌨️ Hold Q Speed", Config.HoldQSpeed, function(state) Config.HoldQSpeed = state end)

local OrbitSec = CreateSection("🌀 ULTRA DODGE (ORBIT)")
local OrbitCoords = CreateInput(OrbitSec, "Center Coords (X, Y, Z)", "0, 50, 0", function(txt)
    local x, y, z = txt:match("([^,]+),([^,]+),([^,]+)")
    if x and y and z then Config.OrbitCenter = Vector3.new(tonumber(x), tonumber(y), tonumber(z)) end
end)
CreateButton(OrbitSec, "📍 Set Center to My Position", function()
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then 
        local pos = LocalPlayer.Character.HumanoidRootPart.Position
        Config.OrbitCenter = pos
        OrbitCoords.Text = string.format("%d, %d, %d", math.floor(pos.X), math.floor(pos.Y), math.floor(pos.Z)) 
    end
end)
CreateInput(OrbitSec, "Radius", tostring(Config.OrbitRadius), function(txt, obj) local val = tonumber(txt); if val then Config.OrbitRadius = val else obj.Text = tostring(Config.OrbitRadius) end end)
CreateInput(OrbitSec, "Speed", tostring(Config.OrbitSpeed), function(txt, obj) local val = tonumber(txt); if val then Config.OrbitSpeed = val else obj.Text = tostring(Config.OrbitSpeed) end end)
CreateToggle(OrbitSec, "🚀 Enable Ultra Dodge", Config.OrbitEnabled, function(state) Config.OrbitEnabled = state end)

local AimSec = CreateSection("🎯 AIMBOTS")
CreateToggle(AimSec, "👾 Toilet Autoaim", Config.AimToiletAuto, function(state) Config.AimToiletAuto = state end)
CreateToggle(AimSec, "⌨️ Hold E Toilet Aim", Config.AimToiletHoldE, function(state) Config.AimToiletHoldE = state end)
CreateToggle(AimSec, "👤 Player Autoaim", Config.AimPlayerAuto, function(state) Config.AimPlayerAuto = state end)
CreateToggle(AimSec, "⌨️ Hold E Player Aim", Config.AimPlayerHoldE, function(state) Config.AimPlayerHoldE = state end)

-- ESP SECTION
local ActivePlayerESP = {}
local ActiveToiletESP = {}

local function ClearPlayerESP()
    for _, data in pairs(ActivePlayerESP) do
        if data.Billboard then data.Billboard:Destroy() end
        if data.Highlight then data.Highlight:Destroy() end
    end
    table.clear(ActivePlayerESP)
end

local function ClearToiletESP()
    for _, data in pairs(ActiveToiletESP) do
        if data.Billboard then data.Billboard:Destroy() end
        if data.Highlight then data.Highlight:Destroy() end
    end
    table.clear(ActiveToiletESP)
end

local EspSec = CreateSection("👁️ VISUALS (ESP)")
CreateToggle(EspSec, "👤 Player ESP", Config.EspPlayer, function(state) 
    Config.EspPlayer = state
    if not state then ClearPlayerESP() end
end)
CreateToggle(EspSec, "👾 Toilet ESP", Config.EspToilet, function(state) 
    Config.EspToilet = state
    if not state then ClearToiletESP() end
end)

local MiscSec = CreateSection("🛡️ MISC")
CreateToggle(MiscSec, "💤 Anti-AFK", Config.AntiAfk, function(state) Config.AntiAfk = state end)

Instance.new("Frame", Holder).Size = UDim2.new(1, 0, 0, 10)

-- === 4. ЛОГИКА ОКНА ===
local isMinimized = false
MinBtn.MouseButton1Click:Connect(function()
    isMinimized = not isMinimized
    MainFrame:TweenSize(isMinimized and UDim2.new(0, 380, 0, 45) or UDim2.new(0, 380, 0, 500), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.2, true)
    MinBtn.Text = isMinimized and "+" or "−"
end)

CloseBtn.MouseButton1Click:Connect(function() 
    Config.StopScripts = true
    ClearPlayerESP()
    ClearToiletESP()
    ScreenGui:Destroy() 
end)

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed or UserInputService:GetFocusedTextBox() then return end
    if input.KeyCode == Enum.KeyCode.RightControl then ScreenGui.Enabled = not ScreenGui.Enabled
    elseif input.KeyCode == Enum.KeyCode.Q then Config.IsQHeld = true 
    elseif input.KeyCode == Enum.KeyCode.E then Config.IsEHeld = true end
end)

UserInputService.InputEnded:Connect(function(input, gameProcessed)
    if gameProcessed or UserInputService:GetFocusedTextBox() then return end
    if input.KeyCode == Enum.KeyCode.Q then Config.IsQHeld = false 
    elseif input.KeyCode == Enum.KeyCode.E then Config.IsEHeld = false end
end)

local dragging, dragStart, startPos = false, nil, nil
Header.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true; dragStart = input.Position; startPos = MainFrame.Position end
end)
UserInputService.InputChanged:Connect(function(input)
    if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
        local delta = input.Position - dragStart
        MainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
    end
end)
UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end)




local function equipSingleTool()
    local character = LocalPlayer.Character
    if not character then return end
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if not humanoid or Config.TargetToolName == "" then return end
    
    for _, item in pairs(character:GetChildren()) do
        if item:IsA("Tool") and item.Name == Config.TargetToolName then return end
    end
    
    local tool = LocalPlayer.Backpack:FindFirstChild(Config.TargetToolName)
    if tool and tool:IsA("Tool") then humanoid:EquipTool(tool) end
end

task.spawn(function()
    while not Config.StopScripts do
        if Config.AutoEquip then equipSingleTool() end
        task.wait(0.3)
    end
end)


task.spawn(function()
    local currentIndex = 1
    while not Config.StopScripts do
        if Config.MultiAutoEquip and #ToolSequence > 0 then
            local character = LocalPlayer.Character
            if character then
                local humanoid = character:FindFirstChildOfClass("Humanoid")
                if humanoid then
                    local toolName = ToolSequence[currentIndex]
                    local tool = LocalPlayer.Backpack:FindFirstChild(toolName) or character:FindFirstChild(toolName)
                    
                    if tool and tool:IsA("Tool") then
                        humanoid:EquipTool(tool)
                    end
                    
                    currentIndex = currentIndex + 1
                    if currentIndex > #ToolSequence then
                        currentIndex = 1
                    end
                end
            end
            task.wait(Config.MultiEquipDelay)
        else
            task.wait(0.5)
        end
    end
end)

LocalPlayer.CharacterAdded:Connect(function()
    task.wait(0.5)
    if Config.AutoEquip then equipSingleTool() end
end)


task.spawn(function()
    while not Config.StopScripts do
        if Config.AutoTp then
            if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                LocalPlayer.Character.HumanoidRootPart.CFrame = CFrame.new(Config.CoordX, Config.CoordY, Config.CoordZ)
            end
            task.wait(Config.TpDelay)
        else
            task.wait(0.5)
        end
    end
end)


task.spawn(function()
    while not Config.StopScripts do
        if Config.AutoSpawn then
            local PlayerGui = LocalPlayer:FindFirstChild("PlayerGui")
            local mainUI = PlayerGui and PlayerGui:FindFirstChild("MainUI")
            local menuBG = mainUI and mainUI:FindFirstChild("MenuBG")
            
            if menuBG and menuBG.Visible then
                pcall(function()
                    VIM:SendKeyEvent(true, Enum.KeyCode.BackSlash, false, game)
                    task.wait(0.25)
                    VIM:SendKeyEvent(false, Enum.KeyCode.BackSlash, false, game)
                    task.wait(0.25)
                    VIM:SendKeyEvent(true, Enum.KeyCode.Down, false, game)
                    task.wait(0.25)
                    VIM:SendKeyEvent(false, Enum.KeyCode.Down, false, game)
                    task.wait(0.25)
                    VIM:SendKeyEvent(true, Enum.KeyCode.Return, false, game)
                    task.wait(0.25)
                    VIM:SendKeyEvent(false, Enum.KeyCode.Return, false, game)
                end)
                task.wait(2)
            end
        end
        task.wait(1)
    end
end)


local function GetEffectiveMultiplier()
    if Config.AutoSpeed then return Config.SpeedMult end
    if Config.HoldQSpeed and Config.IsQHeld then return Config.SpeedMult end
    return 1
end

local function accelerateModel(character)
    for _, obj in pairs(character:GetDescendants()) do
        if obj:IsA("Animator") then
            local animController = obj.Parent
            if animController:IsA("AnimationController") or animController:IsA("Humanoid") then
                obj.AnimationPlayed:Connect(function(track) track:AdjustSpeed(GetEffectiveMultiplier()) end)
            end
        end
    end
    
    local root = character:WaitForChild("HumanoidRootPart", 5)
    if root then
        local lastCFrame = root.CFrame
        local connection
        connection = RunService.Heartbeat:Connect(function()
            if Config.StopScripts or not character.Parent or not root.Parent or not ScreenGui.Parent then connection:Disconnect(); return end
            local currentMultiplier = GetEffectiveMultiplier()
            local movement = root.CFrame.Position - lastCFrame.Position
            local horizontalMovement = Vector3.new(movement.X, 0, movement.Z) * (currentMultiplier - 1)
            local verticalMovement = Vector3.new(0, movement.Y * (currentMultiplier - 1), 0)
            
            if movement.Magnitude > 0.01 and movement.Magnitude < 50 then root.CFrame = root.CFrame + horizontalMovement + verticalMovement end
            lastCFrame = root.CFrame
        end)
    end
end
if LocalPlayer.Character then accelerateModel(LocalPlayer.Character) end
LocalPlayer.CharacterAdded:Connect(function(character) task.wait(0.5); accelerateModel(character) end)


local function GetClosestToilet()
    local closest, shortestDist = nil, math.huge
    local lpChar = LocalPlayer.Character
    if not lpChar or not lpChar.PrimaryPart then return nil end
    local lpPos = lpChar.PrimaryPart.Position
    
    for _, model in pairs(CachedToilets) do
        if model.Parent then
            local root = model.PrimaryPart or model:FindFirstChild("HumanoidRootPart")
            local hum = model:FindFirstChild("Humanoid")
            if root and (not hum or hum.Health > 0) then
                local dist = (root.Position - lpPos).Magnitude
                if dist < shortestDist then shortestDist = dist; closest = root end
            end
        end
    end
    return closest
end

local function GetClosestPlayer()
    local closest, shortestDist = nil, math.huge
    local lpChar = LocalPlayer.Character
    if not lpChar or not lpChar.PrimaryPart then return nil end
    local lpPos = lpChar.PrimaryPart.Position
    
    for _, plr in pairs(Players:GetPlayers()) do
        if plr ~= LocalPlayer and plr.Character then
            local root = plr.Character:FindFirstChild("HumanoidRootPart")
            local hum = plr.Character:FindFirstChild("Humanoid")
            if root and hum and hum.Health > 0 then
                local dist = (root.Position - lpPos).Magnitude
                if dist < shortestDist then shortestDist = dist; closest = root end
            end
        end
    end
    return closest
end


RunService.Heartbeat:Connect(function(deltaTime)
    if Config.StopScripts then return end
    

    if Config.AutoAttack then
        local tool = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Tool")
        if tool then tool:Activate() end
    end
    

    if Config.AutoFarm then
        local target = GetClosestToilet()
        local char = LocalPlayer.Character
        
        if target and char and char:FindFirstChild("HumanoidRootPart") then
            local hrp = char.HumanoidRootPart

            local behindPosition = target.CFrame * CFrame.new(0, 0, Config.FarmDistance)
            hrp.CFrame = CFrame.lookAt(behindPosition.Position, target.Position)
            

            hrp.AssemblyLinearVelocity = Vector3.zero
            hrp.AssemblyAngularVelocity = Vector3.zero
        end
    end


    if not Config.OrbitEnabled then 
        if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") and Config.OrbitConnection then 
            LocalPlayer.Character.HumanoidRootPart.AssemblyLinearVelocity = Vector3.zero 
            Config.OrbitConnection = false
        end
        return 
    end

    if not Config.AutoFarm then
        Config.OrbitConnection = true
        local char = LocalPlayer.Character; local root = char and char:FindFirstChild("HumanoidRootPart")
        if not char or not root then return end
        local direction = Config.OrbitClockwise and -1 or 1
        Config.OrbitAngle = Config.OrbitAngle + (Config.OrbitSpeed * deltaTime * direction)
        local newX = Config.OrbitCenter.X + math.cos(Config.OrbitAngle) * Config.OrbitRadius
        local newZ = Config.OrbitCenter.Z + math.sin(Config.OrbitAngle) * Config.OrbitRadius
        char:PivotTo(CFrame.new(newX, Config.OrbitCenter.Y, newZ))
        root.AssemblyLinearVelocity = Vector3.zero; root.AssemblyAngularVelocity = Vector3.zero
    end
end)


RunService.RenderStepped:Connect(function()
    if Config.StopScripts then return end
    local camera = workspace.CurrentCamera
    if not camera then return end
    

    local targetToAim = nil
    
    if Config.AimPlayerAuto or (Config.AimPlayerHoldE and Config.IsEHeld) then
        targetToAim = GetClosestPlayer()
    end
    
    if not targetToAim and (Config.AimToiletAuto or (Config.AimToiletHoldE and Config.IsEHeld)) then
        targetToAim = GetClosestToilet()
    end
    
    if targetToAim then 
        camera.CFrame = CFrame.lookAt(camera.CFrame.Position, targetToAim.Position) 
    end
    

    if Config.EspPlayer then
        local currentPlayers = {}
        for _, plr in pairs(Players:GetPlayers()) do
            if plr ~= LocalPlayer and plr.Character then
                local char = plr.Character
                local root = char:FindFirstChild("HumanoidRootPart") or char.PrimaryPart
                local hum = char:FindFirstChild("Humanoid")
                
                if root and hum and hum.Health > 0 then
                    currentPlayers[char] = true
                    local espData = ActivePlayerESP[char]
                    
                    if not espData then
                        local bg = Instance.new("BillboardGui")
                        bg.Size = UDim2.new(0, 200, 0, 50)
                        bg.AlwaysOnTop = true
                        bg.Adornee = root
                        bg.StudsOffset = Vector3.new(0, 3.5, 0)
                        bg.Parent = ScreenGui
                        
                        local tl = Instance.new("TextLabel")
                        tl.Size = UDim2.new(1, 0, 1, 0)
                        tl.BackgroundTransparency = 1
                        tl.Font = Enum.Font.GothamBold
                        tl.TextSize = 12
                        tl.TextColor3 = Color3.fromRGB(63, 255, 0)
                        tl.TextStrokeTransparency = 0
                        tl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
                        tl.Parent = bg
                        
                        local hl = Instance.new("Highlight")
                        hl.FillColor = Color3.fromRGB(63, 255, 0)
                        hl.OutlineColor = Color3.fromRGB(255, 255, 255)
                        hl.FillTransparency = 0.5
                        hl.Parent = char
                        
                        espData = {Billboard = bg, TextLabel = tl, Highlight = hl}
                        ActivePlayerESP[char] = espData
                    end
                    
                    if LocalPlayer.Character and LocalPlayer.Character.PrimaryPart then
                        local dist = math.floor((root.Position - LocalPlayer.Character.PrimaryPart.Position).Magnitude)
                        local hp = math.floor(hum.Health)
                        local maxHp = math.floor(hum.MaxHealth)
                        espData.TextLabel.Text = string.format("%s\nHP: %d/%d\n[%d studs]", plr.Name, hp, maxHp, dist)
                    end
                end
            end
        end
        

        for char, data in pairs(ActivePlayerESP) do
            if not currentPlayers[char] or not char.Parent then
                if data.Billboard then data.Billboard:Destroy() end
                if data.Highlight then data.Highlight:Destroy() end
                ActivePlayerESP[char] = nil
            end
        end
    end
    

    if Config.EspToilet then
        local currentToilets = {}
        for _, model in pairs(CachedToilets) do
            if model.Parent then
                local root = model.PrimaryPart or model:FindFirstChild("HumanoidRootPart")
                local hum = model:FindFirstChild("Humanoid")
                
                if root and (not hum or hum.Health > 0) then
                    currentToilets[model] = true
                    local espData = ActiveToiletESP[model]
                    
                    if not espData then
                        local bg = Instance.new("BillboardGui")
                        bg.Size = UDim2.new(0, 200, 0, 50)
                        bg.AlwaysOnTop = true
                        bg.Adornee = root
                        bg.StudsOffset = Vector3.new(0, 3.5, 0)
                        bg.Parent = ScreenGui
                        
                        local tl = Instance.new("TextLabel")
                        tl.Size = UDim2.new(1, 0, 1, 0)
                        tl.BackgroundTransparency = 1
                        tl.Font = Enum.Font.GothamBold
                        tl.TextSize = 12
                        tl.TextColor3 = Color3.fromRGB(255, 60, 60)
                        tl.TextStrokeTransparency = 0
                        tl.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
                        tl.Parent = bg
                        
                        local hl = Instance.new("Highlight")
                        hl.FillColor = Color3.fromRGB(255, 60, 60)
                        hl.OutlineColor = Color3.fromRGB(255, 255, 255)
                        hl.FillTransparency = 0.5
                        hl.Parent = model
                        
                        espData = {Billboard = bg, TextLabel = tl, Highlight = hl}
                        ActiveToiletESP[model] = espData
                    end
                    
                    if LocalPlayer.Character and LocalPlayer.Character.PrimaryPart then
                        local dist = math.floor((root.Position - LocalPlayer.Character.PrimaryPart.Position).Magnitude)
                        local hp = hum and math.floor(hum.Health) or 0
                        local maxHp = hum and math.floor(hum.MaxHealth) or 0
                        if hum then
                            espData.TextLabel.Text = string.format("%s\nHP: %d/%d\n[%d studs]", model.Name, hp, maxHp, dist)
                        else
                            espData.TextLabel.Text = string.format("%s\n[%d studs]", model.Name, dist)
                        end
                    end
                end
            end
        end
        

        for model, data in pairs(ActiveToiletESP) do
            if not currentToilets[model] or not model.Parent then
                if data.Billboard then data.Billboard:Destroy() end
                if data.Highlight then data.Highlight:Destroy() end
                ActiveToiletESP[model] = nil
            end
        end
    end
end)


LocalPlayer.Idled:Connect(function()
    if Config.AntiAfk and not Config.StopScripts then
        VirtualUser:CaptureController()
        VirtualUser:ClickButton2(Vector2.new())
    end
end)

Features & Information

Put yout abilites in local ToolSequence = { "Melee", "Machine Gun", "Laser", "Rocket Launchers" } for multi equip Use RAM for good farm, dont use in public server!

Community Comments (6)

WemmbuhWemmbuhApr 13, 2026

How to use this

gurtpls67gurtpls67Apr 13, 2026

How do u even use ts what char equipped or smh like that

gurtpls67gurtpls67Apr 24, 2026

Ts is not working ts is useless

artenkovanartenkovanApr 28, 2026

I will make new version with anticheat and instruction how to use

artenkovanartenkovanApr 28, 2026

Or more precisely, hidden and modified code. Anti-cheat already exists.

artenkovanartenkovanApr 28, 2026

And those who say it doesn't work, it did work. The reason is that because the code is open source, the developers created a script that interferes with the script's operation.

More Scripts for [G4, Detainer!] Bathtub Universe