Script  by morty
Key Required

Script by morty

The Lost Frontmortyvmortyv 4K views 10.5K executesUpdated Sep 16, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•2139 lines (106246 chars)
-- ============================================================
-- MORTY CHEAT v7.5 — fixed ESP offset + detailed tooltips
-- Insert = menu | Home = unload
-- ============================================================

local Players2 = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local GuiService = game:GetService("GuiService")
local HttpService = game:GetService("HttpService")
local LocalPlayer = Players2.LocalPlayer
local Mouse = LocalPlayer:GetMouse()
local BRAND = "MORTY"
local CurrentLang = "ru"

-- ============================================================
-- ЛОКАЛИЗАЦИЯ
-- ============================================================
local L = {
    ru = { tab_aim="Аим", tab_wallhack="ВХ", tab_world="Мир", tab_misc="Разное", tab_customize="Тема",
        grp_aimbot="АИМБОТ", grp_target="ЦЕЛИ",
        grp_players="ИГРОКИ", grp_skeleton="СКЕЛЕТ", grp_drones="ДРОНЫ", grp_radar="РАДАР",
        grp_camera="КАМЕРА", grp_speed="СКОРОСТЬ", grp_freecam="ФРИКАМ", grp_ui="ИНТЕРФЕЙС",
        grp_colors="ЦВЕТА", grp_config="КОНФИГИ", grp_colors_player="ЦВЕТА ИГРОКОВ",
        grp_colors_other="ЦВЕТА ИНТЕРФЕЙСА", grp_binds="БИНДЫ",
        cfg_name="Имя конфига", cfg_save="Сохранить", cfg_load="Загрузить",
        picks="Выбрать",
        no_binds="ПКМ по пункту меню чтобы добавить бинд.",
        lang="ЯЗЫК",
        bind_title="БИНД: ", bind_hint="Нажмите клавишу...",
        bind_key="Клавиша: ", bind_mode="Режим:",
        bind_toggle="Переключ.", bind_hold="Удержание",
        bind_save="Сохранить", bind_cancel="Отмена", bind_clear="Сброс" },
    en = { tab_aim="Aim", tab_wallhack="Wallhack", tab_world="World", tab_misc="Misc", tab_customize="Theme",
        grp_aimbot="AIMBOT", grp_target="TARGETING",
        grp_players="PLAYERS", grp_skeleton="SKELETON", grp_drones="DRONES", grp_radar="RADAR",
        grp_camera="CAMERA", grp_speed="SPEED", grp_freecam="FREECAM", grp_ui="UI",
        grp_colors="COLORS", grp_config="CONFIGS", grp_colors_player="PLAYER COLORS",
        grp_colors_other="UI COLORS", grp_binds="BINDS",
        cfg_name="Config name", cfg_save="Save", cfg_load="Load",
        picks="Pick",
        no_binds="Right-click menu item to add bind.",
        lang="LANG",
        bind_title="BIND: ", bind_hint="Press any key...",
        bind_key="Key: ", bind_mode="Mode:",
        bind_toggle="Toggle", bind_hold="Hold",
        bind_save="Save", bind_cancel="Cancel", bind_clear="Clear" }
}
local function t(k) return (L[CurrentLang] and L[CurrentLang][k]) or k end

local ITEM_NAME = {
    AIM_Enabled={en="Enable",ru="Включить"},
    AIM_WallCheck={en="Visible Check",ru="Видимость"},
    AIM_ShowFOV={en="Show FOV",ru="Круг FOV"},
    AIM_DynamicSmooth={en="Dynamic Smooth",ru="Дин. сглаж."},
    AIM_AimKey={en="Aim Key",ru="Кнопка аима"}, AIM_FOV={en="FOV",ru="FOV"},
    AIM_Smooth={en="Smooth",ru="Сглаживание"}, AIM_TeamCheck={en="Team Check",ru="Проверка команды"},
    AIM_TargetBone={en="Bone",ru="Кость"},
    ESP_Enabled={en="Enable ESP",ru="Включить ESP"}, ESP_Boxes={en="Boxes",ru="Боксы"},
    ESP_Names={en="Names",ru="Ники"}, ESP_Distance={en="Distance",ru="Дистанция"},
    ESP_Health={en="Health Bar",ru="Полоса HP"}, ESP_Skeleton={en="Skeleton",ru="Скелет"},
    ESP_TeamCheck={en="Team Check",ru="Проверка команды"},
    ESP_MaxDist={en="Max Distance",ru="Макс. дистанция"},
    ESP_Drones={en="Drone ESP",ru="ESP дроны"},
    ESP_DronesTeamCheck={en="Drone Team Check",ru="Проверка команды дронов"},
    SPEED_Enabled={en="Speed Hack",ru="Ускорение"},
    SPEED_Value={en="Speed",ru="Скорость"},
    JUMP_Enabled={en="Jump Power",ru="Прыжок"},
    JUMP_Value={en="Jump",ru="Сила прыжка"},
    RADAR_Enabled={en="Radar",ru="Радар"},
    RADAR_Size={en="Radar Size",ru="Размер радара"},
    FREECAM_Enabled={en="Freecam",ru="Freecam"},
    FREECAM_Speed={en="Speed",ru="Скорость"},
    FREECAM_Sensitivity={en="Sensitivity",ru="Чувствительность"},
    UI_Watermark={en="Watermark",ru="Watermark"},
    C_Enemy={en="Enemy",ru="Враг"}, C_Team={en="Teammate",ru="Тиммейт"},
    C_DroneEnemy={en="Drone (enemy)",ru="Дрон (враг)"},
    C_DroneTeam={en="Drone (team)",ru="Дрон (тиммейт)"},
    C_Box={en="Box",ru="Бокс"}, C_Name={en="Name",ru="Ник"},
    C_Distance={en="Distance",ru="Дистанция"}, C_Skeleton={en="Skeleton",ru="Скелет"},
    C_HealthBg={en="HP bg",ru="HP фон"}, C_HealthHigh={en="HP high",ru="HP высокое"},
    C_HealthMid={en="HP mid",ru="HP среднее"}, C_HealthLow={en="HP low",ru="HP низкое"},
    C_RadarBg={en="Radar bg",ru="Радар фон"}, C_RadarBorder={en="Radar border",ru="Радар рамка"},
    C_RadarYou={en="Radar you",ru="Радар ты"}, C_RadarEnemy={en="Radar enemy",ru="Радар враг"},
    C_FOVCircle={en="FOV circle",ru="Круг FOV"}, C_FOVActive={en="FOV active",ru="FOV активный"},
    C_Accent={en="Accent",ru="Акцент"}
}
local function tItem(key, fallback)
    local n = ITEM_NAME[key]; if not n then return fallback or key end
    return n[CurrentLang] or n.en or fallback or key
end

-- ============================================================
-- ПОДРОБНЫЕ ОПИСАНИЯ
-- ============================================================
local DESC = {
    AIM_Enabled={en="Master switch for the whole aimbot.\nWhen off — nothing else in Aim tab works.",
                 ru="Главный выключатель аимбота.\nЕсли выкл — ничего в табе Аим не работает."},
    AIM_WallCheck={en="Don't aim at enemies behind walls.\nUses raycast — slight CPU cost.",
                   ru="Не целиться во врагов за стеной.\nИспользует raycast — слегка грузит CPU."},
    AIM_ShowFOV={en="Draw a circle showing the aim radius.\nOnly visual — doesn't affect aiming.",
                 ru="Рисует круг радиусом аима.\nТолько визуал — на аим не влияет."},
    AIM_DynamicSmooth={en="Smoothness scales with distance.\nFar target = faster lock, close = smoother.",
                       ru="Плавность зависит от дистанции.\nДалёкая цель = быстрее захват, близкая = плавнее."},
    AIM_AimKey={en="Mouse button that activates aim.\nRMB = right, LMB = left, Always = always on.",
                ru="Кнопка мыши для активации аима.\nRMB = правая, LMB = левая, Always = всегда."},
    AIM_FOV={en="Aim capture radius in pixels.\nOnly targets inside this circle are picked.",
             ru="Радиус захвата в пикселях.\nТолько цели внутри круга берутся."},
    AIM_Smooth={en="How fast aim moves to target.\n1 = instant (rage), 15+ = human-like.",
                ru="Скорость наведения на цель.\n1 = мгновенно (рейдж), 15+ = похоже на человека."},
    AIM_TeamCheck={en="Skip teammates (blue players).\nUses team container from Workspace.",
                   ru="Пропускать союзников (синих).\nИспользует контейнер команды из Workspace."},
    AIM_TargetBone={en="Which part of body to aim at.\nHead = most damage, Torso = safer.",
                    ru="Часть тела для прицела.\nHead = больше урона, Torso = безопаснее."},

    ESP_Enabled={en="Master switch for all ESP elements.\nOff = nothing visible on players.",
                 ru="Главный выключатель всех ESP элементов.\nВыкл = на игроках ничего не видно."},
    ESP_Boxes={en="Rectangle around each player.\nRed = enemy, blue = teammate.",
               ru="Прямоугольник вокруг игрока.\nКрасный = враг, синий = союзник."},
    ESP_Names={en="Show player name above box.\nUses Roblox username.",
               ru="Показывает ник над боксом.\nИспользует имя Roblox."},
    ESP_Distance={en="Distance to player in meters.\nDisplayed below box.",
                  ru="Дистанция до игрока в метрах.\nПоказывается под боксом."},
    ESP_Health={en="Vertical HP bar left of box.\nGreen > 60%, yellow 30-60%, red < 30%.",
                ru="Вертикальная полоса HP слева от бокса.\nЗелёная > 60%, жёлтая 30-60%, красная < 30%."},
    ESP_Skeleton={en="Lines between body parts.\nWorks with R6 and R15 rigs.",
                  ru="Линии между частями тела.\nРаботает и с R6 и с R15."},
    ESP_TeamCheck={en="Hide teammates from ESP.\nThey disappear from screen and radar.",
                   ru="Скрыть союзников из ESP.\nОни исчезают с экрана и радара."},
    ESP_MaxDist={en="Max render distance in studs.\nAbove this — ESP hidden.",
                 ru="Макс. дистанция отрисовки в studs.\nДальше — ESP скрыт."},
    ESP_Drones={en="Highlight FPV drones with purple box.\nWorks through walls.",
                ru="Подсветка FPV-дронов фиолетовым боксом.\nВидно через стены."},
    ESP_DronesTeamCheck={en="Hide teammate drones.\nOnly enemy drones shown.",
                         ru="Скрыть дроны союзников.\nПоказываются только враги."},

    SPEED_Enabled={en="Increase your walk speed.\nSmoothly ramps up — less detectable.",
                   ru="Увеличивает скорость бега.\nПлавный разгон — меньше палева."},
    SPEED_Value={en="Target speed in studs/sec.\nDefault Roblox = 16, sprint = 24.",
                 ru="Целевая скорость studs/сек.\nRoblox по умолч. = 16, спринт = 24."},
    JUMP_Enabled={en="Increase your jump power.\nAlso smooth — no snap.",
                  ru="Увеличивает силу прыжка.\nТоже плавно — без рывка."},
    JUMP_Value={en="Target jump power.\nDefault Roblox = 50, UseJumpPower mode.",
                ru="Целевая сила прыжка.\nRoblox по умолч. = 50."},

    RADAR_Enabled={en="Corner radar with enemies.\nRotates with your camera.",
                   ru="Радар в углу с врагами.\nВращается вместе с камерой."},
    RADAR_Size={en="Radar size in pixels.\nBigger = see further, less precise.",
                ru="Размер радара в пикселях.\nБольше = видно дальше, менее точно."},

    FREECAM_Enabled={en="Detach camera from your body.\nWASD = fly, Space/Q = up/down.",
                     ru="Отцепить камеру от тела.\nWASD = полёт, Space/Q = вверх/вниз."},
    FREECAM_Speed={en="Camera fly speed.\nHold Shift = 3x, Ctrl = 0.25x.",
                   ru="Скорость полёта камеры.\nShift = 3x, Ctrl = 0.25x."},
    FREECAM_Sensitivity={en="Mouse sensitivity for freecam.\nHigher = faster rotation.",
                         ru="Чувствительность мыши в freecam.\nБольше = быстрее поворот."},

    UI_Watermark={en="Info panel top-left.\nShows FPS, targets, role, binds count.",
                  ru="Инфо-панель сверху слева.\nПоказывает FPS, цели, роль, бинды."},

    C_Enemy={en="Color for enemies.\nShown in ESP, radar, skeleton.",
             ru="Цвет врагов.\nПоказывается в ESP, радаре, скелете."},
    C_Team={en="Color for teammates.\nTheir boxes and radar dots.",
            ru="Цвет союзников.\nИх боксы и точки на радаре."},
    C_DroneEnemy={en="Enemy drone box color.\nBright = high visibility.",
                  ru="Цвет бокса дронов врагов.\nЯркий = хорошо видно."},
    C_DroneTeam={en="Teammate drone color.\nUsed when Team Check off.",
                 ru="Цвет дронов союзников.\nВидно только если Team Check выкл."},
    C_Box={en="Box outline color.\nOverrides team/enemy color if you set it manually.",
           ru="Цвет рамки боксов.\nПеребивает цвета команды/врага вручную."},
    C_Name={en="Player name text color.",
            ru="Цвет текста ников."},
    C_Distance={en="Distance text color.",
                ru="Цвет текста дистанции."},
    C_Skeleton={en="Skeleton line color.\nWhite default — visible on any background.",
                ru="Цвет линий скелета.\nБелый по умолч. — видно на любом фоне."},
    C_HealthBg={en="Health bar background.\nDark grey shows missing HP.",
                ru="Фон полосы HP.\nТёмно-серый = недостающее HP."},
    C_HealthHigh={en="HP > 60% color.\nGreen by default.",
                  ru="Цвет HP > 60%.\nЗелёный по умолч."},
    C_HealthMid={en="HP 30-60% color.\nYellow by default.",
                 ru="Цвет HP 30-60%.\nЖёлтый по умолч."},
    C_HealthLow={en="HP < 30% color.\nRed by default.",
                 ru="Цвет HP < 30%.\nКрасный по умолч."},
    C_RadarBg={en="Radar background color.\nDark navy by default.",
               ru="Фон радара.\nТёмно-синий по умолч."},
    C_RadarBorder={en="Radar border line color.\nAccent-colored by default.",
                   ru="Рамка радара.\nАкцентный цвет по умолч."},
    C_RadarYou={en="Your position dot on radar.\nGreen by default.",
                ru="Твоя точка на радаре.\nЗелёная по умолч."},
    C_RadarEnemy={en="Enemy dots on radar.\nRed by default.",
                  ru="Точки врагов на радаре.\nКрасные по умолч."},
    C_FOVCircle={en="FOV circle when not aiming.\nWhite by default.",
                 ru="Круг FOV когда не аимишь.\nБелый по умолч."},
    C_FOVActive={en="FOV circle when aiming.\nAccent-colored by default.",
                 ru="Круг FOV при аиме.\nАкцентный цвет по умолч."},
    C_Accent={en="Main menu accent color.\nAffects headers, sliders, buttons.",
              ru="Главный акцент меню.\nВлияет на заголовки, слайдеры, кнопки."},
}
local function getDesc(key)
    local d = DESC[key]; if not d then return nil end
    return d[CurrentLang] or d.en
end

-- ============================================================
-- ЦВЕТА
-- ============================================================
local DefaultColors = {
    C_Enemy = Color3.fromRGB(255,80,80),
    C_Team = Color3.fromRGB(100,180,255),
    C_DroneEnemy = Color3.fromRGB(255,100,255),
    C_DroneTeam = Color3.fromRGB(180,140,255),
    C_Box = Color3.fromRGB(255,255,255),
    C_Name = Color3.fromRGB(255,255,255),
    C_Distance = Color3.fromRGB(220,220,220),
    C_Skeleton = Color3.fromRGB(240,240,245),
    C_HealthBg = Color3.fromRGB(30,30,34),
    C_HealthHigh = Color3.fromRGB(120,240,120),
    C_HealthMid = Color3.fromRGB(247,224,92),
    C_HealthLow = Color3.fromRGB(255,90,90),
    C_RadarBg = Color3.fromRGB(12,12,14),
    C_RadarBorder = Color3.fromRGB(247,224,92),
    C_RadarYou = Color3.fromRGB(120,240,120),
    C_RadarEnemy = Color3.fromRGB(255,80,80),
    C_FOVCircle = Color3.fromRGB(255,255,255),
    C_FOVActive = Color3.fromRGB(247,224,92),
    C_Accent = Color3.fromRGB(247,224,92),
}
local Colors = {}
for k, v in pairs(DefaultColors) do Colors[k] = v end
local function getColor(k) return Colors[k] or Color3.new(1,1,1) end
local function setColor(k, c) Colors[k] = c end

-- ============================================================
-- CONFIG
-- ============================================================
local Config = {
    ESP_Enabled=true, ESP_Boxes=true, ESP_Names=true, ESP_Distance=true,
    ESP_Skeleton=true, ESP_Health=true, ESP_TeamCheck=false, ESP_MaxDist=3000,
    ESP_Drones=true, ESP_DronesTeamCheck=false,
    SPEED_Enabled=false, SPEED_Value=16, JUMP_Enabled=false, JUMP_Value=50,
    RADAR_Enabled=true, RADAR_Size=120,
    AIM_Enabled=false, AIM_FOV=300, AIM_Smooth=15, AIM_ShowFOV=true,
    AIM_TeamCheck=false, AIM_WallCheck=false, AIM_TargetBone="Head",
    AIM_AimKey="RMB", AIM_DynamicSmooth=true,
    FREECAM_Enabled=false, FREECAM_Speed=50, FREECAM_Sensitivity=1.0,
    UI_Watermark=true,
    MENU_Open=true, MENU_Tab="Wallhack"
}
local Tuning = {
    RefreshRate=0.08, DroneRefreshRate=0.3,
    NameOffset=18, DistOffset=4,
    RadarRange=400, RadarDotSize=6, HealthBarWidth=4, HealthBarOffset=6,
    SpeedStepPerFrame=2,
}
local Cache = {
    targets={}, humanoids={}, teamStatus={}, names={}, myRoot=nil,
    count=0, drawn=0,
    roleRoot=nil, myRole=nil, playerRoles={},
    drones={}, droneCount=0, droneDrawn=0,
    lastRefresh=0, lastDroneRefresh=0,
}
local AimBones = {"Head","Torso","HumanoidRootPart"}
local AimKeys = {"RMB","LMB","Always"}
local Binds = {}
local HoldActive = {}
local Conn = {}
local Unloaded = false

-- ============================================================
-- CONFIG SYSTEM
-- ============================================================
local ConfigSystem = { Folder="morty_cheat", CurrentName="default" }
local CONFIG_SKIP = { ESP_TeamCheck=true, AIM_TeamCheck=true, MENU_Open=true, MENU_Tab=true }

local function ensureFolder(p)
    if not isfolder or not makefolder then return false end
    pcall(function() if not isfolder(p) then makefolder(p) end end)
    return true
end
local function rgbToHex(c) return string.format("#%02X%02X%02X", math.floor(c.R*255+0.5), math.floor(c.G*255+0.5), math.floor(c.B*255+0.5)) end
local function hexToColor(hex)
    hex = tostring(hex):gsub("#",""):gsub("%s","")
    if #hex ~= 6 then return nil end
    local r,g,b = tonumber(hex:sub(1,2),16), tonumber(hex:sub(3,4),16), tonumber(hex:sub(5,6),16)
    if not (r and g and b) then return nil end
    return Color3.fromRGB(r,g,b)
end
function ConfigSystem.GetPath(n) return ConfigSystem.Folder .. "/" .. n .. ".json" end
function ConfigSystem.Save(name)
    if not writefile or not isfolder then return false end
    name = name or ConfigSystem.CurrentName or "default"
    ensureFolder(ConfigSystem.Folder)
    local data = { config = {}, colors = {}, binds = {}, lang = CurrentLang }
    for k,v in pairs(Config) do
        local tp = type(v)
        if tp == "boolean" or tp == "number" or tp == "string" then data.config[k] = v end
    end
    for k,c in pairs(Colors) do data.colors[k] = rgbToHex(c) end
    for k,b in pairs(Binds) do
        if b and b.key then data.binds[k] = { key = b.key.Name, mode = b.mode or "Toggle" } end
    end
    local ok, json = pcall(HttpService.JSONEncode, HttpService, data)
    if not ok then return false end
    if not pcall(writefile, ConfigSystem.GetPath(name), json) then return false end
    ConfigSystem.CurrentName = name
    return true
end
function ConfigSystem.Load(name)
    if not readfile or not isfile then return false end
    name = name or ConfigSystem.CurrentName or "default"
    local path = ConfigSystem.GetPath(name)
    if not isfile(path) then return false end
    local ok, content = pcall(readfile, path)
    if not ok or not content or content == "" then return false end
    local dok, data = pcall(HttpService.JSONDecode, HttpService, content)
    if not dok or type(data) ~= "table" then return false end
    if type(data.config) == "table" then
        for k,v in pairs(data.config) do
            if Config[k] ~= nil and not CONFIG_SKIP[k] and type(v) == type(Config[k]) then Config[k] = v end
        end
    end
    if type(data.colors) == "table" then
        for k,hex in pairs(data.colors) do
            local c = hexToColor(hex); if c then Colors[k] = c end
        end
    end
    Binds = {}
    if type(data.binds) == "table" then
        for k,b in pairs(data.binds) do
            if type(b) == "table" and b.key then
                local kc = Enum.KeyCode[b.key]
                if kc then Binds[k] = { key = kc, mode = b.mode or "Toggle" } end
            end
        end
    end
    if type(data.lang) == "string" and (data.lang == "ru" or data.lang == "en") then
        CurrentLang = data.lang
    end
    ConfigSystem.CurrentName = name
    return true
end

-- ============================================================
-- UI
-- ============================================================
local UI = Instance.new("ScreenGui")
UI.Name = "M_" .. tostring(math.random(100000, 999999))
UI.ResetOnSpawn = false
UI.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
UI.DisplayOrder = 999
UI.IgnoreGuiInset = true
pcall(function() UI.Parent = game:GetService("CoreGui") end)
if not UI.Parent then UI.Parent = LocalPlayer:WaitForChild("PlayerGui") end

local ESPGui = Instance.new("ScreenGui")
ESPGui.Name = "E_" .. tostring(math.random(100000, 999999))
ESPGui.ResetOnSpawn = false
ESPGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
ESPGui.DisplayOrder = 998
ESPGui.IgnoreGuiInset = false   -- ИСПРАВЛЕНО: теперь не игнорит топбар
pcall(function() ESPGui.Parent = game:GetService("CoreGui") end)
if not ESPGui.Parent then ESPGui.Parent = LocalPlayer:WaitForChild("PlayerGui") end

-- Watermark
local WM = Instance.new("Frame", UI)
WM.BackgroundColor3 = Color3.fromRGB(10,10,12); WM.BackgroundTransparency = 0.15
WM.BorderSizePixel = 0; WM.Position = UDim2.new(0, 10, 0, 10)
WM.Size = UDim2.new(0, 800, 0, 26); WM.ZIndex = 200
Instance.new("UICorner", WM).CornerRadius = UDim.new(0, 5)
local WMStroke = Instance.new("UIStroke", WM)
WMStroke.Color = getColor("C_Accent"); WMStroke.Thickness = 1; WMStroke.Transparency = 0.5
local WMBrand = Instance.new("TextLabel", WM)
WMBrand.BackgroundTransparency = 1; WMBrand.Position = UDim2.new(0, 10, 0, 0)
WMBrand.Size = UDim2.new(0, 80, 1, 0)
WMBrand.Font = Enum.Font.GothamBold; WMBrand.TextSize = 12
WMBrand.TextColor3 = getColor("C_Accent"); WMBrand.Text = BRAND
WMBrand.TextXAlignment = Enum.TextXAlignment.Left
local WmInfo = Instance.new("TextLabel", WM)
WmInfo.BackgroundTransparency = 1; WmInfo.Position = UDim2.new(0, 90, 0, 0)
WmInfo.Size = UDim2.new(1, -100, 1, 0)
WmInfo.Font = Enum.Font.GothamMedium; WmInfo.TextSize = 11
WmInfo.TextColor3 = Color3.fromRGB(200,200,200); WmInfo.TextXAlignment = Enum.TextXAlignment.Left
WmInfo.Text = "loading..."

-- Тултип
local Tooltip = { frame = nil, conn = nil }
local function hideTooltip()
    if Tooltip.frame then pcall(function() Tooltip.frame:Destroy() end); Tooltip.frame = nil end
    if Tooltip.conn then pcall(function() Tooltip.conn:Disconnect() end); Tooltip.conn = nil end
end
local function showTooltip(text)
    hideTooltip()
    local f = Instance.new("Frame", UI)
    f.BackgroundColor3 = Color3.fromRGB(19,19,22)
    f.BackgroundTransparency = 0.05
    f.BorderSizePixel = 0; f.Size = UDim2.new(0, 300, 0, 80)
    f.ZIndex = 2000; f.Active = false
    Instance.new("UICorner", f).CornerRadius = UDim.new(0, 6)
    local st = Instance.new("UIStroke", f)
    st.Color = getColor("C_Accent"); st.Thickness = 1; st.Transparency = 0.3
    local lbl = Instance.new("TextLabel", f)
    lbl.BackgroundTransparency = 1
    lbl.Position = UDim2.new(0, 10, 0, 8); lbl.Size = UDim2.new(1, -20, 1, -16)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 12
    lbl.TextColor3 = Color3.fromRGB(240,240,245)
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextYAlignment = Enum.TextYAlignment.Top
    lbl.TextWrapped = true; lbl.Text = text; lbl.ZIndex = 2001
    Tooltip.frame = f
    Tooltip.conn = RunService.RenderStepped:Connect(function()
        if not f.Parent then if Tooltip.conn then Tooltip.conn:Disconnect(); Tooltip.conn = nil end; return end
        local mp = UserInputService:GetMouseLocation()
        local cam = Workspace.CurrentCamera
        local vp = cam and cam.ViewportSize or Vector2.new(1920, 1080)
        local fw, fh = f.AbsoluteSize.X, f.AbsoluteSize.Y
        local tx = math.clamp(mp.X + 16, 4, math.max(4, vp.X - fw - 4))
        local ty = math.clamp(mp.Y + 16, 4, math.max(4, vp.Y - fh - 4))
        f.Position = UDim2.new(0, tx, 0, ty)
    end)
end

-- ============================================================
-- ROLE SCANNER
-- ============================================================
local function findRoleRoot()
    if Cache.roleRoot and Cache.roleRoot.Parent then return Cache.roleRoot end
    local myChar = LocalPlayer.Character
    if myChar and myChar.Parent and myChar.Parent:IsA("Model") then
        Cache.roleRoot = myChar.Parent.Parent
        Cache.myRole = myChar.Parent
        return Cache.roleRoot
    end
    return nil
end
local function scanRoles()
    local root = findRoleRoot()
    if not root then Cache.playerRoles = {}; return end
    local myChar = LocalPlayer.Character
    local myRole = (myChar and myChar.Parent) or Cache.myRole
    local found = {}
    for _, roleContainer in ipairs(root:GetChildren()) do
        if roleContainer:IsA("Model") then
            for _, model in ipairs(roleContainer:GetChildren()) do
                if model:IsA("Model") then
                    local hum = model:FindFirstChildOfClass("Humanoid")
                    if hum and hum.Health > 0 then
                        found[model.Name] = {
                            char = model, role = roleContainer, hum = hum,
                            isMyTeam = (roleContainer == myRole),
                        }
                    end
                end
            end
        end
    end
    Cache.playerRoles = found
    Cache.myRole = myRole
end

local function isDroneModel(model)
    if not model or not model:IsA("Model") then return false end
    if model:FindFirstChildOfClass("Humanoid") then return false end
    return model:FindFirstChild("Rotators") ~= nil
        or model:FindFirstChild("explosive") ~= nil
        or model:FindFirstChild("Base") ~= nil
end
local function getDronePart(model)
    local r = model:FindFirstChild("Rotators")
    if r then
        local br = r:FindFirstChild("Rotator_BR") or r:FindFirstChild("Rotator_BL")
            or r:FindFirstChild("Rotator_FR") or r:FindFirstChild("Rotator_FL")
        if br then return br end
    end
    local ex = model:FindFirstChild("explosive")
    if ex then
        local e = ex:FindFirstChild("Explosive")
        if e then return e end
    end
    for _, c in ipairs(model:GetDescendants()) do
        if c:IsA("BasePart") then return c end
    end
    return nil
end
local function scanDrones()
    local root = findRoleRoot()
    if not root then Cache.drones = {}; return end
    local myChar = LocalPlayer.Character
    local myRole = (myChar and myChar.Parent) or Cache.myRole
    local drones = {}
    for _, roleContainer in ipairs(root:GetChildren()) do
        if roleContainer:IsA("Model") then
            local isMyTeam = (roleContainer == myRole)
            for _, model in ipairs(roleContainer:GetChildren()) do
                if model:IsA("Model") and isDroneModel(model) then
                    local part = getDronePart(model)
                    if part then
                        drones[model] = { model = model, part = part, isMyTeam = isMyTeam }
                    end
                end
            end
        end
    end
    Cache.drones = drones
    Cache.droneCount = 0
    for _ in pairs(drones) do Cache.droneCount = Cache.droneCount + 1 end
end

-- ============================================================
-- TARGETS
-- ============================================================
local function getRootPart(char)
    return char:FindFirstChild("HumanoidRootPart")
        or char:FindFirstChild("UpperTorso")
        or char:FindFirstChild("Torso")
        or char:FindFirstChild("Head")
        or char.PrimaryPart
end
local Targets = {}
function Targets.refresh()
    scanRoles()
    local new, newHum, newTeam = {}, {}, {}
    local myChar = LocalPlayer.Character
    Cache.myRoot = myChar and getRootPart(myChar)
    for _, plr in ipairs(Players2:GetPlayers()) do
        if plr ~= LocalPlayer then
            local entry = Cache.playerRoles[plr.Name]
            if entry then
                local char = entry.char
                local root = getRootPart(char)
                if root and entry.hum and entry.hum.Health > 0 then
                    new[root] = char
                    newHum[root] = entry.hum
                    newTeam[root] = entry.isMyTeam
                end
            end
        end
    end
    Cache.targets = new; Cache.humanoids = newHum; Cache.teamStatus = newTeam
    Cache.count = 0
    for _ in pairs(new) do Cache.count = Cache.count + 1 end
end

local Util = {}
function Util.getName(char)
    local plr = Players2:GetPlayerFromCharacter(char)
    return plr and plr.Name or char.Name
end

-- ============================================================
-- ESP
-- ============================================================
local ESP = { cache = {} }

local function makeLine(color, thickness)
    local f = Instance.new("Frame", ESPGui)
    f.BackgroundColor3 = color or Color3.new(1,1,1); f.BorderSizePixel = 0
    f.AnchorPoint = Vector2.new(0, 0.5)
    f.Size = UDim2.new(0, 0, 0, thickness or 1)
    f.ZIndex = 5; f.Visible = false
    return f
end
local function drawLine(line, x1, y1, x2, y2, color, thickness)
    thickness = thickness or 1
    local dx, dy = x2 - x1, y2 - y1
    local len = math.sqrt(dx*dx + dy*dy)
    if len < 1 then line.Visible = false; return end
    line.Position = UDim2.new(0, x1, 0, y1)
    line.Size = UDim2.new(0, len, 0, thickness)
    line.Rotation = math.deg(math.atan2(dy, dx))
    if color then line.BackgroundColor3 = color end
    line.Visible = true
end
local SKEL_R6 = {{"Head","Torso"},{"Torso","Left Arm"},{"Torso","Right Arm"},{"Torso","Left Leg"},{"Torso","Right Leg"}}
local SKEL_R15 = {
    {"Head","UpperTorso"},{"UpperTorso","LowerTorso"},
    {"UpperTorso","LeftUpperArm"},{"LeftUpperArm","LeftLowerArm"},{"LeftLowerArm","LeftHand"},
    {"UpperTorso","RightUpperArm"},{"RightUpperArm","RightLowerArm"},{"RightLowerArm","RightHand"},
    {"LowerTorso","LeftUpperLeg"},{"LeftUpperLeg","LeftLowerLeg"},{"LeftLowerLeg","LeftFoot"},
    {"LowerTorso","RightUpperLeg"},{"RightUpperLeg","RightLowerLeg"},{"RightLowerLeg","RightFoot"},
}
local function getSkel(char)
    if char:FindFirstChild("UpperTorso") and char:FindFirstChild("LowerTorso") then return SKEL_R15 end
    return SKEL_R6
end

function ESP.Create(root)
    if ESP.cache[root] then return end
    local box = Instance.new("Frame", ESPGui)
    box.BackgroundTransparency = 1; box.BorderSizePixel = 0; box.Visible = false; box.ZIndex = 3
    local boxStroke = Instance.new("UIStroke", box); boxStroke.Thickness = 2
    local name = Instance.new("TextLabel", ESPGui)
    name.BackgroundTransparency = 1; name.Font = Enum.Font.GothamBold
    name.TextSize = 13; name.TextColor3 = Color3.new(1,1,1)
    name.TextStrokeTransparency = 0; name.TextStrokeColor3 = Color3.new(0,0,0)
    name.Size = UDim2.new(0,220,0,16); name.TextXAlignment = Enum.TextXAlignment.Center
    name.Visible = false; name.ZIndex = 4
    local dist = Instance.new("TextLabel", ESPGui)
    dist.BackgroundTransparency = 1; dist.Font = Enum.Font.GothamMedium
    dist.TextSize = 11; dist.TextColor3 = Color3.fromRGB(220,220,220)
    dist.TextStrokeTransparency = 0; dist.TextStrokeColor3 = Color3.new(0,0,0)
    dist.Size = UDim2.new(0,220,0,14); dist.TextXAlignment = Enum.TextXAlignment.Center
    dist.Visible = false; dist.ZIndex = 4
    local hBg = Instance.new("Frame", ESPGui)
    hBg.BackgroundColor3 = getColor("C_HealthBg"); hBg.BorderSizePixel = 0; hBg.Visible = false; hBg.ZIndex = 3
    local hBar = Instance.new("Frame", ESPGui)
    hBar.BackgroundColor3 = getColor("C_HealthHigh"); hBar.BorderSizePixel = 0; hBar.Visible = false; hBar.ZIndex = 3
    local skel = {}
    for i = 1, 14 do skel[i] = makeLine(getColor("C_Skeleton"), 1) end
    ESP.cache[root] = { Box=box, BoxStroke=boxStroke, Name=name, Dist=dist,
        HealthBg=hBg, HealthBar=hBar, Skel=skel }
end
function ESP.Hide(esp)
    if not esp then return end
    for _, k in ipairs({"Box","Name","Dist","HealthBg","HealthBar"}) do
        if esp[k] then esp[k].Visible = false end
    end
    if esp.Skel then for _, l in ipairs(esp.Skel) do l.Visible = false end end
end
function ESP.Destroy(esp)
    if not esp then return end
    for _, k in ipairs({"Box","Name","Dist","HealthBg","HealthBar"}) do
        if esp[k] then pcall(function() esp[k]:Destroy() end) end
    end
    if esp.Skel then for _, l in ipairs(esp.Skel) do pcall(function() l:Destroy() end) end end
end
function ESP.Cleanup()
    local r = {}
    for root, e in pairs(ESP.cache) do
        if not Cache.targets[root] then ESP.Hide(e); ESP.Destroy(e); r[#r+1]=root end
    end
    for _, k in ipairs(r) do ESP.cache[k]=nil end
end

local function projectBounds(char, cam)
    local ok, cf, size = pcall(function() return char:GetBoundingBox() end)
    if not ok or not cf or not size then return nil end
    local hs = size * 0.5
    local corners = {
        cf * Vector3.new(-hs.X,-hs.Y,-hs.Z), cf * Vector3.new(-hs.X,-hs.Y, hs.Z),
        cf * Vector3.new(-hs.X, hs.Y,-hs.Z), cf * Vector3.new(-hs.X, hs.Y, hs.Z),
        cf * Vector3.new( hs.X,-hs.Y,-hs.Z), cf * Vector3.new( hs.X,-hs.Y, hs.Z),
        cf * Vector3.new( hs.X, hs.Y,-hs.Z), cf * Vector3.new( hs.X, hs.Y, hs.Z),
    }
    local minX, minY, maxX, maxY = math.huge, math.huge, -math.huge, -math.huge
    local any = false
    for _, c in ipairs(corners) do
        local sp = cam:WorldToViewportPoint(c)
        if sp.Z > 0 then
            any = true
            if sp.X < minX then minX = sp.X end
            if sp.X > maxX then maxX = sp.X end
            if sp.Y < minY then minY = sp.Y end
            if sp.Y > maxY then maxY = sp.Y end
        end
    end
    if not any or maxX - minX < 1 or maxY - minY < 1 then return nil end
    return minX, minY, maxX, maxY
end

function ESP.Render(esp, root, char, hum, cam, screenSize, screenCenter, dist, giY)
    local minX, minY, maxX, maxY = projectBounds(char, cam)
    if not minX then ESP.Hide(esp); return false end
    minY = minY + giY; maxY = maxY + giY
    local boxTop, boxBottom, boxLeft, boxRight = minY, maxY, minX, maxX
    local boxHeight = boxBottom - boxTop
    local boxWidth = boxRight - boxLeft
    local cx = (boxLeft + boxRight) * 0.5

    local isTeam = Cache.teamStatus[root] or false
    local col = isTeam and getColor("C_Team") or getColor("C_Enemy")

    if Config.ESP_Boxes and boxHeight > 4 and boxWidth > 4 then
        esp.Box.Position = UDim2.new(0, boxLeft, 0, boxTop)
        esp.Box.Size = UDim2.new(0, boxWidth, 0, boxHeight)
        esp.BoxStroke.Color = col
        esp.Box.Visible = true
    else esp.Box.Visible = false end

    if Config.ESP_Names then
        esp.Name.Text = Util.getName(char)
        esp.Name.Position = UDim2.new(0, cx - 110, 0, boxTop - Tuning.NameOffset)
        esp.Name.TextColor3 = col; esp.Name.Visible = true
    else esp.Name.Visible = false end

    if Config.ESP_Distance then
        esp.Dist.Text = string.format("%d m", math.floor(dist))
        esp.Dist.Position = UDim2.new(0, cx - 110, 0, boxBottom + Tuning.DistOffset)
        esp.Dist.TextColor3 = getColor("C_Distance")
        esp.Dist.Visible = true
    else esp.Dist.Visible = false end

    if Config.ESP_Health then
        local pct = math.clamp(hum.Health / math.max(hum.MaxHealth,1), 0, 1)
        local barX = boxLeft - Tuning.HealthBarOffset
        esp.HealthBg.Position = UDim2.new(0, barX - 1, 0, boxTop - 1)
        esp.HealthBg.Size = UDim2.new(0, Tuning.HealthBarWidth + 2, 0, boxHeight + 2)
        esp.HealthBg.BackgroundColor3 = getColor("C_HealthBg")
        esp.HealthBg.Visible = true
        local hh = boxHeight * pct
        esp.HealthBar.Position = UDim2.new(0, barX, 0, boxBottom - hh)
        esp.HealthBar.Size = UDim2.new(0, Tuning.HealthBarWidth, 0, hh)
        esp.HealthBar.BackgroundColor3 = pct > 0.6 and getColor("C_HealthHigh")
            or pct > 0.3 and getColor("C_HealthMid")
            or getColor("C_HealthLow")
        esp.HealthBar.Visible = true
    else esp.HealthBg.Visible = false; esp.HealthBar.Visible = false end

    if Config.ESP_Skeleton then
        local pairs_ = getSkel(char)
        local idx = 0
        for i, b in ipairs(pairs_) do
            if i > #esp.Skel then break end
            idx = i
            local p1, p2 = char:FindFirstChild(b[1]), char:FindFirstChild(b[2])
            if p1 and p2 then
                local s1, o1 = cam:WorldToViewportPoint(p1.Position)
                local s2, o2 = cam:WorldToViewportPoint(p2.Position)
                if o1 and o2 and s1.Z > 0 and s2.Z > 0 then
                    drawLine(esp.Skel[i], s1.X, s1.Y + giY, s2.X, s2.Y + giY, getColor("C_Skeleton"), 1)
                else esp.Skel[i].Visible = false end
            else esp.Skel[i].Visible = false end
        end
        for i = idx + 1, #esp.Skel do esp.Skel[i].Visible = false end
    else for _, l in ipairs(esp.Skel) do l.Visible = false end end
    return true
end

function ESP.Step(cam, screenSize, screenCenter)
    if not Config.ESP_Enabled then
        for _, e in pairs(ESP.cache) do ESP.Hide(e) end
        Cache.drawn = 0; return
    end
    ESP.Cleanup()
    local myRoot = Cache.myRoot
    local giY = -GuiService:GetGuiInset().Y
    local drawn = 0
    for root, char in pairs(Cache.targets) do
        if not root or not root.Parent or not char or not char.Parent then
            if ESP.cache[root] then ESP.Hide(ESP.cache[root]) end
        else
            local hum = Cache.humanoids[root]
            if not hum or not hum.Parent or hum.Health <= 0 then
                if ESP.cache[root] then ESP.Hide(ESP.cache[root]) end
            elseif Config.ESP_TeamCheck and Cache.teamStatus[root] then
                if ESP.cache[root] then ESP.Hide(ESP.cache[root]) end
            else
                if not ESP.cache[root] then ESP.Create(root) end
                local esp = ESP.cache[root]
                local dist = myRoot and (root.Position - myRoot.Position).Magnitude or 0
                if dist > Config.ESP_MaxDist then ESP.Hide(esp)
                else
                    local ok, res = pcall(ESP.Render, esp, root, char, hum, cam, screenSize, screenCenter, dist, giY)
                    if ok and res then drawn = drawn + 1 end
                end
            end
        end
    end
    Cache.drawn = drawn
end

-- ============================================================
-- DRONE ESP
-- ============================================================
local DroneESP = { cache = {} }

function DroneESP.Create(model)
    if DroneESP.cache[model] then return end
    local box = Instance.new("Frame", ESPGui)
    box.BackgroundTransparency = 1; box.BorderSizePixel = 0; box.Visible = false; box.ZIndex = 3
    local boxStroke = Instance.new("UIStroke", box); boxStroke.Thickness = 2
    local name = Instance.new("TextLabel", ESPGui)
    name.BackgroundTransparency = 1; name.Font = Enum.Font.GothamBold
    name.TextSize = 12; name.TextColor3 = Color3.new(1,1,1)
    name.TextStrokeTransparency = 0; name.TextStrokeColor3 = Color3.new(0,0,0)
    name.Size = UDim2.new(0,150,0,16); name.TextXAlignment = Enum.TextXAlignment.Center
    name.Text = "[FPV]"; name.Visible = false; name.ZIndex = 4
    local dist = Instance.new("TextLabel", ESPGui)
    dist.BackgroundTransparency = 1; dist.Font = Enum.Font.GothamMedium
    dist.TextSize = 10; dist.TextColor3 = Color3.fromRGB(220,220,220)
    dist.TextStrokeTransparency = 0; dist.TextStrokeColor3 = Color3.new(0,0,0)
    dist.Size = UDim2.new(0,100,0,14); dist.TextXAlignment = Enum.TextXAlignment.Center
    dist.Visible = false; dist.ZIndex = 4
    DroneESP.cache[model] = { Box=box, BoxStroke=boxStroke, Name=name, Dist=dist }
end
function DroneESP.Hide(esp)
    if not esp then return end
    for _, k in ipairs({"Box","Name","Dist"}) do
        if esp[k] then esp[k].Visible = false end
    end
end
function DroneESP.Destroy(esp)
    if not esp then return end
    for _, k in ipairs({"Box","Name","Dist"}) do
        if esp[k] then pcall(function() esp[k]:Destroy() end) end
    end
end
function DroneESP.Cleanup()
    local r = {}
    for m, e in pairs(DroneESP.cache) do
        if not Cache.drones[m] then DroneESP.Hide(e); DroneESP.Destroy(e); r[#r+1]=m end
    end
    for _, k in ipairs(r) do DroneESP.cache[k]=nil end
end
function DroneESP.Step(cam, screenSize, screenCenter)
    if not Config.ESP_Enabled or not Config.ESP_Drones then
        for _, e in pairs(DroneESP.cache) do DroneESP.Hide(e) end
        Cache.droneDrawn = 0
        return
    end
    DroneESP.Cleanup()
    local myRoot = Cache.myRoot
    local giY = -GuiService:GetGuiInset().Y
    local drawn = 0
    for model, info in pairs(Cache.drones) do
        if not model.Parent or not info.part or not info.part.Parent then
            if DroneESP.cache[model] then DroneESP.Hide(DroneESP.cache[model]) end
        elseif Config.ESP_DronesTeamCheck and info.isMyTeam then
            if DroneESP.cache[model] then DroneESP.Hide(DroneESP.cache[model]) end
        else
            if not DroneESP.cache[model] then DroneESP.Create(model) end
            local esp = DroneESP.cache[model]
            local pos = info.part.Position
            local dist = myRoot and (pos - myRoot.Position).Magnitude or 0
            if dist > Config.ESP_MaxDist then
                DroneESP.Hide(esp)
            else
                local sp, on = cam:WorldToViewportPoint(pos)
                if on and sp.Z > 0 then
                    local size = math.clamp(1000 / sp.Z, 18, 100)
                    local x = sp.X - size/2
                    local y = sp.Y - size/2 + giY
                    esp.Box.Position = UDim2.new(0, x, 0, y)
                    esp.Box.Size = UDim2.new(0, size, 0, size)
                    esp.BoxStroke.Color = info.isMyTeam and getColor("C_DroneTeam") or getColor("C_DroneEnemy")
                    esp.Box.Visible = true
                    esp.Name.Position = UDim2.new(0, sp.X - 75, 0, y - 16)
                    esp.Name.TextColor3 = info.isMyTeam and getColor("C_DroneTeam") or getColor("C_DroneEnemy")
                    esp.Name.Visible = true
                    esp.Dist.Position = UDim2.new(0, sp.X - 50, 0, y + size + 2)
                    esp.Dist.Text = string.format("%d m", math.floor(dist))
                    esp.Dist.Visible = true
                    drawn = drawn + 1
                else
                    DroneESP.Hide(esp)
                end
            end
        end
    end
    Cache.droneDrawn = drawn
end

-- ============================================================
-- RADAR
-- ============================================================
local RadarFrame = Instance.new("Frame", UI)
RadarFrame.BackgroundColor3 = getColor("C_RadarBg"); RadarFrame.BackgroundTransparency = 0.2
RadarFrame.BorderSizePixel = 0; RadarFrame.AnchorPoint = Vector2.new(1, 0)
Instance.new("UICorner", RadarFrame).CornerRadius = UDim.new(0, 6)
local RStroke = Instance.new("UIStroke", RadarFrame)
RStroke.Color = getColor("C_RadarBorder"); RStroke.Thickness = 1; RStroke.Transparency = 0.4
local RadarCenter = Instance.new("Frame", RadarFrame)
RadarCenter.BackgroundColor3 = getColor("C_RadarYou"); RadarCenter.BorderSizePixel = 0
RadarCenter.AnchorPoint = Vector2.new(0.5, 0.5); RadarCenter.Size = UDim2.new(0, 8, 0, 8)
Instance.new("UICorner", RadarCenter).CornerRadius = UDim.new(1, 0)
local radarDots = {}
for i = 1, 50 do
    local d = Instance.new("Frame", RadarFrame)
    d.BackgroundColor3 = getColor("C_RadarEnemy"); d.BorderSizePixel = 0
    d.AnchorPoint = Vector2.new(0.5, 0.5)
    d.Size = UDim2.new(0, Tuning.RadarDotSize, 0, Tuning.RadarDotSize); d.Visible = false
    Instance.new("UICorner", d).CornerRadius = UDim.new(1, 0)
    radarDots[i] = d
end
local function UpdateRadar(cam)
    if not Config.RADAR_Enabled then RadarFrame.Visible = false; return end
    local myRoot = Cache.myRoot
    if not myRoot or not myRoot.Parent then RadarFrame.Visible = false; return end
    local size = Config.RADAR_Size
    RadarFrame.Position = UDim2.new(1, -14, 0, 14)
    RadarFrame.Size = UDim2.new(0, size, 0, size); RadarFrame.Visible = true
    RadarCenter.Position = UDim2.new(0.5, 0, 0.5, 0)
    local myLook = cam.CFrame.LookVector
    local ang = math.atan2(-myLook.X, -myLook.Z)
    local ca, sa = math.cos(ang), math.sin(ang)
    local scale = (size/2 - 10) / Tuning.RadarRange
    local idx = 1
    for root in pairs(Cache.targets) do
        if idx > #radarDots then break end
        if root and root.Parent then
            local isTeam = Cache.teamStatus[root]
            if not (Config.ESP_TeamCheck and isTeam) then
                local rx, rz = root.Position.X - myRoot.Position.X, root.Position.Z - myRoot.Position.Z
                local d2 = math.sqrt(rx^2 + rz^2)
                if d2 < Tuning.RadarRange then
                    local rotX = rx * ca - rz * sa
                    local rotZ = rx * sa + rz * ca
                    local rX, rY = rotX * scale, rotZ * scale
                    local maxD = size/2 - 8
                    local rD = math.sqrt(rX^2 + rY^2)
                    if rD > maxD then rX, rY = rX/rD*maxD, rY/rD*maxD end
                    radarDots[idx].Position = UDim2.new(0.5, rX, 0.5, rY)
                    radarDots[idx].BackgroundColor3 = isTeam and getColor("C_Team") or getColor("C_RadarEnemy")
                    radarDots[idx].Visible = true; idx = idx + 1
                end
            end
        end
    end
    for i = idx, #radarDots do radarDots[i].Visible = false end
end

-- ============================================================
-- AIMBOT
-- ============================================================
local Aim = { aiming=false, locked=nil }
Conn.mb2down = Mouse.Button2Down:Connect(function() Aim.aiming=true end)
Conn.mb2up = Mouse.Button2Up:Connect(function() Aim.aiming=false; Aim.locked=nil end)
local function wantsAim()
    local k = Config.AIM_AimKey
    if k == "Always" then return true end
    if k == "RMB" then return Aim.aiming or UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) end
    if k == "LMB" then return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) end
    return false
end
local function getBest(cam)
    local center = Vector2.new(cam.ViewportSize.X/2, cam.ViewportSize.Y/2)
    local best, bestScore = nil, math.huge
    for root, char in pairs(Cache.targets) do
        if root and root.Parent and char then
            local skip = false
            if Config.AIM_TeamCheck and Cache.teamStatus[root] then skip = true end
            if not skip then
                local head = char:FindFirstChild("Head") or root
                local sp, on = cam:WorldToViewportPoint(head.Position)
                if on and sp.Z > 0 then
                    local d = (Vector2.new(sp.X, sp.Y) - center).Magnitude
                    if d <= Config.AIM_FOV and d < bestScore then bestScore = d; best = char end
                end
            end
        end
    end
    return best
end
local function getAimPos(char, cam)
    local bone = Config.AIM_TargetBone
    if bone == "Head" or bone == "Torso" or bone == "HumanoidRootPart" then
        local p = char:FindFirstChild(bone); return p and p.Position
    end
    local p = char:FindFirstChild("Head") or char:FindFirstChild("Torso")
    return p and p.Position
end
local FOVCircle = Instance.new("Frame", UI)
FOVCircle.BackgroundTransparency = 1; FOVCircle.BorderSizePixel = 0
FOVCircle.AnchorPoint = Vector2.new(0.5, 0.5); FOVCircle.ZIndex = 5
local FOVS = Instance.new("UIStroke", FOVCircle)
FOVS.Color = getColor("C_FOVCircle"); FOVS.Thickness = 1
Instance.new("UICorner", FOVCircle).CornerRadius = UDim.new(1, 0)

local lastAimWarn = 0
task.spawn(function()
    while not Unloaded do
        RunService.RenderStepped:Wait()
        if Config.AIM_Enabled then
            local cam = Workspace.CurrentCamera
            if cam then
                local ok, err = pcall(function()
                    if not wantsAim() then Aim.locked=nil; return end
                    if not Aim.locked or not Aim.locked.Parent then Aim.locked = getBest(cam) end
                    if not Aim.locked then return end
                    local hum = Aim.locked:FindFirstChild("Humanoid")
                    if not hum or hum.Health <= 0 then Aim.locked=nil; return end
                    local pos = getAimPos(Aim.locked, cam)
                    if not pos then return end
                    local sp, on = cam:WorldToViewportPoint(pos)
                    if not on or sp.Z <= 0 then return end
                    local dx = sp.X - cam.ViewportSize.X/2
                    local dy = sp.Y - cam.ViewportSize.Y/2
                    if math.abs(dx) < 0.5 and math.abs(dy) < 0.5 then return end
                    local sm = Config.AIM_Smooth
                    if Config.AIM_DynamicSmooth then
                        local d3 = (pos - cam.CFrame.Position).Magnitude
                        sm = math.clamp(Config.AIM_Smooth * math.min(d3/500, 1), 1, Config.AIM_Smooth)
                    end
                    local mx, my
                    if sm <= 1 then mx, my = dx, dy else mx, my = dx/sm, dy/sm end
                    mx = mx + (math.random() - 0.5) * 0.6
                    my = my + (math.random() - 0.5) * 0.6
                    pcall(mousemoverel, mx, my)
                end)
                if not ok and tick() - lastAimWarn > 3 then
                    lastAimWarn = tick(); warn("[MORTY AIM]", err)
                end
            end
        end
    end
end)

-- ============================================================
-- SPEED / JUMP
-- ============================================================
local Speed = { active=false, sw=nil, sj=nil, sjh=nil }
local function speedStep()
    local char = LocalPlayer.Character; if not char then return end
    local hum = char:FindFirstChildOfClass("Humanoid"); if not hum then return end
    local wantS, wantJ = Config.SPEED_Enabled, Config.JUMP_Enabled
    if (wantS or wantJ) and not Speed.active then
        Speed.active = true
        Speed.sw = hum.WalkSpeed
        Speed.sj = hum.UseJumpPower and hum.JumpPower or nil
        Speed.sjh = (not hum.UseJumpPower) and hum.JumpHeight or nil
    end
    if wantS then
        local v = math.clamp(math.floor(Config.SPEED_Value), 1, 250)
        local cur = hum.WalkSpeed
        if cur < v then hum.WalkSpeed = math.min(cur + Tuning.SpeedStepPerFrame, v)
        elseif cur > v then hum.WalkSpeed = math.max(cur - Tuning.SpeedStepPerFrame, v) end
    end
    if wantJ then
        local v = math.clamp(math.floor(Config.JUMP_Value), 30, 300)
        if hum.UseJumpPower then
            local cur = hum.JumpPower
            if cur < v then hum.JumpPower = math.min(cur + Tuning.SpeedStepPerFrame, v)
            elseif cur > v then hum.JumpPower = math.max(cur - Tuning.SpeedStepPerFrame, v) end
        else
            local jh = v * 0.15
            local cur = hum.JumpHeight
            local step = Tuning.SpeedStepPerFrame * 0.15
            if cur < jh then hum.JumpHeight = math.min(cur + step, jh)
            elseif cur > jh then hum.JumpHeight = math.max(cur - step, jh) end
        end
    end
    if not wantS and not wantJ and Speed.active then
        Speed.active = false
        if Speed.sw then hum.WalkSpeed = Speed.sw end
        if Speed.sj and hum.UseJumpPower then hum.JumpPower = Speed.sj end
        if Speed.sjh and not hum.UseJumpPower then hum.JumpHeight = Speed.sjh end
        Speed.sw=nil; Speed.sj=nil; Speed.sjh=nil
    end
end

-- ============================================================
-- FREECAM
-- ============================================================
local FC = { enabled=false, savedCT=nil, savedSub=nil, savedFOV=nil,
    rot=Vector2.zero, pos=Vector3.zero, inputs={} }
Conn.fcKeyDown = UserInputService.InputBegan:Connect(function(i)
    if not FC.enabled then return end
    if i.UserInputType ~= Enum.UserInputType.Keyboard then return end
    FC.inputs[i.KeyCode] = true
end)
Conn.fcKeyUp = UserInputService.InputEnded:Connect(function(i)
    if not FC.enabled then return end
    if i.UserInputType ~= Enum.UserInputType.Keyboard then return end
    FC.inputs[i.KeyCode] = false
end)
Conn.fcMouse = UserInputService.InputChanged:Connect(function(i)
    if not FC.enabled then return end
    if i.UserInputType == Enum.UserInputType.MouseMovement then
        local s = Config.FREECAM_Sensitivity * 0.0025
        FC.rot = Vector2.new(FC.rot.X - i.Delta.X * s,
            math.clamp(FC.rot.Y - i.Delta.Y * s, -math.rad(89), math.rad(89)))
    end
end)
local function freecamTick(dt)
    if Config.FREECAM_Enabled ~= FC.enabled then
        local cam = Workspace.CurrentCamera
        if Config.FREECAM_Enabled then
            if cam then
                FC.enabled = true
                FC.savedCT = cam.CameraType; FC.savedSub = cam.CameraSubject; FC.savedFOV = cam.FieldOfView
                FC.pos = cam.CFrame.Position
                local lk = cam.CFrame.LookVector
                FC.rot = Vector2.new(math.atan2(-lk.X, -lk.Z), math.asin(math.clamp(lk.Y, -1, 1)))
                FC.inputs = {}
                cam.CameraType = Enum.CameraType.Scriptable
            end
        else
            FC.enabled = false
            if cam then
                cam.CameraType = FC.savedCT or Enum.CameraType.Custom
                if FC.savedSub then cam.CameraSubject = FC.savedSub end
                if FC.savedFOV then cam.FieldOfView = FC.savedFOV end
            end
        end
    end
    if not FC.enabled then return end
    local cam = Workspace.CurrentCamera; if not cam then return end
    local rot = CFrame.fromEulerAnglesYXZ(FC.rot.Y, FC.rot.X, 0)
    local speed = Config.FREECAM_Speed
    if FC.inputs[Enum.KeyCode.LeftShift] then speed = speed * 3 end
    if FC.inputs[Enum.KeyCode.LeftControl] then speed = speed * 0.25 end
    local fwd, right = rot.LookVector, rot.RightVector
    local move = Vector3.zero
    if FC.inputs[Enum.KeyCode.W] then move = move + fwd end
    if FC.inputs[Enum.KeyCode.S] then move = move - fwd end
    if FC.inputs[Enum.KeyCode.D] then move = move + right end
    if FC.inputs[Enum.KeyCode.A] then move = move - right end
    if FC.inputs[Enum.KeyCode.Space] or FC.inputs[Enum.KeyCode.E] then move = move + Vector3.new(0,1,0) end
    if FC.inputs[Enum.KeyCode.Q] then move = move - Vector3.new(0,1,0) end
    if move.Magnitude > 0 then FC.pos = FC.pos + move.Unit * speed * dt end
    cam.CFrame = CFrame.new(FC.pos) * rot
end

-- ============================================================
-- COLOR PICKER
-- ============================================================
local ColorPicker = { frame=nil, conns={} }
function ColorPicker.Close()
    for _, c in ipairs(ColorPicker.conns) do pcall(function() c:Disconnect() end) end
    ColorPicker.conns = {}
    if ColorPicker.frame then pcall(function() ColorPicker.frame:Destroy() end); ColorPicker.frame=nil end
end
function ColorPicker.Open(key)
    ColorPicker.Close()
    local startCol = getColor(key)
    local h, s, v = Color3.toHSV(startCol)
    local W, H = 340, 260
    local f = Instance.new("Frame", UI)
    f.BackgroundColor3 = Color3.fromRGB(10,10,12); f.BorderSizePixel = 0
    f.Size = UDim2.new(0, W, 0, H); f.Position = UDim2.new(0.5, -W/2, 0.5, -H/2)
    f.ZIndex = 1100; f.Active = true
    Instance.new("UICorner", f).CornerRadius = UDim.new(0, 8)
    local st = Instance.new("UIStroke", f); st.Color = getColor("C_Accent"); st.Thickness = 1
    ColorPicker.frame = f

    local title = Instance.new("TextLabel", f)
    title.BackgroundTransparency = 1
    title.Position = UDim2.new(0, 12, 0, 8); title.Size = UDim2.new(1, -24, 0, 20)
    title.Font = Enum.Font.GothamBold; title.TextSize = 13
    title.TextColor3 = getColor("C_Accent"); title.TextXAlignment = Enum.TextXAlignment.Left
    title.Text = tItem(key, key); title.ZIndex = 1101

    local prev = Instance.new("Frame", f)
    prev.BackgroundColor3 = startCol; prev.BorderSizePixel = 0
    prev.Position = UDim2.new(0, 12, 0, 34); prev.Size = UDim2.new(0, 40, 0, 30)
    Instance.new("UICorner", prev).CornerRadius = UDim.new(0, 5); prev.ZIndex = 1101

    local hueSlider = Instance.new("Frame", f)
    hueSlider.BackgroundColor3 = Color3.new(1,1,1); hueSlider.BorderSizePixel = 0
    hueSlider.Position = UDim2.new(0, 60, 0, 34); hueSlider.Size = UDim2.new(1, -72, 0, 30)
    Instance.new("UICorner", hueSlider).CornerRadius = UDim.new(0, 5)
    hueSlider.ClipsDescendants = true; hueSlider.ZIndex = 1101
    local hg = Instance.new("UIGradient", hueSlider); hg.Rotation = 0
    hg.Color = ColorSequence.new({
        ColorSequenceKeypoint.new(0.00, Color3.fromRGB(255,0,0)),
        ColorSequenceKeypoint.new(0.17, Color3.fromRGB(255,255,0)),
        ColorSequenceKeypoint.new(0.33, Color3.fromRGB(0,255,0)),
        ColorSequenceKeypoint.new(0.50, Color3.fromRGB(0,255,255)),
        ColorSequenceKeypoint.new(0.67, Color3.fromRGB(0,0,255)),
        ColorSequenceKeypoint.new(0.83, Color3.fromRGB(255,0,255)),
        ColorSequenceKeypoint.new(1.00, Color3.fromRGB(255,0,0))
    })
    local hueCursor = Instance.new("Frame", hueSlider)
    hueCursor.BackgroundColor3 = Color3.new(1,1,1); hueCursor.BorderSizePixel = 0
    hueCursor.AnchorPoint = Vector2.new(0.5, 0.5)
    hueCursor.Size = UDim2.new(0, 4, 1, 0); hueCursor.ZIndex = 1110
    hueCursor.Position = UDim2.new(h, 0, 0.5, 0)

    local svCanvas = Instance.new("Frame", f)
    svCanvas.BackgroundColor3 = Color3.fromHSV(h, 1, 1); svCanvas.BorderSizePixel = 0
    svCanvas.Position = UDim2.new(0, 12, 0, 74); svCanvas.Size = UDim2.new(0, 300, 0, 130)
    Instance.new("UICorner", svCanvas).CornerRadius = UDim.new(0, 5)
    svCanvas.ClipsDescendants = true; svCanvas.ZIndex = 1101
    local gw = Instance.new("Frame", svCanvas)
    gw.BackgroundColor3 = Color3.new(1,1,1); gw.BorderSizePixel = 0
    gw.Size = UDim2.new(1, 0, 1, 0); gw.ZIndex = 1102
    local gwg = Instance.new("UIGradient", gw)
    gwg.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,0), NumberSequenceKeypoint.new(1,1)})
    local gb = Instance.new("Frame", svCanvas)
    gb.BackgroundColor3 = Color3.new(0,0,0); gb.BorderSizePixel = 0
    gb.Size = UDim2.new(1, 0, 1, 0); gb.ZIndex = 1103
    local gbg = Instance.new("UIGradient", gb); gbg.Rotation = 90
    gbg.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,1), NumberSequenceKeypoint.new(1,0)})
    local svCursor = Instance.new("Frame", svCanvas)
    svCursor.BackgroundTransparency = 1; svCursor.AnchorPoint = Vector2.new(0.5, 0.5)
    svCursor.Size = UDim2.new(0, 12, 0, 12); svCursor.ZIndex = 1110
    local svcStroke = Instance.new("UIStroke", svCursor); svcStroke.Color = Color3.new(1,1,1); svcStroke.Thickness = 2
    Instance.new("UICorner", svCursor).CornerRadius = UDim.new(1, 0)
    svCursor.Position = UDim2.new(s, 0, 1 - v, 0)

    local curH, curS, curV = h, s, v
    local function sync()
        prev.BackgroundColor3 = Color3.fromHSV(curH, curS, curV)
        svCanvas.BackgroundColor3 = Color3.fromHSV(curH, 1, 1)
        svCursor.Position = UDim2.new(curS, 0, 1 - curV, 0)
        hueCursor.Position = UDim2.new(curH, 0, 0.5, 0)
    end
    sync()

    local applyBtn = Instance.new("TextButton", f)
    applyBtn.BackgroundColor3 = getColor("C_Accent"); applyBtn.BorderSizePixel = 0
    applyBtn.Position = UDim2.new(0, 12, 1, -46); applyBtn.Size = UDim2.new(0.5, -18, 0, 32)
    applyBtn.Font = Enum.Font.GothamBold; applyBtn.TextSize = 12
    applyBtn.TextColor3 = Color3.new(0,0,0); applyBtn.Text = "OK"; applyBtn.ZIndex = 1101
    Instance.new("UICorner", applyBtn).CornerRadius = UDim.new(0, 5)
    local cancelBtn = Instance.new("TextButton", f)
    cancelBtn.BackgroundColor3 = Color3.fromRGB(24,24,28); cancelBtn.BorderSizePixel = 0
    cancelBtn.Position = UDim2.new(0.5, 4, 1, -46); cancelBtn.Size = UDim2.new(0.5, -18, 0, 32)
    cancelBtn.Font = Enum.Font.GothamBold; cancelBtn.TextSize = 12
    cancelBtn.TextColor3 = Color3.fromRGB(200,200,200); cancelBtn.Text = "X"; cancelBtn.ZIndex = 1101
    Instance.new("UICorner", cancelBtn).CornerRadius = UDim.new(0, 5)

    local svDrag = false
    svCanvas.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then svDrag = true end
    end)
    table.insert(ColorPicker.conns, UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then svDrag = false end
    end))
    local svConn = RunService.RenderStepped:Connect(function()
        if not f.Parent then svConn:Disconnect(); return end
        if svDrag then
            local mp = UserInputService:GetMouseLocation()
            local ap = svCanvas.AbsolutePosition; local asz = svCanvas.AbsoluteSize
            if asz.X <= 0 or asz.Y <= 0 then return end
            curS = math.clamp((mp.X - ap.X)/asz.X, 0, 1)
            curV = 1 - math.clamp((mp.Y - ap.Y)/asz.Y, 0, 1)
            sync()
        end
    end)
    table.insert(ColorPicker.conns, svConn)

    local hDrag = false
    hueSlider.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then hDrag = true end
    end)
    table.insert(ColorPicker.conns, UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then hDrag = false end
    end))
    local hConn = RunService.RenderStepped:Connect(function()
        if not f.Parent then hConn:Disconnect(); return end
        if hDrag then
            local mp = UserInputService:GetMouseLocation()
            local ap = hueSlider.AbsolutePosition; local asz = hueSlider.AbsoluteSize
            if asz.X <= 0 then return end
            curH = math.clamp((mp.X - ap.X)/asz.X, 0, 1)
            sync()
        end
    end)
    table.insert(ColorPicker.conns, hConn)

    applyBtn.MouseButton1Click:Connect(function()
        setColor(key, Color3.fromHSV(curH, curS, curV))
        ColorPicker.Close()
    end)
    cancelBtn.MouseButton1Click:Connect(function() ColorPicker.Close() end)
end

-- ============================================================
-- BIND EDITOR
-- ============================================================
local BindEditor = { frame=nil, targetKey=nil, mode="Toggle", pendingKey=nil, conn=nil }
function BindEditor.Close()
    if BindEditor.conn then pcall(function() BindEditor.conn:Disconnect() end); BindEditor.conn=nil end
    if BindEditor.frame then pcall(function() BindEditor.frame:Destroy() end); BindEditor.frame=nil end
    BindEditor.targetKey = nil; BindEditor.pendingKey = nil
end
function BindEditor.Open(configKey, displayName)
    BindEditor.Close()
    local existing = Binds[configKey]
    BindEditor.targetKey = configKey
    BindEditor.mode = existing and existing.mode or "Toggle"
    BindEditor.pendingKey = existing and existing.key or nil

    local frame = Instance.new("Frame", UI)
    frame.BackgroundColor3 = Color3.fromRGB(10,10,12); frame.BorderSizePixel = 0
    frame.Size = UDim2.new(0, 300, 0, 210)
    frame.Position = UDim2.new(0.5, -150, 0.5, -105); frame.ZIndex = 999
    BindEditor.frame = frame
    Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 8)
    local stroke = Instance.new("UIStroke", frame)
    stroke.Color = getColor("C_Accent"); stroke.Thickness = 1

    local title = Instance.new("TextLabel", frame)
    title.BackgroundTransparency = 1
    title.Position = UDim2.new(0, 14, 0, 12); title.Size = UDim2.new(1, -28, 0, 20)
    title.Font = Enum.Font.GothamBold; title.TextSize = 13
    title.TextColor3 = getColor("C_Accent"); title.TextXAlignment = Enum.TextXAlignment.Left
    title.Text = t("bind_title") .. displayName; title.ZIndex = 1000

    local hint = Instance.new("TextLabel", frame)
    hint.BackgroundTransparency = 1
    hint.Position = UDim2.new(0, 14, 0, 38); hint.Size = UDim2.new(1, -28, 0, 24)
    hint.Font = Enum.Font.GothamMedium; hint.TextSize = 12
    hint.TextColor3 = BindEditor.pendingKey and getColor("C_Accent") or Color3.fromRGB(130,130,140)
    hint.TextXAlignment = Enum.TextXAlignment.Center
    hint.Text = BindEditor.pendingKey and (t("bind_key") .. BindEditor.pendingKey.Name) or t("bind_hint")
    hint.ZIndex = 1000

    local modeFrame = Instance.new("Frame", frame)
    modeFrame.BackgroundTransparency = 1
    modeFrame.Position = UDim2.new(0, 14, 0, 70); modeFrame.Size = UDim2.new(1, -28, 0, 30); modeFrame.ZIndex = 1000
    local togBtn = Instance.new("TextButton", modeFrame)
    togBtn.BackgroundColor3 = BindEditor.mode == "Toggle" and getColor("C_Accent") or Color3.fromRGB(24,24,28)
    togBtn.BorderSizePixel = 0; togBtn.Size = UDim2.new(0.5, -3, 1, 0)
    togBtn.Font = Enum.Font.GothamBold; togBtn.TextSize = 12
    togBtn.TextColor3 = BindEditor.mode == "Toggle" and Color3.new(0,0,0) or Color3.fromRGB(240,240,245)
    togBtn.Text = t("bind_toggle"); togBtn.AutoButtonColor = false; togBtn.ZIndex = 1000
    Instance.new("UICorner", togBtn).CornerRadius = UDim.new(0, 5)
    local holdBtn = Instance.new("TextButton", modeFrame)
    holdBtn.BackgroundColor3 = BindEditor.mode == "Hold" and getColor("C_Accent") or Color3.fromRGB(24,24,28)
    holdBtn.BorderSizePixel = 0; holdBtn.Position = UDim2.new(0.5, 3, 0, 0); holdBtn.Size = UDim2.new(0.5, -3, 1, 0)
    holdBtn.Font = Enum.Font.GothamBold; holdBtn.TextSize = 12
    holdBtn.TextColor3 = BindEditor.mode == "Hold" and Color3.new(0,0,0) or Color3.fromRGB(240,240,245)
    holdBtn.Text = t("bind_hold"); holdBtn.AutoButtonColor = false; holdBtn.ZIndex = 1000
    Instance.new("UICorner", holdBtn).CornerRadius = UDim.new(0, 5)
    togBtn.MouseButton1Click:Connect(function()
        BindEditor.mode = "Toggle"
        togBtn.BackgroundColor3 = getColor("C_Accent"); togBtn.TextColor3 = Color3.new(0,0,0)
        holdBtn.BackgroundColor3 = Color3.fromRGB(24,24,28); holdBtn.TextColor3 = Color3.fromRGB(240,240,245)
    end)
    holdBtn.MouseButton1Click:Connect(function()
        BindEditor.mode = "Hold"
        holdBtn.BackgroundColor3 = getColor("C_Accent"); holdBtn.TextColor3 = Color3.new(0,0,0)
        togBtn.BackgroundColor3 = Color3.fromRGB(24,24,28); togBtn.TextColor3 = Color3.fromRGB(240,240,245)
    end)

    local actFrame = Instance.new("Frame", frame)
    actFrame.BackgroundTransparency = 1
    actFrame.Position = UDim2.new(0, 14, 1, -40); actFrame.Size = UDim2.new(1, -28, 0, 28); actFrame.ZIndex = 1000
    local function mkBtn(txt, xPos, bg, fg, cb)
        local b = Instance.new("TextButton", actFrame)
        b.BackgroundColor3 = bg; b.BorderSizePixel = 0
        b.Position = UDim2.new(xPos, 0, 0, 0); b.Size = UDim2.new(0.33, -3, 1, 0)
        b.Font = Enum.Font.GothamBold; b.TextSize = 11; b.TextColor3 = fg; b.Text = txt
        b.AutoButtonColor = false; b.ZIndex = 1000
        Instance.new("UICorner", b).CornerRadius = UDim.new(0, 5)
        b.MouseButton1Click:Connect(cb)
        return b
    end
    mkBtn(t("bind_clear"), 0, Color3.fromRGB(60,25,25), Color3.fromRGB(255,180,180), function()
        Binds[BindEditor.targetKey] = nil
        HoldActive[BindEditor.targetKey] = nil
        if GUI then GUI.RefreshItemVisual(BindEditor.targetKey) end
        BindEditor.Close()
    end)
    mkBtn(t("bind_save"), 0.34, getColor("C_Accent"), Color3.new(0,0,0), function()
        if not BindEditor.pendingKey then return end
        Binds[BindEditor.targetKey] = { key = BindEditor.pendingKey, mode = BindEditor.mode }
        if GUI then GUI.RefreshItemVisual(BindEditor.targetKey) end
        BindEditor.Close()
    end)
    mkBtn(t("bind_cancel"), 0.67, Color3.fromRGB(24,24,28), Color3.fromRGB(240,240,245), function()
        BindEditor.Close()
    end)

    BindEditor.conn = UserInputService.InputBegan:Connect(function(input)
        if not BindEditor.frame then return end
        if input.UserInputType ~= Enum.UserInputType.Keyboard then return end
        if input.KeyCode == Enum.KeyCode.Unknown then return end
        if input.KeyCode == Enum.KeyCode.Escape then BindEditor.Close(); return end
        if input.KeyCode == Enum.KeyCode.Insert or input.KeyCode == Enum.KeyCode.Home then return end
        BindEditor.pendingKey = input.KeyCode
        hint.Text = t("bind_key") .. input.KeyCode.Name
        hint.TextColor3 = getColor("C_Accent")
    end)
end

-- ============================================================
-- МЕНЮ
-- ============================================================
local Tabs = {
    { id="Aim", icon="*", langKey="tab_aim" },
    { id="Wallhack", icon="o", langKey="tab_wallhack" },
    { id="World", icon="+", langKey="tab_world" },
    { id="Misc", icon="#", langKey="tab_misc" },
    { id="Customize", icon="~", langKey="tab_customize" },
}
local Layout = {
    Aim = {
        col1 = {
            { titleKey="grp_aimbot", items = {
                {name="Enable", key="AIM_Enabled", type="toggle"},
                {name="Visible Check", key="AIM_WallCheck", type="toggle"},
                {name="Show FOV", key="AIM_ShowFOV", type="toggle"},
                {name="Dynamic Smooth", key="AIM_DynamicSmooth", type="toggle"},
                {name="Aim Key", key="AIM_AimKey", type="dropdown", list=AimKeys},
                {name="Aim Fov", key="AIM_FOV", type="slider", min=50, max=500, step=25},
                {name="Smooth Value", key="AIM_Smooth", type="slider", min=1, max=100, step=1},
                {name="Bone", key="AIM_TargetBone", type="dropdown", list=AimBones}
            }}
        },
        col2 = {
            { titleKey="grp_target", items = {
                {name="Team Check", key="AIM_TeamCheck", type="toggle"}
            }}
        }
    },
    Wallhack = {
        col1 = {
            { titleKey="grp_players", items = {
                {name="Enable ESP", key="ESP_Enabled", type="toggle"},
                {name="Boxes", key="ESP_Boxes", type="toggle"},
                {name="Names", key="ESP_Names", type="toggle"},
                {name="Distance", key="ESP_Distance", type="toggle"},
                {name="Health Bar", key="ESP_Health", type="toggle"},
                {name="Team Check", key="ESP_TeamCheck", type="toggle"},
                {name="Max Distance", key="ESP_MaxDist", type="slider", min=500, max=5000, step=100}
            }},
            { titleKey="grp_skeleton", items = {
                {name="Skeleton", key="ESP_Skeleton", type="toggle"}
            }}
        },
        col2 = {
            { titleKey="grp_drones", items = {
                {name="Drone ESP", key="ESP_Drones", type="toggle"},
                {name="Drone Team Check", key="ESP_DronesTeamCheck", type="toggle"}
            }},
            { titleKey="grp_radar", items = {
                {name="Enable Radar", key="RADAR_Enabled", type="toggle"},
                {name="Radar Size", key="RADAR_Size", type="slider", min=80, max=200, step=10}
            }}
        }
    },
    World = {
        col1 = {
            { titleKey="grp_freecam", items = {
                {name="Enable Freecam", key="FREECAM_Enabled", type="toggle"},
                {name="Speed", key="FREECAM_Speed", type="slider", min=5, max=300, step=5},
                {name="Sensitivity", key="FREECAM_Sensitivity", type="slider", min=0.1, max=5, step=0.1}
            }}
        },
        col2 = {
            { titleKey="grp_ui", items = {
                {name="Watermark", key="UI_Watermark", type="toggle"}
            }}
        }
    },
    Misc = {
        col1 = {
            { titleKey="grp_speed", items = {
                {name="Speed Hack", key="SPEED_Enabled", type="toggle"},
                {name="Speed Value", key="SPEED_Value", type="slider", min=16, max=250, step=2},
                {name="Jump Power", key="JUMP_Enabled", type="toggle"},
                {name="Jump Value", key="JUMP_Value", type="slider", min=50, max=300, step=5}
            }}
        },
        col2 = {
            { titleKey="grp_binds", items = { {name="Binds", key="__BINDS_UI", type="binds"} } }
        }
    },
    Customize = {
        col1 = {
            { titleKey="grp_config", items = { {name="Config", key="__CFG_UI", type="configui"} }},
            { titleKey="grp_colors_player", items = {
                {name="Enemy", key="C_Enemy", type="color"},
                {name="Teammate", key="C_Team", type="color"},
                {name="Drone (enemy)", key="C_DroneEnemy", type="color"},
                {name="Drone (team)", key="C_DroneTeam", type="color"},
                {name="Box", key="C_Box", type="color"},
                {name="Name", key="C_Name", type="color"},
                {name="Distance", key="C_Distance", type="color"},
                {name="Skeleton", key="C_Skeleton", type="color"}
            }}
        },
        col2 = {
            { titleKey="grp_colors", items = {
                {name="HP bg", key="C_HealthBg", type="color"},
                {name="HP high", key="C_HealthHigh", type="color"},
                {name="HP mid", key="C_HealthMid", type="color"},
                {name="HP low", key="C_HealthLow", type="color"},
                {name="Radar bg", key="C_RadarBg", type="color"},
                {name="Radar border", key="C_RadarBorder", type="color"},
                {name="Radar you", key="C_RadarYou", type="color"},
                {name="Radar enemy", key="C_RadarEnemy", type="color"},
                {name="FOV circle", key="C_FOVCircle", type="color"},
                {name="FOV active", key="C_FOVActive", type="color"},
                {name="Accent", key="C_Accent", type="color"}
            }}
        }
    }
}

local GUI = { Frame=nil, Dragging=false, DragOffset=Vector2.zero, ContentArea=nil,
    ItemVisuals={}, TabsButtons={}, LangButtons={}, TabConnections={} }

local function getBindString(key)
    local b = Binds[key]
    if not b or not b.key then return "" end
    return "[" .. b.key.Name .. "]"
end
local function triggerBind(configKey)
    local b = Binds[configKey]; if not b then return end
    local tt = type(Config[configKey])
    if b.mode == "Hold" then
        if not HoldActive[configKey] then
            HoldActive[configKey] = true
            if tt == "boolean" then Config[configKey] = true; if GUI then GUI.RefreshItemVisual(configKey) end end
        end
    else
        if tt == "boolean" then
            Config[configKey] = not Config[configKey]
            if GUI then GUI.RefreshItemVisual(configKey) end
        end
    end
end
local function attachRMB(obj, key, name)
    if obj:IsA("GuiButton") then
        obj.MouseButton2Down:Connect(function() BindEditor.Open(key, name) end)
    else
        obj.InputBegan:Connect(function(input)
            if input.UserInputType == Enum.UserInputType.MouseButton2 then BindEditor.Open(key, name) end
        end)
    end
end
local function addHelpIcon(row, key, xOffset)
    local desc = getDesc(key)
    if not desc then return nil end
    local q = Instance.new("TextButton", row)
    q.BackgroundColor3 = Color3.fromRGB(28,28,34); q.BorderSizePixel = 0
    q.Position = UDim2.new(1, -(xOffset or 145), 0.5, -9)
    q.Size = UDim2.new(0, 18, 0, 18)
    q.Font = Enum.Font.GothamBold; q.TextSize = 11
    q.TextColor3 = getColor("C_Accent"); q.Text = "?"
    q.AutoButtonColor = false; q.ZIndex = 6
    Instance.new("UICorner", q).CornerRadius = UDim.new(1, 0)
    local qStroke = Instance.new("UIStroke", q)
    qStroke.Color = getColor("C_Accent"); qStroke.Thickness = 1; qStroke.Transparency = 0.5
    q.MouseEnter:Connect(function() showTooltip(desc) end)
    q.MouseLeave:Connect(function() hideTooltip() end)
    return q
end

local function buildToggle(parent, item)
    local row = Instance.new("Frame", parent)
    row.BackgroundTransparency = 1; row.Size = UDim2.new(1, 0, 0, 26)
    local box = Instance.new("Frame", row)
    box.BackgroundColor3 = Config[item.key] and getColor("C_Accent") or Color3.fromRGB(28,28,32)
    box.BorderSizePixel = 0; box.Position = UDim2.new(0, 0, 0.5, -9); box.Size = UDim2.new(0, 18, 0, 18)
    Instance.new("UICorner", box).CornerRadius = UDim.new(0, 4)
    local bs = Instance.new("UIStroke", box)
    bs.Color = Config[item.key] and getColor("C_Accent") or Color3.fromRGB(50,50,58); bs.Thickness = 1
    local check = Instance.new("TextLabel", box)
    check.BackgroundTransparency = 1; check.Size = UDim2.new(1,0,1,0)
    check.Font = Enum.Font.GothamBold; check.TextSize = 14
    check.TextColor3 = Color3.new(0,0,0); check.Text = "v"; check.Visible = Config[item.key]
    local lbl = Instance.new("TextLabel", row)
    lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 28, 0, 0); lbl.Size = UDim2.new(1, -170, 1, 0)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 13
    lbl.TextColor3 = Color3.fromRGB(240,240,245); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextTruncate = Enum.TextTruncate.AtEnd
    lbl.Text = tItem(item.key, item.name)
    addHelpIcon(row, item.key, 145)
    local bindLbl = Instance.new("TextLabel", row)
    bindLbl.BackgroundTransparency = 1; bindLbl.Position = UDim2.new(1, -120, 0, 0); bindLbl.Size = UDim2.new(0, 95, 1, 0)
    bindLbl.Font = Enum.Font.GothamMedium; bindLbl.TextSize = 11
    bindLbl.TextColor3 = getColor("C_Accent"); bindLbl.TextXAlignment = Enum.TextXAlignment.Right
    bindLbl.Text = getBindString(item.key)
    local hit = Instance.new("TextButton", row)
    hit.BackgroundTransparency = 1; hit.Size = UDim2.new(1, -125, 1, 0)
    hit.Text = ""; hit.AutoButtonColor = false
    hit.MouseButton1Click:Connect(function()
        Config[item.key] = not Config[item.key]
        box.BackgroundColor3 = Config[item.key] and getColor("C_Accent") or Color3.fromRGB(28,28,32)
        bs.Color = Config[item.key] and getColor("C_Accent") or Color3.fromRGB(50,50,58)
        check.Visible = Config[item.key]
    end)
    attachRMB(hit, item.key, tItem(item.key, item.name))
    GUI.ItemVisuals[item.key] = function()
        local v = Config[item.key]
        box.BackgroundColor3 = v and getColor("C_Accent") or Color3.fromRGB(28,28,32)
        bs.Color = v and getColor("C_Accent") or Color3.fromRGB(50,50,58)
        check.Visible = v
        bindLbl.Text = getBindString(item.key)
    end
    return row
end

local function buildSlider(parent, item)
    local fmt = function(v) if item.step < 1 then return string.format("%.1f", v) end; return tostring(math.floor(v)) end
    local row = Instance.new("Frame", parent)
    row.BackgroundTransparency = 1; row.Size = UDim2.new(1, 0, 0, 42)
    local lbl = Instance.new("TextLabel", row)
    lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 0, 0, 0); lbl.Size = UDim2.new(0.6, -22, 0, 20)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 13
    lbl.TextColor3 = Color3.fromRGB(240,240,245); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextTruncate = Enum.TextTruncate.AtEnd
    lbl.Text = tItem(item.key, item.name)
    addHelpIcon(row, item.key, 145)
    for _, c in ipairs(row:GetChildren()) do
        if c:IsA("TextButton") and c.Text == "?" then
            c.Position = UDim2.new(0.6, 0, 0, 1)
        end
    end
    local valLbl = Instance.new("TextLabel", row)
    valLbl.BackgroundTransparency = 1; valLbl.Position = UDim2.new(0.6, 22, 0, 0); valLbl.Size = UDim2.new(0.4, -22, 0, 20)
    valLbl.Font = Enum.Font.GothamMedium; valLbl.TextSize = 13
    valLbl.TextColor3 = Color3.fromRGB(240,240,245); valLbl.TextXAlignment = Enum.TextXAlignment.Right
    valLbl.Text = fmt(Config[item.key])
    local track = Instance.new("Frame", row)
    track.BackgroundColor3 = Color3.fromRGB(28,28,32); track.BorderSizePixel = 0
    track.Position = UDim2.new(0, 0, 0, 26); track.Size = UDim2.new(1, 0, 0, 4)
    Instance.new("UICorner", track).CornerRadius = UDim.new(1, 0)
    local pct0 = (Config[item.key] - item.min) / (item.max - item.min)
    local fill = Instance.new("Frame", track)
    fill.BackgroundColor3 = Color3.fromRGB(139,127,255); fill.BorderSizePixel = 0
    fill.Size = UDim2.new(pct0, 0, 1, 0); Instance.new("UICorner", fill).CornerRadius = UDim.new(1, 0)
    local knob = Instance.new("Frame", track)
    knob.BackgroundColor3 = Color3.new(1,1,1); knob.BorderSizePixel = 0
    knob.AnchorPoint = Vector2.new(0.5, 0.5)
    knob.Position = UDim2.new(pct0, 0, 0.5, 0); knob.Size = UDim2.new(0, 14, 0, 14)
    Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0)
    local dragging = false
    track.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true end
    end)
    track.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
    end)
    table.insert(GUI.TabConnections, UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
    end))
    table.insert(GUI.TabConnections, RunService.RenderStepped:Connect(function()
        if not dragging then return end
        if not track.Parent or not fill.Parent or not knob.Parent then dragging = false; return end
        local tw = track.AbsoluteSize.X; if tw <= 0 then return end
        local tx = track.AbsolutePosition.X
        local mx = UserInputService:GetMouseLocation().X
        local p = math.clamp((mx-tx)/tw, 0, 1)
        local v = item.min + p * (item.max - item.min)
        v = math.floor(v / item.step + 0.5) * item.step
        Config[item.key] = math.clamp(v, item.min, item.max)
        local np = (Config[item.key] - item.min) / (item.max - item.min)
        fill.Size = UDim2.new(np, 0, 1, 0)
        knob.Position = UDim2.new(np, 0, 0.5, 0)
        valLbl.Text = fmt(Config[item.key])
    end))
    attachRMB(lbl, item.key, tItem(item.key, item.name))
    GUI.ItemVisuals[item.key] = function()
        local v = Config[item.key]
        local np = (v - item.min) / (item.max - item.min)
        fill.Size = UDim2.new(np, 0, 1, 0)
        knob.Position = UDim2.new(np, 0, 0.5, 0)
        valLbl.Text = fmt(v)
    end
    return row
end

local function buildDropdown(parent, item)
    local row = Instance.new("Frame", parent)
    row.BackgroundTransparency = 1; row.Size = UDim2.new(1, 0, 0, 46)
    local lbl = Instance.new("TextLabel", row)
    lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 0, 0, 0); lbl.Size = UDim2.new(1, -30, 0, 18)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 12
    lbl.TextColor3 = Color3.fromRGB(130,130,140); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.Text = tItem(item.key, item.name)
    addHelpIcon(row, item.key, 4)
    local btn = Instance.new("TextButton", row)
    btn.BackgroundColor3 = Color3.fromRGB(24,24,28); btn.BorderSizePixel = 0
    btn.Position = UDim2.new(0, 0, 0, 20); btn.Size = UDim2.new(1, 0, 0, 26)
    btn.Text = ""; btn.AutoButtonColor = false
    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 5)
    local bs = Instance.new("UIStroke", btn); bs.Color = Color3.fromRGB(30,30,34); bs.Thickness = 1
    local btnLbl = Instance.new("TextLabel", btn)
    btnLbl.BackgroundTransparency = 1; btnLbl.Position = UDim2.new(0, 10, 0, 0); btnLbl.Size = UDim2.new(1, -30, 1, 0)
    btnLbl.Font = Enum.Font.GothamMedium; btnLbl.TextSize = 13
    btnLbl.TextColor3 = Color3.fromRGB(240,240,245); btnLbl.TextXAlignment = Enum.TextXAlignment.Left
    btnLbl.Text = tostring(Config[item.key])
    local listFrame = Instance.new("Frame", UI)
    listFrame.BackgroundColor3 = Color3.fromRGB(19,19,22); listFrame.BorderSizePixel = 0
    listFrame.Visible = false; listFrame.ZIndex = 500
    Instance.new("UICorner", listFrame).CornerRadius = UDim.new(0, 5)
    local ls = Instance.new("UIStroke", listFrame); ls.Color = Color3.fromRGB(30,30,34); ls.Thickness = 1
    local listLayout = Instance.new("UIListLayout", listFrame); listLayout.Padding = UDim.new(0, 0)
    for i, opt in ipairs(item.list) do
        local optBtn = Instance.new("TextButton", listFrame)
        optBtn.BackgroundColor3 = Color3.fromRGB(19,19,22); optBtn.BorderSizePixel = 0
        optBtn.Size = UDim2.new(1, 0, 0, 26)
        optBtn.Font = Enum.Font.GothamMedium; optBtn.TextSize = 13
        optBtn.TextColor3 = Color3.fromRGB(240,240,245); optBtn.Text = "  " .. opt
        optBtn.TextXAlignment = Enum.TextXAlignment.Left
        optBtn.AutoButtonColor = false; optBtn.LayoutOrder = i; optBtn.ZIndex = 501
        optBtn.MouseButton1Click:Connect(function()
            Config[item.key] = opt; btnLbl.Text = opt
            listFrame.Visible = false
        end)
    end
    btn.MouseButton1Click:Connect(function()
        if not btn.Parent or not listFrame.Parent then return end
        local willOpen = not listFrame.Visible
        listFrame.Visible = false
        if not willOpen then return end
        listFrame.Size = UDim2.new(0, btn.AbsoluteSize.X, 0, 26 * #item.list)
        listFrame.Position = UDim2.new(0, btn.AbsolutePosition.X, 0, btn.AbsolutePosition.Y + btn.AbsoluteSize.Y + 2)
        listFrame.Visible = true
    end)
    attachRMB(lbl, item.key, tItem(item.key, item.name))
    GUI.ItemVisuals[item.key] = function() btnLbl.Text = tostring(Config[item.key]) end
    return row
end

local function buildColorRow(parent, item)
    local row = Instance.new("Frame", parent)
    row.BackgroundTransparency = 1; row.Size = UDim2.new(1, 0, 0, 28)
    local swatch = Instance.new("Frame", row)
    swatch.BackgroundColor3 = getColor(item.key); swatch.BorderSizePixel = 0
    swatch.Position = UDim2.new(0, 0, 0.5, -8); swatch.Size = UDim2.new(0, 16, 0, 16)
    Instance.new("UICorner", swatch).CornerRadius = UDim.new(0, 3)
    local lbl = Instance.new("TextLabel", row)
    lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 24, 0, 0); lbl.Size = UDim2.new(1, -115, 1, 0)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 13
    lbl.TextColor3 = Color3.fromRGB(240,240,245); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextTruncate = Enum.TextTruncate.AtEnd
    lbl.Text = tItem(item.key, item.name)
    addHelpIcon(row, item.key, 90)
    local btn = Instance.new("TextButton", row)
    btn.BackgroundColor3 = getColor("C_Accent"); btn.BorderSizePixel = 0
    btn.Position = UDim2.new(1, -60, 0.5, -11); btn.Size = UDim2.new(0, 60, 0, 22)
    btn.Font = Enum.Font.GothamBold; btn.TextSize = 10
    btn.TextColor3 = Color3.new(0,0,0); btn.Text = t("picks"); btn.AutoButtonColor = false
    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
    btn.MouseButton1Click:Connect(function()
        ColorPicker.Open(item.key)
        task.spawn(function()
            while ColorPicker.frame and ColorPicker.frame.Parent do task.wait(0.1) end
            swatch.BackgroundColor3 = getColor(item.key)
        end)
    end)
    GUI.ItemVisuals[item.key] = function() swatch.BackgroundColor3 = getColor(item.key) end
    return row
end

local function buildConfigUI(parent)
    local wrap = Instance.new("Frame", parent)
    wrap.BackgroundTransparency = 1; wrap.Size = UDim2.new(1, 0, 0, 90)
    local nameBox = Instance.new("TextBox", wrap)
    nameBox.BackgroundColor3 = Color3.fromRGB(24,24,28); nameBox.BorderSizePixel = 0
    nameBox.Position = UDim2.new(0, 0, 0, 18); nameBox.Size = UDim2.new(1, 0, 0, 28)
    nameBox.Font = Enum.Font.GothamMedium; nameBox.TextSize = 13
    nameBox.TextColor3 = Color3.fromRGB(240,240,245)
    nameBox.PlaceholderText = "default"; nameBox.PlaceholderColor3 = Color3.fromRGB(130,130,140)
    nameBox.Text = ConfigSystem.CurrentName or "default"
    nameBox.ClearTextOnFocus = false; nameBox.TextXAlignment = Enum.TextXAlignment.Left
    Instance.new("UICorner", nameBox).CornerRadius = UDim.new(0, 5)
    local lbl = Instance.new("TextLabel", wrap)
    lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 0, 0, 0); lbl.Size = UDim2.new(1, 0, 0, 14)
    lbl.Font = Enum.Font.GothamBold; lbl.TextSize = 10
    lbl.TextColor3 = Color3.fromRGB(130,130,140); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.Text = t("cfg_name")
    local btnRow = Instance.new("Frame", wrap)
    btnRow.BackgroundTransparency = 1
    btnRow.Position = UDim2.new(0, 0, 0, 52); btnRow.Size = UDim2.new(1, 0, 0, 30)
    local saveBtn = Instance.new("TextButton", btnRow)
    saveBtn.BackgroundColor3 = getColor("C_Accent"); saveBtn.BorderSizePixel = 0
    saveBtn.Position = UDim2.new(0, 0, 0, 0); saveBtn.Size = UDim2.new(0.5, -3, 1, 0)
    saveBtn.Font = Enum.Font.GothamBold; saveBtn.TextSize = 12
    saveBtn.TextColor3 = Color3.new(0,0,0); saveBtn.Text = t("cfg_save"); saveBtn.AutoButtonColor = false
    Instance.new("UICorner", saveBtn).CornerRadius = UDim.new(0, 5)
    local loadBtn = Instance.new("TextButton", btnRow)
    loadBtn.BackgroundColor3 = Color3.fromRGB(24,24,28); loadBtn.BorderSizePixel = 0
    loadBtn.Position = UDim2.new(0.5, 3, 0, 0); loadBtn.Size = UDim2.new(0.5, -3, 1, 0)
    loadBtn.Font = Enum.Font.GothamBold; loadBtn.TextSize = 12
    loadBtn.TextColor3 = Color3.fromRGB(240,240,245); loadBtn.Text = t("cfg_load"); loadBtn.AutoButtonColor = false
    Instance.new("UICorner", loadBtn).CornerRadius = UDim.new(0, 5)
    saveBtn.MouseButton1Click:Connect(function()
        local nm = nameBox.Text ~= "" and nameBox.Text or "default"
        local ok = ConfigSystem.Save(nm)
        saveBtn.Text = ok and "OK!" or "FAIL"
        task.delay(1.5, function() saveBtn.Text = t("cfg_save") end)
    end)
    loadBtn.MouseButton1Click:Connect(function()
        local nm = nameBox.Text ~= "" and nameBox.Text or "default"
        local ok = ConfigSystem.Load(nm)
        loadBtn.Text = ok and "OK!" or "FAIL"
        task.delay(1.5, function() loadBtn.Text = t("cfg_load") end)
        if ok and GUI then
            for k in pairs(GUI.ItemVisuals) do pcall(GUI.ItemVisuals[k]) end
        end
    end)
    return wrap
end

local function buildBindsUI(parent)
    local wrap = Instance.new("Frame", parent)
    wrap.BackgroundTransparency = 1; wrap.Size = UDim2.new(1, 0, 0, 30)
    local lbl = Instance.new("TextLabel", wrap)
    lbl.BackgroundTransparency = 1; lbl.Size = UDim2.new(1, 0, 1, 0)
    lbl.Font = Enum.Font.GothamMedium; lbl.TextSize = 11
    lbl.TextColor3 = Color3.fromRGB(130,130,140); lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.Text = t("no_binds")
    return wrap
end

local ITEM_H = {toggle=26, slider=42, dropdown=46, color=28, configui=90, binds=30}
local function estimateCardHeight(section)
    local h = 18
    for _, it in ipairs(section.items) do h = h + (ITEM_H[it.type] or 26) + 6 end
    return h + 24
end
local function estimateColumnHeight(column)
    local total = 0
    for _, sec in ipairs(column) do total = total + estimateCardHeight(sec) + 10 end
    return total
end
local function buildCard(parent, section, order)
    local card = Instance.new("Frame", parent)
    card.BackgroundColor3 = Color3.fromRGB(19,19,22); card.BorderSizePixel = 0
    card.Size = UDim2.new(1, -12, 0, estimateCardHeight(section)); card.LayoutOrder = order
    Instance.new("UICorner", card).CornerRadius = UDim.new(0, 8)
    local cs = Instance.new("UIStroke", card); cs.Color = Color3.fromRGB(30,30,34); cs.Thickness = 1
    local inner = Instance.new("Frame", card)
    inner.BackgroundTransparency = 1
    inner.Position = UDim2.new(0, 12, 0, 12); inner.Size = UDim2.new(1, -24, 1, -24)
    local il = Instance.new("UIListLayout", inner)
    il.SortOrder = Enum.SortOrder.LayoutOrder; il.Padding = UDim.new(0, 6)
    local title = Instance.new("TextLabel", inner)
    title.BackgroundTransparency = 1; title.Size = UDim2.new(1, 0, 0, 18)
    title.Font = Enum.Font.GothamBold; title.TextSize = 12
    title.TextColor3 = getColor("C_Accent"); title.TextXAlignment = Enum.TextXAlignment.Center
    title.Text = ". " .. t(section.titleKey) .. " ."; title.LayoutOrder = 0
    local orderIdx = 1
    for _, it in ipairs(section.items) do
        local row
        if it.type == "toggle" then row = buildToggle(inner, it)
        elseif it.type == "slider" then row = buildSlider(inner, it)
        elseif it.type == "dropdown" then row = buildDropdown(inner, it)
        elseif it.type == "color" then row = buildColorRow(inner, it)
        elseif it.type == "configui" then row = buildConfigUI(inner)
        elseif it.type == "binds" then row = buildBindsUI(inner) end
        if row then row.LayoutOrder = orderIdx; orderIdx = orderIdx + 1 end
    end
    return card
end

function GUI.RenderTab(tabId)
    if not GUI.ContentArea or not GUI.ContentArea.Parent then return end
    for _, c in ipairs(GUI.ContentArea:GetChildren()) do
        if c:IsA("Frame") then pcall(function() c:Destroy() end) end
    end
    if GUI.TabConnections then
        for _, c in ipairs(GUI.TabConnections) do pcall(function() c:Disconnect() end) end
    end
    GUI.TabConnections = {}
    GUI.ItemVisuals = {}
    local data = Layout[tabId]; if not data then return end
    local grid = Instance.new("Frame", GUI.ContentArea)
    grid.BackgroundTransparency = 1; grid.Size = UDim2.new(1, 0, 1, 0)
    local col1 = Instance.new("Frame", grid)
    col1.BackgroundTransparency = 1
    col1.Size = UDim2.new(0.5, -4, 0, 0); col1.AutomaticSize = Enum.AutomaticSize.Y
    local l1 = Instance.new("UIListLayout", col1)
    l1.SortOrder = Enum.SortOrder.LayoutOrder; l1.Padding = UDim.new(0, 10)
    local col2 = Instance.new("Frame", grid)
    col2.BackgroundTransparency = 1
    col2.Position = UDim2.new(0.5, 4, 0, 0); col2.Size = UDim2.new(0.5, -4, 0, 0)
    col2.AutomaticSize = Enum.AutomaticSize.Y
    local l2 = Instance.new("UIListLayout", col2)
    l2.SortOrder = Enum.SortOrder.LayoutOrder; l2.Padding = UDim.new(0, 10)
    if data.col1 then for i, sec in ipairs(data.col1) do buildCard(col1, sec, i) end end
    if data.col2 then for i, sec in ipairs(data.col2) do buildCard(col2, sec, i) end end
    local h1 = data.col1 and estimateColumnHeight(data.col1) or 0
    local h2 = data.col2 and estimateColumnHeight(data.col2) or 0
    GUI.ContentArea.CanvasSize = UDim2.new(0, 0, 0, math.max(h1, h2) + 24)
end
function GUI.RefreshTabLabels()
    for _, b in pairs(GUI.TabsButtons) do b.Label.Text = t(b.langKey) end
    GUI.RenderTab(Config.MENU_Tab)
end
function GUI.SwitchLang(lang)
    CurrentLang = lang
    for _, lb in pairs(GUI.LangButtons) do
        local active = lb.lang == lang
        lb.Button.BackgroundColor3 = active and getColor("C_Accent") or Color3.fromRGB(24,24,28)
        lb.Button.TextColor3 = active and Color3.new(0,0,0) or Color3.fromRGB(130,130,140)
    end
    GUI.RefreshTabLabels()
end
function GUI.SwitchTab(tabId)
    Config.MENU_Tab = tabId
    for _, b in pairs(GUI.TabsButtons) do
        if b.tabId == tabId then
            b.Label.TextColor3 = Color3.new(1,1,1)
            b.Icon.TextColor3 = getColor("C_Accent")
        else
            b.Label.TextColor3 = Color3.fromRGB(130,130,140)
            b.Icon.TextColor3 = Color3.fromRGB(80,80,90)
        end
    end
    GUI.RenderTab(tabId)
end

function GUI.Create()
    local W, H = 720, 500
    local headerH, footerH = 46, 32
    local main = Instance.new("Frame", UI)
    main.BackgroundColor3 = Color3.fromRGB(10,10,12); main.BorderSizePixel = 0
    main.Size = UDim2.new(0, W, 0, H); main.Position = UDim2.new(0.5, -W/2, 0.5, -H/2)
    main.Active = true; GUI.Frame = main
    Instance.new("UICorner", main).CornerRadius = UDim.new(0, 10)
    local mStroke = Instance.new("UIStroke", main)
    mStroke.Color = Color3.fromRGB(30,30,34); mStroke.Thickness = 1
    local header = Instance.new("Frame", main)
    header.BackgroundTransparency = 1; header.Size = UDim2.new(1, 0, 0, headerH)
    local logo = Instance.new("TextLabel", header)
    logo.BackgroundTransparency = 1; logo.Position = UDim2.new(0, 18, 0, 0); logo.Size = UDim2.new(0, 22, 1, 0)
    logo.Font = Enum.Font.GothamBold; logo.TextSize = 18
    logo.TextColor3 = getColor("C_Accent"); logo.Text = "*"; logo.TextXAlignment = Enum.TextXAlignment.Left
    local brandLbl = Instance.new("TextLabel", header)
    brandLbl.BackgroundTransparency = 1; brandLbl.Position = UDim2.new(0, 42, 0, 0); brandLbl.Size = UDim2.new(0, 80, 1, 0)
    brandLbl.Font = Enum.Font.GothamBold; brandLbl.TextSize = 14
    brandLbl.TextColor3 = Color3.new(1,1,1); brandLbl.Text = BRAND
    brandLbl.TextXAlignment = Enum.TextXAlignment.Left
    local tabsFrame = Instance.new("Frame", header)
    tabsFrame.BackgroundTransparency = 1
    tabsFrame.Position = UDim2.new(0, 130, 0, 0); tabsFrame.Size = UDim2.new(1, -140, 1, 0)
    local tl = Instance.new("UIListLayout", tabsFrame)
    tl.FillDirection = Enum.FillDirection.Horizontal; tl.SortOrder = Enum.SortOrder.LayoutOrder
    tl.Padding = UDim.new(0, 14); tl.VerticalAlignment = Enum.VerticalAlignment.Center
    for i, tab in ipairs(Tabs) do
        local tabBtn = Instance.new("TextButton", tabsFrame)
        tabBtn.BackgroundTransparency = 1
        tabBtn.Size = UDim2.new(0, 100, 1, 0); tabBtn.Text = ""; tabBtn.AutoButtonColor = false
        tabBtn.LayoutOrder = i
        local icon = Instance.new("TextLabel", tabBtn)
        icon.BackgroundTransparency = 1; icon.Position = UDim2.new(0, 0, 0.5, -9)
        icon.Size = UDim2.new(0, 18, 0, 18)
        icon.Font = Enum.Font.GothamBold; icon.TextSize = 16
        icon.TextColor3 = i == 1 and getColor("C_Accent") or Color3.fromRGB(80,80,90)
        icon.Text = tab.icon; icon.TextXAlignment = Enum.TextXAlignment.Left
        local lbl = Instance.new("TextLabel", tabBtn)
        lbl.BackgroundTransparency = 1; lbl.Position = UDim2.new(0, 22, 0, 0); lbl.Size = UDim2.new(1, -22, 1, 0)
        lbl.Font = Enum.Font.GothamBold; lbl.TextSize = 13
        lbl.TextColor3 = i == 1 and Color3.new(1,1,1) or Color3.fromRGB(130,130,140)
        lbl.TextXAlignment = Enum.TextXAlignment.Left
        lbl.Text = t(tab.langKey)
        tabBtn.MouseButton1Click:Connect(function() GUI.SwitchTab(tab.id) end)
        GUI.TabsButtons[#GUI.TabsButtons+1] = {Button=tabBtn, Icon=icon, Label=lbl, tabId=tab.id, langKey=tab.langKey}
    end
    local div = Instance.new("Frame", main)
    div.BackgroundColor3 = Color3.fromRGB(30,30,34); div.BorderSizePixel = 0
    div.Position = UDim2.new(0, 0, 0, headerH); div.Size = UDim2.new(1, 0, 0, 1)
    local contentHolder = Instance.new("Frame", main)
    contentHolder.BackgroundTransparency = 1
    contentHolder.Position = UDim2.new(0, 0, 0, headerH + 1)
    contentHolder.Size = UDim2.new(1, 0, 1, -headerH - footerH - 1)
    local scroll = Instance.new("ScrollingFrame", contentHolder)
    scroll.BackgroundTransparency = 1
    scroll.Position = UDim2.new(0, 12, 0, 12); scroll.Size = UDim2.new(1, -24, 1, -24)
    scroll.BorderSizePixel = 0; scroll.ScrollBarThickness = 3
    scroll.ScrollBarImageColor3 = getColor("C_Accent"); scroll.CanvasSize = UDim2.new(0, 0, 0, 0)
    GUI.ContentArea = scroll
    local footer = Instance.new("Frame", main)
    footer.BackgroundTransparency = 1
    footer.Position = UDim2.new(0, 0, 1, -footerH); footer.Size = UDim2.new(1, 0, 0, footerH)
    local langLabel = Instance.new("TextLabel", footer)
    langLabel.BackgroundTransparency = 1; langLabel.Position = UDim2.new(0, 14, 0, 0)
    langLabel.Size = UDim2.new(0, 40, 1, 0)
    langLabel.Font = Enum.Font.GothamBold; langLabel.TextSize = 10
    langLabel.TextColor3 = Color3.fromRGB(130,130,140); langLabel.TextXAlignment = Enum.TextXAlignment.Left
    langLabel.Text = t("lang") .. ":"
    local langFrame = Instance.new("Frame", footer)
    langFrame.BackgroundTransparency = 1
    langFrame.Position = UDim2.new(0, 60, 0.5, -11); langFrame.Size = UDim2.new(0, 80, 0, 22)
    local ll = Instance.new("UIListLayout", langFrame)
    ll.FillDirection = Enum.FillDirection.Horizontal; ll.Padding = UDim.new(0, 4)
    ll.VerticalAlignment = Enum.VerticalAlignment.Center
    for _, code in ipairs({"en", "ru"}) do
        local btn = Instance.new("TextButton", langFrame)
        btn.BackgroundColor3 = code == CurrentLang and getColor("C_Accent") or Color3.fromRGB(24,24,28)
        btn.BorderSizePixel = 0; btn.Size = UDim2.new(0, 34, 0, 22)
        btn.Font = Enum.Font.GothamBold; btn.TextSize = 11
        btn.TextColor3 = code == CurrentLang and Color3.new(0,0,0) or Color3.fromRGB(130,130,140)
        btn.Text = code:upper(); btn.AutoButtonColor = false
        Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
        btn.MouseButton1Click:Connect(function() GUI.SwitchLang(code) end)
        GUI.LangButtons[#GUI.LangButtons+1] = {Button=btn, lang=code}
    end
    local footerRight = Instance.new("TextLabel", footer)
    footerRight.BackgroundTransparency = 1
    footerRight.Position = UDim2.new(0, 0, 0, 0); footerRight.Size = UDim2.new(1, -14, 1, 0)
    footerRight.Font = Enum.Font.GothamMedium; footerRight.TextSize = 10
    footerRight.TextColor3 = Color3.fromRGB(130,130,140); footerRight.TextXAlignment = Enum.TextXAlignment.Right
    footerRight.Text = "by " .. BRAND .. "  v7.5"
    local function startDrag(input)
        if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end
        GUI.Dragging = true
        local m = UserInputService:GetMouseLocation()
        GUI.DragOffset = m - Vector2.new(main.AbsolutePosition.X, main.AbsolutePosition.Y)
    end
    local function endDrag(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then GUI.Dragging = false end
    end
    header.InputBegan:Connect(startDrag); logo.InputBegan:Connect(startDrag); brandLbl.InputBegan:Connect(startDrag)
    UserInputService.InputEnded:Connect(endDrag)
    GUI.SwitchTab(Config.MENU_Tab)
end
function GUI.Step()
    if not GUI.Frame or not GUI.Frame.Parent then return end
    if GUI.Dragging then
        local m = UserInputService:GetMouseLocation()
        local p = m - GUI.DragOffset
        GUI.Frame.Position = UDim2.new(0, p.X, 0, p.Y)
    end
end

GUI.Create()

-- ============================================================
-- BIND INPUT
-- ============================================================
Conn.bindDown = UserInputService.InputBegan:Connect(function(input, gp)
    if Unloaded or gp then return end
    if input.UserInputType ~= Enum.UserInputType.Keyboard then return end
    if input.KeyCode == Enum.KeyCode.Insert or input.KeyCode == Enum.KeyCode.Home then return end
    for configKey, bind in pairs(Binds) do
        if bind.key == input.KeyCode then
            if bind.mode == "Hold" then
                if not HoldActive[configKey] then
                    HoldActive[configKey] = true
                    if type(Config[configKey]) == "boolean" then
                        Config[configKey] = true
                        if GUI then GUI.RefreshItemVisual(configKey) end
                    end
                end
            else triggerBind(configKey) end
        end
    end
end)
Conn.bindUp = UserInputService.InputEnded:Connect(function(input)
    if Unloaded then return end
    if input.UserInputType ~= Enum.UserInputType.Keyboard then return end
    for configKey, bind in pairs(Binds) do
        if bind.key == input.KeyCode and bind.mode == "Hold" then
            if HoldActive[configKey] then
                HoldActive[configKey] = false
                if type(Config[configKey]) == "boolean" then
                    Config[configKey] = false
                    if GUI then GUI.RefreshItemVisual(configKey) end
                end
            end
        end
    end
end)

-- ============================================================
-- MAIN LOOP
-- ============================================================
local lastFps = tick()
local fpsFrames, fps = 0, 0

Conn.render = RunService.RenderStepped:Connect(function(dt)
    if Unloaded then return end
    local ok, err = pcall(function()
        local cam = Workspace.CurrentCamera; if not cam then return end
        local screenSize = cam.ViewportSize
        local screenCenter = Vector2.new(screenSize.X/2, screenSize.Y/2)
        local now = tick()

        fpsFrames = fpsFrames + 1
        if now - lastFps >= 0.5 then
            fps = math.floor(fpsFrames / (now - lastFps))
            fpsFrames = 0; lastFps = now
        end

        if now - Cache.lastRefresh > Tuning.RefreshRate then
            Cache.lastRefresh = now
            pcall(Targets.refresh)
        end
        if now - Cache.lastDroneRefresh > Tuning.DroneRefreshRate then
            Cache.lastDroneRefresh = now
            pcall(scanDrones)
        end

        pcall(function() ESP.Step(cam, screenSize, screenCenter) end)
        pcall(function() DroneESP.Step(cam, screenSize, screenCenter) end)
        pcall(function() UpdateRadar(cam) end)
        pcall(speedStep)
        pcall(function() freecamTick(dt) end)
        pcall(GUI.Step)

        WMStroke.Color = getColor("C_Accent")
        WMBrand.TextColor3 = getColor("C_Accent")
        RStroke.Color = getColor("C_RadarBorder")
        RadarCenter.BackgroundColor3 = getColor("C_RadarYou")
        RadarFrame.BackgroundColor3 = getColor("C_RadarBg")

        if Config.AIM_Enabled and Config.AIM_ShowFOV then
            local gi = GuiService:GetGuiInset()
            FOVCircle.Position = UDim2.new(0, screenCenter.X, 0, screenCenter.Y + gi.Y)
            FOVCircle.Size = UDim2.new(0, Config.AIM_FOV*2, 0, Config.AIM_FOV*2)
            FOVS.Color = (Aim.aiming and Aim.locked) and getColor("C_FOVActive") or getColor("C_FOVCircle")
            FOVCircle.Visible = true
        else FOVCircle.Visible = false end

        if Config.UI_Watermark then
            WM.Visible = true
            local myRoleName = Cache.myRole and Cache.myRole.Name or "?"
            local myTeamCount = 0
            for _, e in pairs(Cache.playerRoles) do
                if e.isMyTeam then myTeamCount = myTeamCount + 1 end
            end
            local bindCount = 0
            for _ in pairs(Binds) do bindCount = bindCount + 1 end
            WmInfo.Text = string.format("%d fps | esp %d/%d | drones %d/%d | role %s | team %d | binds %d",
                fps, Cache.drawn, Cache.count, Cache.droneDrawn, Cache.droneCount,
                myRoleName, myTeamCount, bindCount)
        else WM.Visible = false end
    end)
    if not ok then warn("[MORTY]", err) end
end)

Conn.input = UserInputService.InputBegan:Connect(function(i, gp)
    if Unloaded then return end
    if i.UserInputType ~= Enum.UserInputType.Keyboard then return end
    if i.KeyCode == Enum.KeyCode.Insert and not gp then
        GUI.Frame.Visible = not GUI.Frame.Visible
        if not GUI.Frame.Visible then
            pcall(ColorPicker.Close)
            pcall(BindEditor.Close)
            hideTooltip()
        end
    elseif i.KeyCode == Enum.KeyCode.Home then
        Unloaded = true
        for _, c in pairs(Conn) do pcall(function() c:Disconnect() end) end
        if GUI.TabConnections then
            for _, c in ipairs(GUI.TabConnections) do pcall(function() c:Disconnect() end) end
        end
        for _, e in pairs(ESP.cache) do ESP.Destroy(e) end
        for _, e in pairs(DroneESP.cache) do DroneESP.Destroy(e) end
        pcall(ColorPicker.Close)
        pcall(BindEditor.Close)
        hideTooltip()
        pcall(function() UI:Destroy() end)
        pcall(function() ESPGui:Destroy() end)
        print("[MORTY] Выгружен (HOME)")
    end
end)

-- Автозагрузка конфига
task.spawn(function()
    task.wait(1)
    if isfile and isfile(ConfigSystem.GetPath("autosave")) then
        ConfigSystem.Load("autosave")
    end
end)

print("[MORTY] v7.5 loaded")
print("[MORTY] Insert = меню | Home = выгрузка | ПКМ = бинд | ? = описание")

Features & Information

MORTY CHEAT v7.5 — Fixed ESP Offset + Detailed Tooltips Controls: Insert — open/close menu Home — unload cheat RMB on menu item — add bind "?" icon — detailed description of the feature Drag — menu can be moved by its header 🎯 AIMBOT Enable — master switch for the whole aimbot. When off, nothing in the Aim tab works. Visible Check — don't aim at enemies behind walls. Uses raycast. Show FOV — draws a circle showing the aim radius. Visual only. Dynamic Smooth — smoothness scales with distance: far target = faster lock, close = smoother. Aim Key — mouse button that activates aim: RMB / LMB / Always. Aim FOV — aim capture radius in pixels (50–500). Smooth Value — how fast aim moves to target (1 = instant/rage, 15+ = human-like). Bone — body part to aim at: Head / Torso / HumanoidRootPart. Team Check — skip teammates. Uses team container from Workspace. 👁️ WALLHACK (Player ESP) Enable ESP — master switch for all ESP elements. Boxes — rectangle around each player. Red = enemy, blue = teammate. Names — show player name above box. Distance — distance to player in meters below box. Health Bar — vertical HP bar left of box. Green > 60%, yellow 30–60%, red < 30%. Team Check — hide teammates from ESP. They disappear from screen and radar. Max Distance — max render distance in studs (500–5000). Skeleton — lines between body parts. Supports R6 and R15. 🚁 DRONE ESP Drone ESP — highlight FPV drones with purple box. Works through walls. Drone Team Check — hide teammate drones. Only enemy drones shown. 📡 RADAR Enable Radar — corner radar with enemies. Rotates with your camera. Radar Size — radar size in pixels (80–200). 🌍 WORLD Freecam — detach camera from your body. WASD = fly, Space/E = up, Q = down. Speed (freecam) — camera fly speed. Shift = 3x, Ctrl = 0.25x. Sensitivity — mouse sensitivity for freecam. Watermark — info panel top-left: FPS, targets, role, binds. ⚡ MISC Speed Hack — increase your walk speed. Smooth ramp-up — less detectable. Speed Value — target speed (16–250 studs/sec, default Roblox = 16). Jump Power — increase your jump power. Also smooth. Jump Value — target jump power (50–300, default = 50). Binds — window with list of all active binds. 🎨 CUSTOMIZE Config name / Save / Load — save and load configs as JSON (folder morty_cheat). Autoload — on script load, the autosave config is loaded. Player Colors — Enemy, Teammate, Drone (enemy/team), Box, Name, Distance, Skeleton. UI Colors — HP bg/high/mid/low, Radar bg/border/you/enemy, FOV circle/active, Accent. Color Picker — full HSV picker with preview and gradient sliders. 🎛️ BINDS RMB on menu item — open bind editor. Modes: Toggle and Hold. Key is displayed next to the menu item. Reset — Clear button in the editor. 🌐 LANGUAGES Switch RU / EN in the menu footer. The entire interface, feature names, and tooltips are translated. 🧠 ADDITIONAL Role Scanner — automatically detects teams via Workspace structure (Role → Model → Humanoid). Drone Scanner — identifies drones by Rotators, explosive, Base. Anti-error — all critical sections wrapped in pcall, error spam in console is limited. Randomized GUI names — ScreenGui names are randomized (less detection). Auto cleanup ESP — when a target leaves the view, elements are removed. Smooth Speed/Jump — values are not snapped, but smoothly interpolated. MORTY CHEAT v7.5 — 14 feature categories, 30+ toggles and sliders, bind support, configs, two languages, full color customization of UI and ESP. Works on R6 and R15, sup

Community Comments (6)

EROR7684EROR7684Sep 19, 2026

спидхак не рабочий, сделай пожалуйста убирание тумана и деревьев, а еще что бы можно было изменить цвет для видимых и не видимых врагов в esp, а так скрипт отличный, только не добавляй ключ

Replying to @EROR7684
mortyvmortyvSep 19, 2026

@EROR7684 Это бета версия , в скором времени баги будут исправлены а вот по ключи добавим для монетизации проекта и возможности новых обновлений

Replying to @mortyv
EROR7684EROR7684Sep 20, 2026

@mortyv ну если бета то ладно, только не делай ключ через ворк инк а то там рекламы тьма тьмущая, лучше создай дс или тг канал и там ключ вставь. еще одна идея появилась, добавь в следуйщем обновлении аимбот для фпв дронов, а то они маленькие попасть трудно было бы круто

Replying to @EROR7684
mortyvmortyvSep 20, 2026

@EROR7684 Хорошо , учту.

Replying to @mortyv
EROR7684EROR7684Sep 20, 2026

@mortyv спасибо

panda22orehpanda22orehSep 26, 2026

AI SLOP AIII PASTED VIBE CODE

More Scripts for The Lost Front