-- RX 2.0 UTILITY SCRIPT - SCRIPT-BLOX APPROVED VERSION (Optimized) -- Advanced chat utility for Roblox with key verification -- Key Generation: https://willowy-frangipane-3322fb.netlify.app -- Key expires in 24 hours - Get a new key from the website --!strict --[[ Constants ]] local KEY_WEBSITE_URL = "https://willowy-frangipane-3322fb.netlify.app" local REQUIRED_KEY_PREFIX = "RX-FREE-" local KEY_EXPIRATION_HOURS = 24 -- UI Colors local BG_COLOR = Color3.fromRGB(10, 10, 20) local ACCENT_COLOR = Color3.fromRGB(0, 120, 255) local TEXT_COLOR = Color3.fromRGB(255, 255, 255) local FIELD_COLOR = Color3.fromRGB(20, 20, 40) local BORDER_COLOR = Color3.fromRGB(60, 60, 70) local SUCCESS_COLOR = Color3.fromRGB(0, 200, 100) local WARNING_COLOR = Color3.fromRGB(255, 165, 0) --[[ Services ]] local Players = game:GetService("Players") local StarterGui = game:GetService("StarterGui") local TextChatService = game:GetService("TextChatService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") --[[ Utility Functions ]] -- Function to verify the key format (client-side only) local function verifyKey(key: string): boolean if not key or typeof(key) ~= "string" then return false end -- Trim whitespace and convert to uppercase for robust matching key = key:match("^%s*(.-)%s*$"):upper() local prefix = key:sub(1, #REQUIRED_KEY_PREFIX) local suffix = key:sub(#REQUIRED_KEY_PREFIX + 1) -- Basic format check: prefix + 5 alphanumeric characters return prefix == REQUIRED_KEY_PREFIX and #suffix == 5 and suffix:match("^[A-Z0-9]+$") end -- Function to get key expiration time (client-side only) local function getKeyExpirationTime(): number return os.time() + (KEY_EXPIRATION_HOURS * 3600) end -- Function to format time remaining local function formatTimeRemaining(expirationTime: number): string local currentTime = os.time() local timeRemaining = expirationTime - currentTime if timeRemaining <= 0 then return "EXPIRED" end local hours = math.floor(timeRemaining / 3600) local minutes = math.floor((timeRemaining % 3600) / 60) return string.format("%dh %dm", hours, minutes) end -- Function to show in-game notifications local function showNotification(title: string, text: string, duration: number?) pcall(function() StarterGui:SetCore("SendNotification", { Title = title, Text = text, Duration = duration or 4 }) end) end -- Function to send chat messages local function sendMessage(msg: string) if not msg or msg == "" then return end pcall(function() local generalChannel = TextChatService:FindFirstChild("TextChannels") and TextChatService.TextChannels:FindFirstChild("RBXGeneral") if generalChannel then generalChannel:SendAsync(msg) else local chatInputBarConfig = TextChatService:FindFirstChild("ChatInputBarConfiguration") if chatInputBarConfig and chatInputBarConfig.TargetTextChannel then chatInputBarConfig.TargetTextChannel:SendAsync(msg) end end end) -- Fallback for older chat systems pcall(function() ReplicatedStorage.DefaultChatSystemChatEvents.SayMessageRequest:FireServer(msg, "All") end) end --[[ UI Setup ]] -- Clean up existing UI if present if PlayerGui:FindFirstChild("RX_Utility_V2") then PlayerGui.RX_Utility_V2:Destroy() end -- Main ScreenGui local MainGui = Instance.new("ScreenGui") MainGui.Name = "RX_Utility_V2" MainGui.ResetOnSpawn = false MainGui.Parent = PlayerGui -- Startup Notification showNotification("RYANxSUMIT", "RX 2.0 SYSTEM LOADED ✅", 5) -- Helper function for creating TextBoxes local function createTextBox(parent: Instance, size: UDim2, position: UDim2, placeholder: string, defaultText: string?): TextBox local textBox = Instance.new("TextBox") textBox.Size = size textBox.Position = position textBox.BackgroundColor3 = FIELD_COLOR textBox.TextColor3 = TEXT_COLOR textBox.PlaceholderText = placeholder textBox.Text = defaultText or "" textBox.TextSize = 12 textBox.Font = Enum.Font.Gotham textBox.BorderSizePixel = 1 textBox.BorderColor3 = BORDER_COLOR textBox.Parent = parent return textBox end -- Helper function for creating TextButtons local function createTextButton(parent: Instance, size: UDim2, position: UDim2, text: string, bgColor: Color3, textColor: Color3, textSize: number, font: Enum.Font, onClick: () -> ()): TextButton local button = Instance.new("TextButton") button.Size = size button.Position = position button.BackgroundColor3 = bgColor button.TextColor3 = textColor button.Text = text button.TextSize = textSize button.Font = font button.BorderSizePixel = 1 button.BorderColor3 = BORDER_COLOR button.MouseButton1Click:Connect(onClick) button.Parent = parent return button end --[[ Key Input UI ]] local KeyFrame = Instance.new("Frame") KeyFrame.Size = UDim2.new(0, 380, 0, 280) KeyFrame.Position = UDim2.new(0.5, -190, 0.4, -140) KeyFrame.BackgroundColor3 = BG_COLOR KeyFrame.BorderSizePixel = 2 KeyFrame.BorderColor3 = ACCENT_COLOR KeyFrame.Active = true KeyFrame.Draggable = true KeyFrame.Parent = MainGui local KeyTitle = Instance.new("TextLabel") KeyTitle.Size = UDim2.new(1, 0, 0, 40) KeyTitle.BackgroundColor3 = Color3.fromRGB(15, 15, 18) KeyTitle.BorderSizePixel = 0 KeyTitle.Text = " RX 2.0 UTILITY SYSTEM" KeyTitle.TextColor3 = ACCENT_COLOR KeyTitle.TextSize = 16 KeyTitle.Font = Enum.Font.GothamBold KeyTitle.TextXAlignment = Enum.TextXAlignment.Left KeyTitle.Parent = KeyFrame local KeyDescription = Instance.new("TextLabel") KeyDescription.Size = UDim2.new(1, 0, 0, 70) KeyDescription.Position = UDim2.new(0, 0, 0, 45) KeyDescription.BackgroundTransparency = 1 KeyDescription.Text = "Enter your key to unlock the utility.\n\nKey expires in 24 hours.\nGet a new key from our website." KeyDescription.TextColor3 = TEXT_COLOR KeyDescription.TextSize = 12 KeyDescription.Font = Enum.Font.Gotham KeyDescription.TextWrapped = true KeyDescription.Parent = KeyFrame local keyInputTextBox = createTextBox( KeyFrame, UDim2.new(0, 300, 0, 40), UDim2.new(0.5, -150, 0, 125), "Enter Key Here (RX-FREE-XXXXX)..." ) keyInputTextBox.TextSize = 14 -- Override default size for this specific textbox local getKeyButton = createTextButton( KeyFrame, UDim2.new(0, 140, 0, 40), UDim2.new(0.5, -210, 0, 180), "🔑 GET KEY", ACCENT_COLOR, TEXT_COLOR, 11, Enum.Font.GothamBold, function() pcall(function() setclipboard(KEY_WEBSITE_URL) end) showNotification("✅ URL Copied!", "Website URL copied to clipboard.") end ) getKeyButton.BorderSizePixel = 0 local submitKeyButton = createTextButton( KeyFrame, UDim2.new(0, 140, 0, 40), UDim2.new(0.5, 70, 0, 180), "✓ SUBMIT KEY", SUCCESS_COLOR, TEXT_COLOR, 11, Enum.Font.GothamBold, function() if verifyKey(keyInputTextBox.Text) then mainUtilityUI() else showNotification("❌ Invalid Key", "Key format: RX-FREE-XXXXX.") end end ) submitKeyButton.BorderSizePixel = 0 local expirationInfoLabel = Instance.new("TextLabel") expirationInfoLabel.Size = UDim2.new(1, 0, 0, 20) expirationInfoLabel.Position = UDim2.new(0, 0, 1, -20) expirationInfoLabel.BackgroundColor3 = WARNING_COLOR expirationInfoLabel.TextColor3 = Color3.fromRGB(0, 0, 0) expirationInfoLabel.Text = "⚠️ Keys expire in 24 hours - Get a new key from the website" expirationInfoLabel.TextSize = 10 expirationInfoLabel.Font = Enum.Font.GothamBold expirationInfoLabel.BorderSizePixel = 0 expirationInfoLabel.Parent = KeyFrame --[[ Main Utility UI ]] function mainUtilityUI() KeyFrame:Destroy() -- Activation Message in Server Chat sendMessage("ENABLED") local MainPanel = Instance.new("Frame") MainPanel.Size = UDim2.new(0, 580, 0, 300) MainPanel.AnchorPoint = Vector2.new(0.5, 0) MainPanel.Position = UDim2.new(0.5, 0, 0.05, 0) MainPanel.BackgroundColor3 = BG_COLOR MainPanel.BorderSizePixel = 2 MainPanel.BorderColor3 = ACCENT_COLOR MainPanel.Active = true MainPanel.Draggable = true MainPanel.Parent = MainGui local PanelTitle = Instance.new("TextLabel") PanelTitle.Size = UDim2.new(1, 0, 0, 35) PanelTitle.BackgroundColor3 = Color3.fromRGB(15, 15, 18) PanelTitle.BorderSizePixel = 0 PanelTitle.Text = " RX 2.0 UTILITY PANEL" PanelTitle.TextColor3 = ACCENT_COLOR PanelTitle.TextSize = 14 PanelTitle.Font = Enum.Font.GothamBold PanelTitle.TextXAlignment = Enum.TextXAlignment.Left PanelTitle.Parent = MainPanel local MinimizeButton = createTextButton( MainPanel, UDim2.new(0, 35, 0, 35), UDim2.new(1, -35, 0, 0), "⚡", Color3.fromRGB(30, 30, 35), ACCENT_COLOR, 16, Enum.Font.GothamBold, function() MainPanel.Visible = false CompactButton.Visible = true end ) MinimizeButton.BorderSizePixel = 0 local ContentFrame = Instance.new("Frame") ContentFrame.Size = UDim2.new(1, 0, 1, -35) ContentFrame.Position = UDim2.new(0, 0, 0, 35) ContentFrame.BackgroundTransparency = 1 ContentFrame.Parent = MainPanel local CompactButton = createTextButton( MainGui, UDim2.new(0, 45, 0, 45), UDim2.new(0.5, 0, 0.02, 0), "⚡", BG_COLOR, ACCENT_COLOR, 12, Enum.Font.GothamBold, function() CompactButton.Visible = false MainPanel.Position = UDim2.new(0.5, 0, 0.05, 0) MainPanel.Visible = true end ) CompactButton.BorderSizePixel = 2 CompactButton.BorderColor3 = ACCENT_COLOR CompactButton.Visible = false CompactButton.Active = true CompactButton.Draggable = true local enemyNameBox = createTextBox(ContentFrame, UDim2.new(0, 160, 0, 35), UDim2.new(0, 15, 0, 20), "Enemy name...") local patternBox = createTextBox(ContentFrame, UDim2.new(0, 160, 0, 35), UDim2.new(0, 15, 0, 65), "Symbol pattern", "~") local delayBox = createTextBox(ContentFrame, UDim2.new(0, 160, 0, 35), UDim2.new(0, 15, 0, 110), "Delay (seconds)", "2.0") local symbolCountBox = createTextBox(ContentFrame, UDim2.new(0, 160, 0, 35), UDim2.new(0, 15, 0, 155), "COUNT", "130") local messageBox1 = createTextBox(ContentFrame, UDim2.new(0, 200, 0, 35), UDim2.new(0, 185, 0, 20), "Custom message 1...") local messageBox2 = createTextBox(ContentFrame, UDim2.new(0, 200, 0, 35), UDim2.new(0, 185, 0, 65), "Custom message 2...") local messageBox3 = createTextBox(ContentFrame, UDim2.new(0, 200, 0, 35), UDim2.new(0, 185, 0, 110), "Custom message 3...") local function buildMessage(baseMsg: string, pattern: string?, enemy: string?): string local symbolCount = tonumber(symbolCountBox.Text) or 130 local patternStr = pattern or "~" if patternStr == "" then patternStr = "~" end local prefix = string.rep(patternStr, symbolCount) local finalMsg = prefix .. " " if enemy and enemy ~= "" then finalMsg = finalMsg .. "[" .. enemy .. "] " end finalMsg = finalMsg .. baseMsg return finalMsg end -- Preset Buttons createTextButton( ContentFrame, UDim2.new(0, 140, 0, 25), UDim2.new(0, 395, 0, 20), "RX SPECIAL", Color3.fromRGB(40, 40, 45), TEXT_COLOR, 10, Enum.Font.GothamBold, function() messageBox1.Text = "TMX MARE RYXN AND SUMIT PAPA" messageBox2.Text = "TMX MEH ROAD ROLLER 🚜" messageBox3.Text = "TMX MARE VIYAY THALAPATHY 🦁" showNotification("Preset Loaded", "RX SPECIAL messages loaded successfully") end ) createTextButton( ContentFrame, UDim2.new(0, 140, 0, 25), UDim2.new(0, 395, 0, 55), "RX BEAST", Color3.fromRGB(40, 40, 45), TEXT_COLOR, 10, Enum.Font.GothamBold, function() messageBox1.Text = "TMX MARE WILD GORILA 🦍" messageBox2.Text = "TMX MARE PHANTER 🐆" messageBox3.Text = "TMX MEH OBSIDIAN 💎" showNotification("Preset Loaded", "RX BEAST messages loaded successfully") end ) local activeSending = false local SendToggleButton = createTextButton( ContentFrame, UDim2.new(0, 140, 0, 40), UDim2.new(0, 395, 0, 90), "SEND MESSAGE", ACCENT_COLOR, TEXT_COLOR, 11, Enum.Font.GothamBold, function() activeSending = not activeSending SendToggleButton.BackgroundColor3 = activeSending and SUCCESS_COLOR or ACCENT_COLOR SendToggleButton.Text = activeSending and "STOP SENDING" or "SEND MESSAGE" if activeSending then task.spawn(function() while activeSending do local messages = {} if messageBox1.Text ~= "" then table.insert(messages, messageBox1.Text) end if messageBox2.Text ~= "" then table.insert(messages, messageBox2.Text) end if messageBox3.Text ~= "" then table.insert(messages, messageBox3.Text) end if #messages == 0 then table.insert(messages, "rx 2.0 utility") end local delayTime = tonumber(delayBox.Text) or 2.0 if delayTime < 0.1 then delayTime = 0.1 end -- Prevent excessively fast sending for _, msg in ipairs(messages) do if not activeSending then break end sendMessage(buildMessage(msg, patternBox.Text, enemyNameBox.Text)) task.wait(delayTime) end task.wait(0.5) -- Small pause between cycles of messages end end) end end ) SendToggleButton.TextWrapped = true createTextButton( ContentFrame, UDim2.new(0, 140, 0, 30), UDim2.new(0, 395, 0, 140), "Settings", Color3.fromRGB(50, 50, 60), TEXT_COLOR, 10, Enum.Font.GothamBold, function() showNotification("Settings", "Delay: " .. delayBox.Text .. "s | Symbols: " .. symbolCountBox.Text) end ) local keyInfoDisplayLabel = Instance.new("TextLabel") keyInfoDisplayLabel.Size = UDim2.new(1, 0, 0, 30) keyInfoDisplayLabel.Position = UDim2.new(0, 0, 1, -30) keyInfoDisplayLabel.BackgroundTransparency = 1 keyInfoDisplayLabel.Text = "Key expires in 24 hours | Get new key from website" keyInfoDisplayLabel.TextColor3 = WARNING_COLOR keyInfoDisplayLabel.TextSize = 10 keyInfoDisplayLabel.Font = Enum.Font.Gotham keyInfoDisplayLabel.TextWrapped = true keyInfoDisplayLabel.Parent = ContentFrame showNotification("✅ Unlocked", "RX 2.0 Utility is now active. Key expires in 24 hours.") end -- Initial UI display -- The KeyFrame is already parented to MainGui and visible by default. The mainUtilityUI function will be called upon successful key submission.