Загрузка данных


-- VAL3RA N1GGER - ULTIMATE HUB
-- by: @zazayaga | mayfive v3.0

local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Camera = workspace.CurrentCamera
local CoreGui = game:GetService("CoreGui")
local TweenService = game:GetService("TweenService")
local Lighting = game:GetService("Lighting")
local Workspace = game:GetService("Workspace")
local Stats = game:GetService("Stats")

-- ============ НАСТРОЙКИ ============
local Settings = {
    -- ESP
    ESPEnabled = false,
    ESPMode = "All", -- "All", "Killer", "Survive"
    KillerColor = Color3.fromRGB(180, 100, 255), -- Фиолетовый
    SurviveColor = Color3.fromRGB(255, 100, 200), -- Розовый
    FillTransparency = 0.4,
    OutlineTransparency = 0,
    
    -- FLY
    FlyEnabled = false,
    FlySpeed = 50,
    
    -- DASH
    DashEnabled = true,
    DashDistance = 5,
    DashModes = {5, 10, 15, 20, 25, 30},
    DashModeIndex = 1,
    
    -- FULLBRIGHT
    Fullbright = false,
    
    -- SCREEN STRETCH
    StretchEnabled = false,
    StretchResolution = 0.65,
    
    -- FOV
    FOV = 70,
    FOVEnabled = true,
    
    -- FPS UNLOCK
    FPSUnlocked = false,
    MaxFPS = 999,
    
    -- SATURATION
    SaturationLevel = 1, -- 1 = Нормальная, 2 = Насыщенная
    SaturationValues = {0, 1.5},
    
    -- MENU
    MenuOpen = false
}

-- ============ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ============
local espObjects = {}
local flyBodyVel = nil
local flyBodyGyro = nil
local flyConnection = nil
local stretchConnection = nil
local originalLighting = {}
local menuGui = nil
local menuFrame = nil
local isMenuOpen = false
local originalFPS = 60
local colorCorrection = nil

-- Сохраняем оригинальные настройки освещения
originalLighting.Brightness = Lighting.Brightness
originalLighting.Ambient = Lighting.Ambient
originalLighting.OutdoorAmbient = Lighting.OutdoorAmbient

-- ============ SATURATION (ДВУХУРОВНЕВАЯ) ============
local function ensureColorCorrection()
    if not colorCorrection or not colorCorrection.Parent then
        colorCorrection = Lighting:FindFirstChildOfClass("ColorCorrectionEffect") or Instance.new("ColorCorrectionEffect")
        colorCorrection.Name = "VAL3RA_ColorCorrection"
        colorCorrection.Parent = Lighting
    end
    colorCorrection.Saturation = Settings.SaturationValues[Settings.SaturationLevel]
    colorCorrection.Brightness = 0
    colorCorrection.Contrast = 0
end

local function cycleSaturation()
    Settings.SaturationLevel = Settings.SaturationLevel + 1
    if Settings.SaturationLevel > #Settings.SaturationValues then
        Settings.SaturationLevel = 1
    end
    ensureColorCorrection()
    local names = { "Нормальная", "Насыщенная" }
    print("Насыщенность:", names[Settings.SaturationLevel])
end

-- Инициализация насыщенности
ensureColorCorrection()

-- ============ FPS UNLOCK ============
local function toggleFPSUnlock()
    Settings.FPSUnlocked = not Settings.FPSUnlocked
    if Settings.FPSUnlocked then
        Stats.MaxFPS = Settings.MaxFPS
        print("FPS разблокирован! Максимум: " .. Settings.MaxFPS .. " FPS")
    else
        Stats.MaxFPS = originalFPS
        print("FPS заблокирован обратно на " .. originalFPS .. " FPS")
    end
end

-- ============ FOV CONTROL ============
RunService.RenderStepped:Connect(function()
    if Settings.FOVEnabled and Camera then
        Camera.FieldOfView = Settings.FOV
    end
end)

-- ============ FULLBRIGHT ============
local function applyFullbright()
    if Settings.Fullbright then
        Lighting.Brightness = 2
        Lighting.Ambient = Color3.new(1, 1, 1)
        Lighting.OutdoorAmbient = Color3.new(1, 1, 1)
        Lighting.GlobalShadows = false
    else
        Lighting.Brightness = originalLighting.Brightness
        Lighting.Ambient = originalLighting.Ambient
        Lighting.OutdoorAmbient = originalLighting.OutdoorAmbient
        Lighting.GlobalShadows = true
    end
end

-- ============ SCREEN STRETCH ============
local function applyStretch()
    if not Settings.StretchEnabled or not Camera then return end
    Camera.CFrame = Camera.CFrame * CFrame.new(0, 0, 0, 1, 0, 0, 0, Settings.StretchResolution, 0, 0, 0, 1)
end

local function toggleStretch()
    Settings.StretchEnabled = not Settings.StretchEnabled
    if Settings.StretchEnabled then
        if stretchConnection then stretchConnection:Disconnect() end
        stretchConnection = RunService.RenderStepped:Connect(applyStretch)
        print("Растяжение экрана включено")
    else
        if stretchConnection then stretchConnection:Disconnect() end
        stretchConnection = nil
        print("Растяжение экрана выключено")
    end
end

-- ============ ESP ============
local function GetPlayerTeam(player)
    if player == LocalPlayer then return nil end
    
    local name = player.Name:lower()
    local teamName = player.Team and player.Team.Name:lower() or ""
    
    local killerKeywords = {"killer", "убийца", "маньяк", "зомби", "монстр", "monster", "demon", "дьявол", "devil"}
    for _, keyword in ipairs(killerKeywords) do
        if name:find(keyword) or teamName:find(keyword) then
            return "killer"
        end
    end
    
    return "survive"
end

local function ShouldShowPlayer(player)
    local team = GetPlayerTeam(player)
    if Settings.ESPMode == "All" then
        return true
    elseif Settings.ESPMode == "Killer" and team == "killer" then
        return true
    elseif Settings.ESPMode == "Survive" and team == "survive" then
        return true
    end
    return false
end

local function GetPlayerColor(player)
    local team = GetPlayerTeam(player)
    if team == "killer" then
        return Settings.KillerColor
    else
        return Settings.SurviveColor
    end
end

local function UpdateChams(player)
    if not Settings.ESPEnabled then
        if espObjects[player] then
            espObjects[player]:Destroy()
            espObjects[player] = nil
        end
        return
    end
    
    if player == LocalPlayer then return end
    if not ShouldShowPlayer(player) then
        if espObjects[player] then
            espObjects[player]:Destroy()
            espObjects[player] = nil
        end
        return
    end
    
    local character = player.Character
    if not character then
        if espObjects[player] then
            espObjects[player]:Destroy()
            espObjects[player] = nil
        end
        return
    end
    
    local color = GetPlayerColor(player)
    
    if not espObjects[player] then
        local highlight = Instance.new("Highlight")
        highlight.Name = "VAL3RA_ESP"
        highlight.FillColor = color
        highlight.OutlineColor = color
        highlight.FillTransparency = Settings.FillTransparency
        highlight.OutlineTransparency = Settings.OutlineTransparency
        highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
        highlight.Parent = character
        espObjects[player] = highlight
    else
        local hl = espObjects[player]
        hl.FillColor = color
        hl.OutlineColor = color
        if hl.Parent ~= character then
            hl.Parent = character
        end
    end
end

local function UpdateAllChams()
    for _, player in ipairs(Players:GetPlayers()) do
        UpdateChams(player)
    end
end

local function RefreshESP()
    if Settings.ESPEnabled then
        UpdateAllChams()
    else
        for player, hl in pairs(espObjects) do
            hl:Destroy()
            espObjects[player] = nil
        end
    end
end

-- Наблюдение за игроками
local function SetupPlayer(player)
    if player == LocalPlayer then return end
    
    player.CharacterAdded:Connect(function()
        task.wait(0.5)
        UpdateChams(player)
    end)
    
    player.CharacterRemoving:Connect(function()
        if espObjects[player] then
            espObjects[player].Parent = nil
        end
    end)
    
    player:GetPropertyChangedSignal("Name"):Connect(function()
        UpdateChams(player)
    end)
    
    if player.Team then
        player.Team:GetPropertyChangedSignal("Name"):Connect(function()
            UpdateChams(player)
        end)
    end
    
    UpdateChams(player)
end

for _, player in ipairs(Players:GetPlayers()) do
    SetupPlayer(player)
end

Players.PlayerAdded:Connect(SetupPlayer)
Players.PlayerRemoving:Connect(function(player)
    if espObjects[player] then
        espObjects[player]:Destroy()
        espObjects[player] = nil
    end
end)

-- ============ FLY (Т-ПОЗА, НА B) ============
local function StartFly()
    if not LocalPlayer.Character then return end
    
    local char = LocalPlayer.Character
    local root = char:FindFirstChild("HumanoidRootPart")
    local humanoid = char:FindFirstChildOfClass("Humanoid")
    
    if not root or not humanoid then return end
    
    humanoid.PlatformStand = true
    
    for _, part in pairs(char:GetChildren()) do
        if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
            part.Transparency = 0.3
        end
    end
    
    if flyBodyVel then flyBodyVel:Destroy() end
    if flyBodyGyro then flyBodyGyro:Destroy() end
    
    flyBodyVel = Instance.new("BodyVelocity")
    flyBodyVel.MaxForce = Vector3.new(100000, 100000, 100000)
    flyBodyVel.Parent = root
    
    flyBodyGyro = Instance.new("BodyGyro")
    flyBodyGyro.MaxTorque = Vector3.new(400000, 400000, 400000)
    flyBodyGyro.Parent = root
    
    if flyConnection then flyConnection:Disconnect() end
    flyConnection = RunService.RenderStepped:Connect(function()
        if not Settings.FlyEnabled then return end
        if not root or not root.Parent then return end
        
        local moveDir = Vector3.new()
        if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir = moveDir + Camera.CFrame.LookVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir = moveDir - Camera.CFrame.LookVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir = moveDir - Camera.CFrame.RightVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir = moveDir + Camera.CFrame.RightVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveDir = moveDir + Vector3.new(0, 1, 0) end
        if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then moveDir = moveDir - Vector3.new(0, 1, 0) end
        
        if moveDir.Magnitude > 0 then
            moveDir = moveDir.Unit * Settings.FlySpeed
        end
        
        flyBodyVel.Velocity = moveDir
        flyBodyGyro.CFrame = Camera.CFrame
    end)
end

local function StopFly()
    Settings.FlyEnabled = false
    
    if flyBodyVel then flyBodyVel:Destroy() end
    if flyBodyGyro then flyBodyGyro:Destroy() end
    if flyConnection then flyConnection:Disconnect() end
    flyBodyVel = nil
    flyBodyGyro = nil
    flyConnection = nil
    
    if LocalPlayer.Character then
        local char = LocalPlayer.Character
        local humanoid = char:FindFirstChildOfClass("Humanoid")
        if humanoid then
            humanoid.PlatformStand = false
        end
        for _, part in pairs(char:GetChildren()) do
            if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
                part.Transparency = 0
            end
        end
    end
end

local function ToggleFly()
    Settings.FlyEnabled = not Settings.FlyEnabled
    if Settings.FlyEnabled then
        StartFly()
    else
        StopFly()
    end
end

-- ============ DASH (НА G) ============
local function Dash()
    if not Settings.DashEnabled then return end
    local char = LocalPlayer.Character
    if not char then return end
    local root = char:FindFirstChild("HumanoidRootPart")
    local hum = char:FindFirstChildOfClass("Humanoid")
    if root and hum and hum.Health > 0 then
        local dir = root.CFrame.LookVector * Settings.DashDistance
        root.CFrame = root.CFrame + dir
    end
end

local function NextDashDistance()
    Settings.DashModeIndex = Settings.DashModeIndex % #Settings.DashModes + 1
    Settings.DashDistance = Settings.DashModes[Settings.DashModeIndex]
end

-- ============ МЕНЮ (ЧЕРНО-БЕЛОЕ, INS) ============
local function CreateMenu()
    if menuGui then menuGui:Destroy() end
    
    menuGui = Instance.new("ScreenGui")
    menuGui.Name = "Val3raMenu"
    menuGui.ResetOnSpawn = false
    menuGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
    menuGui.Parent = CoreGui
    menuGui.Enabled = false
    
    menuFrame = Instance.new("Frame")
    menuFrame.Size = UDim2.new(0, 420, 0, 520)
    menuFrame.Position = UDim2.new(0.5, -210, 0.5, -260)
    menuFrame.BackgroundColor3 = Color3.fromRGB(10, 10, 10)
    menuFrame.BackgroundTransparency = 0.05
    menuFrame.BorderSizePixel = 2
    menuFrame.BorderColor3 = Color3.fromRGB(255, 255, 255)
    menuFrame.ClipsDescendants = true
    menuFrame.Parent = menuGui
    
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, 15)
    corner.Parent = menuFrame
    
    local titleBar = Instance.new("Frame")
    titleBar.Size = UDim2.new(1, 0, 0, 50)
    titleBar.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
    titleBar.Parent = menuFrame
    
    local title = Instance.new("TextLabel")
    title.Size = UDim2.new(1, -60, 1, 0)
    title.Position = UDim2.new(0, 15, 0, 0)
    title.BackgroundTransparency = 1
    title.Text = "VAL3RA N1GGER"
    title.TextColor3 = Color3.fromRGB(255, 255, 255)
    title.TextSize = 20
    title.Font = Enum.Font.GothamBold
    title.TextXAlignment = Enum.TextXAlignment.Left
    title.Parent = titleBar
    
    local closeBtn = Instance.new("TextButton")
    closeBtn.Size = UDim2.new(0, 40, 0, 40)
    closeBtn.Position = UDim2.new(1, -50, 0.5, -20)
    closeBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
    closeBtn.Text = "✕"
    closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
    closeBtn.TextSize = 20
    closeBtn.Font = Enum.Font.GothamBold
    closeBtn.Parent = titleBar
    
    local closeCorner = Instance.new("UICorner")
    closeCorner.CornerRadius = UDim.new(0, 8)
    closeCorner.Parent = closeBtn
    
    closeBtn.MouseButton1Click:Connect(function()
        Settings.MenuOpen = false
        menuGui.Enabled = false
    end)
    
    local container = Instance.new("ScrollingFrame")
    container.Size = UDim2.new(1, -20, 1, -65)
    container.Position = UDim2.new(0, 10, 0, 60)
    container.BackgroundTransparency = 1
    container.ScrollBarThickness = 4
    container.ScrollBarImageColor3 = Color3.fromRGB(255, 255, 255)
    container.Parent = menuFrame
    
    local layout = Instance.new("UIListLayout")
    layout.Padding = UDim.new(0, 8)
    layout.SortOrder = Enum.SortOrder.LayoutOrder
    layout.Parent = container
    
    local function addSection(name)
        local s = Instance.new("TextLabel")
        s.Size = UDim2.new(1, 0, 0, 30)
        s.BackgroundTransparency = 1
        s.Text = "━━━ " .. name .. " ━━━"
        s.TextColor3 = Color3.fromRGB(200, 200, 200)
        s.TextSize = 14
        s.Font = Enum.Font.GothamBold
        s.TextXAlignment = Enum.TextXAlignment.Center
        s.Parent = container
        return s
    end
    
    local function addToggle(text, getter, setter)
        local f = Instance.new("Frame")
        f.Size = UDim2.new(1, 0, 0, 40)
        f.BackgroundTransparency = 1
        f.Parent = container
        
        local label = Instance.new("TextLabel")
        label.Size = UDim2.new(0.6, 0, 1, 0)
        label.BackgroundTransparency = 1
        label.Text = text
        label.TextColor3 = Color3.fromRGB(230, 230, 230)
        label.TextSize = 13
        label.Font = Enum.Font.Gotham
        label.TextXAlignment = Enum.TextXAlignment.Left
        label.Parent = f
        
        local btn = Instance.new("TextButton")
        btn.Size = UDim2.new(0, 65, 0, 30)
        btn.Position = UDim2.new(1, -70, 0.5, -15)
        btn.BackgroundColor3 = getter() and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(40, 40, 40)
        btn.Text = getter() and "ON" or "OFF"
        btn.TextColor3 = getter() and Color3.fromRGB(0, 0, 0) or Color3.fromRGB(200, 200, 200)
        btn.TextSize = 12
        btn.Font = Enum.Font.GothamBold
        btn.Parent = f
        
        local btnCorner = Instance.new("UICorner")
        btnCorner.CornerRadius = UDim.new(0, 8)
        btnCorner.Parent = btn
        
        btn.MouseButton1Click:Connect(function()
            local new = not getter()
            setter(new)
            btn.BackgroundColor3 = new and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(40, 40, 40)
            btn.Text = new and "ON" or "OFF"
            btn.TextColor3 = new and Color3.fromRGB(0, 0, 0) or Color3.fromRGB(200, 200, 200)
        end)
        return btn
    end
    
    local function addSlider(text, min, max, getter, setter, suffix)
        local f = Instance.new("Frame")
        f.Size = UDim2.new(1, 0, 0, 55)
        f.BackgroundTransparency = 1
        f.Parent = container
        
        local label = Instance.new("TextLabel")
        label.Size = UDim2.new(0.6, 0, 0, 22)
        label.BackgroundTransparency = 1
        label.Text = text
        label.TextColor3 = Color3.fromRGB(230, 230, 230)
        label.TextSize = 12
        label.Font = Enum.Font.Gotham
        label.TextXAlignment = Enum.TextXAlignment.Left
        label.Parent = f
        
        local valueLabel = Instance.new("TextLabel")
        valueLabel.Size = UDim2.new(0.4, 0, 0, 22)
        valueLabel.Position = UDim2.new(0.6, 0, 0, 0)
        valueLabel.BackgroundTransparency = 1
        valueLabel.Text = string.format("%.1f", getter()) .. (suffix or "")
        valueLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
        valueLabel.TextSize = 12
        valueLabel.Font = Enum.Font.GothamBold
        valueLabel.TextXAlignment = Enum.TextXAlignment.Right
        valueLabel.Parent = f
        
        local bar = Instance.new("Frame")
        bar.Size = UDim2.new(1, 0, 0, 4)
        bar.Position = UDim2.new(0, 0, 0, 30)
        bar.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
        bar.Parent = f
        
        local fill = Instance.new("Frame")
        local ratio = (getter() - min) / (max - min)
        fill.Size = UDim2.new(ratio, 0, 1, 0)
        fill.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        fill.Parent = bar
        
        local sliderBtn = Instance.new("TextButton")
        sliderBtn.Size = UDim2.new(0, 14, 0, 14)
        sliderBtn.Position = UDim2.new(ratio, -7, 0, -5)
        sliderBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        sliderBtn.Text = ""
        sliderBtn.Parent = bar
        
        local dragging = false
        sliderBtn.MouseButton1Down:Connect(function() dragging = true end)
        UserInputService.InputEnded:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
        end)
        
        UserInputService.InputChanged:Connect(function(input)
            if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
                local mouse = LocalPlayer:GetMouse()
                local relX = math.clamp(mouse.X - bar.AbsolutePosition.X, 0, bar.AbsoluteSize.X)
                local newVal = min + (relX / bar.AbsoluteSize.X) * (max - min)
                setter(newVal)
                valueLabel.Text = string.format("%.1f", newVal) .. (suffix or "")
                fill.Size = UDim2.new((newVal - min) / (max - min), 0, 1, 0)
                sliderBtn.Position = UDim2.new((newVal - min) / (max - min), -7, 0, -5)
            end
        end)
    end
    
    local function addColorPicker(text, getter, setter)
        local f = Instance.new("Frame")
        f.Size = UDim2.new(1, 0, 0, 40)
        f.BackgroundTransparency = 1
        f.Parent = container
        
        local label = Instance.new("TextLabel")
        label.Size = UDim2.new(0.5, 0, 1, 0)
        label.BackgroundTransparency = 1
        label.Text = text
        label.TextColor3 = Color3.fromRGB(230, 230, 230)
        label.TextSize = 13
        label.Font = Enum.Font.Gotham
        label.TextXAlignment = Enum.TextXAlignment.Left
        label.Parent = f
        
        local btn = Instance.new("TextButton")
        btn.Size = UDim2.new(0, 60, 0, 30)
        btn.Position = UDim2.new(1, -65, 0.5, -15)
        btn.BackgroundColor3 = getter()
        btn.Text = ""
        btn.Parent = f
        
        local btnCorner = Instance.new("UICorner")
        btnCorner.CornerRadius = UDim.new(0, 8)
        btnCorner.Parent = btn
        
        local colors = {
            Color3.fromRGB(180, 100, 255), -- Фиолетовый
            Color3.fromRGB(255, 100, 200), -- Розовый
            Color3.fromRGB(255, 0, 0),     -- Красный
            Color3.fromRGB(0, 255, 0),     -- Зеленый
            Color3.fromRGB(0, 0, 255),     -- Синий
            Color3.fromRGB(255, 255, 0),   -- Желтый
            Color3.fromRGB(255, 165, 0),   -- Оранжевый
            Color3.fromRGB(255, 255, 255), -- Белый
            Color3.fromRGB(0, 255, 255),   -- Голубой
            Color3.fromRGB(255, 0, 255)    -- Пурпурный
        }
        local index = 1
        
        btn.MouseButton1Click:Connect(function()
            for i, col in ipairs(colors) do
                if col == getter() then
                    index = i % #colors + 1
                    break
                end
            end
            setter(colors[index])
            btn.BackgroundColor3 = colors[index]
            RefreshESP()
        end)
    end
    
    local function addDropdown(text, options, getter, setter)
        local f = Instance.new("Frame")
        f.Size = UDim2.new(1, 0, 0, 45)
        f.BackgroundTransparency = 1
        f.Parent = container
        
        local label = Instance.new("TextLabel")
        label.Size = UDim2.new(0.4, 0, 1, 0)
        label.BackgroundTransparency = 1
        label.Text = text
        label.TextColor3 = Color3.fromRGB(230, 230, 230)
        label.TextSize = 12
        label.Font = Enum.Font.Gotham
        label.TextXAlignment = Enum.TextXAlignment.Left
        label.Parent = f
        
        local btn = Instance.new("TextButton")
        btn.Size = UDim2.new(0.5, 0, 0, 30)
        btn.Position = UDim2.new(0.5, 0, 0.5, -15)
        btn.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
        btn.Text = getter()
        btn.TextColor3 = Color3.fromRGB(255, 255, 255)
        btn.TextSize = 11
        btn.Font = Enum.Font.Gotham
        btn.Parent = f
        
        local btnCorner = Instance.new("UICorner")
        btnCorner.CornerRadius = UDim.new(0, 8)
        btnCorner.Parent = btn
        
        local list = nil
        btn.MouseButton1Click:Connect(function()
            if list then list:Destroy() list = nil return end
            list = Instance.new("Frame")
            list.Size = UDim2.new(0.5, 0, 0, #options * 32)
            list.Position = UDim2.new(0.5, 0, 0, 48)
            list.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
            list.BackgroundTransparency = 0.1
            list.Parent = f
            
            for i, opt in ipairs(options) do
                local optBtn = Instance.new("TextButton")
                optBtn.Size = UDim2.new(1, 0, 0, 32)
                optBtn.Position = UDim2.new(0, 0, 0, (i-1)*32)
                optBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
                optBtn.Text = opt
                optBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
                optBtn.TextSize = 10
                optBtn.Font = Enum.Font.Gotham
                optBtn.Parent = list
                
                optBtn.MouseButton1Click:Connect(function()
                    setter(opt)
                    btn.Text = opt
                    list:Destroy()
                    list = nil
                    RefreshESP()
                end)
            end
        end)
    end
    
    -- ESP Секция
    addSection("ESP (F8)")
    addToggle("Enable ESP", function() return Settings.ESPEnabled end, function(v) Settings.ESPEnabled = v; RefreshESP() end)
    addDropdown("ESP Mode", {"All", "Killer", "Survive"}, function() return Settings.ESPMode end, function(v) Settings.ESPMode = v; RefreshESP() end)
    addColorPicker("Killer Color", function() return Settings.KillerColor end, function(v) Settings.KillerColor = v; RefreshESP() end)
    addColorPicker("Survive Color", function() return Settings.SurviveColor end, function(v) Settings.SurviveColor = v; RefreshESP() end)
    addSlider("Fill Transparency", 0, 1, function() return Settings.FillTransparency end, function(v) Settings.FillTransparency = v; RefreshESP() end, "")
    
    -- FLY Секция
    addSection("FLY (B)")
    addToggle("Enable Fly", function() return Settings.FlyEnabled end, function(v) ToggleFly() end)
    addSlider("Fly Speed", 0, 1000, function() return Settings.FlySpeed end, function(v) Settings.FlySpeed = v end, "")
    
    -- DASH Секция
    addSection("DASH (G)")
    addToggle("Enable Dash", function() return Settings.DashEnabled end, function(v) Settings.DashEnabled = v end)
    addSlider("Dash Distance", 5, 50, function() return Settings.DashDistance end, function(v) Settings.DashDistance = v end, "")
    
    -- VISUAL Секция
    addSection("VISUAL")
    addToggle("Fullbright (End)", function() return Settings.Fullbright end, function(v) Settings.Fullbright = v; applyFullbright() end)
    addToggle("Screen Stretch (Y)", function() return Settings.StretchEnabled end, function(v) toggleStretch() end)
    addSlider("Stretch Factor", 0.3, 1.5, function() return Settings.StretchResolution end, function(v) Settings.StretchResolution = v; if Settings.StretchEnabled then toggleStretch(); toggleStretch() end end, "x")
    addSlider("FOV", 20, 120, function() return Settings.FOV end, function(v) Settings.FOV = v end, "")
    addToggle("Unlock FPS (F9)", function() return Settings.FPSUnlocked end, function(v) toggleFPSUnlock() end)
    
    -- SATURATION Секция
    addSection("SATURATION (F5)")
    local satLabel = Instance.new("TextLabel")
    satLabel.Size = UDim2.new(1, 0, 0, 30)
    satLabel.BackgroundTransparency = 1
    satLabel.Text = "Текущий уровень: " .. (Settings.SaturationLevel == 1 and "Нормальная" or "Насыщенная")
    satLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
    satLabel.TextSize = 13
    satLabel.Font = Enum.Font.Gotham
    satLabel.TextXAlignment = Enum.TextXAlignment.Center
    satLabel.Parent = container
    
    -- Info Секция
    addSection("CONTROLS")
    local info = Instance.new("TextLabel")
    info.Size = UDim2.new(1, 0, 0, 130)
    info.BackgroundTransparency = 1
    info.Text = "INS - Menu\nG - Dash\nB - Fly\nF8 - ESP\nF1/F2 - FOV\nEnd - Fullbright\nY - Stretch Toggle\nF9 - Unlock FPS\nF5 - Saturation (2 levels)\nDelete - Change Dash Distance"
    info.TextColor3 = Color3.fromRGB(150, 150, 150)
    info.TextSize = 11
    info.Font = Enum.Font.Gotham
    info.TextXAlignment = Enum.TextXAlignment.Left
    info.Parent = container
    
    local function updateCanvas()
        container.CanvasSize = UDim2.new(0, 0, 0, layout.AbsoluteContentSize.Y + 20)
    end
    layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(updateCanvas)
    updateCanvas()
    
    -- Функция для обновления лейбла насыщенности в меню
    local function updateSatLabel()
        satLabel.Text = "Текущий уровень: " .. (Settings.SaturationLevel == 1 and "Нормальная" or "Насыщенная")
    end
    
    return updateSatLabel
end

-- ============ КЛАВИШИ ============
local updateSatLabel = CreateMenu()

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed then return end
    local key = input.KeyCode
    
    -- INS - Menu
    if key == Enum.KeyCode.Insert then
        Settings.MenuOpen = not Settings.MenuOpen
        if menuGui then menuGui.Enabled = Settings.MenuOpen end
    end
    
    -- F8 - ESP
    if key == Enum.KeyCode.F8 then
        Settings.ESPEnabled = not Settings.ESPEnabled
        RefreshESP()
        print("ESP " .. (Settings.ESPEnabled and "включён" or "выключен"))
    end
    
    -- G - Dash
    if key == Enum.KeyCode.G then
        Dash()
    end
    
    -- B - Fly
    if key == Enum.KeyCode.B then
        ToggleFly()
    end
    
    -- Delete - Dash Distance
    if key == Enum.KeyCode.Delete then
        NextDashDistance()
    end
    
    -- End - Fullbright
    if key == Enum.KeyCode.End then
        Settings.Fullbright = not Settings.Fullbright
        applyFullbright()
    end
    
    -- Y - Stretch Toggle
    if key == Enum.KeyCode.Y then
        toggleStretch()
    end
    
    -- F1/F2 - FOV
    if key == Enum.KeyCode.F1 then
        Settings.FOV = math.min(Settings.FOV + 5, 120)
    end
    if key == Enum.KeyCode.F2 then
        Settings.FOV = math.max(Settings.FOV - 5, 20)
    end
    
    -- F5 - Saturation (двухуровневая)
    if key == Enum.KeyCode.F5 then
        cycleSaturation()
        if updateSatLabel then updateSatLabel() end
    end
    
    -- F9 - Unlock FPS
    if key == Enum.KeyCode.F9 then
        toggleFPSUnlock()
    end
end)

-- ============ ПРИ РЕСПАВНЕ ============
LocalPlayer.CharacterAdded:Connect(function()
    task.wait(1)
    UpdateAllChams()
    if Settings.FlyEnabled then
        task.wait(0.5)
        StartFly()
    end
end)

-- ============ ЗАПУСК ============
applyFullbright()

print("========================================")
print("VAL3RA N1GGER ULTIMATE HUB LOADED")
print("INS - Menu | G - Dash | B - Fly | F8 - ESP")
print("F1/F2 - FOV | End - Fullbright | F5 - Saturation")
print("Y - Stretch | F9 - Unlock FPS")
print("Delete - Dash Distance")
print("========================================")

game:GetService("StarterGui"):SetCore("SendNotification", {
    Title = "VAL3RA N1GGER",
    Text = "INS - Menu | G - Dash | B - Fly | F8 - ESP\nF1/F2 - FOV | End - Fullbright | F5 - Saturation",
    Duration = 6
})