forked from aya/aya
778 lines
28 KiB
Lua
778 lines
28 KiB
Lua
-- 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 UIS = game:GetService('UserInputService')
|
|
local CP = game:GetService('ContentProvider')
|
|
local guiService = game:GetService("GuiService")
|
|
local ContextActionService = game:GetService('ContextActionService')
|
|
|
|
local startTime = tick()
|
|
|
|
local COLORS = {
|
|
BLACK = Color3.new(0, 0, 0),
|
|
BACKGROUND_COLOR = Color3.new(45/255, 45/255, 45/255),
|
|
WHITE = Color3.new(1, 1, 1),
|
|
ERROR = Color3.new(253/255,68/255,72/255)
|
|
}
|
|
|
|
local function getViewportSize()
|
|
while not game.Workspace.CurrentCamera do
|
|
game.Workspace.Changed:wait()
|
|
end
|
|
|
|
while game.Workspace.CurrentCamera.ViewportSize == Vector2.new(0,0) do
|
|
game.Workspace.CurrentCamera.Changed:wait()
|
|
end
|
|
|
|
return game.Workspace.CurrentCamera.ViewportSize
|
|
end
|
|
|
|
--
|
|
-- Variables
|
|
local GameAssetInfo -- loaded by InfoProvider:LoadAssets()
|
|
local currScreenGui = nil
|
|
local renderSteppedConnection = nil
|
|
local fadingBackground = false
|
|
local destroyingBackground = false
|
|
local destroyedLoadingGui = false
|
|
local hasReplicatedFirstElements = false
|
|
local backgroundImageTransparency = 0
|
|
local isMobile = (UIS.TouchEnabled == true and UIS.MouseEnabled == false and getViewportSize().Y <= 500)
|
|
local isTenFootInterface = false
|
|
pcall(function() isTenFootInterface = guiService:IsTenFootInterface() end)
|
|
local platform = UIS:GetPlatform()
|
|
|
|
local useGameLoadedSuccess, useGameLoadedFlagValue = pcall(function() return settings():GetFFlag("UseGameLoadedInLoadingScript") end)
|
|
local useGameLoadedToWait = (useGameLoadedSuccess and useGameLoadedFlagValue == true)
|
|
|
|
local function IsConvertMyPlaceNameInXboxAppEnabled()
|
|
if UIS:GetPlatform() == Enum.Platform.XBoxOne then
|
|
local success, flagValue = pcall(function() return settings():GetFFlag("ConvertMyPlaceNameInXboxApp") end)
|
|
return (success and flagValue == true)
|
|
end
|
|
return false
|
|
end
|
|
|
|
--
|
|
-- 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 ExtractGeneratedUsername(gameName)
|
|
local tempUsername = string.match(gameName, "^([0-9a-fA-F]+)'s Place$")
|
|
if tempUsername and #tempUsername == 32 then
|
|
return tempUsername
|
|
end
|
|
end
|
|
|
|
-- Fix places that have been made with incorrect temporary usernames
|
|
function GetFilteredGameName(gameName, creatorName)
|
|
if gameName and type(gameName) == 'string' then
|
|
local tempUsername = ExtractGeneratedUsername(gameName)
|
|
if tempUsername then
|
|
local newGameName = string.gsub(gameName, tempUsername, creatorName, 1)
|
|
if newGameName then
|
|
return newGameName
|
|
end
|
|
end
|
|
end
|
|
return gameName
|
|
end
|
|
|
|
|
|
function InfoProvider:GetGameName()
|
|
if GameAssetInfo ~= nil then
|
|
if IsConvertMyPlaceNameInXboxAppEnabled() then
|
|
return GetFilteredGameName(GameAssetInfo.Name, self:GetCreatorName())
|
|
else
|
|
return GameAssetInfo.Name
|
|
end
|
|
else
|
|
return ''
|
|
end
|
|
end
|
|
|
|
function InfoProvider:GetCreatorName()
|
|
if GameAssetInfo ~= nil then
|
|
return GameAssetInfo.Creator.Name
|
|
else
|
|
return ''
|
|
end
|
|
end
|
|
|
|
function InfoProvider:LoadAssets()
|
|
local assetsCoroutine = coroutine.create(function()
|
|
if PLACEID <= 0 then
|
|
repeat wait() until game.PlaceId > 0
|
|
PLACEID = game.PlaceId
|
|
end
|
|
|
|
-- load game asset info
|
|
local success, result = pcall(function()
|
|
GameAssetInfo = MPS:GetProductInfo(PLACEID)
|
|
end)
|
|
if not success then
|
|
print("LoadingScript->InfoProvider:LoadAssets:", result)
|
|
end
|
|
end)
|
|
|
|
coroutine.resume(assetsCoroutine)
|
|
end
|
|
|
|
|
|
function MainGui:tileBackgroundTexture(frameToFill)
|
|
if not frameToFill then return end
|
|
frameToFill:ClearAllChildren()
|
|
if backgroundImageTransparency < 1 then
|
|
local backgroundTextureSize = Vector2.new(512, 512)
|
|
for i = 0, math.ceil(frameToFill.AbsoluteSize.X/backgroundTextureSize.X) do
|
|
for j = 0, math.ceil(frameToFill.AbsoluteSize.Y/backgroundTextureSize.Y) do
|
|
create 'ImageLabel' {
|
|
Name = 'BackgroundTextureImage',
|
|
BackgroundTransparency = 1,
|
|
ImageTransparency = backgroundImageTransparency,
|
|
Image = 'ayaasset://textures/loading/darkLoadingTexture.png',
|
|
Position = UDim2.new(0, i*backgroundTextureSize.X, 0, j*backgroundTextureSize.Y),
|
|
Size = UDim2.new(0, backgroundTextureSize.X, 0, backgroundTextureSize.Y),
|
|
ZIndex = 1,
|
|
Parent = frameToFill
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- create a cancel binding for console to be able to cancel anytime while loading
|
|
local function createTenfootCancelGui()
|
|
local cancelLabel = create'ImageLabel'
|
|
{
|
|
Name = "CancelLabel";
|
|
Size = UDim2.new(0, 83, 0, 83);
|
|
Position = UDim2.new(1, -32 - 83, 0, 32);
|
|
BackgroundTransparency = 1;
|
|
Image = 'ayaasset://textures/ui/Shell/ButtonIcons/BButton.png';
|
|
}
|
|
local cancelText = create'TextLabel'
|
|
{
|
|
Name = "CancelText";
|
|
Size = UDim2.new(0, 0, 0, 0);
|
|
Position = UDim2.new(1, -131, 0, 64);
|
|
BackgroundTransparency = 1;
|
|
FontSize = Enum.FontSize.Size36;
|
|
TextXAlignment = Enum.TextXAlignment.Right;
|
|
TextColor3 = COLORS.WHITE;
|
|
Text = "Cancel";
|
|
}
|
|
|
|
-- bind cancel action
|
|
local platformService = nil
|
|
pcall(function()
|
|
platformService = game:GetService('PlatformService')
|
|
end)
|
|
|
|
if platformService then
|
|
if not game:GetService("ReplicatedFirst"):IsFinishedReplicating() then
|
|
local seenBButtonBegin = false
|
|
ContextActionService:BindCoreAction("CancelGameLoad",
|
|
function(actionName, inputState, inputObject)
|
|
if inputState == Enum.UserInputState.Begin then
|
|
seenBButtonBegin = true
|
|
elseif inputState == Enum.UserInputState.End and seenBButtonBegin then
|
|
cancelLabel:Destroy()
|
|
cancelText.Text = "Canceling..."
|
|
cancelText.Position = UDim2.new(1, -32, 0, 64)
|
|
ContextActionService:UnbindCoreAction('CancelGameLoad')
|
|
platformService:RequestGameShutdown()
|
|
end
|
|
end,
|
|
false,
|
|
Enum.KeyCode.ButtonB)
|
|
end
|
|
end
|
|
|
|
while cancelLabel.Parent == nil do
|
|
if currScreenGui then
|
|
local blackFrame = currScreenGui:FindFirstChild('BlackFrame')
|
|
if blackFrame then
|
|
cancelLabel.Parent = blackFrame
|
|
cancelText.Parent = blackFrame
|
|
break
|
|
end
|
|
end
|
|
wait()
|
|
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.BACKGROUND_COLOR,
|
|
BackgroundTransparency = 0,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Active = true,
|
|
Parent = screenGui,
|
|
}
|
|
|
|
local closeButton = create 'ImageButton' {
|
|
Name = 'CloseButton',
|
|
Image = 'ayaasset://textures/loading/cancelButton.png',
|
|
ImageTransparency = 1,
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(1, -37, 0, 5),
|
|
Size = UDim2.new(0, 32, 0, 32),
|
|
Active = false,
|
|
ZIndex = 10,
|
|
Parent = mainBackgroundContainer,
|
|
}
|
|
|
|
local graphicsFrame = create 'Frame' {
|
|
Name = 'GraphicsFrame',
|
|
BorderSizePixel = 0,
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(1, (isMobile == true and -75 or (isTenFootInterface and -245 or -225)), 1, (isMobile == true and -75 or (isTenFootInterface and -185 or -165))),
|
|
Size = UDim2.new(0, (isMobile == true and 70 or (isTenFootInterface and 140 or 120)), 0, (isMobile == true and 70 or (isTenFootInterface and 140 or 120))),
|
|
ZIndex = 2,
|
|
Parent = mainBackgroundContainer,
|
|
}
|
|
|
|
local loadingImage = create 'ImageLabel' {
|
|
Name = 'LoadingImage',
|
|
BackgroundTransparency = 1,
|
|
Image = 'ayaasset://textures/loading/loadingCircle.png',
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
ZIndex = 2,
|
|
Parent = graphicsFrame,
|
|
}
|
|
|
|
local loadingText = create 'TextLabel' {
|
|
Name = 'LoadingText',
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, (isMobile == true and -14 or -56), 1, 0),
|
|
Position = UDim2.new(0, (isMobile == true and 12 or 28), 0, 0),
|
|
Font = Enum.Font.SourceSans,
|
|
FontSize = (isMobile == true and Enum.FontSize.Size12 or Enum.FontSize.Size18),
|
|
TextWrapped = true,
|
|
TextColor3 = COLORS.WHITE,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
Visible = not isTenFootInterface,
|
|
Text = "Loading...",
|
|
ZIndex = 2,
|
|
Parent = graphicsFrame,
|
|
}
|
|
|
|
local uiMessageFrame = create 'Frame' {
|
|
Name = 'UiMessageFrame',
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0.25, 0, 1, -120),
|
|
Size = UDim2.new(0.5, 0, 0, 80),
|
|
ZIndex = 2,
|
|
Parent = mainBackgroundContainer,
|
|
}
|
|
|
|
local uiMessage = 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,
|
|
Parent = uiMessageFrame,
|
|
}
|
|
|
|
local infoFrame = create 'Frame' {
|
|
Name = 'InfoFrame',
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, (isMobile == true and 20 or 100), 1, (isMobile == true and -120 or -150)),
|
|
Size = UDim2.new(0.4, 0, 0, 110),
|
|
ZIndex = 2,
|
|
Parent = mainBackgroundContainer,
|
|
}
|
|
|
|
local placeLabel = create 'TextLabel' {
|
|
Name = 'PlaceLabel',
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 0, 80),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Font = Enum.Font.SourceSans,
|
|
FontSize = (isTenFootInterface and Enum.FontSize.Size48 or Enum.FontSize.Size24),
|
|
TextWrapped = true,
|
|
TextScaled = true,
|
|
TextColor3 = COLORS.WHITE,
|
|
TextStrokeTransparency = 0,
|
|
Text = "",
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Bottom,
|
|
ZIndex = 2,
|
|
Parent = infoFrame,
|
|
}
|
|
|
|
if isTenFootInterface then
|
|
local byLabel = create'TextLabel' {
|
|
Name = "ByLabel",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 36, 0, 30),
|
|
Position = UDim2.new(0, 0, 0, 80),
|
|
Font = Enum.Font.SourceSans,
|
|
FontSize = Enum.FontSize.Size36,
|
|
TextScaled = true,
|
|
TextColor3 = COLORS.WHITE,
|
|
TextStrokeTransparency = 0,
|
|
Text = "By",
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
ZIndex = 2,
|
|
Visible = false,
|
|
Parent = infoFrame,
|
|
}
|
|
local creatorIcon = create'ImageLabel' {
|
|
Name = "CreatorIcon",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(0, 30, 0, 30),
|
|
Position = UDim2.new(0, 38, 0, 80),
|
|
ImageTransparency = 0,
|
|
Image = 'ayaasset://textures/ui/Shell/Icons/RobloxIcon32.png',
|
|
ZIndex = 2,
|
|
Visible = false,
|
|
Parent = infoFrame,
|
|
}
|
|
end
|
|
|
|
local creatorLabel = create 'TextLabel' {
|
|
Name = 'CreatorLabel',
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 0, 30),
|
|
Position = UDim2.new(0, isTenFootInterface and 72 or 0, 0, 80),
|
|
Font = Enum.Font.SourceSans,
|
|
FontSize = (isTenFootInterface and Enum.FontSize.Size36 or Enum.FontSize.Size18),
|
|
TextWrapped = true,
|
|
TextScaled = true,
|
|
TextColor3 = COLORS.WHITE,
|
|
TextStrokeTransparency = 0,
|
|
Text = "",
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
ZIndex = 2,
|
|
Parent = infoFrame,
|
|
}
|
|
|
|
local backgroundTextureFrame = create 'Frame' {
|
|
Name = 'BackgroundTextureFrame',
|
|
BorderSizePixel = 0,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
ClipsDescendants = true,
|
|
ZIndex = 1,
|
|
BackgroundTransparency = 1,
|
|
Parent = mainBackgroundContainer,
|
|
}
|
|
|
|
local errorFrame = 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,
|
|
Parent = screenGui,
|
|
}
|
|
|
|
local errorText = 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 = errorFrame,
|
|
}
|
|
|
|
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()
|
|
if isTenFootInterface then
|
|
createTenfootCancelGui()
|
|
end
|
|
|
|
local removedLoadingScreen = false
|
|
local setVerb = true
|
|
local lastRenderTime = nil
|
|
local fadeCycleTime = 1.7
|
|
local turnCycleTime = 2
|
|
local lastAbsoluteSize = Vector2.new(0, 0)
|
|
local loadingDots = "..."
|
|
local lastDotUpdateTime = nil
|
|
local dotChangeTime = .2
|
|
local brickCountChange = nil
|
|
local lastBrickCount = 0
|
|
|
|
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:FindFirstChild("BackgroundTextureFrame") and currScreenGui.BlackFrame.BackgroundTextureFrame.AbsoluteSize ~= lastAbsoluteSize then
|
|
lastAbsoluteSize = currScreenGui.BlackFrame.BackgroundTextureFrame.AbsoluteSize
|
|
MainGui:tileBackgroundTexture(currScreenGui.BlackFrame.BackgroundTextureFrame)
|
|
end
|
|
|
|
local infoFrame = currScreenGui.BlackFrame:FindFirstChild('InfoFrame')
|
|
if infoFrame then
|
|
-- set place name
|
|
local placeLabel = infoFrame:FindFirstChild('PlaceLabel')
|
|
if placeLabel and placeLabel.Text == "" then
|
|
placeLabel.Text = InfoProvider:GetGameName()
|
|
end
|
|
|
|
-- set creator name
|
|
local creatorLabel = infoFrame:FindFirstChild('CreatorLabel')
|
|
if creatorLabel and creatorLabel.Text == "" then
|
|
local creatorName = InfoProvider:GetCreatorName()
|
|
if creatorName ~= "" then
|
|
if isTenFootInterface then
|
|
local showDevName = true
|
|
if platform == Enum.Platform.XBoxOne then
|
|
local success, result = pcall(function()
|
|
return settings():GetFFlag("ShowDevNameInXboxApp")
|
|
end)
|
|
if success then
|
|
showDevName = result
|
|
end
|
|
end
|
|
creatorLabel.Text = showDevName and creatorName or ""
|
|
local creatorIcon = infoFrame:FindFirstChild('CreatorIcon')
|
|
local byLabel = infoFrame:FindFirstChild('ByLabel')
|
|
if creatorIcon then creatorIcon.Visible = showDevName end
|
|
if byLabel then byLabel.Visible = showDevName end
|
|
else
|
|
creatorLabel.Text = "By "..creatorName
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if not lastRenderTime then
|
|
lastRenderTime = tick()
|
|
lastDotUpdateTime = lastRenderTime
|
|
return
|
|
end
|
|
|
|
local currentTime = tick()
|
|
local fadeAmount = (currentTime - lastRenderTime) * fadeCycleTime
|
|
local turnAmount = (currentTime - lastRenderTime) * (360/turnCycleTime)
|
|
lastRenderTime = currentTime
|
|
|
|
currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.Rotation = currScreenGui.BlackFrame.GraphicsFrame.LoadingImage.Rotation + turnAmount
|
|
|
|
local updateLoadingDots = function()
|
|
loadingDots = loadingDots.. "."
|
|
if loadingDots == "...." then
|
|
loadingDots = ""
|
|
end
|
|
currScreenGui.BlackFrame.GraphicsFrame.LoadingText.Text = "Loading" ..loadingDots
|
|
end
|
|
|
|
if currentTime - lastDotUpdateTime >= dotChangeTime and InfoProvider:GetCreatorName() == "" then
|
|
lastDotUpdateTime = currentTime
|
|
updateLoadingDots()
|
|
else
|
|
if guiService:GetBrickCount() > 0 then
|
|
if brickCountChange == nil then
|
|
brickCountChange = guiService:GetBrickCount()
|
|
end
|
|
if guiService:GetBrickCount() - lastBrickCount >= brickCountChange then
|
|
lastBrickCount = guiService:GetBrickCount()
|
|
updateLoadingDots()
|
|
end
|
|
end
|
|
end
|
|
|
|
if not isTenFootInterface then
|
|
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
|
|
end)
|
|
|
|
local genericCoroutine = coroutine.create(function()
|
|
local RobloxGui = game:GetService("CoreGui"):WaitForChild("RobloxGui")
|
|
local guiInsetChangedEvent = Instance.new("BindableEvent")
|
|
guiInsetChangedEvent.Name = "GuiInsetChanged"
|
|
guiInsetChangedEvent.Parent = RobloxGui
|
|
guiInsetChangedEvent.Event:connect(function(x1, y1, x2, y2)
|
|
if currScreenGui and currScreenGui:FindFirstChild("BlackFrame") then
|
|
currScreenGui.BlackFrame.Position = UDim2.new(0, -x1, 0, -y1)
|
|
currScreenGui.BlackFrame.Size = UDim2.new(1, x1 + x2, 1, y1 + y2)
|
|
end
|
|
end)
|
|
end)
|
|
coroutine.resume(genericCoroutine)
|
|
|
|
local leaveGameButton, leaveGameTextLabel, errorImage = nil
|
|
|
|
guiService.ErrorMessageChanged:connect(function()
|
|
if guiService:GetErrorMessage() ~= '' then
|
|
if isTenFootInterface then
|
|
currScreenGui.ErrorFrame.Size = UDim2.new(1, 0, 0, 144)
|
|
currScreenGui.ErrorFrame.Position = UDim2.new(0, 0, 0, 0)
|
|
currScreenGui.ErrorFrame.BackgroundColor3 = COLORS.BLACK
|
|
currScreenGui.ErrorFrame.BackgroundTransparency = 0.5
|
|
currScreenGui.ErrorFrame.ErrorText.FontSize = Enum.FontSize.Size36
|
|
currScreenGui.ErrorFrame.ErrorText.Position = UDim2.new(.3, 0, 0, 0)
|
|
currScreenGui.ErrorFrame.ErrorText.Size = UDim2.new(.4, 0, 0, 144)
|
|
if errorImage == nil then
|
|
errorImage = Instance.new("ImageLabel")
|
|
errorImage.Image = "ayaasset://textures/ui/ErrorIconSmall.png"
|
|
errorImage.Size = UDim2.new(0, 96, 0, 79)
|
|
errorImage.Position = UDim2.new(0.228125, 0, 0, 32)
|
|
errorImage.ZIndex = 9
|
|
errorImage.BackgroundTransparency = 1
|
|
errorImage.Parent = currScreenGui.ErrorFrame
|
|
end
|
|
-- we show a B button to kill game data model on console
|
|
if not isTenFootInterface then
|
|
if leaveGameButton == nil then
|
|
local RobloxGui = game:GetService("CoreGui"):WaitForChild("RobloxGui")
|
|
local utility = require(RobloxGui.Modules.Utility)
|
|
local textLabel = nil
|
|
leaveGameButton, leaveGameTextLabel = utility:MakeStyledButton("LeaveGame", "Leave", UDim2.new(0, 288, 0, 78))
|
|
leaveGameButton:SetVerb("Exit")
|
|
leaveGameButton.NextSelectionDown = leaveGameButton
|
|
leaveGameButton.NextSelectionLeft = leaveGameButton
|
|
leaveGameButton.NextSelectionRight = leaveGameButton
|
|
leaveGameButton.NextSelectionUp = leaveGameButton
|
|
leaveGameButton.ZIndex = 9
|
|
leaveGameButton.Position = UDim2.new(0.771875, 0, 0, 37)
|
|
leaveGameButton.Parent = currScreenGui.ErrorFrame
|
|
leaveGameTextLabel.FontSize = Enum.FontSize.Size36
|
|
leaveGameTextLabel.ZIndex = 10
|
|
game:GetService("GuiService").SelectedCoreObject = leaveGameButton
|
|
else
|
|
game:GetService("GuiService").SelectedCoreObject = leaveGameButton
|
|
end
|
|
end
|
|
end
|
|
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 fadeAndDestroyBlackFrame(blackFrame)
|
|
if destroyingBackground then return end
|
|
destroyingBackground = true
|
|
local genericCoroutine = coroutine.create(function()
|
|
local infoFrame = blackFrame:FindFirstChild("InfoFrame")
|
|
local graphicsFrame = blackFrame:FindFirstChild("GraphicsFrame")
|
|
|
|
local infoFrameChildren = infoFrame: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, #infoFrameChildren do
|
|
local child = infoFrameChildren[i]
|
|
if child:IsA('TextLabel') then
|
|
child.TextTransparency = transparency
|
|
child.TextStrokeTransparency = transparency
|
|
elseif child:IsA('ImageLabel') then
|
|
child.ImageTransparency = transparency
|
|
end
|
|
end
|
|
graphicsFrame.LoadingImage.ImageTransparency = transparency
|
|
blackFrame.BackgroundTransparency = transparency
|
|
|
|
if backgroundImageTransparency < 1 then
|
|
backgroundImageTransparency = transparency
|
|
local backgroundImages = blackFrame.BackgroundTextureFrame:GetChildren()
|
|
for i = 1, #backgroundImages do
|
|
backgroundImages[i].ImageTransparency = backgroundImageTransparency
|
|
end
|
|
end
|
|
|
|
lastUpdateTime = newTime
|
|
end
|
|
wait()
|
|
end
|
|
if blackFrame ~= nil then
|
|
stopListeningToRenderingStep()
|
|
blackFrame:Destroy()
|
|
end
|
|
end)
|
|
|
|
coroutine.resume(genericCoroutine)
|
|
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
|
|
if useGameLoadedToWait then
|
|
if game:IsLoaded() then
|
|
handleRemoveDefaultLoadingGui()
|
|
else
|
|
local gameLoadedCon = nil
|
|
gameLoadedCon = game.Loaded:connect(function()
|
|
gameLoadedCon:disconnect()
|
|
gameLoadedCon = nil
|
|
handleRemoveDefaultLoadingGui()
|
|
end)
|
|
end
|
|
else
|
|
while game:GetService("ContentProvider").RequestQueueSize > 0 do
|
|
wait()
|
|
end
|
|
handleRemoveDefaultLoadingGui()
|
|
end
|
|
else
|
|
wait(5) -- make sure after 5 seconds we remove the default gui, even if the user doesn't
|
|
handleRemoveDefaultLoadingGui()
|
|
end
|
|
end
|
|
|
|
function handleRemoveDefaultLoadingGui()
|
|
if isTenFootInterface then
|
|
ContextActionService:UnbindCoreAction('CancelGameLoad')
|
|
end
|
|
destroyLoadingElements()
|
|
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()
|
|
end
|