-- Creates the generic "ROBLOX" loading screen on startup -- Written by ArceusInator & Ben Tkacheff, 2014 -- -- Constants local PLACEID = Game.PlaceId local MPS = Game:GetService 'MarketplaceService' local CP = Game:GetService 'ContentProvider' local startTime = tick() local COLORS = { BLACK = Color3.new(0, 0, 0), WHITE = Color3.new(1, 1, 1), ERROR = Color3.new(253/255,68/255,72/255) } -- -- Variables local GameAssetInfo -- loaded by InfoProvider:LoadAssets() local currScreenGui = nil local renderSteppedConnection = nil local fadingBackground = false local destroyedLoadingGui = false local hasReplicatedFirstElements = false -- Fast Flags local topbarSuccess, topbarFlagValue = pcall(function() return settings():GetFFlag("UseInGameTopBar") end) local useTopBar = (topbarSuccess and topbarFlagValue == true) local bgFrameOffset = useTopBar and 36 or 20 local offsetPosition = useTopBar and UDim2.new(0, 0, 0, -36) or UDim2.new(0, 0, 0, 0) -- -- Utility functions local create = function(className, defaultParent) return function(propertyList) local object = Instance.new(className) for index, value in next, propertyList do if type(index) == 'string' then object[index] = value else if type(value) == 'function' then value(object) elseif type(value) == 'userdata' then value.Parent = object end end end if object.Parent == nil then object.Parent = defaultParent end return object end end -- -- Create objects local MainGui = {} local InfoProvider = {} function InfoProvider:GetGameName() if GameAssetInfo ~= nil then return GameAssetInfo.Name else return '' end end function InfoProvider:GetCreatorName() if GameAssetInfo ~= nil then return GameAssetInfo.Creator.Name else return '' end end function InfoProvider:LoadAssets() Spawn(function() if PLACEID <= 0 then while Game.PlaceId <= 0 do wait() end PLACEID = Game.PlaceId end -- load game asset info coroutine.resume(coroutine.create(function() local success, result = pcall(function() GameAssetInfo = MPS:GetProductInfo(PLACEID) end) if not success then print("LoadingScript->InfoProvider:LoadAssets:", result) end end)) end) end -- -- Declare member functions function MainGui:GenerateMain() local screenGui = create 'ScreenGui' { Name = 'RobloxLoadingGui' } -- -- create descendant frames local mainBackgroundContainer = create 'Frame' { Name = 'BlackFrame', BackgroundColor3 = COLORS.BLACK, Size = UDim2.new(1, 0, 1, bgFrameOffset), Position = offsetPosition, Active = true, create 'ImageButton' { Name = 'CloseButton', Image = 'rbxasset://textures/ui/CloseButton_dn.png', ImageColor3=Color3.new(0.9,0.9,0.9), ImageTransparency = 1, BackgroundTransparency = 1, Position = UDim2.new(1, -37, 0, 5), Size = UDim2.new(0, 32, 0, 32), Active = false, ZIndex = 10 }, create 'Frame' { Name = 'GraphicsFrame', BorderSizePixel = 0, BackgroundTransparency = 1, Position = UDim2.new(1, -125, 1, -125), Size = UDim2.new(0, 120, 0, 120), ZIndex = 2, create 'ImageLabel' { Name = 'LoadingImage', BackgroundTransparency = 1, Image = 'rbxasset://textures/Roblox-loading-glow.png', Position = UDim2.new(0, 0, 0, 0), Size = UDim2.new(1, 0, 1, 0), ZIndex = 2 }, create 'ImageLabel' { Name = 'LogoImage', BackgroundTransparency = 1, Image = 'rbxasset://textures/Roblox-loading.png', Position = UDim2.new(0.125, 0, 0.125, 0), Size = UDim2.new(0.75, 0, 0.75, 0), ZIndex = 2 } }, create 'Frame' { Name = 'UiMessageFrame', BackgroundTransparency = 1, Position = UDim2.new(0.25, 0, 1, -120), Size = UDim2.new(0.5, 0, 0, 80), ZIndex = 2, create 'TextLabel' { Name = 'UiMessage', BackgroundTransparency = 1, Size = UDim2.new(1, 0, 1, 0), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size18, TextWrapped = true, TextColor3 = COLORS.WHITE, Text = "", ZIndex = 2 }, }, create 'Frame' { Name = 'CountFrame', BackgroundTransparency = 1, Position = UDim2.new(0, 0, 1, -120), Size = UDim2.new(0.3, 0, 0, 120), ZIndex = 2, create 'TextLabel' { Name = 'PlaceLabel', BackgroundTransparency = 1, Size = UDim2.new(1, -5, 0, 18), Position = UDim2.new(0, 5, 0, 0), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size14, TextWrapped = true, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, create 'TextLabel' { Name = 'CreatorLabel', BackgroundTransparency = 1, Position = UDim2.new(0,5,0,18), Size = UDim2.new(1, -5, 0, 18), Font = Enum.Font.SourceSans, FontSize = Enum.FontSize.Size12, TextWrapped = true, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, create 'TextLabel' { Name = 'BrickLabel', BackgroundTransparency = 1, Position = UDim2.new(0, 5, 0, 63), Size = UDim2.new(0, 85, 0, 18), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "Bricks:", TextXAlignment = Enum.TextXAlignment.Right, ZIndex = 2 }, create 'TextLabel' { Name = 'ConnectorLabel', BackgroundTransparency = 1, Position = UDim2.new(0, 5, 0, 81), Size = UDim2.new(0, 85, 0, 18), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "Connectors:", TextXAlignment = Enum.TextXAlignment.Right, ZIndex = 2 }, create 'TextLabel' { Name = 'InstanceLabel', BackgroundTransparency = 1, Position = UDim2.new(0, 5, 0, 45), Size = UDim2.new(0, 85, 0, 18), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "Instances:", TextXAlignment = Enum.TextXAlignment.Right, ZIndex = 2 }, create 'TextLabel' { Name = 'VoxelLabel', BackgroundTransparency = 1, Position = UDim2.new(0, 5, 0, 99), Size = UDim2.new(0, 85, 0, 18), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "Voxels:", TextXAlignment = Enum.TextXAlignment.Right, ZIndex = 2 }, create 'TextLabel' { Name = 'BrickCount', BackgroundTransparency = 1, Position = UDim2.new(0, 95, 0, 63), Size = UDim2.new(0.5, -5, 0, 18), Font = Enum.Font.SourceSans, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, create 'TextLabel' { Name = 'ConnectorCount', BackgroundTransparency = 1, Position = UDim2.new(0, 95, 0, 81), Size = UDim2.new(0.5, -5, 0, 18), Font = Enum.Font.SourceSans, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, create 'TextLabel' { Name = 'InstanceCount', BackgroundTransparency = 1, Position = UDim2.new(0, 95, 0, 45), Size = UDim2.new(0.5, -5, 0, 18), Font = Enum.Font.SourceSans, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, create 'TextLabel' { Name = 'VoxelCount', BackgroundTransparency = 1, Position = UDim2.new(0, 95, 0, 99), Size = UDim2.new(0.5, -5, 0, 18), Font = Enum.Font.SourceSans, FontSize = Enum.FontSize.Size18, TextScaled = true, TextColor3 = COLORS.WHITE, TextStrokeTransparency = 0, Text = "", TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 2 }, }, Parent = screenGui } create 'Frame' { Name = 'ErrorFrame', BackgroundColor3 = COLORS.ERROR, BorderSizePixel = 0, Position = UDim2.new(0.25,0,0,0), Size = UDim2.new(0.5, 0, 0, 80), ZIndex = 8, Visible = false, create 'TextLabel' { Name = "ErrorText", BackgroundTransparency = 1, Size = UDim2.new(1, 0, 1, 0), Font = Enum.Font.SourceSansBold, FontSize = Enum.FontSize.Size14, TextWrapped = true, TextColor3 = COLORS.WHITE, Text = "", ZIndex = 8 }, Parent = screenGui } while not Game:GetService("CoreGui") do wait() end screenGui.Parent = Game:GetService("CoreGui") currScreenGui = screenGui end function round(num, idp) local mult = 10^(idp or 0) return math.floor(num * mult + 0.5) / mult end --------------------------------------------------------- -- Main Script (show something now + setup connections) -- start loading assets asap InfoProvider:LoadAssets() MainGui:GenerateMain() local guiService = Game:GetService("GuiService") local removedLoadingScreen = false local instanceCount = 0 local voxelCount = 0 local brickCount = 0 local connectorCount = 0 local setVerb = true local fadeDown = true local lastRenderTime = nil local fadeCycleTime = 1.7 renderSteppedConnection = Game:GetService("RunService").RenderStepped:connect(function() if not currScreenGui then return end if not currScreenGui:FindFirstChild("BlackFrame") then return end if setVerb then currScreenGui.BlackFrame.CloseButton:SetVerb("Exit") setVerb = false end if currScreenGui.BlackFrame.CountFrame.PlaceLabel.Text == "" then currScreenGui.BlackFrame.CountFrame.PlaceLabel.Text = InfoProvider:GetGameName() end if currScreenGui.BlackFrame.CountFrame.CreatorLabel.Text == "" then local creatorName = InfoProvider:GetCreatorName() if creatorName ~= "" then currScreenGui.BlackFrame.CountFrame.CreatorLabel.Text = "By " .. creatorName end end instanceCount = guiService:GetInstanceCount() voxelCount = guiService:GetVoxelCount() brickCount = guiService:GetBrickCount() connectorCount = guiService:GetConnectorCount() currScreenGui.BlackFrame.CountFrame.InstanceCount.Text = tostring(instanceCount) currScreenGui.BlackFrame.CountFrame.BrickCount.Text = tostring(brickCount) currScreenGui.BlackFrame.CountFrame.ConnectorCount.Text = tostring(connectorCount) if voxelCount <= 0 then currScreenGui.BlackFrame.CountFrame.VoxelCount.Text = "0" else currScreenGui.BlackFrame.CountFrame.VoxelCount.Text = tostring(round(voxelCount,4)) .." million" end if not lastRenderTime then lastRenderTime = tick() return end local currentTime = tick() local fadeAmount = (currentTime - lastRenderTime) * fadeCycleTime lastRenderTime = currentTime if fadeDown then currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency = currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency - fadeAmount if currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency <= 0 then fadeDown = false end else currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency = currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency + fadeAmount if currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.ImageTransparency >= 1 then fadeDown = true end end -- fade in close button after 5 seconds if currentTime - startTime > 5 and currScreenGui.BlackFrame.CloseButton.ImageTransparency > 0 then currScreenGui.BlackFrame.CloseButton.ImageTransparency = currScreenGui.BlackFrame.CloseButton.ImageTransparency - fadeAmount if currScreenGui.BlackFrame.CloseButton.ImageTransparency <= 0 then currScreenGui.BlackFrame.CloseButton.Active = true end end end) guiService.ErrorMessageChanged:connect(function() if guiService:GetErrorMessage() ~= '' then currScreenGui.ErrorFrame.ErrorText.Text = guiService:GetErrorMessage() currScreenGui.ErrorFrame.Visible = true local blackFrame = currScreenGui:FindFirstChild('BlackFrame') if blackFrame then blackFrame.CloseButton.ImageTransparency = 0 blackFrame.CloseButton.Active = true end else currScreenGui.ErrorFrame.Visible = false end end) guiService.UiMessageChanged:connect(function(type, newMessage) if type == Enum.UiMessageType.UiMessageInfo then local blackFrame = currScreenGui and currScreenGui:FindFirstChild('BlackFrame') if blackFrame then blackFrame.UiMessageFrame.UiMessage.Text = newMessage if newMessage ~= '' then blackFrame.UiMessageFrame.Visible = true else blackFrame.UiMessageFrame.Visible = false end end end end) if guiService:GetErrorMessage() ~= '' then currScreenGui.ErrorFrame.ErrorText.Text = guiService:GetErrorMessage() currScreenGui.ErrorFrame.Visible = true end function stopListeningToRenderingStep() if renderSteppedConnection then renderSteppedConnection:disconnect() renderSteppedConnection = nil end end function fadeBackground() if not currScreenGui then return end if fadingBackground then return end if not currScreenGui:findFirstChild("BlackFrame") then return end fadingBackground = true local lastTime = nil local backgroundRemovalTime = 3.2 while currScreenGui and currScreenGui.BlackFrame and currScreenGui.BlackFrame.BackgroundTransparency < 1 do if lastTime == nil then currScreenGui.BlackFrame.Active = false lastTime = tick() else local currentTime = tick() local fadeAmount = (currentTime - lastTime) * backgroundRemovalTime lastTime = currentTime currScreenGui.BlackFrame.BackgroundTransparency = currScreenGui.BlackFrame.BackgroundTransparency + fadeAmount end wait() end end function fadeAndDestroyBlackFrame(blackFrame) Spawn(function() local countFrame = blackFrame:FindFirstChild("CountFrame") local graphicsFrame = blackFrame:FindFirstChild("GraphicsFrame") local textChildren = countFrame:GetChildren() local transparency = 0 local rateChange = 1.8 local lastUpdateTime = nil while transparency < 1 do if not lastUpdateTime then lastUpdateTime = tick() else local newTime = tick() transparency = transparency + rateChange * (newTime - lastUpdateTime) for i =1, #textChildren do textChildren[i].TextTransparency = transparency textChildren[i].TextStrokeTransparency = transparency end graphicsFrame.LoadingImage.ImageTransparency = transparency graphicsFrame.LogoImage.ImageTransparency = transparency lastUpdateTime = newTime end wait() end blackFrame:Destroy() end) end function destroyLoadingElements() if not currScreenGui then return end if destroyedLoadingGui then return end destroyedLoadingGui = true local guiChildren = currScreenGui:GetChildren() for i=1, #guiChildren do -- need to keep this around in case we get a connection error later if guiChildren[i].Name ~= "ErrorFrame" then if guiChildren[i].Name == "BlackFrame" then fadeAndDestroyBlackFrame(guiChildren[i]) else guiChildren[i]:Destroy() end end end end function handleFinishedReplicating() hasReplicatedFirstElements = (#Game:GetService("ReplicatedFirst"):GetChildren() > 0) if not hasReplicatedFirstElements then fadeBackground() else wait(20) -- make sure after 20 seconds we remove the default gui, even if the user doesn't handleRemoveDefaultLoadingGui() end end function handleRemoveDefaultLoadingGui() fadeBackground() destroyLoadingElements() end function handleGameLoaded() if not hasReplicatedFirstElements then destroyLoadingElements() end end Game:GetService("ReplicatedFirst").FinishedReplicating:connect(handleFinishedReplicating) if Game:GetService("ReplicatedFirst"):IsFinishedReplicating() then handleFinishedReplicating() end Game:GetService("ReplicatedFirst").RemoveDefaultLoadingGuiSignal:connect(handleRemoveDefaultLoadingGui) if Game:GetService("ReplicatedFirst"):IsDefaultLoadingGuiRemoved() then handleRemoveDefaultLoadingGui() return end Game.Loaded:connect(handleGameLoaded) if Game:IsLoaded() then handleGameLoaded() end