-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[ external.vip FREE VERSION (CRIPPLED EDITION) ⚠️ THIS IS THE FREE VERSION ⚠️ If you want the FULL version: → Join our Discord: https://discord.gg/EN6YnuCjYV This free version has: - Half the features locked behind Discord - Features that "work" but not really - An annoying watermark - A popup every 30 seconds telling you to join Discord - "Premium" features that just do nothing Made because rscripts.net can't handle the full script for some reason lol ]] local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local HttpService = game:GetService("HttpService") local SoundService = game:GetService("SoundService") local Lighting = game:GetService("Lighting") local Debris = game:GetService("Debris") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local mouse = LocalPlayer:GetMouse() --============================================================-- -- BAD THEME (intentionally worse than the real one) --============================================================-- local Theme = { Background = Color3.fromRGB(20, 20, 20), Sidebar = Color3.fromRGB(25, 25, 25), Panel = Color3.fromRGB(30, 30, 30), Panel2 = Color3.fromRGB(35, 35, 35), Border = Color3.fromRGB(50, 50, 50), BorderLight = Color3.fromRGB(70, 70, 70), Cyan = Color3.fromRGB(100, 180, 220), -- washed out Pink = Color3.fromRGB(200, 130, 180), Green = Color3.fromRGB(100, 200, 100), Red = Color3.fromRGB(220, 80, 80), Yellow = Color3.fromRGB(220, 200, 80), White = Color3.fromRGB(220, 220, 220), Text = Color3.fromRGB(180, 180, 180), SubText = Color3.fromRGB(120, 120, 120), Muted = Color3.fromRGB(80, 80, 80), Disabled = Color3.fromRGB(40, 40, 40), } local ACCENT = Theme.Cyan local WINDOW_WIDTH = 700 local WINDOW_HEIGHT = 480 local SIDEBAR_WIDTH = 180 local CARD_GAP = 10 local CARD_HEIGHT = 200 --============================================================-- -- DISCORD CONFIG --============================================================-- local DISCORD_INVITE = "https://discord.gg/EN6YnuCjYV" local DISCORD_LINK = "https://discord.gg/EN6YnuCjYV" local FREE_VERSION = true -- always true for this version --============================================================-- -- SOUNDS (bad quality) --============================================================-- local SFX = {} local sfxEnabled = true local function makeSfx(id, volume, pitch) local s = Instance.new("Sound") s.SoundId = id s.Volume = volume or 0.5 s.PlaybackSpeed = pitch or 1 s.Parent = SoundService return s end -- intentionally bad sounds SFX.ToggleOn = makeSfx("rbxassetid://6895079853", 0.2, 1.5) SFX.ToggleOff = makeSfx("rbxassetid://6895079853", 0.2, 0.7) SFX.Error = makeSfx("rbxassetid://5043539486", 0.3, 0.5) local function playSfx(sound) if not sfxEnabled or not sound then return end task.spawn(function() local clone = sound:Clone() clone.Parent = SoundService clone:Play() task.delay(2, function() if clone then clone:Destroy() end end) end) end local oldGui = PlayerGui:FindFirstChild("external_vip_free") if oldGui then oldGui:Destroy() end local oldNotifs = PlayerGui:FindFirstChild("external_vip_free_notifs") if oldNotifs then oldNotifs:Destroy() end --============================================================-- -- HELPERS (simplified/uglier) --============================================================-- local function New(className, properties, parent) local object = Instance.new(className) for property, value in pairs(properties or {}) do object[property] = value end object.Parent = parent return object end local function Corner(object, radius) local r = radius if r == "pill" then r = math.huge elseif r == nil then r = 4 end -- less rounded, uglier local corner = Instance.new("UICorner") if r == math.huge then corner.CornerRadius = UDim.new(1, 0) else corner.CornerRadius = UDim.new(0, r) end corner.Parent = object return corner end local function Outline(object, color, thickness, transparency) local stroke = Instance.new("UIStroke") stroke.Color = color or Theme.Border stroke.Thickness = thickness or 1 stroke.Transparency = transparency or 0 stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border stroke.Parent = object return stroke end local function Tween(object, properties, duration) local tween = TweenService:Create( object, TweenInfo.new(duration or 0.15, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), properties ) tween:Play() return tween end local function Label(parent, text, position, size, textSize, color) return New("TextLabel", { Position = position, Size = size, BackgroundTransparency = 1, Text = text, Font = Enum.Font.SourceSans, -- ugly font TextSize = textSize or 10, TextColor3 = color or Theme.Text, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Center, }, parent) end --============================================================-- -- FLAGS + OPTIONS --============================================================-- local Flags = {} local Options = {} local function registerConfig(flag, type, changeState, oldargs) Options[flag] = { type = type, changeState = changeState, oldargs = oldargs or {} } end --============================================================-- -- DISCORD GATE GUI --============================================================-- local GateGui = New("ScreenGui", { Name = "external_vip_free_gate", ResetOnSpawn = false, IgnoreGuiInset = true, DisplayOrder = 2000, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }, PlayerGui) local GateMain = New("Frame", { Name = "Gate", Size = UDim2.fromOffset(500, 380), Position = UDim2.new(0.5, -250, 0.5, -190), BackgroundColor3 = Color3.fromRGB(25, 25, 30), BorderSizePixel = 0, }, GateGui) Corner(GateMain, 10) Outline(GateMain, Color3.fromRGB(88, 101, 242), 2) -- Discord logo-ish thing local DiscordLogo = New("Frame", { Position = UDim2.new(0.5, -40, 0, 25), Size = UDim2.fromOffset(80, 80), BackgroundColor3 = Color3.fromRGB(88, 101, 242), BorderSizePixel = 0, }, GateMain) Corner(DiscordLogo, "pill") Label(DiscordLogo, "💬", UDim2.fromOffset(0, 0), UDim2.fromScale(1, 1), 40, Color3.fromRGB(255,255,255)).TextXAlignment = Enum.TextXAlignment.Center local GateTitle = Label(GateMain, "JOIN THE DISCORD FOR FULL VERSION", UDim2.fromOffset(0, 115), UDim2.new(1, 0, 0, 30), 16, Color3.fromRGB(255,255,255)) GateTitle.TextXAlignment = Enum.TextXAlignment.Center GateTitle.Font = Enum.Font.SourceSansBold local GateSub = Label(GateMain, "This is the FREE version. It's missing like half the features.", UDim2.fromOffset(0, 145), UDim2.new(1, 0, 0, 20), 11, Color3.fromRGB(180, 180, 180)) GateSub.TextXAlignment = Enum.TextXAlignment.Center local GateSub2 = Label(GateMain, "The full version has EVERYTHING. Join to get it.", UDim2.fromOffset(0, 165), UDim2.new(1, 0, 0, 20), 11, Color3.fromRGB(180, 180, 180)) GateSub2.TextXAlignment = Enum.TextXAlignment.Center local GateSub3 = Label(GateMain, "(we swear it actually works, rscripts.net is just weird and i cant post the full script for some reason)", UDim2.fromOffset(0, 185), UDim2.new(1, 0, 0, 20), 9, Color3.fromRGB(120, 120, 120)) GateSub3.TextXAlignment = Enum.TextXAlignment.Center -- Discord button local DiscordBtn = New("TextButton", { Position = UDim2.new(0.5, -120, 0, 220), Size = UDim2.fromOffset(240, 40), BackgroundColor3 = Color3.fromRGB(88, 101, 242), BorderSizePixel = 0, Text = "JOIN DISCORD (REQUIRED)", Font = Enum.Font.SourceSansBold, TextColor3 = Color3.fromRGB(255,255,255), TextSize = 13, AutoButtonColor = false, }, GateMain) Corner(DiscordBtn, 6) Outline(DiscordBtn, Color3.fromRGB(120, 130, 255), 2) DiscordBtn.MouseButton1Click:Connect(function() pcall(function() local http = game:GetService("HttpService") -- try to open in browser if setclipboard then setclipboard(DISCORD_LINK) -- Show notification that we copied local copyNote = Label(GateMain, "Link copied to clipboard!", UDim2.fromOffset(0, 265), UDim2.new(1, 0, 0, 20), 10, Color3.fromRGB(100, 220, 100)) copyNote.TextXAlignment = Enum.TextXAlignment.Center task.delay(3, function() copyNote:Destroy() end) end end) -- Actually try to open pcall(function() local http = game:GetService("HttpService") -- In most executors, this works if syn and syn.request then -- no end end) end) -- "Skip" button (loads bad free version) local SkipBtn = New("TextButton", { Position = UDim2.new(0.5, -120, 0, 280), Size = UDim2.fromOffset(240, 35), BackgroundColor3 = Color3.fromRGB(40, 40, 45), BorderSizePixel = 0, Text = "Continue with FREE version (bad)", Font = Enum.Font.SourceSans, TextColor3 = Color3.fromRGB(150, 150, 150), TextSize = 11, AutoButtonColor = false, }, GateMain) Corner(SkipBtn, 6) Outline(SkipBtn, Color3.fromRGB(70, 70, 75), 1) SkipBtn.MouseButton1Click:Connect(function() GateGui.Enabled = false notify("Using FREE version. Join Discord for full!", "warn", 5) end) -- Discord gate notifications local GateNotify = New("TextLabel", { Position = UDim2.fromOffset(0, 325), Size = UDim2.new(1, 0, 0, 20), BackgroundTransparency = 1, Text = "You MUST join Discord to get the full script!", Font = Enum.Font.SourceSansBold, TextSize = 11, TextColor3 = Color3.fromRGB(240, 200, 90), TextXAlignment = Enum.TextXAlignment.Center, }, GateMain) --============================================================-- -- NOTIFICATIONS (bad version) --============================================================-- local NotifyGui = New("ScreenGui", { Name = "external_vip_free_notifs", ResetOnSpawn = false, IgnoreGuiInset = true, DisplayOrder = 1000, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }, PlayerGui) local NotifyHolder = New("Frame", { Name = "Holder", AnchorPoint = Vector2.new(1, 0), Position = UDim2.new(1, -16, 0, 16), Size = UDim2.fromOffset(280, 400), BackgroundTransparency = 1, }, NotifyGui) New("UIListLayout", { Padding = UDim.new(0, 6), HorizontalAlignment = Enum.HorizontalAlignment.Right, VerticalAlignment = Enum.VerticalAlignment.Top, SortOrder = Enum.SortOrder.LayoutOrder, }, NotifyHolder) local notifyCounter = 0 local function notify(text, kind, duration) kind = kind or "info" duration = duration or 3 notifyCounter += 1 local toast = New("Frame", { Size = UDim2.fromOffset(260, 50), Position = UDim2.new(1, 300, 0, 0), BackgroundColor3 = Theme.Panel, BorderSizePixel = 0, LayoutOrder = notifyCounter, ClipsDescendants = true, }, NotifyHolder) Corner(toast, 6) Outline(toast, Theme.Border, 1) local color = kind == "success" and Theme.Green or (kind == "warn" and Theme.Yellow or (kind == "error" and Theme.Red or Theme.Cyan)) local accent = New("Frame", { Position = UDim2.fromOffset(0, 0), Size = UDim2.fromOffset(3, 50), BackgroundColor3 = color, BorderSizePixel = 0, }, toast) Label(toast, text, UDim2.fromOffset(12, 0), UDim2.new(1, -20, 1, 0), 10, Theme.Text).TextWrapped = true playSfx(SFX.ToggleOn) toast.Position = UDim2.new(1, 300, 0, 0) Tween(toast, { Position = UDim2.new(0, 0, 0, 0) }, 0.25) task.delay(duration, function() if not toast.Parent then return end Tween(toast, { Position = UDim2.new(1, 300, 0, 0) }, 0.25) task.wait(0.3) toast:Destroy() end) end --============================================================-- -- GUI --============================================================-- local Gui = New("ScreenGui", { Name = "external_vip_free", ResetOnSpawn = false, IgnoreGuiInset = true, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }, PlayerGui) local Main = New("Frame", { Name = "Window", Size = UDim2.fromOffset(WINDOW_WIDTH, WINDOW_HEIGHT), Position = UDim2.new(0.5, -WINDOW_WIDTH/2, 0.5, -WINDOW_HEIGHT/2), BackgroundColor3 = Theme.Background, BorderSizePixel = 0, }, Gui) Corner(Main, 8) Outline(Main, Theme.Border, 2) -- BAD WATERMARK local Watermark = Label(Main, "FREE VERSION", UDim2.new(1, -120, 0, 5), UDim2.fromOffset(100, 20), 10, Color3.fromRGB(240, 200, 90)) Watermark.TextXAlignment = Enum.TextXAlignment.Right Watermark.Font = Enum.Font.SourceSansBold -- SIDEBAR local Sidebar = New("Frame", { Name = "Sidebar", Size = UDim2.fromOffset(SIDEBAR_WIDTH, WINDOW_HEIGHT), BackgroundColor3 = Theme.Sidebar, BorderSizePixel = 0, ClipsDescendants = true, }, Main) Corner(Sidebar, 8) -- BRAND local Brand = New("Frame", { Position = UDim2.fromOffset(10, 10), Size = UDim2.fromOffset(160, 40), BackgroundTransparency = 1, }, Sidebar) local BrandText = Label(Brand, "external.vip", UDim2.fromOffset(0, 5), UDim2.new(1, 0, 0, 18), 13, Theme.White) BrandText.Font = Enum.Font.SourceSansBold Label(Brand, "FREE VERSION (limited)", UDim2.fromOffset(0, 23), UDim2.new(1, 0, 0, 14), 9, Theme.Yellow) -- NAVIGATION local Navigation = New("ScrollingFrame", { Position = UDim2.fromOffset(10, 65), Size = UDim2.new(1, -20, 1, -130), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 0, CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.Y, ScrollingDirection = Enum.ScrollingDirection.Y, }, Sidebar) New("UIListLayout", { Padding = UDim.new(0, 3), SortOrder = Enum.SortOrder.LayoutOrder }, Navigation) local Pages = {} local NavItems = {} local CurrentPage = nil local function CreatePage(name) local page = New("ScrollingFrame", { Name = name, Position = UDim2.fromOffset(SIDEBAR_WIDTH, 1), Size = UDim2.new(1, -SIDEBAR_WIDTH, 1, -21), BackgroundTransparency = 1, BorderSizePixel = 0, Visible = false, ScrollingDirection = Enum.ScrollingDirection.Y, ScrollBarThickness = 3, ScrollBarImageColor3 = Theme.Cyan, ScrollBarImageTransparency = 0.5, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(0, 0, 0, 0), ClipsDescendants = true, }, Main) New("UIPadding", { PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10), PaddingTop = UDim.new(0, 10), PaddingBottom = UDim.new(0, 15), }, page) New("UIListLayout", { FillDirection = Enum.FillDirection.Vertical, HorizontalAlignment = Enum.HorizontalAlignment.Left, VerticalAlignment = Enum.VerticalAlignment.Top, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }, page) Pages[name] = page return page end local function CreateNav(name, icon) local button = New("TextButton", { Size = UDim2.new(1, 0, 0, 30), BackgroundColor3 = Theme.Sidebar, BorderSizePixel = 0, AutoButtonColor = false, Text = "", LayoutOrder = #NavItems + 1, }, Navigation) Corner(button, 6) local iconLabel = Label(button, icon, UDim2.fromOffset(8, 0), UDim2.fromOffset(20, 30), 12, Theme.SubText) iconLabel.TextXAlignment = Enum.TextXAlignment.Center local text = Label(button, name, UDim2.fromOffset(34, 0), UDim2.new(1, -40, 1, 0), 10, Theme.SubText) NavItems[name] = { Button = button, Text = text, Icon = iconLabel } button.MouseEnter:Connect(function() if CurrentPage ~= name then Tween(button, { BackgroundColor3 = Color3.fromRGB(35, 35, 35) }, 0.1) end end) button.MouseLeave:Connect(function() if CurrentPage ~= name then Tween(button, { BackgroundColor3 = Theme.Sidebar }, 0.1) end end) button.MouseButton1Click:Connect(function() CurrentPage = name for pageName, page in pairs(Pages) do page.Visible = pageName == name end for navName, item in pairs(NavItems) do local selected = navName == name Tween(item.Button, { BackgroundColor3 = selected and Color3.fromRGB(45, 45, 45) or Theme.Sidebar }, 0.1) Tween(item.Text, { TextColor3 = selected and Theme.White or Theme.SubText }, 0.1) Tween(item.Icon, { TextColor3 = selected and Theme.Cyan or Theme.SubText }, 0.1) end end) return button end local function PageHeader(parent, title, subtitle) local holder = New("Frame", { Size = UDim2.new(1, 0, 0, 40), BackgroundTransparency = 1, LayoutOrder = 1, }, parent) local titleLabel = Label(holder, title, UDim2.fromOffset(0, 0), UDim2.new(1, 0, 0, 22), 14, Theme.White) titleLabel.Font = Enum.Font.SourceSansBold Label(holder, subtitle, UDim2.fromOffset(0, 22), UDim2.new(1, 0, 0, 14), 9, Theme.Muted) return holder end local function Columns(parent, amount, perRow) perRow = perRow or 2 -- less columns because we're lazy local rows = math.ceil(amount / perRow) local totalHeight = (rows * CARD_HEIGHT) + (math.max(rows - 1, 0) * CARD_GAP) local grid = New("Frame", { Name = "CardGrid", Size = UDim2.new(1, 0, 0, totalHeight), BackgroundTransparency = 1, BorderSizePixel = 0, ClipsDescendants = false, LayoutOrder = 2, }, parent) local cardOffset = -math.ceil((CARD_GAP * (perRow - 1)) / perRow) local holders = {} for i = 1, amount do local holder = New("Frame", { Size = UDim2.new(1/perRow, cardOffset, 0, CARD_HEIGHT), BackgroundTransparency = 1, BorderSizePixel = 0, ClipsDescendants = false, }, grid) holders[i] = holder end New("UIGridLayout", { CellSize = UDim2.new(1/perRow, cardOffset, 0, CARD_HEIGHT), CellPadding = UDim2.fromOffset(CARD_GAP, CARD_GAP), FillDirection = Enum.FillDirection.Horizontal, FillDirectionMaxCells = perRow, HorizontalAlignment = Enum.HorizontalAlignment.Left, VerticalAlignment = Enum.VerticalAlignment.Top, SortOrder = Enum.SortOrder.LayoutOrder, }, grid) for i, holder in ipairs(holders) do holder.LayoutOrder = i end return holders end local function Card(parent, title) local card = New("Frame", { Size = UDim2.new(1, 0, 1, 0), BackgroundColor3 = Theme.Panel, BorderSizePixel = 0, ClipsDescendants = false, }, parent) Corner(card, 6) Outline(card, Theme.Border, 1) local titleLabel = Label(card, title, UDim2.fromOffset(8, 6), UDim2.new(1, -16, 0, 16), 9, Theme.White) titleLabel.Font = Enum.Font.SourceSansBold local content = New("ScrollingFrame", { Position = UDim2.fromOffset(6, 26), Size = UDim2.new(1, -12, 1, -32), BackgroundTransparency = 1, BorderSizePixel = 0, ClipsDescendants = true, ScrollBarThickness = 2, ScrollBarImageColor3 = Theme.Cyan, ScrollBarImageTransparency = 0.5, CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.Y, ScrollingDirection = Enum.ScrollingDirection.Y, }, card) New("UIListLayout", { FillDirection = Enum.FillDirection.Vertical, Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder, }, content) New("UIPadding", { PaddingBottom = UDim.new(0, 4) }, content) return content end --============================================================-- -- CHECKBOX (basic/bad) --============================================================-- local allToggles = {} local function Checkbox(parent, name, flag, default, callback) local row = New("Frame", { Size = UDim2.new(1, 0, 0, 22), BackgroundTransparency = 1 }, parent) local Box = New("TextButton", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -2, 0.5, 0), Size = UDim2.new(0, 16, 0, 16), BackgroundColor3 = Theme.Disabled, BorderSizePixel = 0, Text = "", AutoButtonColor = false, }, row) Corner(Box, 3) local boxStroke = Outline(Box, Theme.BorderLight, 1) Label(row, name, UDim2.fromOffset(1, 0), UDim2.new(1, -24, 1, 0), 9, Theme.Text) local state = default == true if flag then Flags[flag] = state end local function render(animated) local dur = animated and 0.12 or 0 Tween(Box, { BackgroundColor3 = state and Theme.Cyan or Theme.Disabled }, dur) Tween(boxStroke, { Color = state and Theme.Cyan or Theme.BorderLight }, dur) Box.Text = state and "✓" or "" Box.TextColor3 = Color3.fromRGB(255,255,255) Box.Font = Enum.Font.SourceSansBold Box.TextSize = 10 end local function set(v, fire) v = v == true if state == v and not fire then return end local changed = state ~= v state = v if flag then Flags[flag] = v end render(true) if changed then playSfx(state and SFX.ToggleOn or SFX.ToggleOff) end if fire ~= false and callback then task.spawn(callback, v) end end Box.MouseButton1Click:Connect(function() set(not state, true) end) render(false) if flag then registerConfig(flag, "toggle", set, { value = default }) end local obj = { Set = set, Get = function() return state end, render = render } table.insert(allToggles, obj) return obj end --============================================================-- -- KEYBIND (basic/bad) --============================================================-- local keybindRegistry = {} local function KeybindButton(parent, name, flag, defaultKey, actionFn, callback) local row = New("Frame", { Size = UDim2.new(1, 0, 0, 22), BackgroundTransparency = 1 }, parent) Label(row, name, UDim2.fromOffset(1, 0), UDim2.new(1, -56, 1, 0), 9, Theme.Text) local keyBtn = New("TextButton", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -2, 0.5, 0), Size = UDim2.new(0, 50, 0, 18), BackgroundColor3 = Theme.Panel2, BorderSizePixel = 0, Text = defaultKey and defaultKey.Name or "None", Font = Enum.Font.SourceSans, TextColor3 = Theme.SubText, TextSize = 8, AutoButtonColor = false, }, row) Corner(keyBtn, 4) Outline(keyBtn, Theme.Border, 1) local currentKey = defaultKey or Enum.KeyCode.Unknown local listening = false if flag then Flags[flag] = currentKey end keybindRegistry[flag] = { action = actionFn, getKey = function() return currentKey end, } local function setKey(k, fire) currentKey = k if flag then Flags[flag] = k end keyBtn.Text = k and k.Name or "None" keyBtn.TextColor3 = Theme.SubText if fire ~= false and callback then task.spawn(callback, k) end end keyBtn.MouseButton1Click:Connect(function() listening = true keyBtn.Text = "..." keyBtn.TextColor3 = Theme.Cyan end) UIS.InputBegan:Connect(function(input, gp) if gp then return end if listening then listening = false if input.KeyCode ~= Enum.KeyCode.Unknown then setKey(input.KeyCode, true) else setKey(Enum.UserInputType.MouseButton1, true) end end end) if flag then registerConfig(flag, "keybind", function(v) if typeof(v) == "EnumItem" then setKey(v, true) end end, { key = defaultKey }) end return { Set = function(k) setKey(k, false) end, Get = function() return currentKey end } end UIS.InputBegan:Connect(function(input, gp) if gp then return end if UIS:GetFocusedTextBox() then return end for flag, entry in pairs(keybindRegistry) do if entry.getKey() == input.KeyCode and input.KeyCode ~= Enum.KeyCode.Unknown then if entry.action then task.spawn(entry.action) end end end end) --============================================================-- -- SLIDER (basic/bad) --============================================================-- local function Slider(parent, name, flag, min, max, value, suffix, callback) local holder = New("Frame", { Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1 }, parent) Label(holder, name, UDim2.fromOffset(1, 0), UDim2.new(0.7, 0, 0, 12), 9, Theme.Text) local valueLabel = Label(holder, tostring(value)..(suffix or ""), UDim2.fromOffset(0, 0), UDim2.new(1, 0, 0, 12), 8, Theme.SubText) valueLabel.TextXAlignment = Enum.TextXAlignment.Right local bar = New("Frame", { Position = UDim2.fromOffset(1, 22), Size = UDim2.new(1, -2, 0, 6), BackgroundColor3 = Color3.fromRGB(40, 40, 40), BorderSizePixel = 0, }, holder) Corner(bar, "pill") local p0 = math.clamp((value - min) / (max - min), 0, 1) local fill = New("Frame", { Size = UDim2.new(p0, 0, 1, 0), BackgroundColor3 = Theme.Cyan, BorderSizePixel = 0 }, bar) Corner(fill, "pill") local knob = New("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(p0, 0, 0.5, 0), Size = UDim2.fromOffset(10, 10), BackgroundColor3 = Theme.White, BorderSizePixel = 0, ZIndex = 3, }, bar) Corner(knob, "pill") local currentValue = value if flag then Flags[flag] = value end local function render(v) local p = math.clamp((v - min) / (max - min), 0, 1) fill.Size = UDim2.new(p, 0, 1, 0) knob.Position = UDim2.new(p, 0, 0.5, 0) valueLabel.Text = tostring(v)..(suffix or "") end local function set(v, fire) v = math.clamp(math.floor(v + 0.5), min, max) if v == currentValue and fire then return end currentValue = v if flag then Flags[flag] = v end render(v) if fire ~= false and callback then task.spawn(callback, v) end end local dragging = false local function updateFromX(x) local p = math.clamp((x - bar.AbsolutePosition.X) / math.max(bar.AbsoluteSize.X, 1), 0, 1) set(min + (max - min) * p, true) end bar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true updateFromX(input.Position.X) end end) UIS.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then updateFromX(input.Position.X) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) set(value, false) if flag then registerConfig(flag, "slider", set, { value = value }) end return { Set = set, Get = function() return currentValue end } end --============================================================-- -- DROPDOWN (basic/bad) --============================================================-- local function Dropdown(parent, name, flag, options, default, callback) local holder = New("Frame", { Size = UDim2.new(1, 0, 0, 44), BackgroundTransparency = 1, ClipsDescendants = false, }, parent) Label(holder, name, UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 12), 9, Theme.Text) local button = New("TextButton", { Position = UDim2.fromOffset(0, 16), Size = UDim2.new(1, 0, 0, 24), BackgroundColor3 = Theme.Panel2, BorderSizePixel = 0, AutoButtonColor = false, Text = "", }, holder) Corner(button, 5) local bStroke = Outline(button, Theme.Border, 1) local selected = Label(button, default or options[1], UDim2.fromOffset(8, 0), UDim2.new(1, -26, 1, 0), 9, Theme.SubText) local arrow = Label(button, "v", UDim2.new(1, -18, 0, 0), UDim2.fromOffset(12, 24), 10, Theme.Muted) arrow.TextXAlignment = Enum.TextXAlignment.Center local open = false local menu = nil local current = default or options[1] local values = options if flag then Flags[flag] = current end local function setValue(v, fire) if not table.find(values, v) then v = values[1] end current = v if flag then Flags[flag] = v end selected.Text = tostring(v) if fire ~= false and callback then task.spawn(callback, v) end end local function setOpen(state) if open and not state and menu then menu:Destroy() menu = nil end open = state Tween(arrow, { Rotation = open and 180 or 0 }, 0.15) if open then menu = New("Frame", { Position = UDim2.new(0, 0, 0, 42), Size = UDim2.new(1, 0, 0, math.min(#values * 22, 110)), BackgroundColor3 = Color3.fromRGB(35, 35, 35), BorderSizePixel = 0, ZIndex = 100, }, holder) Corner(menu, 5) Outline(menu, Theme.BorderLight, 1) for i, opt in ipairs(values) do local item = New("TextButton", { Position = UDim2.fromOffset(0, (i-1)*22), Size = UDim2.new(1, 0, 0, 22), BackgroundColor3 = Color3.fromRGB(35, 35, 35), BackgroundTransparency = 1, BorderSizePixel = 0, AutoButtonColor = false, Text = opt, Font = Enum.Font.SourceSans, TextSize = 9, TextColor3 = Theme.SubText, ZIndex = 101, }, menu) local p = Instance.new("UIPadding") p.PaddingLeft = UDim.new(0, 8) p.Parent = item item.MouseEnter:Connect(function() Tween(item, { BackgroundTransparency = 0, TextColor3 = Theme.White, BackgroundColor3 = Color3.fromRGB(45, 45, 45) }, 0.1) end) item.MouseLeave:Connect(function() Tween(item, { BackgroundTransparency = 1, TextColor3 = Theme.SubText }, 0.1) end) item.MouseButton1Click:Connect(function() setValue(opt, true) if menu then menu:Destroy() menu = nil end open = false Tween(arrow, { Rotation = 0 }, 0.12) end) end end end button.MouseButton1Click:Connect(function() setOpen(not open) end) setValue(current, false) if flag then registerConfig(flag, "list", function(v) setValue(v, true) end, { value = default }) end return { Set = function(v) setValue(v, true) end, Get = function() return current end, Refresh = function(newOpts) values = newOpts if not table.find(values, current) then setValue(values[1] or "None", false) end end, } end --============================================================-- -- TEXTBOX (basic/bad) --============================================================-- local function Textbox(parent, name, flag, default, placeholder, callback) local row = New("Frame", { Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1 }, parent) Label(row, name, UDim2.fromOffset(1, 0), UDim2.new(0.4, 0, 1, 0), 9, Theme.Text) local box = New("TextBox", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -2, 0.5, 0), Size = UDim2.new(0.55, 0, 20, 0), BackgroundColor3 = Theme.Panel2, BorderSizePixel = 0, Font = Enum.Font.SourceSans, Text = default or "", PlaceholderText = placeholder or "...", TextColor3 = Theme.Text, TextSize = 9, TextXAlignment = Enum.TextXAlignment.Left, ClearTextOnFocus = false, }, row) Corner(box, 4) Outline(box, Theme.Border, 1) New("UIPadding", { PaddingLeft = UDim.new(0, 6) }, box) if flag then Flags[flag] = default or "" end box.FocusLost:Connect(function() if flag then Flags[flag] = box.Text end if callback then task.spawn(callback, box.Text) end end) if flag then registerConfig(flag, "textbox", function(v) box.Text = v or "" Flags[flag] = box.Text end, { value = default }) end return { Set = function(v) box.Text = v or "" if flag then Flags[flag] = box.Text end end, Get = function() return box.Text end } end --============================================================-- -- COLORPICKER (basic/bad - only 4 colors) --============================================================-- local function Colorpicker(parent, name, flag, default, callback) local Row = New("Frame", { Size = UDim2.new(1, 0, 0, 22), BackgroundTransparency = 1 }, parent) Label(Row, name, UDim2.fromOffset(1, 0), UDim2.new(1, -46, 1, 0), 9, Theme.Text) local Swatch = New("TextButton", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -2, 0.5, 0), Size = UDim2.new(0, 36, 0, 16), BackgroundColor3 = default or Color3.new(1,1,1), BorderSizePixel = 0, Text = "", AutoButtonColor = false, }, Row) Corner(Swatch, 4) Outline(Swatch, Theme.Border, 1) local current = default or Color3.new(1,1,1) if flag then Flags[flag] = current end local function apply(c, fire) current = c if flag then Flags[flag] = c end Swatch.BackgroundColor3 = c if fire ~= false and callback then task.spawn(callback, c) end end -- Only 4 bad colors local PALETTE = { Color3.fromRGB(255,255,255), Color3.fromRGB(100, 180, 220), -- washed cyan Color3.fromRGB(255, 80, 80), -- red Color3.fromRGB(100, 200, 100), -- green } local idx = 1 for i, c in ipairs(PALETTE) do if c.R == current.R and c.G == current.G and c.B == current.B then idx = i break end end Swatch.MouseButton1Click:Connect(function() idx = idx % #PALETTE + 1 apply(PALETTE[idx], true) end) if flag then registerConfig(flag, "colorpicker", function(v) if typeof(v) == "Color3" then apply(v, true) end end, { color = default }) end return { Set = function(c) apply(c, false) end, Get = function() return current end } end local function Button(parent, text, callback) local row = New("Frame", { Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1 }, parent) local btn = New("TextButton", { Position = UDim2.fromOffset(0, 2), Size = UDim2.new(1, 0, 0, 20), BackgroundColor3 = Theme.Panel2, BorderSizePixel = 0, Font = Enum.Font.SourceSans, Text = text, TextColor3 = Theme.Text, TextSize = 9, AutoButtonColor = false, }, row) Corner(btn, 4) local s = Outline(btn, Theme.Border, 1) btn.MouseEnter:Connect(function() Tween(s, { Color = Theme.Cyan }, 0.1) end) btn.MouseLeave:Connect(function() Tween(s, { Color = Theme.Border }, 0.1) end) btn.MouseButton1Click:Connect(function() if callback then task.spawn(callback) end end) end --============================================================-- -- CONFIG ENGINE (basic) --============================================================-- local CONFIG_FOLDER = "ExternalVipFreeConfigs" local function ensureFolder() if not isfolder(CONFIG_FOLDER) then makefolder(CONFIG_FOLDER) end end local function sanitizeName(name) if not name or name == "" then return nil end name = tostring(name):gsub("[^%w_%- ]", "") if name == "" then return nil end return name end local function buildConfigTable() local data = {} for flag, v in pairs(Flags) do if not Options[flag] then continue end if typeof(v) == "Color3" then data[flag] = { v.R, v.G, v.B, "__color" } elseif typeof(v) == "EnumItem" then data[flag] = { tostring(v.EnumType), v.Name, "__enum" } else data[flag] = v end end return data end local function applyConfigTable(data) if type(data) ~= "table" then return end for flag, v in pairs(data) do local opt = Options[flag] if opt then task.spawn(function() pcall(function() if type(v) == "table" and v[4] == "__color" then opt.changeState(Color3.new(v[1], v[2], v[3])) elseif type(v) == "table" and v[3] == "__enum" then local et = Enum[v[1]] if et and et[v[2]] then opt.changeState(et[v[2]]) end else opt.changeState(v) end end) end) end end end local function refreshConfigList(dropdown) ensureFolder() local tbl = {} local ok, files = pcall(listfiles, CONFIG_FOLDER) if ok and type(files) == "table" then for _, path in ipairs(files) do local name = path:match("([^/\\]+)%.json$") if name then table.insert(tbl, name) end end end table.sort(tbl) if dropdown then dropdown.Refresh(tbl) end return tbl end --============================================================-- -- PAGES (reduced and crippled) --============================================================-- local SilentAimPage = CreatePage("Silent Aim") local VisualsPage = CreatePage("Visuals") local MiscPage = CreatePage("Misc") local ConfigPage = CreatePage("Config") --============================================================-- -- SILENT AIM (crippled) --============================================================ PageHeader(SilentAimPage, "Silent Aim", "FREE VERSION - limited features") do local silentAimSettings = { enabled = false, fov = 100, -- smaller FOV hitbox = "Head", -- locked features } local saCircle pcall(function() saCircle = Drawing.new("Circle") saCircle.Thickness = 1 saCircle.NumSides = 30 saCircle.Filled = false saCircle.Color = ACCENT saCircle.Visible = false end) local function isTargetable(char) if not char or char == LocalPlayer.Character then return false end local hum = char:FindFirstChildOfClass("Humanoid") if not hum or hum.Health <= 0 then return false end return true end local cachedRay = nil RunService.RenderStepped:Connect(function() cachedRay = nil local camera = workspace.CurrentCamera if not camera then return end if saCircle then saCircle.Visible = silentAimSettings.enabled if saCircle.Visible then saCircle.Radius = silentAimSettings.fov local vp = camera.ViewportSize saCircle.Position = Vector2.new(vp.X/2, vp.Y/2) saCircle.Color = ACCENT saCircle.Filled = false saCircle.Transparency = 1 saCircle.Thickness = 1 end end if not silentAimSettings.enabled then return end local best, bestDist = nil, silentAimSettings.fov local center = Vector2.new(camera.ViewportSize.X*0.5, camera.ViewportSize.Y*0.5) for _, plr in ipairs(Players:GetPlayers()) do local char = plr.Character if not isTargetable(char) then continue end local part = char:FindFirstChild("Head") if part then local sp, onScreen = camera:WorldToViewportPoint(part.Position) if onScreen then local d = (Vector2.new(sp.X, sp.Y) - center).Magnitude if d < bestDist then best, bestDist = part, d end end end end if best then local origin = camera.CFrame.Position local dir = best.Position - origin if dir.Magnitude > 1 then cachedRay = Ray.new(origin, dir.Unit) end end end) do local nc = newcclosure or function(f) return f end local old old = hookmetamethod(game, "__namecall", nc(function(self, ...) local method = getnamecallmethod() if silentAimSettings.enabled and cachedRay and self == workspace.CurrentCamera and (method == "ViewportPointToRay" or method == "ScreenPointToRay") then return cachedRay end return old(self, ...) end)) end local saGrid = Columns(SilentAimPage, 2, 2) local saMain = Card(saGrid[1], "Silent Aim (BASIC)") Checkbox(saMain, "Enabled", "sa_enabled", false, function(v) silentAimSettings.enabled = v end) Checkbox(saMain, "Show FOV", "sa_showfov", true, function(v) end) Slider(saMain, "FOV", "sa_fov", 10, 300, 100, " px", function(v) silentAimSettings.fov = v end) local saLocked = Card(saGrid[2], "LOCKED FEATURES") Label(saLocked, "❌ Hitbox Selection", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 20), 10, Theme.Red) Label(saLocked, "❌ Team Check", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 20), 10, Theme.Red) Label(saLocked, "❌ Wall Check", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 20), 10, Theme.Red) Label(saLocked, "❌ Smooth Aim", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 20), 10, Theme.Red) Label(saLocked, "🔒 Join Discord for full", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 20), 10, Theme.Yellow) end --============================================================-- -- VISUALS (crippled) --============================================================ PageHeader(VisualsPage, "Visuals", "FREE VERSION - limited features") do local espSettings = { enabled = false, boxes = true, names = true, boxcolor = Theme.Cyan, maxdistance = 500, -- very limited } local BOX_LINES = 4 -- only a simple box, not corners local espObjects = {} local function createEspDrawings() local obj = {box = {}} for i = 1, BOX_LINES do local l = Drawing.new("Line") l.Thickness = 2 l.Transparency = 1 l.Visible = false table.insert(obj.box, l) end obj.nameText = Drawing.new("Text") obj.nameText.Size = 13 obj.nameText.Center = true obj.nameText.Outline = true obj.nameText.Font = 2 obj.nameText.Visible = false return obj end local function removeEsp(plr) local o = espObjects[plr] if not o then return end pcall(function() for _, l in ipairs(o.box) do l:Remove() end o.nameText:Remove() end) espObjects[plr] = nil end local function clearEsp() for plr in pairs(espObjects) do removeEsp(plr) end end local function getScreenBounds(camera, character) local minX, minY = math.huge, math.huge local maxX, maxY = -math.huge, -math.huge local found = false for _, part in ipairs(character:GetChildren()) do if part:IsA("BasePart") then local sp = camera:WorldToViewportPoint(part.Position) if sp.Z > 0 then minX = math.min(minX, sp.X); minY = math.min(minY, sp.Y) maxX = math.max(maxX, sp.X); maxY = math.max(maxY, sp.Y) found = true end end end if not found then return nil end return minX, minY, maxX, maxY end local function updateSimpleBox(obj, minX, minY, maxX, maxY, alpha, color) -- simple rectangle (4 lines) local lines = { {Vector2.new(minX,minY), Vector2.new(maxX,minY)}, {Vector2.new(maxX,minY), Vector2.new(maxX,maxY)}, {Vector2.new(maxX,maxY), Vector2.new(minX,maxY)}, {Vector2.new(minX,maxY), Vector2.new(minX,minY)}, } for i = 1, 4 do local l = obj.box[i] l.From, l.To = lines[i][1], lines[i][2] l.Color = color l.Thickness = 2 l.Transparency = alpha l.Visible = true end end local function updateEspPlayer(plr, camera) if not espSettings.enabled or plr == LocalPlayer then return end local char = plr.Character if not char then if espObjects[plr] then removeEsp(plr) end return end local root = char:FindFirstChild("HumanoidRootPart") or char:FindFirstChild("Torso") or char.PrimaryPart local hum = char:FindFirstChildOfClass("Humanoid") if not root or not hum or hum.Health <= 0 then if espObjects[plr] then removeEsp(plr) end return end local dist = (camera.CFrame.Position - root.Position).Magnitude if dist > espSettings.maxdistance then local o = espObjects[plr] if o then for _, l in ipairs(o.box) do l.Visible = false end o.nameText.Visible = false end return end local obj = espObjects[plr] if not obj then obj = createEspDrawings() espObjects[plr] = obj end local alpha = 1 local minX, minY, maxX, maxY = getScreenBounds(camera, char) if not minX then for _, l in ipairs(obj.box) do l.Visible = false end obj.nameText.Visible = false return end if espSettings.boxes then updateSimpleBox(obj, minX, minY, maxX, maxY, alpha, espSettings.boxcolor) else for _, l in ipairs(obj.box) do l.Visible = false end end if espSettings.names then obj.nameText.Text = plr.Name obj.nameText.Position = Vector2.new((minX+maxX)/2, minY-16) obj.nameText.Color = Color3.fromRGB(255,255,255) obj.nameText.Visible = true else obj.nameText.Visible = false end end Players.PlayerRemoving:Connect(function(plr) removeEsp(plr) end) RunService.RenderStepped:Connect(function() local camera = workspace.CurrentCamera if not camera then return end if espSettings.enabled then for _, plr in next, Players:GetPlayers() do pcall(updateEspPlayer, plr, camera) end else if next(espObjects) then clearEsp() end end end) local espGrid = Columns(VisualsPage, 2, 2) local espCard = Card(espGrid[1], "ESP (BASIC)") Checkbox(espCard, "Enable ESP", "esp_enabled", false, function(v) espSettings.enabled = v if not v then clearEsp() end end) Checkbox(espCard, "Simple Box", "esp_boxes", true, function(v) espSettings.boxes = v end) Checkbox(espCard, "Names", "esp_names", true, function(v) espSettings.names = v end) Slider(espCard, "Max Distance", "esp_maxdist", 100, 1000, 500, "m", function(v) espSettings.maxdistance = v end) local espLocked = Card(espGrid[2], "LOCKED FEATURES") Label(espLocked, "❌ Skeleton ESP", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ Tracers", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ Vehicle ESP", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ Corpse ESP", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ Weapon ESP", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ World Tinter", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "❌ Full Bright", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(espLocked, "🔒 Join Discord for full", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Yellow) end --============================================================-- -- MISC (crippled) --============================================================ PageHeader(MiscPage, "Misc", "FREE VERSION - limited features") do -- only infinite jump works local jumpSettings = { infiniteJump = false } UIS.JumpRequest:Connect(function() if not jumpSettings.infiniteJump then return end local c = LocalPlayer.Character if not c then return end local h = c:FindFirstChildOfClass("Humanoid") if h then h.Jump = true end end) local miscGrid = Columns(MiscPage, 2, 2) local jumpCard = Card(miscGrid[1], "Movement (BASIC)") Checkbox(jumpCard, "Infinite Jump", "ij_enabled", false, function(v) jumpSettings.infiniteJump = v end) local miscLocked = Card(miscGrid[2], "LOCKED FEATURES") Label(miscLocked, "❌ High Jump", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Noclip", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Zoom", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Car Fly", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Hit Sounds", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Hit Notifier", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Gun Glow", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "❌ Bullet Tracers", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Red) Label(miscLocked, "🔒 Join Discord for full", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 9, Theme.Yellow) end --============================================================-- -- CONFIG PAGE (basic) --============================================================ PageHeader(ConfigPage, "Config", "FREE VERSION - save/load settings") local cfgGrid = Columns(ConfigPage, 2, 2) local createCard = Card(cfgGrid[1], "Create Config") Textbox(createCard, "Name", "cfg_name", "", "my_settings", nil) Button(createCard, "Create New Config", function() local name = sanitizeName(Flags["cfg_name"]) if not name then notify("Enter a config name", "error") return end ensureFolder() local path = CONFIG_FOLDER .. "/" .. name .. ".json" if isfile(path) then notify(name .. " already exists", "warn") return end writefile(path, HttpService:JSONEncode(buildConfigTable())) notify("Created: " .. name, "success") if _G.__cfgRefresh then _G.__cfgRefresh() end end) local manageCard = Card(cfgGrid[2], "Manage Configs") local cfgDropdown = Dropdown(manageCard, "Selected", "cfg_selected", {"None"}, "None", nil) Button(manageCard, "Load", function() local name = sanitizeName(Flags["cfg_selected"]) if not name or name == "None" then notify("Select a config", "error") return end local path = CONFIG_FOLDER .. "/" .. name .. ".json" if not isfile(path) then notify("Config not found", "error") return end local ok, data = pcall(function() return HttpService:JSONDecode(readfile(path)) end) if not ok or type(data) ~= "table" then notify("Corrupt config", "error") return end applyConfigTable(data) notify("Loaded: " .. name, "success") end) Button(manageCard, "Save", function() local name = sanitizeName(Flags["cfg_selected"]) if not name or name == "None" then notify("Select a config", "error") return end local path = CONFIG_FOLDER .. "/" .. name .. ".json" if not isfile(path) then notify("Config not found", "error") return end writefile(path, HttpService:JSONEncode(buildConfigTable())) notify("Saved: " .. name, "success") end) Button(manageCard, "Delete", function() local name = sanitizeName(Flags["cfg_selected"]) if not name or name == "None" then notify("Select a config", "error") return end local path = CONFIG_FOLDER .. "/" .. name .. ".json" if isfile(path) then delfile(path) notify("Deleted: " .. name, "warn") if _G.__cfgRefresh then _G.__cfgRefresh() end else notify("Config not found", "error") end end) Button(manageCard, "Refresh", function() if _G.__cfgRefresh then _G.__cfgRefresh() end end) _G.__cfgRefresh = function() local list = refreshConfigList(cfgDropdown) if #list == 0 then cfgDropdown.Set("None") end end task.spawn(function() task.wait(0.5) _G.__cfgRefresh() end) -- Discord reminder card local discordCard = Card(cfgGrid[1], "REMINDER") Label(discordCard, "You're using the FREE version.", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 10, Theme.Yellow) Label(discordCard, "Join Discord for the FULL script!", UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 10, Theme.Text) Label(discordCard, DISCORD_INVITE, UDim2.fromOffset(1, 0), UDim2.new(1, 0, 0, 18), 10, Color3.fromRGB(88, 101, 242)) Button(discordCard, "Copy Discord Link", function() if setclipboard then setclipboard(DISCORD_LINK) notify("Discord link copied!", "success") else notify("Clipboard not available", "error") end end) --============================================================-- -- NAV --============================================================-- CreateNav("Silent Aim", "◈") CreateNav("Visuals", "◉") CreateNav("Misc", "◆") CreateNav("Config", "⚙") CurrentPage = "Silent Aim" for pageName, page in pairs(Pages) do page.Visible = pageName == "Silent Aim" end for navName, item in pairs(NavItems) do local selected = navName == "Silent Aim" item.Button.BackgroundColor3 = selected and Color3.fromRGB(45, 45, 45) or Theme.Sidebar item.Text.TextColor3 = selected and Theme.White or Theme.SubText item.Icon.TextColor3 = selected and Theme.Cyan or Theme.SubText end --============================================================-- -- STATUS BAR --============================================================ local Status = New("Frame", { Position = UDim2.new(0, SIDEBAR_WIDTH, 1, -18), Size = UDim2.new(1, -SIDEBAR_WIDTH, 0, 18), BackgroundColor3 = Color3.fromRGB(15, 15, 15), BorderSizePixel = 0, }, Main) Label(Status, "external.vip FREE", UDim2.fromOffset(8, 0), UDim2.fromOffset(100, 18), 8, Theme.Pink) local StatusRight = Label(Status, "JOIN DISCORD FOR FULL", UDim2.new(1, -180, 0, 0), UDim2.fromOffset(170, 18), 7, Theme.Yellow) StatusRight.TextXAlignment = Enum.TextXAlignment.Right --============================================================-- -- DRAGGING --============================================================ local dragging = false local dragStart local startPosition Main.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then if input.Position.X >= Main.AbsolutePosition.X + SIDEBAR_WIDTH then return end dragging = true dragStart = input.Position startPosition = Main.Position end end) Main.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) UIS.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then local delta = input.Position - dragStart Main.Position = UDim2.new( startPosition.X.Scale, startPosition.X.Offset + delta.X, startPosition.Y.Scale, startPosition.Y.Offset + delta.Y ) end end) UIS.InputBegan:Connect(function(input, processed) if processed then return end if input.KeyCode == Enum.KeyCode.RightShift then Gui.Enabled = not Gui.Enabled GateGui.Enabled = not Gui.Enabled end end) --============================================================-- -- ANNOYING DISCORD REMINDER (every 30 seconds) --============================================================ task.spawn(function() while Gui.Parent do task.wait(30) if Gui.Enabled and FREE_VERSION then notify("⚠️ Join Discord for the FULL version! ⚠️", "warn", 5) task.wait(0.5) notify("You're missing: Tracers, Gun Glow, Noclip, World Tint, and MORE!", "warn", 5) end end end) --============================================================-- -- INITIAL NOTIFICATIONS --============================================================ task.delay(0.5, function() notify("external.vip FREE VERSION loaded", "warn", 5) task.wait(0.5) notify("⚠️ You're using the limited free version!", "error", 5) task.wait(0.5) notify("Join " .. DISCORD_INVITE .. " for the FULL script!", "warn", 6) task.wait(0.5) notify("(full version works, rscripts.net is just weird lol)", "info", 5) end) print("[external.vip] FREE VERSION (crippled edition) loaded") print("[external.vip] Join " .. DISCORD_INVITE .. " for the full script")