RobloxMAN Gui
Key Required

RobloxMAN Gui

The Apocalypse Swrod1kSwrod1k 2.7K views 232 executesUpdated Dec 17, 2025
0.0/ 5(4 votes)
040% Positive
Lua Script•2052 lines (59771 chars)
local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/"
local success, Library = pcall(function()
    return loadstring(game:HttpGet(repo .. "Library.lua"))()
end)

if not success then
    error("Не удалось загрузить библиотеку!")
end

local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()

local Options = Library.Options
local Toggles = Library.Toggles

Library.ForceCheckbox = false
Library.ShowToggleFrameInKeybinds = true

local Players = game:GetService("Players")
local VirtualInputManager = game:GetService("VirtualInputManager")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local HttpService = game:GetService("HttpService")

local player = Players.LocalPlayer

_G.AutoFarmRunning = false
_G.AutoFarmTask = nil
_G.Flying = false
_G.FlySpeed = 50
_G.NoClipEnabled = false
_G.FlyBodyVelocity = nil
_G.NoClipConnection = nil
_G.InfJumpEnabled = false
_G.FarmFlySpeed = 50
_G.AimSmoothness = 0.3
_G.ESPRunning = false
_G.ESPConnection = nil
_G.ESPObjects = {}
_G.EnemyESPRunning = false
_G.EnemyESPConnection = nil
_G.EnemyESPObjects = {}
_G.PlayerESPRunning = false
_G.PlayerESPConnection = nil
_G.PlayerESPObjects = {}
_G.HitboxMultiplier = 5
_G.HitboxEnabled = false
_G.HitboxConnection = nil
_G.OriginalHitboxSizes = {}
_G.ShowHeadHitboxEnabled = false
_G.HeadHitboxConnection = nil
_G.HeadHitboxParts = {}
_G.Invisible = false
_G.InvisibilityConnection = nil

_G.SpeedLoop = nil

_G.Waypoints = {}
_G.SelectedWaypoint = nil

_G.KnownEnemies = {
    "Zombie",
    "ArcticZombie",
    "Headless Zombie", 
    "Infected Zombie",
    "Mutant Zombie",
    "Radioactive Zombie",
    "Others Enemy"
}

_G.SelectedEnemies = {}
for _, enemyName in pairs(_G.KnownEnemies) do
    _G.SelectedEnemies[enemyName] = true
end

_G.AvailableObjects = {
    "BlueberryBush",
    "Coal", 
    "CommonLoot",
    "CopperOre",
    "IronOre",
    "MedicalLoot",
    "Palm1",
    "Palm2", 
    "Palm3",
    "PotatoPlant",
    "PresentLoot",
    "RareLoot",
    "Sandstone",
    "Stone",
    "StrawberryBush",
    "Tree1",
    "Tree2",
    "Tree3",
    "Tree4",
    "Tree5",
    "UncommonLoot"
}

_G.SelectedObjects = {}
for _, objName in pairs(_G.AvailableObjects) do
    _G.SelectedObjects[objName] = true
end

local BRIGHT_PURPLE_COLOR = Color3.fromRGB(200, 0, 255)

_G.ESPColors = {
    ["BlueberryBush"] = Color3.fromRGB(0, 100, 255),
    ["Coal"] = Color3.fromRGB(30, 30, 30),
    ["CommonLoot"] = Color3.fromRGB(255, 255, 255),
    ["CopperOre"] = Color3.fromRGB(184, 115, 51),
    ["IronOre"] = Color3.fromRGB(150, 150, 150),
    ["MedicalLoot"] = Color3.fromRGB(255, 0, 0),
    ["Palm1"] = Color3.fromRGB(34, 139, 34),
    ["Palm2"] = Color3.fromRGB(0, 100, 0),
    ["Palm3"] = Color3.fromRGB(0, 80, 0),
    ["PotatoPlant"] = Color3.fromRGB(139, 69, 19),
    ["PresentLoot"] = Color3.fromRGB(255, 215, 0),
    ["RareLoot"] = Color3.fromRGB(0, 255, 255),
    ["Sandstone"] = Color3.fromRGB(210, 180, 140),
    ["Stone"] = Color3.fromRGB(128, 128, 128),
    ["StrawberryBush"] = Color3.fromRGB(255, 0, 0),
    ["Tree1"] = Color3.fromRGB(85, 107, 47),
    ["Tree2"] = Color3.fromRGB(107, 142, 35),
    ["Tree3"] = Color3.fromRGB(124, 252, 0),
    ["Tree4"] = Color3.fromRGB(173, 255, 47),
    ["Tree5"] = Color3.fromRGB(154, 205, 50),
    ["UncommonLoot"] = Color3.fromRGB(0, 255, 0),
    
    ["Zombie"] = Color3.fromRGB(255, 100, 100),
    ["ArcticZombie"] = Color3.fromRGB(100, 200, 255),
    ["Headless Zombie"] = Color3.fromRGB(255, 150, 50),
    ["Infected Zombie"] = Color3.fromRGB(100, 255, 100),
    ["Mutant Zombie"] = Color3.fromRGB(255, 50, 200),
    ["Radioactive Zombie"] = Color3.fromRGB(50, 255, 50),
    ["Others Enemy"] = Color3.fromRGB(255, 50, 50),
    ["Boss"] = Color3.fromRGB(255, 0, 0),
    ["Player"] = Color3.fromRGB(0, 200, 255),
}

local function startSpeedLoop()
    if _G.SpeedLoop then return end
    
    _G.SpeedLoop = RunService.Heartbeat:Connect(function()
        if not Toggles.SpeedToggle or not Toggles.SpeedToggle.Value then
            _G.SpeedLoop:Disconnect()
            _G.SpeedLoop = nil
            return
        end
        
        local character = player.Character
        if not character then return end
        
        local humanoid = character:FindFirstChildOfClass("Humanoid")
        if not humanoid then return end
        
        local speed = Options.SpeedValue and Options.SpeedValue.Value or 50
        humanoid.WalkSpeed = speed
    end)
end

local function disableCameraShake()
    local camera = workspace.CurrentCamera
    if not camera then return end
    
    for _, child in pairs(camera:GetChildren()) do
        if child:IsA("Camera") or child:IsA("Script") then
            local success, result = pcall(function()
                if child.Name:lower():find("shake") or child.Name:lower():find("camera") then
                    child:Destroy()
                end
            end)
        end
    end
    
    camera.CameraType = Enum.CameraType.Custom
end

local function getEnemyType(enemyName)
    for _, knownEnemy in pairs(_G.KnownEnemies) do
        if string.find(enemyName, knownEnemy) or enemyName == knownEnemy then
            if knownEnemy == "Others Enemy" then
                return "Others Enemy", enemyName
            end
            return knownEnemy, nil
        end
    end
    
    if string.find(enemyName, "Arctic") then
        return "ArcticZombie", nil
    elseif string.find(enemyName, "Mutant") then
        return "Mutant Zombie", nil
    elseif string.find(enemyName, "Headless") then
        return "Headless Zombie", nil
    elseif string.find(enemyName, "Infected") then
        return "Infected Zombie", nil
    elseif string.find(enemyName, "Radioactive") then
        return "Radioactive Zombie", nil
    elseif string.find(enemyName, "Zombie") then
        return "Zombie", nil
    elseif string.find(enemyName, "Boss") then
        return "Boss", nil
    else
        return "Others Enemy", enemyName
    end
end

local function createHeadHitbox(enemy)
    if not enemy or not enemy:IsA("Model") then return nil end
    
    local head = enemy:FindFirstChild("Head")
    if not head or not head:IsA("BasePart") then return nil end
    
    local hitboxPart = Instance.new("Part")
    hitboxPart.Name = "BeautifulHeadHitbox"
    hitboxPart.Size = head.Size * 1.1
    hitboxPart.CFrame = head.CFrame
    hitboxPart.Transparency = 0.85
    hitboxPart.CanCollide = false
    hitboxPart.Anchored = true
    hitboxPart.CastShadow = false
    hitboxPart.Locked = true
    hitboxPart.Color = BRIGHT_PURPLE_COLOR
    
    local glow = Instance.new("PointLight")
    glow.Name = "HitboxGlow"
    glow.Color = BRIGHT_PURPLE_COLOR
    glow.Brightness = 2
    glow.Range = 10
    glow.Shadows = false
    glow.Parent = hitboxPart
    
    local highlight = Instance.new("SelectionBox")
    highlight.Name = "HitboxOutline"
    highlight.Adornee = hitboxPart
    highlight.LineThickness = 0.05
    highlight.Color3 = BRIGHT_PURPLE_COLOR
    highlight.Transparency = 0.3
    highlight.Parent = hitboxPart
    
    _G.HeadHitboxParts[enemy] = {
        part = hitboxPart,
        head = head,
        enemy = enemy
    }
    
    hitboxPart.Parent = workspace
    
    return hitboxPart
end

local function updateHeadHitbox(hitboxData)
    if not hitboxData or not hitboxData.part or not hitboxData.head then return end
    
    hitboxData.part.CFrame = hitboxData.head.CFrame
    hitboxData.part.Size = hitboxData.head.Size * 1.1
end

local function removeHeadHitbox(hitboxData)
    if hitboxData and hitboxData.part then
        hitboxData.part:Destroy()
    end
end

local function toggleShowHeadHitbox()
    if _G.ShowHeadHitboxEnabled then
        _G.ShowHeadHitboxEnabled = false
        
        for enemy, hitboxData in pairs(_G.HeadHitboxParts) do
            removeHeadHitbox(hitboxData)
        end
        _G.HeadHitboxParts = {}
        
        if _G.HeadHitboxConnection then
            _G.HeadHitboxConnection:Disconnect()
            _G.HeadHitboxConnection = nil
        end
        
        Library:Notify("Красивые хитбоксы отключены", 3)
        return
    end
    
    _G.ShowHeadHitboxEnabled = true
    
    local function createHitboxesForExistingEnemies()
        local enemiesFolder = workspace:FindFirstChild("Enemies")
        if not enemiesFolder then return end
        
        for _, enemy in ipairs(enemiesFolder:GetChildren()) do
            if enemy:IsA("Model") then
                createHeadHitbox(enemy)
            end
        end
    end
    
    local function onEnemyAdded(child)
        if not _G.ShowHeadHitboxEnabled then return end
        
        task.wait(0.1)
        
        if child:IsA("Model") then
            createHeadHitbox(child)
        end
    end
    
    local function onEnemyRemoved(child)
        if _G.HeadHitboxParts[child] then
            removeHeadHitbox(_G.HeadHitboxParts[child])
            _G.HeadHitboxParts[child] = nil
        end
    end
    
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if enemiesFolder then
        createHitboxesForExistingEnemies()
        
        _G.HeadHitboxConnection = enemiesFolder.ChildAdded:Connect(onEnemyAdded)
        enemiesFolder.ChildRemoved:Connect(onEnemyRemoved)
    end
    
    local updateConnection
    updateConnection = RunService.RenderStepped:Connect(function()
        if not _G.ShowHeadHitboxEnabled then
            updateConnection:Disconnect()
            return
        end
        
        for enemy, hitboxData in pairs(_G.HeadHitboxParts) do
            if enemy and enemy.Parent and enemy.Parent == workspace.Enemies then
                updateHeadHitbox(hitboxData)
            else
                removeHeadHitbox(hitboxData)
                _G.HeadHitboxParts[enemy] = nil
            end
        end
    end)
    
    Library:Notify("Красивые фиолетовые хитбоксы включены", 3)
end

local function applyHitboxToEnemy(enemy, multiplier)
    if enemy and enemy:IsA("Model") then
        local head = enemy:FindFirstChild("Head")
        if head and head:IsA("BasePart") then
            if not _G.OriginalHitboxSizes[enemy] then
                _G.OriginalHitboxSizes[enemy] = head.Size
            end
            
            local originalSize = _G.OriginalHitboxSizes[enemy]
            
            local baseSize = math.min(originalSize.X, originalSize.Y, originalSize.Z)
            local uniformSize = baseSize * multiplier
            
            head.Size = Vector3.new(uniformSize, uniformSize, uniformSize)
        end
    end
end

local function updateAllHitboxes(multiplier)
    _G.HitboxMultiplier = multiplier
    
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if not enemiesFolder then return end
    
    for _, enemy in ipairs(enemiesFolder:GetChildren()) do
        applyHitboxToEnemy(enemy, multiplier)
    end
end

local function resetEnemyHitboxes()
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if not enemiesFolder then return end
    
    for enemy, originalSize in pairs(_G.OriginalHitboxSizes) do
        if enemy and enemy.Parent and enemy.Parent == enemiesFolder then
            local head = enemy:FindFirstChild("Head")
            if head and head:IsA("BasePart") then
                head.Size = originalSize
            end
        end
    end
    
    _G.OriginalHitboxSizes = {}
end

local function toggleHitbox()
    if _G.HitboxEnabled then
        _G.HitboxEnabled = false
        
        if _G.HitboxConnection then
            _G.HitboxConnection:Disconnect()
            _G.HitboxConnection = nil
        end
        
        resetEnemyHitboxes()
        
        Library:Notify("Авто-хитбокс отключен", 3)
        return
    end
    
    _G.HitboxEnabled = true
    
    local multiplier = Options.HitboxMultiplier and Options.HitboxMultiplier.Value or 5
    updateAllHitboxes(multiplier)
    
    local function onEnemyAdded(child)
        if not _G.HitboxEnabled then return end
        
        task.wait(0.1)
        
        if child:IsA("Model") then
            local multiplier = Options.HitboxMultiplier and Options.HitboxMultiplier.Value or 5
            applyHitboxToEnemy(child, multiplier)
        end
    end
    
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if enemiesFolder then
        _G.HitboxConnection = enemiesFolder.ChildAdded:Connect(onEnemyAdded)
    end
    
    Library:Notify("Авто-хитбокс включен", 3)
end

local function toggleInvisible()
    if _G.Invisible then
        _G.Invisible = false
        
        if _G.InvisibilityConnection then
            _G.InvisibilityConnection:Disconnect()
            _G.InvisibilityConnection = nil
        end
        
        local character = player.Character
        if character then
            for _, part in ipairs(character:GetDescendants()) do
                if part:IsA("BasePart") then
                    part.Transparency = 0
                    if part:FindFirstChild("OriginalTransparency") then
                        part.Transparency = part.OriginalTransparency.Value
                        part.OriginalTransparency:Destroy()
                    end
                end
            end
        end
        
        Library:Notify("Невидимость отключена", 3)
        return
    end
    
    _G.Invisible = true
    
    local function updateInvisibility()
        local character = player.Character
        if not character then return end
        
        for _, part in ipairs(character:GetDescendants()) do
            if part:IsA("BasePart") then
                if not part:FindFirstChild("OriginalTransparency") then
                    local originalValue = Instance.new("NumberValue")
                    originalValue.Name = "OriginalTransparency"
                    originalValue.Value = part.Transparency
                    originalValue.Parent = part
                end
                part.Transparency = 1
            end
        end
    end
    
    updateInvisibility()
    
    _G.InvisibilityConnection = RunService.Heartbeat:Connect(function()
        if not _G.Invisible then
            _G.InvisibilityConnection:Disconnect()
            _G.InvisibilityConnection = nil
            return
        end
        
        updateInvisibility()
    end)
    
    player.CharacterAdded:Connect(function()
        if _G.Invisible then
            task.wait(1)
            updateInvisibility()
        end
    end)
    
    Library:Notify("Невидимость включена", 3)
end

local function createESP(obj, isEnemy, isPlayer, enemyType, customName, playerName)
    if not obj or not obj:IsDescendantOf(workspace) then return nil end
    
    local esp = {}
    
    if isEnemy and not enemyType then
        enemyType, customName = getEnemyType(obj.Name)
    end
    
    if isEnemy and enemyType and not _G.SelectedEnemies[enemyType] then
        return nil
    end
    
    local billboard = Instance.new("BillboardGui")
    billboard.Name = "ESPBillboard"
    billboard.Adornee = obj:IsA("BasePart") and obj or obj:FindFirstChildWhichIsA("BasePart")
    billboard.Size = UDim2.new(0, 200, 0, 50)
    billboard.StudsOffset = Vector3.new(0, 3, 0)
    billboard.AlwaysOnTop = true
    billboard.MaxDistance = 1000
    billboard.ResetOnSpawn = false
    
    local displayText = ""
    if isPlayer then
        displayText = playerName or "Player"
    elseif isEnemy then
        if enemyType == "Others Enemy" and customName then
            displayText = customName
        else
            displayText = enemyType or obj.Name
        end
    else
        displayText = obj.Name
    end
    
    local textLabel = Instance.new("TextLabel")
    textLabel.Name = "ESPLabel"
    textLabel.Size = UDim2.new(1, 0, 0.5, 0)
    textLabel.Position = UDim2.new(0, 0, 0, 0)
    textLabel.BackgroundTransparency = 1
    textLabel.TextColor3 = Color3.new(1, 1, 1)
    textLabel.TextStrokeTransparency = 0
    textLabel.TextStrokeColor3 = Color3.new(0, 0, 0)
    textLabel.Font = Enum.Font.SourceSansBold
    textLabel.TextSize = 18
    textLabel.Text = displayText
    textLabel.Parent = billboard
    
    local distanceLabel = Instance.new("TextLabel")
    distanceLabel.Name = "ESPDistance"
    distanceLabel.Size = UDim2.new(1, 0, 0.5, 0)
    distanceLabel.Position = UDim2.new(0, 0, 0.5, 0)
    distanceLabel.BackgroundTransparency = 1
    distanceLabel.TextColor3 = Color3.new(1, 1, 1)
    distanceLabel.TextStrokeTransparency = 0
    distanceLabel.TextStrokeColor3 = Color3.new(0, 0, 0)
    distanceLabel.Font = Enum.Font.SourceSansBold
    distanceLabel.TextSize = 16
    distanceLabel.Text = "0 studs"
    distanceLabel.Parent = billboard
    
    local highlight = Instance.new("Highlight")
    highlight.Name = "ESPHighlight"
    highlight.FillTransparency = 0.8
    highlight.OutlineTransparency = 0
    highlight.OutlineColor = Color3.new(1, 1, 1)
    highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
    highlight.Adornee = obj
    
    local color
    if isPlayer then
        color = _G.ESPColors["Player"]
    elseif isEnemy then
        color = _G.ESPColors[enemyType] or _G.ESPColors["Others Enemy"]
    else
        color = _G.ESPColors[obj.Name] or Color3.new(1, 1, 1)
    end
    
    highlight.FillColor = color
    highlight.OutlineColor = color
    textLabel.TextColor3 = color
    distanceLabel.TextColor3 = color
    
    esp.billboard = billboard
    esp.highlight = highlight
    esp.object = obj
    esp.isEnemy = isEnemy
    esp.isPlayer = isPlayer
    esp.enemyType = enemyType
    
    if obj:IsA("Model") then
        if obj.PrimaryPart then
            billboard.Adornee = obj.PrimaryPart
            highlight.Adornee = obj
        else
            local part = obj:FindFirstChildWhichIsA("BasePart")
            if part then
                billboard.Adornee = part
                highlight.Adornee = obj
            else
                billboard:Destroy()
                highlight:Destroy()
                return nil
            end
        end
    end
    
    billboard.Parent = game:GetService("CoreGui")
    highlight.Parent = game:GetService("CoreGui")
    
    return esp
end

local function updateESP(espTable)
    if not espTable or not espTable.billboard or not espTable.billboard.Parent then return end
    
    local character = player.Character
    if not character then return end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return end
    
    local targetPart = espTable.billboard.Adornee
    if not targetPart or not targetPart.Parent then return end
    
    local distance = (humanoidRootPart.Position - targetPart.Position).Magnitude
    espTable.billboard.ESPDistance.Text = math.floor(distance) .. " studs"
    
    local maxDistance = espTable.isEnemy and 500 or 300
    if espTable.isPlayer then
        maxDistance = 1000
    end
    espTable.billboard.Enabled = distance <= maxDistance
    espTable.highlight.Enabled = distance <= maxDistance
end

local function removeESP(espTable)
    if espTable then
        if espTable.billboard then
            espTable.billboard:Destroy()
        end
        if espTable.highlight then
            espTable.highlight:Destroy()
        end
    end
end

local function refreshEnemyESP()
    if not _G.EnemyESPRunning then return end
    
    for enemy, esp in pairs(_G.EnemyESPObjects) do
        removeESP(esp)
    end
    _G.EnemyESPObjects = {}
    
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if enemiesFolder then
        for _, enemy in ipairs(enemiesFolder:GetChildren()) do
            if enemy:IsA("BasePart") or enemy:IsA("Model") then
                local enemyType, customName = getEnemyType(enemy.Name)
                if _G.SelectedEnemies[enemyType] then
                    local esp = createESP(enemy, true, false, enemyType, customName)
                    if esp then
                        _G.EnemyESPObjects[enemy] = esp
                    end
                end
            end
        end
    end
end

local function refreshResourceESP()
    if not _G.ESPRunning then return end
    
    for obj, esp in pairs(_G.ESPObjects) do
        removeESP(esp)
    end
    _G.ESPObjects = {}
    
    local spawnedFolder = workspace:FindFirstChild("Spawned")
    if spawnedFolder then
        for _, obj in ipairs(spawnedFolder:GetChildren()) do
            if obj:IsA("BasePart") or obj:IsA("Model") then
                if _G.SelectedObjects[obj.Name] then
                    local esp = createESP(obj, false, false)
                    if esp then
                        _G.ESPObjects[obj] = esp
                    end
                end
            end
        end
    end
end

local function refreshPlayerESP()
    if not _G.PlayerESPRunning then return end
    
    for plyr, esp in pairs(_G.PlayerESPObjects) do
        removeESP(esp)
    end
    _G.PlayerESPObjects = {}
    
    for _, otherPlayer in ipairs(Players:GetPlayers()) do
        if otherPlayer ~= player and otherPlayer.Character then
            local character = otherPlayer.Character
            local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
            if humanoidRootPart then
                local esp = createESP(character, false, true, nil, nil, otherPlayer.Name)
                if esp then
                    _G.PlayerESPObjects[otherPlayer] = esp
                end
            end
        end
    end
end

local function toggleAllResources(value)
    for _, objName in pairs(_G.AvailableObjects) do
        _G.SelectedObjects[objName] = value
        if Toggles["ResourceESP_" .. objName] then
            Toggles["ResourceESP_" .. objName]:SetValue(value)
        end
    end
    
    if _G.ESPRunning then
        refreshResourceESP()
    end
end

local function toggleAllEnemies(value)
    for _, enemyName in pairs(_G.KnownEnemies) do
        _G.SelectedEnemies[enemyName] = value
        if Toggles["EnemyESP_" .. enemyName] then
            Toggles["EnemyESP_" .. enemyName]:SetValue(value)
        end
    end
    
    if _G.EnemyESPRunning then
        refreshEnemyESP()
    end
end

local function simulateClick()
    local mouse = player:GetMouse()
    local screenCenter = Vector2.new(mouse.ViewSizeX / 2, mouse.ViewSizeY / 2)
    
    if VirtualInputManager then
        VirtualInputManager:SendMouseButtonEvent(
            screenCenter.X, 
            screenCenter.Y, 
            0,
            true,
            game, 
            1
        )
        
        task.wait(0.05)
        
        VirtualInputManager:SendMouseButtonEvent(
            screenCenter.X, 
            screenCenter.Y, 
            0,
            false,
            game, 
            1
        )
    end
end

local function setupClickTP()
    local mouse = player:GetMouse()
    
    mouse.Button1Down:Connect(function()
        if Toggles.ClickTPToggle and Toggles.ClickTPToggle.Value then
            local character = player.Character
            if not character then return end
            
            local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
            if not humanoidRootPart then return end
            
            local target = mouse.Hit.Position
            humanoidRootPart.CFrame = CFrame.new(target + Vector3.new(0, 5, 0))
        end
    end)
end

local function smoothAimAtObject(objPosition)
    if not objPosition then return end
    
    local camera = workspace.CurrentCamera
    if not camera then return end
    
    local character = player.Character
    if not character then return end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return end
    
    local currentLookVector = camera.CFrame.LookVector
    local directionToTarget = (objPosition - camera.CFrame.Position).Unit
    
    local smoothFactor = math.clamp(_G.AimSmoothness, 0.01, 0.99)
    local newLookVector = currentLookVector:Lerp(directionToTarget, 1 - smoothFactor)
    
    local newCFrame = CFrame.new(camera.CFrame.Position, camera.CFrame.Position + newLookVector)
    
    camera.CFrame = newCFrame
    
    local lookPos = Vector3.new(objPosition.X, objPosition.Y, objPosition.Z)
    local currentRotation = humanoidRootPart.CFrame
    local targetRotation = CFrame.lookAt(humanoidRootPart.Position, lookPos)
    humanoidRootPart.CFrame = currentRotation:Lerp(targetRotation, 0.5)
end

local function getObjectPosition(obj)
    if obj:IsA("BasePart") then
        return obj.Position
    elseif obj:IsA("Model") then
        if obj.PrimaryPart then
            return obj.PrimaryPart.Position
        end
        
        local part = obj:FindFirstChildWhichIsA("BasePart")
        if part then
            return part.Position
        end
        
        if obj.GetPivot then
            return obj:GetPivot().Position
        end
    end
    
    return nil
end

local function isObjectSelected(objName)
    return _G.SelectedObjects[objName] == true
end

local function saveWaypoint(name)
    local character = player.Character
    if not character then 
        Library:Notify("Ошибка: Персонаж не найден!", 3)
        return 
    end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then 
        Library:Notify("Ошибка: HumanoidRootPart не найден!", 3)
        return 
    end
    
    local position = humanoidRootPart.Position
    local waypointId = HttpService:GenerateGUID(false)
    
    _G.Waypoints[waypointId] = {
        id = waypointId,
        name = name,
        position = position,
        timestamp = os.time()
    }
    
    Library:Notify("Waypoint '" .. name .. "' сохранен!", 3)
    return waypointId
end

local function teleportToWaypoint(waypointId)
    local waypoint = _G.Waypoints[waypointId]
    if not waypoint then 
        Library:Notify("Waypoint не найден!", 3)
        return 
    end
    
    local character = player.Character
    if not character then return end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return end
    
    humanoidRootPart.CFrame = CFrame.new(waypoint.position + Vector3.new(0, 5, 0))
    Library:Notify("Телепортирован к '" .. waypoint.name .. "'", 3)
end

local function deleteWaypoint(waypointId)
    if _G.Waypoints[waypointId] then
        local name = _G.Waypoints[waypointId].name
        _G.Waypoints[waypointId] = nil
        Library:Notify("Waypoint '" .. name .. "' удален!", 3)
    end
end

local function findNearestSelectedObject()
    local spawnedFolder = workspace:FindFirstChild("Spawned")
    if not spawnedFolder then return nil end
    
    local character = player.Character
    if not character then return nil end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return nil end
    
    local nearestObj = nil
    local nearestDistance = math.huge
    
    for _, item in ipairs(spawnedFolder:GetChildren()) do
        local itemName = item.Name
        if isObjectSelected(itemName) then
            if item:IsA("BasePart") or item:IsA("Model") then
                local position = getObjectPosition(item)
                if position then
                    local distance = (humanoidRootPart.Position - position).Magnitude
                    if distance < nearestDistance then
                        nearestDistance = distance
                        nearestObj = item
                    end
                end
            end
        end
    end
    
    return nearestObj, nearestDistance
end

local function findNearestPlayer()
    local character = player.Character
    if not character then return nil end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return nil end
    
    local nearestPlayer = nil
    local nearestDistance = math.huge
    
    for _, otherPlayer in ipairs(Players:GetPlayers()) do
        if otherPlayer ~= player and otherPlayer.Character then
            local otherCharacter = otherPlayer.Character
            local otherHumanoidRootPart = otherCharacter:FindFirstChild("HumanoidRootPart")
            if otherHumanoidRootPart then
                local distance = (humanoidRootPart.Position - otherHumanoidRootPart.Position).Magnitude
                if distance < nearestDistance then
                    nearestDistance = distance
                    nearestPlayer = otherPlayer
                end
            end
        end
    end
    
    return nearestPlayer, nearestDistance
end

local function teleportToNearestPlayer()
    local nearestPlayer, distance = findNearestPlayer()
    if not nearestPlayer then
        Library:Notify("Игроки не найдены!", 3)
        return
    end
    
    local character = player.Character
    if not character then return end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return end
    
    local targetCharacter = nearestPlayer.Character
    if not targetCharacter then return end
    
    local targetHumanoidRootPart = targetCharacter:FindFirstChild("HumanoidRootPart")
    if not targetHumanoidRootPart then return end
    
    humanoidRootPart.CFrame = CFrame.new(targetHumanoidRootPart.Position + Vector3.new(0, 5, 0))
    Library:Notify("Телепортирован к " .. nearestPlayer.Name .. " (" .. math.floor(distance) .. " studs)", 3)
end

local function moveToObject(objPosition, speed)
    local character = player.Character
    if not character then return false end
    
    local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
    if not humanoidRootPart then return false end
    
    local startPos = humanoidRootPart.Position
    local direction = (objPosition - startPos).Unit
    local distance = (objPosition - startPos).Magnitude
    local travelTime = distance / speed
    
    if travelTime <= 0 then return true end
    
    local startTime = tick()
    
    while _G.AutoFarmRunning and tick() - startTime < travelTime do
        local elapsed = tick() - startTime
        local progress = elapsed / travelTime
        local currentPos = startPos + (objPosition - startPos) * progress
        
        humanoidRootPart.CFrame = CFrame.new(currentPos)
        
        smoothAimAtObject(objPosition)
        
        task.wait()
    end
    
    return true
end

local function toggleFly()
    if _G.Flying then
        _G.Flying = false
        
        if _G.FlyBodyVelocity then
            _G.FlyBodyVelocity:Destroy()
            _G.FlyBodyVelocity = nil
        end
        
        local character = player.Character
        if character then
            local humanoid = character:FindFirstChildOfClass("Humanoid")
            if humanoid then
                humanoid.PlatformStand = false
            end
        end
        
        return
    end
    
    _G.Flying = true
    local flySpeed = Options.FlySpeed and Options.FlySpeed.Value or 50
    
    local function updateFly()
        local character = player.Character
        if not character then return end
        
        local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
        if not humanoidRootPart then return end
        
        if not _G.FlyBodyVelocity or not _G.FlyBodyVelocity.Parent then
            if _G.FlyBodyVelocity then
                _G.FlyBodyVelocity:Destroy()
            end
            
            _G.FlyBodyVelocity = Instance.new("BodyVelocity")
            _G.FlyBodyVelocity.Velocity = Vector3.new(0, 0, 0)
            _G.FlyBodyVelocity.MaxForce = Vector3.new(4000, 4000, 4000)
            _G.FlyBodyVelocity.P = 1250
            _G.FlyBodyVelocity.Parent = humanoidRootPart
        end
        
        local camera = workspace.CurrentCamera
        local direction = Vector3.new(0, 0, 0)
        
        if UserInputService:IsKeyDown(Enum.KeyCode.W) then
            direction = direction + camera.CFrame.LookVector
        end
        if UserInputService:IsKeyDown(Enum.KeyCode.S) then
            direction = direction - camera.CFrame.LookVector
        end
        
        if UserInputService:IsKeyDown(Enum.KeyCode.A) then
            direction = direction - camera.CFrame.RightVector
        end
        if UserInputService:IsKeyDown(Enum.KeyCode.D) then
            direction = direction + camera.CFrame.RightVector
        end
        
        if UserInputService:IsKeyDown(Enum.KeyCode.E) then
            direction = direction + Vector3.new(0, 1, 0)
        end
        if UserInputService:IsKeyDown(Enum.KeyCode.Q) then
            direction = direction - Vector3.new(0, 1, 0)
        end
        
        if direction.Magnitude > 0 then
            direction = direction.Unit * flySpeed
        end
        
        _G.FlyBodyVelocity.Velocity = direction
        
        local humanoid = character:FindFirstChildOfClass("Humanoid")
        if humanoid then
            humanoid.PlatformStand = true
        end
    end
    
    local flyConnection
    flyConnection = RunService.Heartbeat:Connect(function()
        if not _G.Flying then
            flyConnection:Disconnect()
            return
        end
        
        local success, err = pcall(updateFly)
        if not success then
            _G.Flying = false
            flyConnection:Disconnect()
        end
    end)
end

local function toggleNoClip()
    if _G.NoClipEnabled then
        _G.NoClipEnabled = false
        if _G.NoClipConnection then
            _G.NoClipConnection:Disconnect()
            _G.NoClipConnection = nil
        end
        return
    end
    
    _G.NoClipEnabled = true
    
    _G.NoClipConnection = RunService.Stepped:Connect(function()
        if not _G.NoClipEnabled then
            if _G.NoClipConnection then
                _G.NoClipConnection:Disconnect()
            end
            return
        end
        
        local character = player.Character
        if not character then return end
        
        for _, part in ipairs(character:GetDescendants()) do
            if part:IsA("BasePart") then
                part.CanCollide = false
            end
        end
    end)
end

local function ensureNoClipForAutoFarm()
    if _G.AutoFarmRunning and not _G.NoClipEnabled then
        toggleNoClip()
        if Toggles.NoClipToggle then
            Toggles.NoClipToggle:SetValue(true)
        end
    end
end

local function toggleInfJump()
    if _G.InfJumpEnabled then
        _G.InfJumpEnabled = false
        if _G.InfJumpConnection then
            _G.InfJumpConnection:Disconnect()
            _G.InfJumpConnection = nil
        end
        return
    end
    
    _G.InfJumpEnabled = true
    
    _G.InfJumpConnection = UserInputService.JumpRequest:Connect(function()
        if _G.InfJumpEnabled then
            local character = player.Character
            if character then
                local humanoid = character:FindFirstChildOfClass("Humanoid")
                if humanoid and humanoid:GetState() == Enum.HumanoidStateType.Freefall then
                    humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
                end
            end
        end
    end)
end

local function toggleAllObjects(value)
    for _, objName in pairs(_G.AvailableObjects) do
        _G.SelectedObjects[objName] = value
        if Toggles["FarmObject_" .. objName] then
            Toggles["FarmObject_" .. objName]:SetValue(value)
        end
    end
end

local function startAutoFarm()
    if _G.AutoFarmRunning then 
        return 
    end
    
    local hasSelectedObjects = false
    for _, objName in pairs(_G.AvailableObjects) do
        if _G.SelectedObjects[objName] then
            hasSelectedObjects = true
            break
        end
    end
    
    if not hasSelectedObjects then
        Library:Notify("Ошибка: Не выбрано ни одного объекта для фарма!", 5)
        return
    end
    
    _G.AutoFarmRunning = true
    
    ensureNoClipForAutoFarm()
    
    _G.AutoFarmTask = task.spawn(function()
        while _G.AutoFarmRunning do
            task.wait(0.5)
            
            if not player.Character then
                player:LoadCharacter()
                task.wait(2)
                continue
            end
            
            local spawnedFolder = workspace:FindFirstChild("Spawned")
            if not spawnedFolder then
                task.wait(2)
                continue
            end
            
            local nearestObj, distance = findNearestSelectedObject()
            if not nearestObj then
                task.wait(2)
                continue
            end
            
            local objPosition = getObjectPosition(nearestObj)
            if not objPosition then
                task.wait(1)
                continue
            end
            
            local targetPosition = objPosition + Vector3.new(0, 3, 0)
            
            local successMove = moveToObject(targetPosition, _G.FarmFlySpeed)
            
            if successMove then
                task.wait(0.2)
                
                local startTime = os.time()
                local clicked = false
                
                while nearestObj and nearestObj.Parent and nearestObj.Parent == spawnedFolder and _G.AutoFarmRunning do
                    if os.time() - startTime > 45 then
                        break
                    end
                    
                    local currentObjPosition = getObjectPosition(nearestObj)
                    if currentObjPosition then
                        smoothAimAtObject(currentObjPosition)
                    end
                    
                    simulateClick()
                    clicked = true
                    
                    if not nearestObj or not nearestObj.Parent or nearestObj.Parent ~= spawnedFolder then
                        break
                    end
                    
                    task.wait(0.5)
                end
                
                task.wait(0.2)
            end
        end
    end)
end

local function stopAutoFarm()
    if not _G.AutoFarmRunning then return end
    
    _G.AutoFarmRunning = false
    
    if _G.AutoFarmTask then
        task.cancel(_G.AutoFarmTask)
        _G.AutoFarmTask = nil
    end
end

local function toggleESP()
    if _G.ESPRunning then
        _G.ESPRunning = false
        
        for _, esp in pairs(_G.ESPObjects) do
            removeESP(esp)
        end
        _G.ESPObjects = {}
        
        if _G.ESPConnection then
            _G.ESPConnection:Disconnect()
            _G.ESPConnection = nil
        end
        
        return
    end
    
    _G.ESPRunning = true
    
    local function onChildAdded(child)
        if not _G.ESPRunning then return end
        
        task.wait(0.1)
        
        if child:IsA("BasePart") or child:IsA("Model") then
            if _G.SelectedObjects[child.Name] then
                local esp = createESP(child, false, false)
                if esp then
                    _G.ESPObjects[child] = esp
                end
            end
        end
    end
    
    local function onChildRemoved(child)
        if _G.ESPObjects[child] then
            removeESP(_G.ESPObjects[child])
            _G.ESPObjects[child] = nil
        end
    end
    
    local spawnedFolder = workspace:FindFirstChild("Spawned")
    if spawnedFolder then
        refreshResourceESP()
        
        _G.ESPConnection = spawnedFolder.ChildAdded:Connect(onChildAdded)
        spawnedFolder.ChildRemoved:Connect(onChildRemoved)
    end
    
    local updateConnection
    updateConnection = RunService.RenderStepped:Connect(function()
        if not _G.ESPRunning then
            updateConnection:Disconnect()
            return
        end
        
        for obj, esp in pairs(_G.ESPObjects) do
            if obj and obj.Parent and obj.Parent == workspace.Spawned then
                updateESP(esp)
            else
                removeESP(esp)
                _G.ESPObjects[obj] = nil
            end
        end
    end)
end

local function toggleEnemyESP()
    if _G.EnemyESPRunning then
        _G.EnemyESPRunning = false
        
        for _, esp in pairs(_G.EnemyESPObjects) do
            removeESP(esp)
        end
        _G.EnemyESPObjects = {}
        
        if _G.EnemyESPConnection then
            _G.EnemyESPConnection:Disconnect()
            _G.EnemyESPConnection = nil
        end
        
        return
    end
    
    _G.EnemyESPRunning = true
    
    local function onEnemyAdded(child)
        if not _G.EnemyESPRunning then return end
        
        task.wait(0.1)
        
        if child:IsA("BasePart") or child:IsA("Model") then
            local enemyType, customName = getEnemyType(child.Name)
            if _G.SelectedEnemies[enemyType] then
                local esp = createESP(child, true, false, enemyType, customName)
                if esp then
                    _G.EnemyESPObjects[child] = esp
                end
            end
        end
    end
    
    local function onEnemyRemoved(child)
        if _G.EnemyESPObjects[child] then
            removeESP(_G.EnemyESPObjects[child])
            _G.EnemyESPObjects[child] = nil
        end
    end
    
    local enemiesFolder = workspace:FindFirstChild("Enemies")
    if enemiesFolder then
        refreshEnemyESP()
        
        _G.EnemyESPConnection = enemiesFolder.ChildAdded:Connect(onEnemyAdded)
        enemiesFolder.ChildRemoved:Connect(onEnemyRemoved)
    end
    
    local updateConnection
    updateConnection = RunService.RenderStepped:Connect(function()
        if not _G.EnemyESPRunning then
            updateConnection:Disconnect()
            return
        end
        
        for enemy, esp in pairs(_G.EnemyESPObjects) do
            if enemy and enemy.Parent and enemy.Parent == workspace.Enemies then
                updateESP(esp)
            else
                removeESP(esp)
                _G.EnemyESPObjects[enemy] = nil
            end
        end
    end)
end

local function togglePlayerESP()
    if _G.PlayerESPRunning then
        _G.PlayerESPRunning = false
        
        for _, esp in pairs(_G.PlayerESPObjects) do
            removeESP(esp)
        end
        _G.PlayerESPObjects = {}
        
        if _G.PlayerESPConnection then
            _G.PlayerESPConnection:Disconnect()
            _G.PlayerESPConnection = nil
        end
        
        return
    end
    
    _G.PlayerESPRunning = true
    
    local function onPlayerAdded(otherPlayer)
        if not _G.PlayerESPRunning then return end
        
        otherPlayer.CharacterAdded:Connect(function(character)
            task.wait(0.5)
            if _G.PlayerESPRunning and character then
                local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
                if humanoidRootPart then
                    local esp = createESP(character, false, true, nil, nil, otherPlayer.Name)
                    if esp then
                        _G.PlayerESPObjects[otherPlayer] = esp
                    end
                end
            end
        end)
        
        if otherPlayer.Character then
            task.wait(0.5)
            local character = otherPlayer.Character
            local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
            if humanoidRootPart then
                local esp = createESP(character, false, true, nil, nil, otherPlayer.Name)
                if esp then
                    _G.PlayerESPObjects[otherPlayer] = esp
                end
            end
        end
    end
    
    local function onPlayerRemoved(otherPlayer)
        if _G.PlayerESPObjects[otherPlayer] then
            removeESP(_G.PlayerESPObjects[otherPlayer])
            _G.PlayerESPObjects[otherPlayer] = nil
        end
    end
    
    refreshPlayerESP()
    
    _G.PlayerESPConnection = Players.PlayerAdded:Connect(onPlayerAdded)
    Players.PlayerRemoving:Connect(onPlayerRemoved)
    
    local updateConnection
    updateConnection = RunService.RenderStepped:Connect(function()
        if not _G.PlayerESPRunning then
            updateConnection:Disconnect()
            return
        end
        
        for otherPlayer, esp in pairs(_G.PlayerESPObjects) do
            if otherPlayer and otherPlayer.Character and otherPlayer.Character.Parent then
                updateESP(esp)
            else
                removeESP(esp)
                _G.PlayerESPObjects[otherPlayer] = nil
            end
        end
    end)
end

local function toggleSpeed()
    if Toggles.SpeedToggle then
        Toggles.SpeedToggle:SetValue(not Toggles.SpeedToggle.Value)
    end
end

local Window = Library:CreateWindow({
    Title = "RobloxMAN",
    Footer = "AutoFarm + ESP + Красивые хитбоксы + Телепорт + Waypoints + Невидимость",
    Icon = 95816097006870,
    NotifySide = "Right",
    ShowCustomCursor = true,
})

local Tabs = {
    Main = Window:AddTab("Главная", "home"),
    Player = Window:AddTab("Игрок", "user"),
    Teleport = Window:AddTab("Телепорт", "move"),
    ESP = Window:AddTab("ESP", "eye"),
    Hitbox = Window:AddTab("Hitbox", "target"),
}

local AutoFarmGroup = Tabs.Main:AddLeftGroupbox("AutoFarm Ресурсы")

AutoFarmGroup:AddToggle("AutoFarmToggle", {
    Text = "Включить AutoFarm Ресурсов",
    Default = false,
    Tooltip = "Плавное движение к выбранным ресурсам с авто-прицелом",
    
    Callback = function(Value)
        if Value then
            startAutoFarm()
        else
            stopAutoFarm()
        end
    end,
})

AutoFarmGroup:AddSlider("FarmFlySpeed", {
    Text = "Скорость AutoFarm",
    Default = 50,
    Min = 20,
    Max = 100,
    Rounding = 0,
    Callback = function(Value)
        _G.FarmFlySpeed = Value
    end
})

AutoFarmGroup:AddSlider("AimSmoothness", {
    Text = "Плавность прицела",
    Default = 0.3,
    Min = 0.01,
    Max = 0.9,
    Rounding = 2,
    Tooltip = "Чем меньше значение, тем быстрее камера поворачивается на объект",
    Callback = function(Value)
        _G.AimSmoothness = Value
    end
})

AutoFarmGroup:AddDivider()

AutoFarmGroup:AddButton("Выбрать все ресурсы для фарма", function()
    toggleAllObjects(true)
    Library:Notify("Все ресурсы выбраны для фарма!", 3)
end)

AutoFarmGroup:AddButton("Отменить все ресурсы для фарма", function()
    toggleAllObjects(false)
    Library:Notify("Все ресурсы отменены для фарма!", 3)
end)

AutoFarmGroup:AddDivider()
AutoFarmGroup:AddLabel("Выбор ресурсов:")

for _, objName in pairs(_G.AvailableObjects) do
    AutoFarmGroup:AddToggle("FarmObject_" .. objName, {
        Text = objName,
        Default = true,
        
        Callback = function(Value)
            _G.SelectedObjects[objName] = Value
        end,
    })
end

local MovementGroup = Tabs.Main:AddRightGroupbox("Движение")

MovementGroup:AddToggle("FlyToggle", {
    Text = "Включить Fly",
    Default = false,
    Tooltip = "WASD - движение, Q/E - вниз/вверх",
    
    Callback = function(Value)
        toggleFly()
    end,
})

MovementGroup:AddToggle("NoClipToggle", {
    Text = "Включить NoClip",
    Default = false,
    Tooltip = "Проходить сквозь стены",
    
    Callback = function(Value)
        toggleNoClip()
    end,
})

MovementGroup:AddToggle("InfJumpToggle", {
    Text = "Включить InfJump",
    Default = false,
    Tooltip = "Бесконечный прыжок (пробел)",
    
    Callback = function(Value)
        toggleInfJump()
    end,
})

local FlySettingsGroup = Tabs.Main:AddLeftGroupbox("Настройки Fly")

FlySettingsGroup:AddSlider("FlySpeed", {
    Text = "Скорость Fly",
    Default = 50,
    Min = 10,
    Max = 200,
    Rounding = 0,
})

local CameraGroup = Tabs.Main:AddRightGroupbox("Настройки камеры")

CameraGroup:AddButton("Отключить тряску камеры", function()
    disableCameraShake()
    Library:Notify("Тряска камеры отключена!", 3)
end)

local PlayerGroup = Tabs.Player:AddLeftGroupbox("Характеристики")

PlayerGroup:AddToggle("SpeedToggle", {
    Text = "Изменить скорость",
    Default = false,
    
    Callback = function(Value)
        if Value then
            startSpeedLoop()
        else
            if _G.SpeedLoop then
                _G.SpeedLoop:Disconnect()
                _G.SpeedLoop = nil
            end
            
            local character = player.Character
            if character then
                local humanoid = character:FindFirstChildOfClass("Humanoid")
                if humanoid then
                    humanoid.WalkSpeed = 16
                end
            end
        end
    end,
})

PlayerGroup:AddSlider("SpeedValue", {
    Text = "Скорость бега",
    Default = 50,
    Min = 16,
    Max = 200,
    Rounding = 0,
})

PlayerGroup:AddToggle("InvisibleToggle", {
    Text = "Включить невидимость",
    Default = false,
    Tooltip = "Сделает вашего персонажа невидимым",
    
    Callback = function(Value)
        toggleInvisible()
    end,
})

local TeleportGroup = Tabs.Teleport:AddLeftGroupbox("Телепорт")

TeleportGroup:AddToggle("ClickTPToggle", {
    Text = "Включить ClickTP",
    Default = false,
    
    Callback = function(Value)
        if Value then
            setupClickTP()
            Library:Notify("ClickTP включен! Кликайте ЛКМ для телепортации", 3)
        end
    end,
})

TeleportGroup:AddButton("Телепорт к ближайшему игроку", function()
    teleportToNearestPlayer()
end)

local WaypointsGroup = Tabs.Teleport:AddRightGroupbox("Waypoints")

local waypointNameInput = WaypointsGroup:AddInput("WaypointNameInput", {
    Text = "Название Waypoint",
    Default = "Waypoint",
    Tooltip = "Введите название для сохранения позиции",
    Placeholder = "Введите название",
})

WaypointsGroup:AddButton("Сохранить Waypoint", function()
    local name = Options.WaypointNameInput.Value or "Waypoint"
    saveWaypoint(name)
end)

WaypointsGroup:AddDivider()

local waypointsList = WaypointsGroup:AddDropdown("WaypointsList", {
    Text = "Сохраненные Waypoints",
    Default = 1,
    Values = {},
    Tooltip = "Выберите waypoint для телепортации",
    
    Callback = function(Value)
        _G.SelectedWaypoint = Value
    end,
})

local function updateWaypointsList()
    local waypointValues = {}
    for id, waypoint in pairs(_G.Waypoints) do
        table.insert(waypointValues, id)
    end
    waypointsList:SetValues(waypointValues)
    
    if #waypointValues > 0 then
        local displayValues = {}
        for id, waypoint in pairs(_G.Waypoints) do
            table.insert(displayValues, waypoint.name .. " (" .. math.floor(waypoint.position.X) .. ", " .. math.floor(waypoint.position.Y) .. ", " .. math.floor(waypoint.position.Z) .. ")")
        end
        waypointsList:SetValues(displayValues)
    end
end

WaypointsGroup:AddButton("Телепорт к выбранному Waypoint", function()
    if _G.SelectedWaypoint then
        for id, waypoint in pairs(_G.Waypoints) do
            local displayName = waypoint.name .. " (" .. math.floor(waypoint.position.X) .. ", " .. math.floor(waypoint.position.Y) .. ", " .. math.floor(waypoint.position.Z) .. ")"
            if displayName == _G.SelectedWaypoint then
                teleportToWaypoint(id)
                return
            end
        end
    end
    Library:Notify("Выберите waypoint из списка!", 3)
end)

WaypointsGroup:AddButton("Удалить выбранный Waypoint", function()
    if _G.SelectedWaypoint then
        for id, waypoint in pairs(_G.Waypoints) do
            local displayName = waypoint.name .. " (" .. math.floor(waypoint.position.X) .. ", " .. math.floor(waypoint.position.Y) .. ", " .. math.floor(waypoint.position.Z) .. ")"
            if displayName == _G.SelectedWaypoint then
                deleteWaypoint(id)
                updateWaypointsList()
                return
            end
        end
    end
    Library:Notify("Выберите waypoint из списка!", 3)
end)

WaypointsGroup:AddButton("Обновить список Waypoints", function()
    updateWaypointsList()
    Library:Notify("Список waypoints обновлен!", 3)
end)

local HitboxGroup = Tabs.Hitbox:AddLeftGroupbox("Hitbox Multiplier")

HitboxGroup:AddToggle("AutoHitboxToggle", {
    Text = "Включить авто-хитбокс",
    Default = false,
    Tooltip = "Автоматически применяет хитбокс ко всем врагам",
    
    Callback = function(Value)
        toggleHitbox()
    end
})

HitboxGroup:AddSlider("HitboxMultiplier", {
    Text = "Множитель хитбокса",
    Default = 5,
    Min = 1,
    Max = 20,
    Rounding = 0,
    Tooltip = "Изменяет размер хитбокса врагов (Head.Size)",
    
    Callback = function(Value)
        if _G.HitboxEnabled then
            updateAllHitboxes(Value)
        end
    end
})

HitboxGroup:AddDivider()

local HeadHitboxGroup = Tabs.Hitbox:AddRightGroupbox("Красивые хитбоксы голов")

HeadHitboxGroup:AddLabel("Стильные фиолетовые хитбоксы")
HeadHitboxGroup:AddLabel("Яркие и прозрачные")

HeadHitboxGroup:AddToggle("ShowHeadHitboxToggle", {
    Text = "Включить красивые хитбоксы",
    Default = false,
    Tooltip = "Показывает стильные фиолетовые хитбоксы голов врагов",
    
    Callback = function(Value)
        toggleShowHeadHitbox()
    end
})

local ESPResourcesGroup = Tabs.ESP:AddLeftGroupbox("ESP Ресурсы")

ESPResourcesGroup:AddToggle("ESPToggle", {
    Text = "Включить ESP для ресурсов",
    Default = false,
    Tooltip = "Показывает выбранные ресурсы из папки Spawned",
    
    Callback = function(Value)
        toggleESP()
    end,
})

ESPResourcesGroup:AddDivider()

for _, objName in pairs(_G.AvailableObjects) do
    ESPResourcesGroup:AddToggle("ResourceESP_" .. objName, {
        Text = objName,
        Default = true,
        
        Callback = function(Value)
            _G.SelectedObjects[objName] = Value
            if _G.ESPRunning then
                refreshResourceESP()
            end
        end,
    })
end

ESPResourcesGroup:AddDivider()

ESPResourcesGroup:AddButton("Выбрать все ресурсы", function()
    toggleAllResources(true)
    Library:Notify("Все ресурсы выбраны для ESP!", 3)
end)

ESPResourcesGroup:AddButton("Отменить все ресурсы", function()
    toggleAllResources(false)
    Library:Notify("Все ресурсы отменены для ESP!", 3)
end)

local ESPEnemiesGroup = Tabs.ESP:AddRightGroupbox("ESP Враги")

ESPEnemiesGroup:AddToggle("EnemyESPToggle", {
    Text = "Включить ESP для врагов",
    Default = false,
    Tooltip = "Показывает выбранных врагов из папки Enemies",
    
    Callback = function(Value)
        toggleEnemyESP()
    end,
})

ESPEnemiesGroup:AddDivider()

for _, enemyName in pairs(_G.KnownEnemies) do
    ESPEnemiesGroup:AddToggle("EnemyESP_" .. enemyName, {
        Text = enemyName,
        Default = true,
        
        Callback = function(Value)
            _G.SelectedEnemies[enemyName] = Value
            if _G.EnemyESPRunning then
                refreshEnemyESP()
            end
        end,
    })
end

ESPEnemiesGroup:AddDivider()

ESPEnemiesGroup:AddButton("Выбрать всех врагов", function()
    toggleAllEnemies(true)
    Library:Notify("Все враги выбраны для ESP!", 3)
end)

ESPEnemiesGroup:AddButton("Отменить всех врагов", function()
    toggleAllEnemies(false)
    Library:Notify("Все враги отменены для ESP!", 3)
end)

local ESPPlayersGroup = Tabs.ESP:AddLeftGroupbox("ESP Игроков")

ESPPlayersGroup:AddToggle("PlayerESPToggle", {
    Text = "Включить ESP для игроков",
    Default = false,
    Tooltip = "Показывает всех игроков на сервере",
    
    Callback = function(Value)
        togglePlayerESP()
    end,
})

local SettingsTab = Window:AddTab("Настройки UI", "settings")

local UIGroup = SettingsTab:AddLeftGroupbox("Управление")

UIGroup:AddToggle("KeybindMenuOpen", {
    Default = Library.KeybindFrame.Visible,
    Text = "Показать меню клавиш",
    Callback = function(value)
        Library.KeybindFrame.Visible = value
    end,
})

UIGroup:AddLabel("Клавиша меню"):AddKeyPicker("MenuKeybind", { 
    Default = "RightShift", 
    NoUI = true, 
    Text = "Клавиша меню" 
})

Library.ToggleKeybind = Options.MenuKeybind

UIGroup:AddDivider()
UIGroup:AddButton("Выгрузить скрипт", function()
    stopAutoFarm()
    _G.Flying = false
    if _G.FlyBodyVelocity then
        _G.FlyBodyVelocity:Destroy()
    end
    _G.NoClipEnabled = false
    if _G.NoClipConnection then
        _G.NoClipConnection:Disconnect()
    end
    _G.InfJumpEnabled = false
    if _G.InfJumpConnection then
        _G.InfJumpConnection:Disconnect()
    end
    
    if _G.SpeedLoop then
        _G.SpeedLoop:Disconnect()
        _G.SpeedLoop = nil
    end
    
    _G.HitboxEnabled = false
    if _G.HitboxConnection then
        _G.HitboxConnection:Disconnect()
    end
    resetEnemyHitboxes()
    
    _G.ShowHeadHitboxEnabled = false
    if _G.HeadHitboxConnection then
        _G.HeadHitboxConnection:Disconnect()
    end
    for enemy, hitboxData in pairs(_G.HeadHitboxParts) do
        removeHeadHitbox(hitboxData)
    end
    _G.HeadHitboxParts = {}
    
    _G.ESPRunning = false
    for _, esp in pairs(_G.ESPObjects) do
        removeESP(esp)
    end
    _G.ESPObjects = {}
    
    _G.EnemyESPRunning = false
    for _, esp in pairs(_G.EnemyESPObjects) do
        removeESP(esp)
    end
    _G.EnemyESPObjects = {}
    
    _G.PlayerESPRunning = false
    for _, esp in pairs(_G.PlayerESPObjects) do
        removeESP(esp)
    end
    _G.PlayerESPObjects = {}
    
    _G.Invisible = false
    if _G.InvisibilityConnection then
        _G.InvisibilityConnection:Disconnect()
        _G.InvisibilityConnection = nil
    end
    
    Library:Unload()
end)

player.CharacterAdded:Connect(function(character)
    task.wait(1)
    
    if Toggles.SpeedToggle and Toggles.SpeedToggle.Value then
        startSpeedLoop()
    end
end)

if ThemeManager and SaveManager then
    ThemeManager:SetLibrary(Library)
    SaveManager:SetLibrary(Library)
    
    SaveManager:IgnoreThemeSettings()
    SaveManager:SetIgnoreIndexes({ "MenuKeybind" })
    
    ThemeManager:SetFolder("RobloxMAN")
    SaveManager:SetFolder("RobloxMAN/configs")
    
    SaveManager:BuildConfigSection(SettingsTab)
    ThemeManager:ApplyToTab(SettingsTab)
    
    SaveManager:LoadAutoloadConfig()
end

updateWaypointsList()

Library:OnUnload(function()
    stopAutoFarm()
    _G.Flying = false
    if _G.FlyBodyVelocity then
        _G.FlyBodyVelocity:Destroy()
    end
    _G.NoClipEnabled = false
    if _G.NoClipConnection then
        _G.NoClipConnection:Disconnect()
    end
    _G.InfJumpEnabled = false
    if _G.InfJumpConnection then
        _G.InfJumpConnection:Disconnect()
    end
    
    if _G.SpeedLoop then
        _G.SpeedLoop:Disconnect()
        _G.SpeedLoop = nil
    end
    
    _G.HitboxEnabled = false
    if _G.HitboxConnection then
        _G.HitboxConnection:Disconnect()
    end
    resetEnemyHitboxes()
    
    _G.ShowHeadHitboxEnabled = false
    if _G.HeadHitboxConnection then
        _G.HeadHitboxConnection:Disconnect()
    end
    for enemy, hitboxData in pairs(_G.HeadHitboxParts) do
        removeHeadHitbox(hitboxData)
    end
    _G.HeadHitboxParts = {}
    
    _G.ESPRunning = false
    for _, esp in pairs(_G.ESPObjects) do
        removeESP(esp)
    end
    _G.ESPObjects = {}
    
    _G.EnemyESPRunning = false
    for _, esp in pairs(_G.EnemyESPObjects) do
        removeESP(esp)
    end
    _G.EnemyESPObjects = {}
    
    _G.PlayerESPRunning = false
    for _, esp in pairs(_G.PlayerESPObjects) do
        removeESP(esp)
    end
    _G.PlayerESPObjects = {}
    
    _G.Invisible = false
    if _G.InvisibilityConnection then
        _G.InvisibilityConnection:Disconnect()
        _G.InvisibilityConnection = nil
    end
end)

task.wait(1)
disableCameraShake()

Features & Information

Autofarm ESP HITBOX SPEED PLAYER FLY NOCLIP CLICKTP DISCORD: dualjuja

Community Comments (0)

No comments yet for this script.

More Scripts for The Apocalypse