Files
watrbx-game-engine/PlatformContent/pc/scripts/ui/Modules/EngagementScreen.lua
T
2025-09-18 17:55:52 -04:00

188 lines
6.7 KiB
Lua

-- Written by Kip Turner, Copyright ROBLOX 2015
local CoreGui = Game:GetService("CoreGui")
local GuiService = game:GetService('GuiService')
local PlayersService = game:GetService("Players")
local ContextActionService = game:GetService("ContextActionService")
local UserInputService = game:GetService("UserInputService")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local AccountManager = require(Modules:FindFirstChild('AccountManager'))
local Utility = require(Modules:FindFirstChild('Utility'))
local GlobalSettings = require(Modules:FindFirstChild('GlobalSettings'))
local Errors = require(Modules:FindFirstChild('Errors'))
local ErrorOverlay = require(Modules:FindFirstChild('ErrorOverlay'))
local Strings = require(Modules:FindFirstChild('LocalizedStrings'))
local AssetManager = require(Modules:FindFirstChild('AssetManager'))
local ScreenManager = require(Modules:FindFirstChild('ScreenManager'))
local SetAccountCredentialsScreen = require(Modules:FindFirstChild('SetAccountCredentialsScreen'))
local SignInScreen = require(Modules:FindFirstChild('SignInScreen'))
local LoadingWidget = require(Modules:FindFirstChild('LoadingWidget'))
local SoundManager = require(Modules:FindFirstChild('SoundManager'))
local EventHub = require(Modules:FindFirstChild('EventHub'))
local ANY_KEY_CODES =
{
[Enum.KeyCode.ButtonA] = true;
-- [Enum.KeyCode.ButtonB] = true;
[Enum.KeyCode.ButtonX] = true;
[Enum.KeyCode.ButtonY] = true;
[Enum.KeyCode.ButtonStart] = true;
[Enum.KeyCode.ButtonSelect] = true;
[Enum.KeyCode.ButtonL1] = true;
[Enum.KeyCode.ButtonR1] = true;
}
local GAMEPAD_INPUT_TYPES =
{
[Enum.UserInputType.Gamepad1] = true;
[Enum.UserInputType.Gamepad2] = true;
[Enum.UserInputType.Gamepad3] = true;
[Enum.UserInputType.Gamepad4] = true;
}
local function CreateHomePane(parent)
local this = {}
local AnyButtonBeganConnection, AnyButtonEndedConnection = nil
local EngagementScreenContainer = Utility.Create'Frame'
{
Name = 'EngagementScreen';
Size = UDim2.new(1, 0, 1, 0);
BackgroundTransparency = 1;
Parent = parent;
}
local RobloxLogo = Utility.Create'ImageLabel'
{
Name = 'RobloxLogo';
BackgroundTransparency = 1;
Size = UDim2.new(0, 594, 0, 199);
Image = 'rbxasset://textures/ui/Shell/Icons/ROBLOXSplashLogo.png';
Parent = EngagementScreenContainer;
}
Utility.CalculateAnchor(RobloxLogo, UDim2.new(0.5,0,0.5,0), Utility.Enum.Anchor.Center)
local AnyButtonHint = Utility.Create'TextLabel'
{
Name = 'AnyButtonHint';
Text = Strings:LocalizedString('EngagementScreenHint');
TextColor3 = GlobalSettings.WhiteTextColor;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.ButtonSize;
Size = UDim2.new(0,0,0,0);
BackgroundTransparency = 1;
Parent = RobloxLogo;
};
Utility.CalculateAnchor(AnyButtonHint, UDim2.new(0.5,0,0,415), Utility.Enum.Anchor.Center)
local function beginAuthenticationAsync(gamePad)
local authResult = nil
local hasRobloxCredentialsResult = nil
local function auth()
authResult = AccountManager:BeginAuthenticationAsync(gamePad)
if not authResult then
print("beginAuthenticationAsync() failed because", result)
authResult = AccountManager.AuthResults.Error
end
if authResult == AccountManager.AuthResults.Success then
hasRobloxCredentialsResult = AccountManager:HasRobloxCredentialsAsync()
end
end
local loader = LoadingWidget(
{ Parent = RobloxLogo, Position = UDim2.new(0.5, 0, 0, 415) }, { auth })
loader:AwaitFinished()
loader:Cleanup()
loader = nil
print("beginAuthenticationAsync has completed with code:", authResult)
if authResult == AccountManager.AuthResults.Success then
if hasRobloxCredentialsResult == AccountManager.AuthResults.Success then
EventHub:dispatchEvent(EventHub.Notifications["AuthenticationSuccess"])
elseif hasRobloxCredentialsResult == AccountManager.AuthResults.UsernamePasswordNotSet then
local setAccountCredentialsScreen = SetAccountCredentialsScreen(Strings:LocalizedString("SetCredentialsTitle"),
Strings:LocalizedString("SetCredentialsPhrase"), Strings:LocalizedString("SetCredentialsWord"))
setAccountCredentialsScreen:SetParent(EngagementScreenContainer.Parent)
ScreenManager:OpenScreen(setAccountCredentialsScreen, true)
else
local err = Errors.Authentication[hasRobloxCredentialsResult] or Errors.Default
ScreenManager:OpenScreen(ErrorOverlay(err), false)
end
elseif authResult == AccountManager.AuthResults.AccountUnlinked then
local signInScreen = SignInScreen()
signInScreen:SetParent(EngagementScreenContainer.Parent)
ScreenManager:OpenScreen(signInScreen, true)
else
local err = Errors.Authentication[authResult] or Errors.Default
ScreenManager:OpenScreen(ErrorOverlay(err), false)
end
end
local function onAnyButtonPressed(gamePad)
AnyButtonBeganConnection = Utility.DisconnectEvent(AnyButtonBeganConnection)
AnyButtonEndedConnection = Utility.DisconnectEvent(AnyButtonEndedConnection)
AnyButtonHint.TextColor3 = GlobalSettings.WhiteTextColor
Utility.PropertyTweener(AnyButtonHint, 'TextTransparency', 0, 1, 0.25, Utility.EaseOutQuad, true,
function()
beginAuthenticationAsync(gamePad)
end)
end
function this:Show()
EngagementScreenContainer.Visible = true
end
function this:Hide()
EngagementScreenContainer.Visible = false
end
function this:Focus()
AnyButtonHint.TextColor3 = GlobalSettings.WhiteTextColor
AnyButtonHint.TextTransparency = 0
Utility.DisconnectEvent(AnyButtonBeganConnection)
local anyButtonDown = {}
AnyButtonBeganConnection = UserInputService.InputBegan:connect(function(inputObject)
if GAMEPAD_INPUT_TYPES[inputObject.UserInputType] then
if ANY_KEY_CODES[inputObject.KeyCode] then
AnyButtonHint.TextColor3 = GlobalSettings.GreyTextColor
anyButtonDown[inputObject.KeyCode] = true
end
end
end)
Utility.DisconnectEvent(AnyButtonEndedConnection)
local isAuthenticating = false
AnyButtonEndedConnection = UserInputService.InputEnded:connect(function(inputObject)
if isAuthenticating then return end
isAuthenticating = true
if GAMEPAD_INPUT_TYPES[inputObject.UserInputType] then
if ANY_KEY_CODES[inputObject.KeyCode] and anyButtonDown[inputObject.KeyCode] == true then
SoundManager:Play('ButtonPress')
onAnyButtonPressed(inputObject.UserInputType)
end
end
isAuthenticating = false
anyButtonDown[inputObject.KeyCode] = false
end)
end
function this:RemoveFocus()
AnyButtonBeganConnection = Utility.DisconnectEvent(AnyButtonBeganConnection)
AnyButtonEndedConnection = Utility.DisconnectEvent(AnyButtonEndedConnection)
end
function this:SetParent(newParent)
EngagementScreenContainer.Parent = newParent
end
return this
end
return CreateHomePane