--[[ WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk! ]] -- ============================================ -- CONFIGURATION - Edit these values only -- ============================================ local CONFIG = { SERVICE_NAME = "YOUR_SERVICE_NAME", -- Your Junkie service name IDENTIFIER = "YOUR_IDENTIFIER", -- Your Junkie identifier PROVIDER_NAME = "YOUR_PROVIDER_NAME", -- Your Junkie provider name KEY_FILENAME = "YOUR_KEY_FILENAME.txt",-- Filename to save the key locally GUI_NAME = "YOUR_GUI_NAME", -- ScreenGui name (hidden from user) UI_TITLE = "YOUR_TITLE_HERE", -- Title shown on the key UI DISCORD_INVITE = "YOUR_DISCORD_INVITE", -- Your Discord invite link } -- ============================================ local Junkie = loadstring(game:HttpGet("https://jnkie.com/sdk/library.lua"))() Junkie.service = CONFIG.SERVICE_NAME Junkie.identifier = CONFIG.IDENTIFIER Junkie.provider = CONFIG.PROVIDER_NAME local result = (function() getgenv().UI_CLOSED = false getgenv().SCRIPT_KEY = nil local function SaveKey(key) pcall(function() writefile(CONFIG.KEY_FILENAME, key) end) end local function LoadKey() if pcall(function() return isfile(CONFIG.KEY_FILENAME) and isfile end) and isfile(CONFIG.KEY_FILENAME) then local success, key = pcall(function() return readfile(CONFIG.KEY_FILENAME) end) if success then return key:gsub("%s+", "") end end return nil end local function DeleteKey() pcall(function() if isfile(CONFIG.KEY_FILENAME) then delfile(CONFIG.KEY_FILENAME) end end) end local function IsExpiredResponse(res) if not res then return false end local statusText = tostring(res.error or res.message or res.reason or res.status or ""):lower() if statusText:find("expired", 1, true) or statusText == "key_expired" then return true end local expiresAt = tonumber(res.expires_at or res.expiresAt or res.expires or res.expiry or res.expiry_at) if expiresAt and expiresAt > 0 and expiresAt <= os.time() then return true end local globalExpiresAt = tonumber(getgenv().JD_EXPIRES_AT) if globalExpiresAt and globalExpiresAt > 0 and globalExpiresAt <= os.time() then return true end return false end local function GetValidationMessage(res) if IsExpiredResponse(res) then return "Expired Key" end local raw = tostring((res and (res.error or res.message or res.reason or res.status)) or "") local lowered = raw:lower() if lowered:find("hwid", 1, true) then return "HWID Mismatch" elseif lowered:find("service", 1, true) then return "Wrong Service" end return "Invalid Key" end local function CheckKeyStrict(key) getgenv().JD_EXPIRES_AT = nil local ok, res = pcall(function() return Junkie.check_key(key) end) if not ok then return false, nil, "Check Failed" end if not res or not res.valid or IsExpiredResponse(res) then return false, res, GetValidationMessage(res) end return true, res, "Valid" end local SavedKey = LoadKey() if SavedKey then local valid = CheckKeyStrict(SavedKey) if valid then getgenv().SCRIPT_KEY = SavedKey getgenv().UI_CLOSED = true return getgenv().SCRIPT_KEY else DeleteKey() end end -- FIX 1: Robust parent resolution for mobile executors -- Many mobile executors silently fail when parenting to CoreGui. -- We probe with a dummy folder first; fall back to PlayerGui if needed. local function GetScreenParent() local ok, cg = pcall(function() return game:GetService("CoreGui") end) if ok and cg then local probe = Instance.new("Folder") local canUse = pcall(function() probe.Parent = cg end) probe:Destroy() if canUse then return cg end end local Players = game:GetService("Players") return Players.LocalPlayer:WaitForChild("PlayerGui", 10) end local TweenService = game:GetService("TweenService") local UserInputService = game:GetService("UserInputService") local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = CONFIG.GUI_NAME ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling ScreenGui.IgnoreGuiInset = true ScreenGui.ResetOnSpawn = false -- FIX 2: High DisplayOrder so the key UI renders above thumbsticks / chat on mobile ScreenGui.DisplayOrder = 999 ScreenGui.Parent = GetScreenParent() local Frame = Instance.new("Frame") Frame.Size = UDim2.new(0, 320, 0, 260) Frame.AnchorPoint = Vector2.new(0.5, 0.5) Frame.Position = UDim2.new(0.5, 0, 0.5, 0) Frame.BackgroundColor3 = Color3.fromRGB(22, 27, 34) Frame.BorderSizePixel = 0 Frame.Parent = ScreenGui Instance.new("UICorner", Frame).CornerRadius = UDim.new(0, 8) -- Auto-scale UI based on screen resolution (handles mobile aspect ratios) local Camera = workspace.CurrentCamera local UI_BASE_W, UI_BASE_H = 1920, 1080 local UI_SCALE_BOOST = 1.15 local uiScaleObj = Instance.new("UIScale") uiScaleObj.Parent = Frame local isCustomPosition = false local function updateUIScale() local vp = Camera.ViewportSize local rawScale = math.min(vp.X / UI_BASE_W, vp.Y / UI_BASE_H) * UI_SCALE_BOOST local ar = vp.X / vp.Y local target if ar < 1.0 then target = math.clamp(rawScale, 0.5, 0.8) elseif ar < 1.6 then target = math.clamp(rawScale, 0.65, 1.0) else target = math.clamp(rawScale, 0.8, 1.3) end target = math.floor(target * 10 + 0.5) / 10 uiScaleObj.Scale = target if not isCustomPosition then Frame.Position = UDim2.new(0.5, 0, 0.5, 0) end end updateUIScale() if Camera then Camera:GetPropertyChangedSignal("ViewportSize"):Connect(updateUIScale) end local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, 0, 0, 40) Title.BackgroundTransparency = 1 Title.Text = CONFIG.UI_TITLE Title.TextColor3 = Color3.fromRGB(230, 237, 243) Title.Font = Enum.Font.GothamBold Title.TextSize = 16 Title.Parent = Frame local TextBox = Instance.new("TextBox") TextBox.Size = UDim2.new(0.9, 0, 0, 35) TextBox.Position = UDim2.new(0.05, 0, 0.25, 0) TextBox.BackgroundColor3 = Color3.fromRGB(13, 17, 23) TextBox.TextColor3 = Color3.fromRGB(255, 255, 255) TextBox.PlaceholderText = "Paste your license key here..." TextBox.Text = "" TextBox.Font = Enum.Font.Gotham TextBox.TextSize = 13 TextBox.ClearTextOnFocus = false TextBox.Parent = Frame Instance.new("UICorner", TextBox).CornerRadius = UDim.new(0, 5) local GetLinkBtn = Instance.new("TextButton") GetLinkBtn.Size = UDim2.new(0.42, 0, 0, 35) GetLinkBtn.Position = UDim2.new(0.05, 0, 0.48, 0) GetLinkBtn.BackgroundColor3 = Color3.fromRGB(48, 54, 61) GetLinkBtn.TextColor3 = Color3.fromRGB(255, 255, 255) GetLinkBtn.Text = "Copy Activation Link" GetLinkBtn.Font = Enum.Font.GothamSemibold GetLinkBtn.TextSize = 13 GetLinkBtn.Parent = Frame Instance.new("UICorner", GetLinkBtn).CornerRadius = UDim.new(0, 5) local VerifyBtn = Instance.new("TextButton") VerifyBtn.Size = UDim2.new(0.42, 0, 0, 35) VerifyBtn.Position = UDim2.new(0.53, 0, 0.48, 0) VerifyBtn.BackgroundColor3 = Color3.fromRGB(47, 183, 117) VerifyBtn.TextColor3 = Color3.fromRGB(255, 255, 255) VerifyBtn.Text = "Verify Key" VerifyBtn.Font = Enum.Font.GothamSemibold VerifyBtn.TextSize = 13 VerifyBtn.Parent = Frame Instance.new("UICorner", VerifyBtn).CornerRadius = UDim.new(0, 5) local DiscordBtn = Instance.new("TextButton") DiscordBtn.Size = UDim2.new(0.9, 0, 0, 35) DiscordBtn.Position = UDim2.new(0.05, 0, 0.78, 0) DiscordBtn.BackgroundColor3 = Color3.fromRGB(114, 137, 218) DiscordBtn.TextColor3 = Color3.fromRGB(255, 255, 255) DiscordBtn.Text = "Join Discord" DiscordBtn.Font = Enum.Font.GothamSemibold DiscordBtn.TextSize = 13 DiscordBtn.Parent = Frame Instance.new("UICorner", DiscordBtn).CornerRadius = UDim.new(0, 5) -- Guide text for activation link local GuideLabel = Instance.new("TextLabel") GuideLabel.Size = UDim2.new(0.9, 0, 0, 35) GuideLabel.Position = UDim2.new(0.05, 0, 0.62, 0) GuideLabel.BackgroundTransparency = 1 GuideLabel.Text = "Click 'Copy Activation Link', then paste in your browser to get your key." GuideLabel.TextColor3 = Color3.fromRGB(139, 148, 158) GuideLabel.Font = Enum.Font.GothamSemibold GuideLabel.TextSize = 14 GuideLabel.TextWrapped = true GuideLabel.Parent = Frame -- Dragging support (works for both mouse and touch) local dragging, dragInput, dragStart, startPos Frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true isCustomPosition = true dragStart = input.Position startPos = Frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) Frame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then local delta = input.Position - dragStart local s = uiScaleObj.Scale Frame.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X / s, startPos.Y.Scale, startPos.Y.Offset + delta.Y / s ) end end) -- FIX 3: Yield one render frame so Roblox actually draws the GUI on mobile -- before the spin-wait loop captures the thread. task.wait() GetLinkBtn.MouseButton1Click:Connect(function() local link = Junkie.get_key_link() if link and setclipboard then setclipboard(link) GetLinkBtn.Text = "Link Copied!" task.delay(2, function() GetLinkBtn.Text = "Copy Activation Link" end) end end) DiscordBtn.MouseButton1Click:Connect(function() if setclipboard then setclipboard(CONFIG.DISCORD_INVITE) DiscordBtn.Text = "Link Copied!" task.delay(2, function() DiscordBtn.Text = "Join Discord" end) end end) VerifyBtn.MouseButton1Click:Connect(function() local key = TextBox.Text:gsub("%s+", "") if key == "" then return end VerifyBtn.Text = "Verifying..." VerifyBtn.BackgroundColor3 = Color3.fromRGB(58, 136, 225) local valid, _, message = CheckKeyStrict(key) if valid then VerifyBtn.BackgroundColor3 = Color3.fromRGB(37, 153, 97) VerifyBtn.Text = "Success!" SaveKey(key) getgenv().SCRIPT_KEY = key task.wait(0.5) ScreenGui:Destroy() getgenv().UI_CLOSED = true else getgenv().SCRIPT_KEY = nil if message == "Expired Key" then DeleteKey() end VerifyBtn.BackgroundColor3 = Color3.fromRGB(248, 81, 73) VerifyBtn.Text = message or "Invalid Key" task.delay(2, function() VerifyBtn.Text = "Verify Key" VerifyBtn.BackgroundColor3 = Color3.fromRGB(47, 183, 117) end) end end) while not getgenv().UI_CLOSED do task.wait(0.1) end return getgenv().SCRIPT_KEY end)()