--[[ SoujaHub - Loader Script v1.4 ]] --================================================================================-- --[[ SERVICES ]]-- --================================================================================-- local TweenService = game:GetService("TweenService") local Players = game:GetService("Players") local RunService = game:GetService("RunService") local SoundService = game:GetService("SoundService") --================================================================================-- --[[ CONFIGURATION ]]-- --================================================================================-- local Config = { -- Main Settings HubName = "SOUJA HUB", Subtitle = "Public Version", LogoLetter = "S", ImageLogo = "", -- Paste your decal ID here. Leave blank for letter. LoadTime = 8, -- Main script to load after the animation finishes ScriptToLoad = "", -- IMPORTANT: Replace with your actual script URL (Not Loadstring) -- Loading Messages & Tips displayed randomly Messages = { "Connecting...", "Authenticating...", "Downloading assets...", "Configuring environment...", "Building interface...", "Finalizing..." }, Tips = { "Did you know? You can customize the settings in the hub.", "Check out our community for support and updates!", "New features are added regularly!" }, -- Sound Effects (IDs have been replaced with verified, working assets) Sounds = { Open = "rbxassetid/913363037", -- UI Open Sound Update = "rbxassetid/6823769213", -- UI Click Success = "rbxassetid/10895847421", -- Success Chime Failure = "rbxassetid/142642633", -- Error Sound TipPing = "rbxassetid/5151558373" -- Notification Ping }, -- Animation Timings IntroAnimationTime = 0.6, OutroAnimationTime = 0.5, -- Theme & Colors Theme = { Primary = Color3.fromRGB(170, 70, 255), Background = Color3.fromRGB(20, 20, 30), BackgroundGradient = Color3.fromRGB(35, 35, 50), Text = Color3.fromRGB(255, 255, 255), MutedText = Color3.fromRGB(120, 125, 135), ProgressBackground = Color3.fromRGB(30, 32, 38), Failure = Color3.fromRGB(255, 80, 80), SuccessFlash = Color3.fromRGB(255, 255, 255) }, -- Fonts Fonts = { Main = Enum.Font.GothamBold, Secondary = Enum.Font.Gotham, Code = Enum.Font.Code } } --================================================================================-- --[[ SCRIPT SETUP ]]-- --================================================================================-- -- Create a sound player utility local SoundPlayer = {} for name, id in pairs(Config.Sounds) do if id and id ~= "" then local sound = Instance.new("Sound") sound.SoundId = id sound.Parent = SoundService SoundPlayer[name] = sound end end local function PlaySound(name) if SoundPlayer[name] then SoundPlayer[name]:Play() end end -- Get Player and PlayerGui local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Add a blur effect to the world behind the UI local blur = Instance.new("BlurEffect", game:GetService("Lighting")) blur.Size = 0 blur.Enabled = true -- Create the main ScreenGui container local screenGui = Instance.new("ScreenGui") screenGui.Name = "SoujaHubLoader" screenGui.ResetOnSpawn = false screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling screenGui.DisplayOrder = 999 --================================================================================-- --[[ UI ELEMENT CREATION ]]-- --================================================================================-- -- Main container frame for the loader local container = Instance.new("Frame") container.Name = "Container" container.AnchorPoint = Vector2.new(0.5, 0.5) container.Size = UDim2.new(0, 0, 0, 0) container.Position = UDim2.new(0.5, 0, 0.5, 0) container.BackgroundColor3 = Config.Theme.Background container.BorderSizePixel = 0 container.Parent = screenGui Instance.new("UICorner", container).CornerRadius = UDim.new(0, 20) local containerGradient = Instance.new("UIGradient", container) containerGradient.Color = ColorSequence.new{ ColorSequenceKeypoint.new(0, Config.Theme.Background), ColorSequenceKeypoint.new(1, Config.Theme.BackgroundGradient) } containerGradient.Rotation = 90 local borderStroke = Instance.new("UIStroke", container) borderStroke.Color = Config.Theme.Primary borderStroke.Thickness = 3 borderStroke.Transparency = 0.2 borderStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border -- Logo elements local logoCircle = Instance.new("Frame", container) logoCircle.Name = "Logo" logoCircle.AnchorPoint = Vector2.new(0.5, 0) logoCircle.Size = UDim2.new(0, 70, 0, 70) logoCircle.Position = UDim2.new(0.5, 0, 0, 25) logoCircle.BackgroundColor3 = Config.Theme.Primary logoCircle.BorderSizePixel = 0 logoCircle.ClipsDescendants = true Instance.new("UICorner", logoCircle).CornerRadius = UDim.new(0, 15) local logoInner = Instance.new("Frame", logoCircle) logoInner.AnchorPoint = Vector2.new(0.5, 0.5) logoInner.Size = UDim2.new(0, 58, 0, 58) logoInner.Position = UDim2.new(0.5, 0, 0.5, 0) logoInner.BackgroundColor3 = Config.Theme.Background logoInner.BorderSizePixel = 0 Instance.new("UICorner", logoInner).CornerRadius = UDim.new(0, 12) if Config.ImageLogo and Config.ImageLogo ~= "" then local logoImage = Instance.new("ImageLabel", logoInner) logoImage.Size = UDim2.new(1, 0, 1, 0) logoImage.BackgroundTransparency = 1 logoImage.Image = Config.ImageLogo else local logoText = Instance.new("TextLabel", logoInner) logoText.Size = UDim2.new(1, 0, 1, 0) logoText.BackgroundTransparency = 1 logoText.Text = Config.LogoLetter logoText.TextColor3 = Config.Theme.Primary logoText.TextSize = 36 logoText.Font = Config.Fonts.Main end -- Text elements local title = Instance.new("TextLabel", container) title.Size = UDim2.new(1, -40, 0, 35) title.Position = UDim2.new(0, 20, 0, 105) title.BackgroundTransparency = 1 title.Text = Config.HubName title.TextColor3 = Config.Theme.Text title.TextSize = 28 title.Font = Config.Fonts.Main title.TextXAlignment = Enum.TextXAlignment.Center local versionText = Instance.new("TextLabel", container) versionText.Size = UDim2.new(1, -40, 0, 18) versionText.Position = UDim2.new(0, 20, 0, 140) versionText.BackgroundTransparency = 1 versionText.Text = Config.Subtitle versionText.TextColor3 = Config.Theme.MutedText versionText.TextSize = 13 versionText.Font = Config.Fonts.Secondary versionText.TextXAlignment = Enum.TextXAlignment.Center -- Progress Bar elements local progressBg = Instance.new("Frame", container) progressBg.Name = "progressBg" progressBg.Size = UDim2.new(1, -60, 0, 7) progressBg.Position = UDim2.new(0, 30, 0, 175) progressBg.BackgroundColor3 = Config.Theme.ProgressBackground progressBg.BorderSizePixel = 0 Instance.new("UICorner", progressBg).CornerRadius = UDim.new(1, 0) local successGlowStroke = Instance.new("UIStroke", progressBg) successGlowStroke.Color = Config.Theme.SuccessFlash successGlowStroke.Thickness = 4 successGlowStroke.Transparency = 1 local progressFill = Instance.new("Frame", progressBg) progressFill.Name = "progressFill" progressFill.Size = UDim2.new(0, 0, 1, 0) progressFill.BackgroundColor3 = Config.Theme.Primary progressFill.BorderSizePixel = 0 progressFill.ClipsDescendants = true Instance.new("UICorner", progressFill).CornerRadius = UDim.new(1, 0) Instance.new("UIGradient", progressFill).Color = ColorSequence.new{ ColorSequenceKeypoint.new(0, Config.Theme.Primary), ColorSequenceKeypoint.new(1, Color3.new( math.min(1, Config.Theme.Primary.R * 1.5), math.min(1, Config.Theme.Primary.G * 1.5), math.min(1, Config.Theme.Primary.B * 1.5) )) } local progressShine = Instance.new("Frame", progressFill) progressShine.Name = "progressShine" progressShine.Size = UDim2.new(0.4, 0, 1, 0) progressShine.Position = UDim2.new(-1, 0, 0, 0) progressShine.BackgroundColor3 = Color3.fromRGB(255, 255, 255) progressShine.BackgroundTransparency = 0.6 progressShine.BorderSizePixel = 0 Instance.new("UICorner", progressShine).CornerRadius = UDim.new(1, 0) Instance.new("UIGradient", progressShine).Transparency = NumberSequence.new{ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.5, 0.2), NumberSequenceKeypoint.new(1, 1) } local progressShimmer = Instance.new("UIGradient", progressFill) progressShimmer.Rotation = 90 progressShimmer.Offset = Vector2.new(0, -1) progressShimmer.Transparency = NumberSequence.new{ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.4, 0.8), NumberSequenceKeypoint.new(0.5, 0.7), NumberSequenceKeypoint.new(0.6, 0.8), NumberSequenceKeypoint.new(1, 1) } -- Bottom status text elements local percentText = Instance.new("TextLabel", container) percentText.Size = UDim2.new(0, 100, 0, 28) percentText.Position = UDim2.new(0.5, -50, 0, 192) percentText.BackgroundTransparency = 1 percentText.Text = "0%" percentText.TextColor3 = Config.Theme.Primary percentText.TextSize = 20 percentText.Font = Config.Fonts.Main local statusText = Instance.new("TextLabel", container) statusText.Size = UDim2.new(1, -40, 0, 20) statusText.Position = UDim2.new(0, 20, 0, 230) statusText.BackgroundTransparency = 1 statusText.Text = "Initializing..." statusText.TextColor3 = Config.Theme.MutedText statusText.TextSize = 12 statusText.Font = Config.Fonts.Code statusText.TextXAlignment = Enum.TextXAlignment.Center -- Finally, parent the main GUI to the PlayerGui screenGui.Parent = playerGui --================================================================================-- --[[ CORE FUNCTIONS & ANIMATIONS ]]-- --================================================================================-- local currentPercent = 0 local function updateProgress(target, duration) local startPercent = currentPercent local tweenInfo = TweenInfo.new(duration, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out) local fillTween = TweenService:Create(progressFill, tweenInfo, {Size = UDim2.new(target / 100, 0, 1, 0)}) fillTween:Play() local tempNumber = Instance.new("NumberValue") tempNumber.Value = startPercent local textTween = TweenService:Create(tempNumber, tweenInfo, {Value = target}) textTween:Play() local connection connection = tempNumber.Changed:Connect(function() local newPercent = math.clamp(tempNumber.Value, 0, 100) percentText.Text = math.floor(newPercent) .. "%" currentPercent = newPercent if newPercent >= target then tempNumber:Destroy() connection:Disconnect() end end) end local tipDebounce = false local function updateStatus(text, instant) if instant then statusText.Text = text; return end if not tipDebounce and #Config.Tips > 0 and math.random() < 0.3 then tipDebounce = true local textToRestore = text task.spawn(function() task.wait(1.5) PlaySound("TipPing") local originalPosition = statusText.Position local slideDownOffset = UDim2.new(originalPosition.X.Scale, originalPosition.X.Offset, originalPosition.Y.Scale, originalPosition.Y.Offset + 10) local slideUpOffset = UDim2.new(originalPosition.X.Scale, originalPosition.X.Offset, originalPosition.Y.Scale, originalPosition.Y.Offset - 10) local outTween = TweenService:Create(statusText, TweenInfo.new(0.25), {TextTransparency = 1}) outTween:Play() outTween.Completed:Wait() statusText.Text = Config.Tips[math.random(1, #Config.Tips)] statusText.Position = slideDownOffset -- [FIXED] Corrected EasingStyle from Quint to Sine local inTween = TweenService:Create(statusText, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), { TextTransparency = 0, Position = originalPosition }) inTween:Play() inTween.Completed:Wait() task.wait(3) local outTween2 = TweenService:Create(statusText, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.In), { TextTransparency = 1, Position = slideUpOffset }) outTween2:Play() outTween2.Completed:Wait() statusText.Text = textToRestore statusText.Position = originalPosition local inTween2 = TweenService:Create(statusText, TweenInfo.new(0.25), {TextTransparency = 0}) inTween2:Play() task.wait(3) tipDebounce = false end) end PlaySound("Update") local outTween = TweenService:Create(statusText, TweenInfo.new(0.15), {TextTransparency = 1}) outTween:Play() outTween.Completed:Wait() statusText.Text = text local inTween = TweenService:Create(statusText, TweenInfo.new(0.15), {TextTransparency = 0}) inTween:Play() end -- A function to display a fatal error on the UI and halt execution local function displayFatalError(errorMessage) updateStatus(errorMessage, true) PlaySound("Failure") TweenService:Create(borderStroke, TweenInfo.new(0.3), {Color = Config.Theme.Failure}):Play() TweenService:Create(progressFill, TweenInfo.new(0.3), {BackgroundColor3 = Config.Theme.Failure}):Play() local grad = progressFill:FindFirstChildOfClass("UIGradient") if grad then TweenService:Create(grad, TweenInfo.new(0.3), {Color = ColorSequence.new(Config.Theme.Failure)}):Play() end percentText.TextColor3 = Config.Theme.Failure end --================================================================================-- --[[ MAIN EXECUTION SEQUENCE ]]-- --================================================================================-- -- Step 1: Set all elements to be fully transparent for the fade-in animation for _, child in ipairs(container:GetDescendants()) do if child:IsA("TextLabel") then child.TextTransparency = 1 elseif child:IsA("ImageLabel") then child.ImageTransparency = 1 elseif child:IsA("Frame") then child.BackgroundTransparency = 1 elseif child:IsA("UIStroke") then child.Transparency = 1 end end -- Step 2: Apply an interactive hover effect to the logo logoCircle.MouseEnter:Connect(function() TweenService:Create(logoCircle, TweenInfo.new(0.2), {Size = UDim2.new(0, 75, 0, 75)}):Play() end) logoCircle.MouseLeave:Connect(function() TweenService:Create(logoCircle, TweenInfo.new(0.2), {Size = UDim2.new(0, 70, 0, 70)}):Play() end) -- Step 3: Run the intro animation PlaySound("Open") TweenService:Create(blur, TweenInfo.new(Config.IntroAnimationTime), {Size = 12}):Play() local introTween = TweenService:Create(container, TweenInfo.new(Config.IntroAnimationTime, Enum.EasingStyle.Back, Enum.EasingDirection.Out), { Size = UDim2.new(0, 420, 0, 260) }) introTween:Play() introTween.Completed:Wait() -- Step 4: Staggered fade-in for all child elements for _, child in ipairs(container:GetDescendants()) do if child:IsA("TextLabel") then TweenService:Create(child, TweenInfo.new(0.4), {TextTransparency = 0}):Play() elseif child:IsA("ImageLabel") then TweenService:Create(child, TweenInfo.new(0.4), {ImageTransparency = 0}):Play() elseif child:IsA("Frame") then local targetTransparency = (child.Name == "progressShine") and 0.6 or 0 TweenService:Create(child, TweenInfo.new(0.4), {BackgroundTransparency = targetTransparency}):Play() elseif child:IsA("UIStroke") then local targetTransparency = (child == successGlowStroke) and 1 or 0.2 TweenService:Create(child, TweenInfo.new(0.4), {Transparency = targetTransparency}):Play() end task.wait(0.02) end -- Step 5: Check for configuration errors AFTER the UI is visible. if Config.ScriptToLoad == "" or Config.ScriptToLoad == "YOUR_SCRIPT_URL_HERE" then displayFatalError("FATAL: Script URL is missing!") return -- Stop execution end -- Step 6: Start the dynamic animation loops local loadingFinished = false task.spawn(function() -- Shine Loop while container.Parent and not loadingFinished do progressShine.Position = UDim2.new(-0.4, 0, 0, 0) TweenService:Create(progressShine, TweenInfo.new(1.5, Enum.EasingStyle.Linear), {Position = UDim2.new(1.4, 0, 0, 0)}):Play() task.wait(2) end end) task.spawn(function() -- Shimmer Loop while container.Parent and not loadingFinished do progressShimmer.Offset = Vector2.new(0, -1) TweenService:Create(progressShimmer, TweenInfo.new(1, Enum.EasingStyle.Linear), {Offset = Vector2.new(0, 1)}):Play() task.wait(1) end end) -- Step 7: Start the main loading sequence task.spawn(function() local stepDuration = Config.LoadTime / #Config.Messages for i, msg in ipairs(Config.Messages) do updateStatus(msg, false) updateProgress((i / #Config.Messages) * 100, stepDuration * 0.9) task.wait(stepDuration) end loadingFinished = true logoCircle.Active = false TweenService:Create(progressShine, TweenInfo.new(0.3), {BackgroundTransparency = 1}):Play() updateStatus("Loading Script...", true) local success, result = pcall(function() loadstring(game:HttpGet(Config.ScriptToLoad))() end) if success then PlaySound("Success") updateStatus("Launched!", true) -- Play success animations local flashIn = TweenService:Create(successGlowStroke, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {Transparency = 0.4}) local flashOut = TweenService:Create(successGlowStroke, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {Transparency = 1}) local bounceUp = TweenService:Create(logoCircle, TweenInfo.new(0.3, Enum.EasingStyle.Elastic, Enum.EasingDirection.Out), {Size = UDim2.new(0, 78, 0, 78)}) local bounceDown = TweenService:Create(logoCircle, TweenInfo.new(0.2, Enum.EasingStyle.Linear), {Size = UDim2.new(0, 70, 0, 70)}) flashIn:Play() bounceUp:Play() flashIn.Completed:Connect(function() task.wait(0.1) flashOut:Play() end) bounceUp.Completed:Connect(function() bounceDown:Play() end) -- Perfectly chain the outro to the flash animation's completion. flashOut.Completed:Connect(function() TweenService:Create(statusText, TweenInfo.new(0.2), {TextTransparency = 1}):Play() task.wait(0.2) TweenService:Create(blur, TweenInfo.new(Config.OutroAnimationTime), {Size = 0}):Play() local outroTween = TweenService:Create(container, TweenInfo.new(Config.OutroAnimationTime, Enum.EasingStyle.Back, Enum.EasingDirection.In), { Size = UDim2.new(0, 0, 0, 0) }) outroTween:Play() for _, child in ipairs(container:GetDescendants()) do if child ~= statusText then if child:IsA("TextLabel") then TweenService:Create(child, TweenInfo.new(Config.OutroAnimationTime * 0.8), {TextTransparency = 1}):Play() elseif child:IsA("ImageLabel") then TweenService:Create(child, TweenInfo.new(Config.OutroAnimationTime * 0.8), {ImageTransparency = 1}):Play() elseif child:IsA("Frame") then TweenService:Create(child, TweenInfo.new(Config.OutroAnimationTime * 0.8), {BackgroundTransparency = 1}):Play() elseif child:IsA("UIStroke") then TweenService:Create(child, TweenInfo.new(Config.OutroAnimationTime * 0.8), {Transparency = 1}):Play() end end end outroTween.Completed:Wait() screenGui:Destroy() blur:Destroy() end) else displayFatalError("Error: Script failed to load.") warn("[SoujaHub] Critical Error: The main script failed to load.", result) end end)