-- Creates all neccessary scripts for the gui on initial load, everything except build tools -- Created by Ben T. 10/29/10 -- Please note that these are loaded in a specific order to diminish errors/perceived load time by user local CorePackages = game:GetService("CorePackages") local ScriptContext = game:GetService("ScriptContext") local UserInputService = game:GetService("UserInputService") local GuiService = game:GetService("GuiService") local VRService = game:GetService("VRService") local Players = game:GetService("Players") local ABTestService = game:GetService("ABTestService") local RunService = game:GetService("RunService") local RobloxGui = game:GetService("CoreGui"):WaitForChild("RobloxGui") local CoreGuiModules = RobloxGui:WaitForChild("Modules") local initify = require(CorePackages.initify) -- Initifying CorePackages.Packages is required for the error reporter to work. initify(CorePackages.Packages) -- Load the error reporter as early as possible, even before we finish requiring, -- so that it can report any errors that come after this point. ScriptContext:AddCoreScriptLocal("CoreScripts/CoreScriptErrorReporter", RobloxGui) local Roact = require(CorePackages.Roact) local PolicyService = require(CoreGuiModules:WaitForChild("Common"):WaitForChild("PolicyService")) -- remove this when removing FFlagConnectErrorHandlerInLoadingScript local FFlagConnectionScriptEnabled = settings():GetFFlag("ConnectionScriptEnabled") local FFlagLuaInviteModalEnabled = settings():GetFFlag("LuaInviteModalEnabledV384") local FFlagUseRoactGlobalConfigInCoreScripts = require(RobloxGui.Modules.Flags.FFlagUseRoactGlobalConfigInCoreScripts) local FFlagConnectErrorHandlerInLoadingScript = require(RobloxGui.Modules.Flags.FFlagConnectErrorHandlerInLoadingScript) local GetFFlagRoactBubbleChat = require(RobloxGui.Modules.Common.Flags.GetFFlagRoactBubbleChat) local isNewGamepadMenuEnabled = require(RobloxGui.Modules.Flags.isNewGamepadMenuEnabled) -- The Rotriever index, as well as the in-game menu code itself, relies on -- the init.lua convention, so we have to run initify over the module. -- We do this explicitly because the LocalPlayer hasn't been created at this -- point, so we can't check enrollment status. initify(CoreGuiModules.InGameMenu) local UIBlox = require(CorePackages.UIBlox) local uiBloxConfig = require(CoreGuiModules.UIBloxInGameConfig) UIBlox.init(uiBloxConfig) local localPlayer = Players.LocalPlayer while not localPlayer do Players:GetPropertyChangedSignal("LocalPlayer"):Wait() localPlayer = Players.LocalPlayer end -- Since prop validation can be expensive in certain scenarios, you can enable -- this flag locally to validate props to Roact components. if FFlagUseRoactGlobalConfigInCoreScripts and RunService:IsStudio() then Roact.setGlobalConfig({ propValidation = true, elementTracing = true, }) end ABTestService:InitializeForUserId(localPlayer.UserId) local InGameMenuDependencies = require(CorePackages.InGameMenuDependencies) local InGameMenuUIBlox = InGameMenuDependencies.UIBlox if InGameMenuUIBlox ~= UIBlox then InGameMenuUIBlox.init(uiBloxConfig) end local soundFolder = Instance.new("Folder") soundFolder.Name = "Sounds" soundFolder.Parent = RobloxGui -- This can be useful in cases where a flag configuration issue causes requiring a CoreScript to fail local function safeRequire(moduleScript) local success, ret = pcall(require, moduleScript) if success then return ret else warn("Failure to Start CoreScript module " .. moduleScript.Name .. ".\n" .. ret) end end if not FFlagConnectErrorHandlerInLoadingScript then if FFlagConnectionScriptEnabled and not GuiService:IsTenFootInterface() then ScriptContext:AddCoreScriptLocal("Connection", RobloxGui) end end -- In-game notifications script ScriptContext:AddCoreScriptLocal("CoreScripts/NotificationScript2", RobloxGui) -- TopBar initify(CoreGuiModules.TopBar) coroutine.wrap(safeRequire)(CoreGuiModules.TopBar) if game:GetEngineFeature("LuobuModerationStatus") then coroutine.wrap(function() initify(CoreGuiModules.Watermark) safeRequire(CoreGuiModules.Watermark) end)() end -- MainBotChatScript (the Lua part of Dialogs) ScriptContext:AddCoreScriptLocal("CoreScripts/MainBotChatScript2", RobloxGui) coroutine.wrap(function() -- this is the first place we call, which can yield so wrap in coroutine if PolicyService:IsSubjectToChinaPolicies() then ScriptContext:AddCoreScriptLocal("CoreScripts/AntiAddictionPrompt", RobloxGui) ScriptContext:AddCoreScriptLocal("CoreScripts/ScreenTimeInGame", RobloxGui) end end)() -- Performance Stats Management ScriptContext:AddCoreScriptLocal("CoreScripts/PerformanceStatsManagerScript", RobloxGui) -- Default Alternate Death Ragdoll (China only for now) ScriptContext:AddCoreScriptLocal("CoreScripts/PlayerRagdoll", RobloxGui) -- Chat script coroutine.wrap(safeRequire)(RobloxGui.Modules.ChatSelector) coroutine.wrap(safeRequire)(RobloxGui.Modules.PlayerList.PlayerListManager) local UserRoactBubbleChatBeta do local success, value = pcall(function() return UserSettings():IsUserFeatureEnabled("UserRoactBubbleChatBeta") end) UserRoactBubbleChatBeta = success and value end if game:GetEngineFeature("EnableBubbleChatFromChatService") or UserRoactBubbleChatBeta then ScriptContext:AddCoreScriptLocal("CoreScripts/InGameChat", RobloxGui) end -- Purchase Prompt Script coroutine.wrap(function() local PurchasePrompt = safeRequire(CorePackages.PurchasePrompt) if PurchasePrompt then PurchasePrompt.mountPurchasePrompt() end end)() -- Prompt Block Player Script ScriptContext:AddCoreScriptLocal("CoreScripts/BlockPlayerPrompt", RobloxGui) ScriptContext:AddCoreScriptLocal("CoreScripts/FriendPlayerPrompt", RobloxGui) -- Avatar Context Menu ScriptContext:AddCoreScriptLocal("CoreScripts/AvatarContextMenu", RobloxGui) -- Backpack! coroutine.wrap(safeRequire)(RobloxGui.Modules.BackpackScript) -- Emotes Menu coroutine.wrap(safeRequire)(RobloxGui.Modules.EmotesMenu.EmotesMenuMaster) ScriptContext:AddCoreScriptLocal("CoreScripts/VehicleHud", RobloxGui) if not isNewGamepadMenuEnabled() then ScriptContext:AddCoreScriptLocal("CoreScripts/GamepadMenu", RobloxGui) end if FFlagLuaInviteModalEnabled then ScriptContext:AddCoreScriptLocal("CoreScripts/InviteToGamePrompt", RobloxGui) end if UserInputService.TouchEnabled then -- touch devices don't use same control frame -- only used for touch device button generation ScriptContext:AddCoreScriptLocal("CoreScripts/ContextActionTouch", RobloxGui) RobloxGui:WaitForChild("ControlFrame") RobloxGui.ControlFrame:WaitForChild("BottomLeftControl") RobloxGui.ControlFrame.BottomLeftControl.Visible = false end ScriptContext:AddCoreScriptLocal("CoreScripts/InspectAndBuy", RobloxGui) coroutine.wrap(function() if not VRService.VREnabled then VRService:GetPropertyChangedSignal("VREnabled"):Wait() end safeRequire(RobloxGui.Modules.VR.VirtualKeyboard) safeRequire(RobloxGui.Modules.VR.UserGui) end)() ScriptContext:AddCoreScriptLocal("CoreScripts/NetworkPause", RobloxGui)