untyped global function MenuLobby_Init global function InitLobbyMenu global function UICodeCallback_SetupPlayerListGenElements global function UpdateAnnouncementDialog global function EnableButton global function DisableButton global function UICodeCallback_CommunityUpdated global function UICodeCallback_FactionUpdated global function Lobby_UpdateInboxButtons global function GetTimeToRestartMatchMaking global function RefreshCreditsAvailable global function InviteFriendsIfAllowed global function SetPutPlayerInMatchmakingAfterDelay global function DLCStoreShouldBeMarkedAsNew global function SetNextAutoMatchmakingPlaylist global function GetNextAutoMatchmakingPlaylist global function OnDpadCommsButton_Activate global function GetActiveSearchingPlaylist global function Lobby_SetFDModeBasedOnSearching global function Lobby_IsFDMode global function Lobby_SetAutoFDOpen global function Lobby_SetFDMode global function Lobby_ToggleFDMode global function Lobby_CallsignButton3EventHandler global function Lobby_RefreshButtons global function OnStoreButton_Activate global function OnStoreBundlesButton_Activate global function OnStoreNewReleasesButton_Activate const string MATCHMAKING_AUDIO_CONNECTING = "menu_campaignsummary_titanunlocked" struct { struct { string playlistName = "" int mapIdx = -1 int modeIdx = -1 } preCacheInfo array searchIconElems array searchTextElems array matchStartCountdownElems array matchStatusRuis array creditsAvailableElems var chatroomMenu var chatroomMenu_chatroomWidget var findGameButton var inviteRoomButton var inviteFriendsButton var inviteFriendsToNetworkButton var toggleMenuModeButton var networksMoreButton int inboxHeaderIndex var inboxButton int customizeHeaderIndex var pilotButton var titanButton var boostsButton var storeButton var storeNewReleasesButton var storeBundlesButton var factionButton var bannerButton var patchButton var statsButton var networksHeader var settingsHeader var storeHeader var browseNetworkButton var faqButton var dpadCommsButton var genUpButton array lobbyButtons var playHeader var customizeHeader var callsignHeader float timeToRestartMatchMaking = 0 string nextAutoMatchmakingPlaylist var callsignCard bool putPlayerInMatchmakingAfterDelay = false float matchmakingStartTime = 0.0 int etaTime = 0 int etaMaxMinutes = 15 string lastMixtapeMatchmakingStatus ComboStruct &lobbyComboStruct bool isFDMode = false bool shouldAutoOpenFDMenu = false } file void function MenuLobby_Init() { PrecacheHUDMaterial( $"ui/menu/lobby/player_hover" ) PrecacheHUDMaterial( $"ui/menu/lobby/chatroom_player" ) PrecacheHUDMaterial( $"ui/menu/lobby/chatroom_hover" ) PrecacheHUDMaterial( $"ui/menu/main_menu/motd_background" ) PrecacheHUDMaterial( $"ui/menu/main_menu/motd_background_happyhour" ) AddUICallback_OnLevelInit( OnLobbyLevelInit ) } bool function ChatroomIsVisibleAndFocused() { return Hud_IsVisible( file.chatroomMenu ) && Hud_IsFocused( file.chatroomMenu_chatroomWidget ); } bool function ChatroomIsVisibleAndNotFocused() { return Hud_IsVisible( file.chatroomMenu ) && !Hud_IsFocused( file.chatroomMenu_chatroomWidget ); } void function Lobby_UpdateInboxButtons() { var menu = GetMenu( "LobbyMenu" ) if ( GetUIPlayer() == null || !IsPersistenceAvailable() ) return bool hasNewMail = (Inbox_HasUnreadMessages() && Inbox_GetTotalMessageCount() > 0) || PlayerRandomUnlock_GetTotal( GetUIPlayer() ) > 0 if ( hasNewMail ) { int messageCount = Inbox_GetTotalMessageCount() int lootCount = PlayerRandomUnlock_GetTotal( GetUIPlayer() ) int totalCount = messageCount + lootCount string countString if ( totalCount >= MAX_MAIL_COUNT ) countString = MAX_MAIL_COUNT + "+" else countString = string( totalCount ) SetComboButtonHeaderTitle( menu, file.inboxHeaderIndex, Localize( "#MENU_HEADER_NETWORKS_NEW_MSGS", countString ) ) ComboButton_SetText( file.inboxButton, Localize( "#MENU_TITLE_INBOX_NEW_MSGS", countString ) ) } else { SetComboButtonHeaderTitle( menu, file.inboxHeaderIndex, Localize( "#MENU_HEADER_NETWORKS" ) ) ComboButton_SetText( file.inboxButton, Localize( "#MENU_TITLE_READ" ) ) } ComboButton_SetNewMail( file.inboxButton, hasNewMail ) } void function InitLobbyMenu() { var menu = GetMenu( "LobbyMenu" ) InitOpenInvitesMenu() AddMenuFooterOption( menu, BUTTON_A, "#A_BUTTON_SELECT", "", null, ChatroomIsVisibleAndNotFocused ) AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) AddMenuFooterOption( menu, BUTTON_BACK, "#BACK_BUTTON_POSTGAME_REPORT", "#POSTGAME_REPORT", OpenPostGameMenu, IsPostGameMenuValid ) AddMenuFooterOption( menu, BUTTON_TRIGGER_RIGHT, "#R_TRIGGER_CHAT", "", null, IsVoiceChatPushToTalk ) InitChatroom( menu ) file.chatroomMenu = Hud_GetChild( menu, "ChatRoomPanel" ) file.chatroomMenu_chatroomWidget = Hud_GetChild( file.chatroomMenu, "ChatRoom" ) file.genUpButton = Hud_GetChild( menu, "GenUpButton" ) SetupComboButtonTest( menu ) AddMenuEventHandler( menu, eUIEvent.MENU_OPEN, OnLobbyMenu_Open ) AddMenuEventHandler( menu, eUIEvent.MENU_CLOSE, OnLobbyMenu_Close ) AddMenuEventHandler( menu, eUIEvent.MENU_NAVIGATE_BACK, OnLobbyMenu_NavigateBack ) RegisterUIVarChangeCallback( "gameStartTime", GameStartTime_Changed ) RegisterUIVarChangeCallback( "showGameSummary", ShowGameSummary_Changed ) file.searchIconElems = GetElementsByClassnameForMenus( "SearchIconClass", uiGlobal.allMenus ) file.searchTextElems = GetElementsByClassnameForMenus( "SearchTextClass", uiGlobal.allMenus ) file.matchStartCountdownElems = GetElementsByClassnameForMenus( "MatchStartCountdownClass", uiGlobal.allMenus ) file.matchStatusRuis = GetElementsByClassnameForMenus( "MatchmakingStatusRui", uiGlobal.allMenus ) file.creditsAvailableElems = GetElementsByClassnameForMenus( "CreditsAvailableClass", uiGlobal.allMenus ) file.callsignCard = Hud_GetChild( menu, "CallsignCard" ) AddEventHandlerToButton( menu, "GenUpButton", UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "Generation_Respawn" ) ) ) AddMenuVarChangeHandler( "focus", UpdateFooterOptions ) AddMenuVarChangeHandler( "isFullyConnected", UpdateFooterOptions ) AddMenuVarChangeHandler( "isPartyLeader", UpdateFooterOptions ) AddMenuVarChangeHandler( "isPrivateMatch", UpdateFooterOptions ) #if DURANGO_PROG AddMenuVarChangeHandler( "DURANGO_canInviteFriends", UpdateFooterOptions ) AddMenuVarChangeHandler( "DURANGO_isJoinable", UpdateFooterOptions ) AddMenuVarChangeHandler( "DURANGO_isGameFullyInstalled", UpdateFooterOptions ) #elseif PS4_PROG AddMenuVarChangeHandler( "PS4_canInviteFriends", UpdateFooterOptions ) #elseif PC_PROG AddMenuVarChangeHandler( "ORIGIN_isEnabled", UpdateFooterOptions ) AddMenuVarChangeHandler( "ORIGIN_isJoinable", UpdateFooterOptions ) #endif RegisterSignal( "BypassWaitBeforeRestartingMatchmaking" ) RegisterSignal( "PutPlayerInMatchmakingAfterDelay" ) RegisterSignal( "CancelRestartingMatchmaking" ) RegisterSignal( "LeaveParty" ) } void function SetupComboButtonTest( var menu ) { ComboStruct comboStruct = ComboButtons_Create( menu ) file.lobbyComboStruct = comboStruct int headerIndex = 0 int buttonIndex = 0 file.playHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_PLAY" ) bool isModded = IsNorthstarServer() // this will be the server browser if ( isModded ) { file.findGameButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_SERVER_BROWSER" ) file.lobbyButtons.append( file.findGameButton ) Hud_SetLocked( file.findGameButton, true ) Hud_AddEventHandler( file.findGameButton, UIE_CLICK, OpenServerBrowser ) } else { file.findGameButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_FIND_GAME" ) file.lobbyButtons.append( file.findGameButton ) Hud_AddEventHandler( file.findGameButton, UIE_CLICK, BigPlayButton1_Activate ) } // this is used for launching private matches now if ( isModded ) { file.inviteRoomButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#PRIVATE_MATCH" ) Hud_AddEventHandler( file.inviteRoomButton, UIE_CLICK, StartPrivateMatch ) } else { file.inviteRoomButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INVITE_ROOM" ) Hud_AddEventHandler( file.inviteRoomButton, UIE_CLICK, DoRoomInviteIfAllowed ) } file.inviteFriendsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INVITE_FRIENDS" ) Hud_AddEventHandler( file.inviteFriendsButton, UIE_CLICK, InviteFriendsIfAllowed ) if ( isModded ) { Hud_SetEnabled( file.inviteFriendsButton, false ) Hud_SetVisible( file.inviteFriendsButton, false ) } // file.toggleMenuModeButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_LOBBY_SWITCH_FD" ) // Hud_AddEventHandler( file.toggleMenuModeButton, UIE_CLICK, ToggleLobbyMode ) headerIndex++ buttonIndex = 0 file.customizeHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_LOADOUTS" ) file.customizeHeaderIndex = headerIndex var pilotButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_PILOT" ) file.pilotButton = pilotButton file.lobbyButtons.append( pilotButton ) Hud_AddEventHandler( pilotButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "EditPilotLoadoutsMenu" ) ) ) var titanButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_TITAN" ) file.titanButton = titanButton Hud_AddEventHandler( titanButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "EditTitanLoadoutsMenu" ) ) ) file.boostsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_BOOSTS" ) Hud_AddEventHandler( file.boostsButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "BurnCardMenu" ) ) ) headerIndex++ buttonIndex = 0 file.callsignHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_CALLSIGN" ) file.bannerButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_BANNER" ) file.lobbyButtons.append( file.bannerButton ) Hud_AddEventHandler( file.bannerButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "CallsignCardSelectMenu" ) ) ) file.patchButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_PATCH" ) Hud_AddEventHandler( file.patchButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "CallsignIconSelectMenu" ) ) ) file.factionButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_FACTION" ) Hud_AddEventHandler( file.factionButton, UIE_CLICK, Lobby_CallsignButton3EventHandler ) file.statsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_STATS" ) Hud_AddEventHandler( file.statsButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "ViewStatsMenu" ) ) ) file.callsignCard = Hud_GetChild( menu, "CallsignCard" ) headerIndex++ buttonIndex = 0 file.networksHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_NETWORKS" ) file.inboxHeaderIndex = headerIndex var networksInbox = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INBOX" ) file.inboxButton = networksInbox file.lobbyButtons.append( networksInbox ) Hud_AddEventHandler( networksInbox, UIE_CLICK, OnInboxButton_Activate ) var switchButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#COMMUNITY_SWITCHCOMMUNITY" ) Hud_AddEventHandler( switchButton, UIE_CLICK, OnSwitchButton_Activate ) var browseButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#COMMUNITY_BROWSE_NETWORKS" ) file.lobbyButtons.append( browseButton ) Hud_AddEventHandler( browseButton, UIE_CLICK, OnBrowseNetworksButton_Activate ) file.browseNetworkButton = browseButton #if NETWORK_INVITE file.inviteFriendsToNetworkButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#INVITE_FRIENDS" ) file.lobbyButtons.append( file.inviteFriendsToNetworkButton ) Hud_AddEventHandler( file.inviteFriendsToNetworkButton, UIE_CLICK, OnInviteFriendsToNetworkButton_Activate ) #endif headerIndex++ buttonIndex = 0 file.storeHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_STORE" ) SetComboButtonHeaderTint( GetMenu( "LobbyMenu" ), headerIndex, true ) file.storeButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_STORE_BROWSE" ) Hud_AddEventHandler( file.storeButton, UIE_CLICK, OnStoreButton_Activate ) file.storeNewReleasesButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_STORE_NEW_RELEASES" ) Hud_AddEventHandler( file.storeNewReleasesButton, UIE_CLICK, OnStoreNewReleasesButton_Activate ) file.storeBundlesButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_STORE_BUNDLES" ) Hud_AddEventHandler( file.storeBundlesButton, UIE_CLICK, OnStoreBundlesButton_Activate ) headerIndex++ buttonIndex = 0 file.settingsHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_SETTINGS" ) var controlsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_CONTROLS" ) Hud_AddEventHandler( controlsButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "ControlsMenu" ) ) ) file.lobbyButtons.append( controlsButton ) #if CONSOLE_PROG var avButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#AUDIO_VIDEO" ) Hud_AddEventHandler( avButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "AudioVideoMenu" ) ) ) #elseif PC_PROG var videoButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#AUDIO" ) Hud_AddEventHandler( videoButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "AudioMenu" ) ) ) var soundButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#VIDEO" ) Hud_AddEventHandler( soundButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "VideoMenu" ) ) ) #endif file.faqButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#KNB_MENU_HEADER" ) Hud_AddEventHandler( file.faqButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "KnowledgeBaseMenu" ) ) ) comboStruct.navUpButtonDisabled = true comboStruct.navDownButton = file.genUpButton ComboButtons_Finalize( comboStruct ) } bool function MatchResultsExist() { return true // TODO } void function StartPrivateMatch( var button ) { if ( Hud_IsLocked( button ) ) return ClientCommand( "StartPrivateMatchSearch" ) } void function DoRoomInviteIfAllowed( var button ) { if ( Hud_IsLocked( button ) ) return if ( !DoesCurrentCommunitySupportInvites() ) { OnBrowseNetworksButton_Activate( button ) return } entity player = GetUIPlayer() if ( IsValid( player ) && Player_NextAvailableMatchmakingTime( player ) > 0 ) { DisplayMatchmakingPenaltyDialog( player ) return } SendOpenInvite( true ) OpenSelectedPlaylistMenu() } void function DisplayMatchmakingPenaltyDialog( entity player ) { int minutesRemaining = int( ceil( Player_GetRemainingMatchmakingDelay( player ) / 60) ) if ( minutesRemaining <= 1 ) ServerCallback_GenericDialog( 30, 31, true ) else if ( minutesRemaining == 2 ) ServerCallback_GenericDialog( 30, 32, true ) else if ( minutesRemaining == 3 ) ServerCallback_GenericDialog( 30, 33, true ) else if ( minutesRemaining == 4 ) ServerCallback_GenericDialog( 30, 34, true ) else if ( minutesRemaining == 5 ) ServerCallback_GenericDialog( 30, 35, true ) else ServerCallback_GenericDialog( 30, 36, true ) } void function CreatePartyAndInviteFriends() { if ( CanInvite() ) { while ( !PartyHasMembers() && !AmIPartyLeader() ) { ClientCommand( "createparty" ) WaitFrameOrUntilLevelLoaded() } InviteFriends( file.inviteFriendsButton ) } else { printt( "Not inviting friends - CanInvite() returned false" ); } } void function ToggleLobbyMode( var button ) { Lobby_ToggleFDMode() } void function Lobby_ToggleFDMode() { Hud_SetFocused( file.findGameButton ) ComboButtons_ResetColumnFocus( file.lobbyComboStruct ) file.isFDMode = !file.isFDMode Lobby_RefreshButtons() } void function Lobby_CallsignButton3EventHandler( var button ) { if ( Lobby_IsFDMode() ) { AdvanceMenu( GetMenu( "ViewStatsMenu" ) ) } else { AdvanceMenu( GetMenu( "FactionChoiceMenu" ) ) } } void function InviteFriendsIfAllowed( var button ) { if ( Hud_IsLocked( button ) ) return entity player = GetUIPlayer() if ( IsValid( player ) && Player_NextAvailableMatchmakingTime( player ) > 0 ) { DisplayMatchmakingPenaltyDialog( player ) return } #if PC_PROG if ( !Origin_IsOverlayAvailable() ) { PopUpOriginOverlayDisabledDialog() return } #endif thread CreatePartyAndInviteFriends() } bool function CanInvite() { if ( Player_NextAvailableMatchmakingTime( GetUIPlayer() ) > 0 ) return false #if DURANGO_PROG return ( GetMenuVarBool( "isFullyConnected" ) && GetMenuVarBool( "DURANGO_canInviteFriends" ) && GetMenuVarBool( "DURANGO_isJoinable" ) && GetMenuVarBool( "DURANGO_isGameFullyInstalled" ) ) #elseif PS4_PROG return GetMenuVarBool( "PS4_canInviteFriends" ) #elseif PC_PROG return ( GetMenuVarBool( "isFullyConnected" ) && GetMenuVarBool( "ORIGIN_isEnabled" ) && GetMenuVarBool( "ORIGIN_isJoinable" ) && Origin_IsOverlayAvailable() ) #endif } void function Lobby_RefreshButtons() { bool fdMode = Lobby_IsFDMode() var menu = GetMenu( "LobbyMenu" ) if ( GetTopNonDialogMenu() == GetMenu( "LobbyMenu" ) ) { if ( fdMode ) UI_SetPresentationType( ePresentationType.FD_MAIN ) else UI_SetPresentationType( ePresentationType.DEFAULT ) } string buttonString = fdMode ? "#MENU_LOBBY_SWITCH_DEFAULT" : "#MENU_LOBBY_SWITCH_FD" // ComboButton_SetText( file.toggleMenuModeButton, buttonString ) buttonString = fdMode ? "" : "#MENU_TITLE_BOOSTS" Hud_SetEnabled( file.boostsButton, !fdMode ) ComboButton_SetText( file.boostsButton, buttonString ) buttonString = fdMode ? "#MENU_TITLE_STATS" : "#MENU_TITLE_FACTION" ComboButton_SetText( file.factionButton, buttonString ) buttonString = fdMode ? "" : "#MENU_TITLE_STATS" Hud_SetEnabled( file.statsButton, !fdMode ) ComboButton_SetText( file.statsButton, buttonString ) buttonString = fdMode ? "#MENU_HEADER_PLAY_FD" : "#MENU_HEADER_PLAY" SetComboButtonHeaderTitle( menu, 0, buttonString ) if ( fdMode ) Hud_Hide( Hud_GetChild( menu, "ImgTopBar" ) ) else Hud_Show( Hud_GetChild( menu, "ImgTopBar" ) ) ComboButtons_ResetColumnFocus( file.lobbyComboStruct ) if ( fdMode ) { Hud_SetText( Hud_GetChild( menu, "MenuTitle" ), "" ) } else { Hud_SetText( Hud_GetChild( menu, "MenuTitle" ), "#MULTIPLAYER" ) } } void function OnLobbyMenu_Open() { Assert( IsConnected() ) // code will start loading DLC info from first party unless already done InitDLCStore() thread UpdateCachedNewItems() if ( file.putPlayerInMatchmakingAfterDelay ) { entity player = GetUIPlayer() if (IsValid( player )) { string playlistToSearch = expect string( player.GetPersistentVar( "lastPlaylist" ) ) string nextAutoPlaylist = GetNextAutoMatchmakingPlaylist() if ( nextAutoPlaylist.len() > 0 ) playlistToSearch = nextAutoPlaylist Lobby_SetFDModeBasedOnSearching( playlistToSearch ) } AdvanceMenu( GetMenu( "SearchMenu" ) ) thread PutPlayerInMatchmakingAfterDelay() file.putPlayerInMatchmakingAfterDelay = false } else if ( uiGlobal.activeMenu == GetMenu( "LobbyMenu" ) ) Lobby_SetFDMode( false ) thread UpdateLobbyUI() thread LobbyMenuUpdate( GetMenu( "LobbyMenu" ) ) Hud_Show( file.chatroomMenu ) Lobby_RefreshButtons() if ( IsFullyConnected() ) { entity player = GetUIPlayer() if ( !IsValid( player ) ) return while ( IsPersistenceAvailable() && (player.GetPersistentVarAsInt( "initializedVersion" ) < PERSISTENCE_INIT_VERSION) ) { WaitFrame() } if ( !IsPersistenceAvailable() ) return // Clear hidden boosts array boosts = GetAllItemsOfType( eItemTypes.BURN_METER_REWARD ) foreach ( boost in boosts ) { if ( boost.hidden ) { ClearNewStatus( null, boost.ref ) } } UpdateCallsignElement( file.callsignCard ) RefreshCreditsAvailable() bool emotesAreEnabled = EmotesEnabled() // "Customize" { bool anyNewPilotItems = HasAnyNewPilotItems( player ) bool anyNewTitanItems = HasAnyNewTitanItems( player ) bool anyNewBoosts = HasAnyNewBoosts( player ) bool anyNewCommsIcons = emotesAreEnabled ? HasAnyNewDpadCommsIcons( player ) : false bool anyNewCustomizeHeader = (anyNewPilotItems || anyNewTitanItems || anyNewBoosts || anyNewCommsIcons) RuiSetBool( Hud_GetRui( file.customizeHeader ), "isNew", anyNewCustomizeHeader ) ComboButton_SetNew( file.pilotButton, anyNewPilotItems ) ComboButton_SetNew( file.titanButton, anyNewTitanItems ) ComboButton_SetNew( file.boostsButton, anyNewBoosts ) } // "Store" { bool storeIsNew = DLCStoreShouldBeMarkedAsNew() RuiSetBool( Hud_GetRui( file.storeHeader ), "isNew", storeIsNew ) ComboButton_SetNew( file.storeButton, storeIsNew ) } // "Callsign" { bool anyNewBanners = HasAnyNewCallsignBanners( player ) bool anyNewPatches = HasAnyNewCallsignPatches( player ) bool anyNewFactions = HasAnyNewFactions( player ) && Lobby_IsFDMode() bool anyNewCallsignHeader = (anyNewBanners || anyNewPatches || anyNewFactions) RuiSetBool( Hud_GetRui( file.callsignHeader ), "isNew", anyNewCallsignHeader ) ComboButton_SetNew( file.bannerButton, anyNewBanners ) ComboButton_SetNew( file.patchButton, anyNewPatches ) ComboButton_SetNew( file.factionButton, anyNewFactions ) } bool faqIsNew = !GetConVarBool( "menu_faq_viewed" ) || HaveNewPatchNotes() || HaveNewCommunityNotes() RuiSetBool( Hud_GetRui( file.settingsHeader ), "isNew", faqIsNew ) ComboButton_SetNew( file.faqButton, faqIsNew ) TryUnlockSRSCallsign() Lobby_UpdateInboxButtons() if ( file.shouldAutoOpenFDMenu ) { file.shouldAutoOpenFDMenu = false AdvanceMenu( GetMenu( GetPlaylistMenuName() ) ) AdvanceMenu( GetMenu( "FDMenu" ) ) } } } bool function DLCStoreShouldBeMarkedAsNew() { if ( !IsFullyConnected() ) return false if ( !IsPersistenceAvailable() ) return false bool hasSeenStore = expect bool( GetPersistentVar( "hasSeenStore" ) ) bool result = (!hasSeenStore) return result } void function LobbyMenuUpdate( var menu ) { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) while ( GetTopNonDialogMenu() == menu ) { bool inPendingOpenInvite = InPendingOpenInvite() Hud_SetLocked( file.findGameButton, !IsPartyLeader() || inPendingOpenInvite ) Hud_SetLocked( file.inviteRoomButton, IsOpenInviteVisible() || GetPartySize() > 1 || inPendingOpenInvite ) Hud_SetLocked( file.inviteFriendsButton, inPendingOpenInvite ) bool canGenUp = false if ( GetUIPlayer() ) canGenUp = GetPersistentVarAsInt( "xp" ) == GetMaxPlayerXP() && GetGen() < MAX_GEN Hud_SetVisible( file.genUpButton, canGenUp ) Hud_SetEnabled( file.genUpButton, canGenUp ) WaitFrame() } } void function SetNextAutoMatchmakingPlaylist( string playlistName ) { file.nextAutoMatchmakingPlaylist = playlistName } string function GetNextAutoMatchmakingPlaylist() { return file.nextAutoMatchmakingPlaylist } void function PutPlayerInMatchmakingAfterDelay() { Signal( uiGlobal.signalDummy, "PutPlayerInMatchmakingAfterDelay" ) EndSignal( uiGlobal.signalDummy, "PutPlayerInMatchmakingAfterDelay" ) EndSignal( uiGlobal.signalDummy, "CancelRestartingMatchmaking" ) EndSignal( uiGlobal.signalDummy, "LeaveParty" ) EndSignal( uiGlobal.signalDummy, "OnCloseLobbyMenu" ) EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) if ( AreWeMatchmaking() ) //Party member, party leader is already searching return entity player = GetUIPlayer() if ( !player ) return string lastPlaylist = expect string( player.GetPersistentVar( "lastPlaylist" ) ) //Bump player out of match making if they were playing coliseum and are out of tickets. if ( ("coliseum" == lastPlaylist) && Player_GetColiseumTicketCount( GetLocalClientPlayer() ) <= 0 ) { SetNextAutoMatchmakingPlaylist( "" ) return } // Need to know if you were a party member before the countdown starts in case you leave bool wasAPartyMemberThatIsNotLeader = AmIPartyMember() waitthread WaitBeforeRestartingMatchmaking() // Only the leader should proceed to start matchmaking if ( wasAPartyMemberThatIsNotLeader ) return if ( !Console_HasPermissionToPlayMultiplayer() ) { ClientCommand( "disconnect" ) return } string playlistToSearch = lastPlaylist string nextAutoPlaylist = GetNextAutoMatchmakingPlaylist() if ( nextAutoPlaylist.len() > 0 ) playlistToSearch = nextAutoPlaylist StartMatchmakingPlaylists( playlistToSearch ) } void function WaitBeforeRestartingMatchmaking() { Signal( uiGlobal.signalDummy, "BypassWaitBeforeRestartingMatchmaking" ) EndSignal( uiGlobal.signalDummy, "BypassWaitBeforeRestartingMatchmaking" ) float timeToWait bool isPartyMemberThatIsNotLeader = AmIPartyMember() SetPutPlayerInMatchmakingAfterDelay( !isPartyMemberThatIsNotLeader ) if ( isPartyMemberThatIsNotLeader ) timeToWait = 99999 //HACK, JFS else timeToWait = GetCurrentPlaylistVarFloat( "wait_before_restarting_matchmaking_time", 30.0 ) float timeToEnd = Time() + timeToWait UpdateTimeToRestartMatchmaking( timeToEnd ) OnThreadEnd( function() : ( ) { UpdateTimeToRestartMatchmaking( 0.0 ) UpdateFooterOptions() } ) if ( isPartyMemberThatIsNotLeader ) { while( Time() < timeToEnd ) //Hack hack, JFS. No appropriate signals for StartMatchmaking() being called. Replace when code gives us notifications about it { if ( isPartyMemberThatIsNotLeader != ( AmIPartyMember() ) ) //Party Status changed. Party leader probably left? break if ( AreWeMatchmaking() ) //Need to break out if Party Leader brings us into matchmaking break WaitFrame() } } else { wait timeToWait } } void function OnLobbyMenu_Close() { Signal( uiGlobal.signalDummy, "OnCloseLobbyMenu" ) } void function OnLobbyMenu_NavigateBack() { if ( ChatroomIsVisibleAndFocused() ) { foreach ( button in file.lobbyButtons ) { if ( Hud_IsVisible( button ) && Hud_IsEnabled( button ) && !Hud_IsLocked( button ) ) { Hud_SetFocused( button ) return } } } if ( InPendingOpenInvite() ) LeaveOpenInvite() else LeaveDialog() } function GameStartTime_Changed() { UpdateGameStartTimeCounter() } function ShowGameSummary_Changed() { if ( level.ui.showGameSummary ) uiGlobal.EOGOpenInLobby = true } function UpdateGameStartTimeCounter() { if ( level.ui.gameStartTime == null ) return MatchmakingSetSearchText( "#STARTING_IN_LOBBY" ) MatchmakingSetCountdownTimer( expect float( level.ui.gameStartTime + 0.0 ), true ) HideMatchmakingStatusIcons() } bool function MatchmakingStatusShouldShowAsActiveSearch( string matchmakingStatus ) { if ( matchmakingStatus == "#MATCHMAKING_QUEUED" ) return true if ( matchmakingStatus == "#MATCHMAKING_ALLOCATING_SERVER" ) return true if ( matchmakingStatus == "#MATCHMAKING_MATCH_CONNECTING" ) return true return false } string function GetActiveSearchingPlaylist() { if ( !IsConnected() ) return "" if ( !AreWeMatchmaking() ) return "" string matchmakingStatus = GetMyMatchmakingStatus() if ( !MatchmakingStatusShouldShowAsActiveSearch( matchmakingStatus ) ) return "" string param1 = GetMyMatchmakingStatusParam( 1 ) return param1 } float function CalcMatchmakingWaitTime() { float result = ((file.matchmakingStartTime > 0.01) ? (Time() - file.matchmakingStartTime) : 0.0) return result } float function GetMixtapeWaitTimeForPlaylist( string playlistName ) { float maxWaitTime = float( GetPlaylistVarOrUseValue( playlistName, "mixtape_timeout", "0" ) ) return maxWaitTime } void function UpdateRestartMatchmakingStatus( float time ) { if ( AmIPartyMember() ) { MatchmakingSetSearchText( "#MATCHMAKING_WAIT_ON_PARTY_LEADER_RESTARTING_MATCHMAKING" ) } else { string statusText = "#MATCHMAKING_WAIT_BEFORE_RESTARTING_MATCHMAKING" string matchmakeNowText = "" if ( uiGlobal.activeMenu == GetMenu( "SearchMenu" ) ) matchmakeNowText = Localize( "#MATCHMAKING_WAIT_MATCHMAKE_NOW" ) MatchmakingSetSearchText( statusText, matchmakeNowText ) MatchmakingSetCountdownTimer( time, false ) } } void function UpdateMatchmakingStatus() { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) OnThreadEnd( function() : () { printt( "Hiding all matchmaking elems due to UpdateMatchmakingStatus thread ending" ) HideMatchmakingStatusIcons() MatchmakingSetSearchText( "" ) MatchmakingSetCountdownTimer( 0.0, true ) MatchmakingSetSearchVisible( false ) MatchmakingSetCountdownVisible( false ) } ) MatchmakingSetSearchVisible( true ) MatchmakingSetCountdownVisible( true ) var lobbyMenu = GetMenu( "LobbyMenu" ) var searchMenu = GetMenu( "SearchMenu" ) var postGameMenu = GetMenu( "PostGameMenu" ) string lastActiveSearchingPlaylist file.matchmakingStartTime = 0.0 file.etaTime = 0 file.etaMaxMinutes = int( GetCurrentPlaylistVarOrUseValue( "etaMaxMinutes", file.etaMaxMinutes ) ) file.lastMixtapeMatchmakingStatus = "" while ( true ) { int lobbyType = GetLobbyTypeScript() string matchmakingStatus = GetMyMatchmakingStatus() bool isConnectingToMatch = matchmakingStatus == "#MATCHMAKING_MATCH_CONNECTING" { string activeSearchingPlaylist = GetActiveSearchingPlaylist() if ( lastActiveSearchingPlaylist != activeSearchingPlaylist ) { if ( activeSearchingPlaylist.len() > 0 ) { lastActiveSearchingPlaylist = activeSearchingPlaylist file.matchmakingStartTime = Time() } else { lastActiveSearchingPlaylist = "" file.matchmakingStartTime = 0.0 } } if ( isConnectingToMatch && (matchmakingStatus != file.lastMixtapeMatchmakingStatus) ) { EmitUISound( MATCHMAKING_AUDIO_CONNECTING ) int mixtape_version = GetMixtapeMatchmakingVersion() if ( IsMixtapeVersionNew() ) LogMixtapeHasNew( mixtape_version ) } file.lastMixtapeMatchmakingStatus = matchmakingStatus } if ( level.ui.gameStartTime != null || lobbyType == eLobbyType.PRIVATE_MATCH ) { if ( level.ui.gameStartTimerComplete ) { MatchmakingSetSearchText( matchmakingStatus, GetMyMatchmakingStatusParam( 1 ), GetMyMatchmakingStatusParam( 2 ), GetMyMatchmakingStatusParam( 3 ), GetMyMatchmakingStatusParam( 4 ) ) } if ( uiGlobal.activeMenu == searchMenu ) CloseActiveMenu() } else if ( GetTimeToRestartMatchMaking() > 0 ) { UpdateRestartMatchmakingStatus( GetTimeToRestartMatchMaking() ) } else if ( level.ui.gameStartTime == null ) { MatchmakingSetCountdownTimer( 0.0, true ) MatchmakingSetSearchText( "" ) HideMatchmakingStatusIcons() if ( !IsConnected() || !AreWeMatchmaking() ) { if ( uiGlobal.activeMenu == searchMenu ) CloseActiveMenu() } else { ShowMatchmakingStatusIcons() if ( GetActiveMenu() == lobbyMenu && !IsMenuInMenuStack( searchMenu ) ) { CloseAllDialogs() AdvanceMenu( searchMenu ) } var statusEl = Hud_GetChild( searchMenu, "MatchmakingStatusBig" ) if ( matchmakingStatus == "#MATCH_NOTHING" ) { Hud_Hide( statusEl ) } else if ( MatchmakingStatusShouldShowAsActiveSearch( matchmakingStatus ) ) { string playlistName = GetMyMatchmakingStatusParam( 1 ) int etaSeconds = int( GetMyMatchmakingStatusParam( 2 ) ) int mapIdx = int( GetMyMatchmakingStatusParam( 3 ) ) int modeIdx = int( GetMyMatchmakingStatusParam( 4 ) ) string playlistList = GetMyMatchmakingStatusParam( 5 ) { string statusText = Localize( "#MATCHMAKING_PLAYLISTS" ) RuiSetString( Hud_GetRui( statusEl ), "statusText", statusText ) for ( int idx = 1; idx <= 5; ++idx ) RuiSetString( Hud_GetRui( statusEl ), ("bulletPointText" + idx), "" ) const int MAX_SHOWN_PLAYLISTS = 9 array< string > searchingPlaylists = split( playlistList, "," ) int searchingCount = minint( searchingPlaylists.len(), MAX_SHOWN_PLAYLISTS ) RuiSetInt( Hud_GetRui( statusEl ), "playlistCount", searchingCount ) for( int idx = 0; idx < searchingCount; ++idx ) { asset playlistThumbnail = GetPlaylistThumbnailImage( searchingPlaylists[idx] ) RuiSetImage( Hud_GetRui( statusEl ), format( "playlistIcon%d", idx ), playlistThumbnail ) } } Hud_Show( statusEl ) if ( mapIdx > -1 && modeIdx > -1 ) { if ( file.preCacheInfo.playlistName != playlistName || file.preCacheInfo.mapIdx != mapIdx || file.preCacheInfo.modeIdx != modeIdx ) { file.preCacheInfo.playlistName = playlistName file.preCacheInfo.mapIdx = mapIdx file.preCacheInfo.modeIdx = modeIdx } } string etaStr = "" if ( !etaSeconds && !isConnectingToMatch ) { matchmakingStatus = "#MATCHMAKING_SEARCHING_FOR_MATCH" } else { int now = int( Time() ) int etaTime = now + etaSeconds if ( !file.etaTime || etaTime < file.etaTime ) file.etaTime = etaTime int etaSeconds = file.etaTime - now if ( etaSeconds <= 0 ) file.etaTime = etaTime etaSeconds = file.etaTime - now if ( etaSeconds <= 90 ) { etaStr = Localize( "#MATCHMAKING_ETA_SECONDS", etaSeconds ) } else { int etaMinutes = int( ceil( etaSeconds / 60.0 ) ) if ( etaMinutes < file.etaMaxMinutes ) etaStr = Localize( "#MATCHMAKING_ETA_MINUTES", etaMinutes ) else etaStr = Localize( "#MATCHMAKING_ETA_UNKNOWN", etaMinutes ) } } MatchmakingSetSearchText( matchmakingStatus, etaStr ) } else { Hud_Show( statusEl ) RuiSetString( Hud_GetRui( statusEl ), "statusText", "" ) RuiSetInt( Hud_GetRui( statusEl ), "playlistCount", 0 ) } } } WaitFrameOrUntilLevelLoaded() } } void function UpdateAnnouncementDialog() { while ( IsLobby() && IsFullyConnected() ) { // Only safe on these menus. Not safe if these variables are true because they indicate the search menu or postgame menu are going to be opened. if ( ( uiGlobal.activeMenu == GetMenu( "LobbyMenu" ) || uiGlobal.activeMenu == GetMenu( "PrivateLobbyMenu" ) ) && !file.putPlayerInMatchmakingAfterDelay && !uiGlobal.EOGOpenInLobby ) { entity player = GetUIPlayer() // Only initialize here, CloseAnnouncementDialog() handles setting it when closing if ( uiGlobal.announcementVersionSeen == -1 ) uiGlobal.announcementVersionSeen = player.GetPersistentVarAsInt( "announcementVersionSeen" ) int announcementVersion = GetConVarInt( "announcementVersion" ) if ( announcementVersion > uiGlobal.announcementVersionSeen ) { OpenAnnouncementDialog() } else if ( uiGlobal.activeMenu != "AnnouncementDialog" && ShouldShowEmotesAnnouncement( player ) ) { OpenCommsIntroDialog() } } WaitFrame() } } bool function CurrentMenuIsPVEMenu() { var topMenu = GetTopNonDialogMenu() if ( topMenu == null ) return false return (uiGlobal.menuData[topMenu].isPVEMenu) } void function RefreshCreditsAvailable( int creditsOverride = -1 ) { entity player = GetUIPlayer() if ( !IsValid( player ) ) return if ( !IsPersistenceAvailable() ) return int credits = creditsOverride >= 0 ? creditsOverride : GetAvailableCredits( GetLocalClientPlayer() ) string pveTitle = "" int pveCredits = 0 bool isPVE = CurrentMenuIsPVEMenu() if ( isPVE ) { TitanLoadoutDef loadout = GetCachedTitanLoadout( uiGlobal.editingLoadoutIndex ) pveCredits = GetAvailableFDUnlockPoints( player, loadout.titanClass ) pveTitle = GetTitanLoadoutName( loadout ) } foreach ( elem in file.creditsAvailableElems ) { SetUIPlayerCreditsInfo( elem, credits, GetLocalClientPlayer().GetXP(), GetGen(), GetLevel(), GetNextLevel( GetLocalClientPlayer() ), isPVE, pveCredits, pveTitle ) } } void function SetUIPlayerCreditsInfo( var infoElement, int credits, int xp, int gen, int level, int nextLevel, bool isPVE, int pveCredits, string pveTitle ) { var rui = Hud_GetRui( infoElement ) RuiSetInt( rui, "credits", credits ) RuiSetString( rui, "nameText", GetPlayerName() ) RuiSetBool( rui, "isPVE", isPVE ) if ( isPVE ) { RuiSetInt( rui, "pveCredits", pveCredits ) RuiSetString( rui, "pveTitle", pveTitle ) } if ( xp == GetMaxPlayerXP() && gen < MAX_GEN ) { RuiSetString( rui, "levelText", PlayerXPDisplayGenAndLevel( gen, level ) ) RuiSetString( rui, "nextLevelText", Localize( "#REGEN_AVAILABLE" ) ) RuiSetInt( rui, "numLevelPips", GetXPPipsForLevel( level - 1 ) ) RuiSetInt( rui, "filledLevelPips", GetXPPipsForLevel( level - 1 ) ) } else if ( xp == GetMaxPlayerXP() && gen == MAX_GEN ) { RuiSetString( rui, "levelText", PlayerXPDisplayGenAndLevel( gen, level ) ) RuiSetString( rui, "nextLevelText", Localize( "#MAX_GEN" ) ) RuiSetInt( rui, "numLevelPips", GetXPPipsForLevel( level - 1 ) ) RuiSetInt( rui, "filledLevelPips", GetXPPipsForLevel( level - 1 ) ) } else { RuiSetString( rui, "levelText", PlayerXPDisplayGenAndLevel( gen, level ) ) RuiSetString( rui, "nextLevelText", PlayerXPDisplayGenAndLevel( gen, nextLevel ) ) RuiSetInt( rui, "numLevelPips", GetXPPipsForLevel( level ) ) RuiSetInt( rui, "filledLevelPips", GetXPFilledPipsForXP( xp ) ) } CallsignIcon callsignIcon = PlayerCallsignIcon_GetActive( GetLocalClientPlayer() ) RuiSetImage( rui, "callsignIcon", callsignIcon.image ) } void function OpenServerBrowser( var button ) { if ( Hud_IsLocked( button ) ) return // nothing here yet lol // look at OpenSelectedPlaylistMenu for advancing to server browser menu probably // AdvanceMenu( GetMenu( "ServerBrowser ) ) i guess? idk } void function BigPlayButton1_Activate( var button ) { if ( Hud_IsLocked( button ) ) return SendOpenInvite( false ) OpenSelectedPlaylistMenu() } function EnableButton( button ) { Hud_SetEnabled( button, true ) Hud_Show( button ) } function DisableButton( button ) { Hud_SetEnabled( button, false ) Hud_Hide( button ) } void function OpenSelectedPlaylistMenu() { if ( Lobby_IsFDMode() ) { AdvanceMenu( GetMenu( "FDMenu" ) ) } else { string playlistMenuName = GetPlaylistMenuName() AdvanceMenu( GetMenu( playlistMenuName ) ) } } function UpdateLobbyUI() { if ( uiGlobal.updatingLobbyUI ) return uiGlobal.updatingLobbyUI = true thread UpdateLobbyType() thread UpdateMatchmakingStatus() thread UpdateChatroomThread() //thread UpdateInviteJoinButton() thread UpdateInviteFriendsToNetworkButton() thread UpdatePlayerInfo() if ( uiGlobal.menuToOpenFromPromoButton != null ) { // Special case because this menu needs a few properties set before opening if ( IsStoreMenu( uiGlobal.menuToOpenFromPromoButton ) ) { string menuName = expect string( uiGlobal.menuToOpenFromPromoButton._name ) void functionref() preOpenfunc = null if ( uiGlobal.menuToOpenFromPromoButton == GetMenu( "StoreMenu_WeaponSkins" ) ) // Hardcoded special case for now preOpenfunc = DefaultToDLC11WeaponWarpaintBundle OpenStoreMenu( [ menuName ], preOpenfunc ) } else { AdvanceMenu( uiGlobal.menuToOpenFromPromoButton ) } uiGlobal.menuToOpenFromPromoButton = null } else if ( uiGlobal.EOGOpenInLobby ) { EOGOpen() } WaitSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) uiGlobal.updatingLobbyUI = false } void function UpdateInviteJoinButton() { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) var menu = GetMenu( "LobbyMenu" ) while ( true ) { if ( DoesCurrentCommunitySupportInvites() ) ComboButton_SetText( file.inviteRoomButton, Localize( "#MENU_TITLE_INVITE_ROOM" ) ) else ComboButton_SetText( file.inviteRoomButton, Localize( "#MENU_TITLE_JOIN_NETWORK" ) ) WaitFrame() } } void function UpdateInviteFriendsToNetworkButton() { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) var menu = GetMenu( "LobbyMenu" ) while ( true ) { bool areInvitesToNetworkNotAllowed = !DoesCurrentCommunitySupportChat() if ( areInvitesToNetworkNotAllowed || ( IsCurrentCommunityInviteOnly() && !AreWeAdminInCurrentCommunity() ) ) DisableButton( file.inviteFriendsToNetworkButton ) else EnableButton( file.inviteFriendsToNetworkButton ) WaitFrame() } } function UpdateLobbyType() { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) var menu = GetMenu( "LobbyMenu" ) int lobbyType local lastType local partySize local lastPartySize local debugArray = [ "SOLO", "PARTY_LEADER", "PARTY_MEMBER", "MATCH", "PRIVATE_MATCH" ] // Must match enum WaitFrameOrUntilLevelLoaded() while ( true ) { lobbyType = GetLobbyTypeScript() partySize = GetPartySize() if ( IsConnected() && ((lobbyType != lastType) || (partySize != lastPartySize)) ) { if ( lastType == null ) printt( "Lobby lobbyType changing from:", lastType, "to:", debugArray[lobbyType] ) else printt( "Lobby lobbyType changing from:", debugArray[lastType], "to:", debugArray[lobbyType] ) local animation = null switch ( lobbyType ) { case eLobbyType.SOLO: animation = "SoloLobby" break case eLobbyType.PARTY_LEADER: animation = "PartyLeaderLobby" break case eLobbyType.PARTY_MEMBER: animation = "PartyMemberLobby" break case eLobbyType.MATCH: animation = "MatchLobby" break case eLobbyType.PRIVATE_MATCH: animation = "PrivateMatchLobby" break } if ( animation != null ) { menu.RunAnimationScript( animation ) } // Force the animation scripts (which have zero duration) to complete before anything can cancel them. ForceUpdateHUDAnimations() lastType = lobbyType lastPartySize = partySize } WaitFrameOrUntilLevelLoaded() } } void function UICodeCallback_CommunityUpdated() { Community_CommunityUpdated() UpdateChatroomUI() } void function UICodeCallback_FactionUpdated() { printt( "Faction changed! to " + GetCurrentFaction() ); } void function UICodeCallback_SetupPlayerListGenElements( table params, int gen, int rank, bool isPlayingRanked, int pilotClassIndex ) { params.image = "" params.label = "" params.imageOverlay = "" } float function GetTimeToRestartMatchMaking() { return file.timeToRestartMatchMaking } void function UpdateTimeToRestartMatchmaking( float time )//JFS: This uses UI time instead of server time, which leads to awkwardness in MatchmakingSetCountdownTimer() and the rui involved { file.timeToRestartMatchMaking = time if ( time > 0 ) { UpdateRestartMatchmakingStatus( time ) ShowMatchmakingStatusIcons() } else { MatchmakingSetSearchText( "" ) MatchmakingSetCountdownTimer( 0.0, true ) HideMatchmakingStatusIcons() } } void function HideMatchmakingStatusIcons() { foreach ( element in file.searchIconElems ) Hud_Hide( element ) foreach ( element in file.matchStatusRuis ) RuiSetBool( Hud_GetRui( element ), "iconVisible", false ) } void function ShowMatchmakingStatusIcons() { //foreach ( element in file.searchIconElems ) // Hud_Show( element ) foreach ( element in file.matchStatusRuis ) RuiSetBool( Hud_GetRui( element ), "iconVisible", true ) } void function MatchmakingSetSearchVisible( bool state ) { foreach ( el in file.searchTextElems ) { //if ( state ) // Hud_Show( el ) //else Hud_Hide( el ) } foreach ( element in file.matchStatusRuis ) RuiSetBool( Hud_GetRui( element ), "statusVisible", state ) } void function MatchmakingSetSearchText( string searchText, var param1 = "", var param2 = "", var param3 = "", var param4 = "" ) { foreach ( el in file.searchTextElems ) { Hud_SetText( el, searchText, param1, param2, param3, param4 ) } foreach ( element in file.matchStatusRuis ) { RuiSetBool( Hud_GetRui( element ), "statusHasText", searchText != "" ) RuiSetString( Hud_GetRui( element ), "statusText", Localize( searchText, param1, param2, param3, param4 ) ) } } void function MatchmakingSetCountdownVisible( bool state ) { foreach ( el in file.matchStartCountdownElems ) { //if ( state ) // Hud_Show( el ) //else Hud_Hide( el ) } foreach ( element in file.matchStatusRuis ) RuiSetBool( Hud_GetRui( element ), "timerVisible", state ) } void function MatchmakingSetCountdownTimer( float time, bool useServerTime = true ) //JFS: useServerTime bool is awkward, comes from level.ui.gameStartTime using server time and UpdateTimeToRestartMatchmaking() uses UI time. { foreach ( element in file.matchStatusRuis ) { RuiSetBool( Hud_GetRui( element ), "timerHasText", time != 0.0 ) RuiSetGameTime( Hud_GetRui( element ), "startTime", Time() ) RuiSetBool( Hud_GetRui( element ), "useServerTime", useServerTime ) RuiSetGameTime( Hud_GetRui( element ), "timerEndTime", time ) } } void function OnLobbyLevelInit() { UpdateCallsignElement( file.callsignCard ) RefreshCreditsAvailable() } function UpdatePlayerInfo() { EndSignal( uiGlobal.signalDummy, "CleanupInGameMenus" ) var menu = GetMenu( "LobbyMenu" ) WaitFrameOrUntilLevelLoaded() while ( true ) { RefreshCreditsAvailable() WaitFrame() } } void function TryUnlockSRSCallsign() { if ( Script_IsRunningTrialVersion() ) return int numCallsignsToUnlock = 0 if ( GetTotalLionsCollected() >= GetTotalLionsInGame() ) numCallsignsToUnlock = 3 else if ( GetTotalLionsCollected() >= ACHIEVEMENT_COLLECTIBLES_2_COUNT ) numCallsignsToUnlock = 2 else if ( GetTotalLionsCollected() >= ACHIEVEMENT_COLLECTIBLES_1_COUNT ) numCallsignsToUnlock = 1 else numCallsignsToUnlock = 0 if ( numCallsignsToUnlock > 0 ) ClientCommand( "UnlockSRSCallsign " + numCallsignsToUnlock ) } void function SetPutPlayerInMatchmakingAfterDelay( bool value ) { file.putPlayerInMatchmakingAfterDelay = value } void function OnStoreButton_Activate( var button ) { LaunchGamePurchaseOrDLCStore() } void function OnStoreNewReleasesButton_Activate( var button ) { //LaunchGamePurchaseOrDLCStore( [ "StoreMenu", "StoreMenu_NewReleases" ] ) LaunchGamePurchaseOrDLCStore( [ "StoreMenu", "StoreMenu_WeaponSkins" ] ) } void function OnStoreBundlesButton_Activate( var button ) { LaunchGamePurchaseOrDLCStore( [ "StoreMenu", "StoreMenu_Sales" ] ) } void function OnDpadCommsButton_Activate( var button ) { AdvanceMenu( GetMenu( "EditDpadCommsMenu" ) ) } void function OpenCommsIntroDialog() { DialogData dialogData dialogData.menu = GetMenu( "AnnouncementDialog" ) dialogData.header = "#DPAD_COMMS_ANNOUNCEMENT_HEADER" dialogData.ruiMessage.message = "#DPAD_COMMS_ANNOUNCEMENT" dialogData.image = $"ui/menu/common/dialog_announcement_1" AddDialogButton( dialogData, "#DPAD_COMMS_ANNOUNCEMENT_B1" , OpenDpadCommsMenu ) AddDialogButton( dialogData, "#DPAD_COMMS_ANNOUNCEMENT_B2" ) AddDialogPCBackButton( dialogData ) AddDialogFooter( dialogData, "#A_BUTTON_ACCEPT" ) AddDialogFooter( dialogData, "#B_BUTTON_BACK" ) OpenDialog( dialogData ) ClientCommand( "SetCommsIntroSeen" ) } void function OpenDpadCommsMenu() { OnDpadCommsButton_Activate( null ) } bool function ShouldShowEmotesAnnouncement( entity player ) { if ( !EmotesEnabled() ) return false if ( player.GetPersistentVarAsInt( "numTimesUsedComms" ) > 2 ) return false if ( player.GetPersistentVar( "hasBeenIntroducedToComms" ) ) return false #if !DEV if ( PlayerGetRawLevel( player ) <= 2 ) return false #endif return true } void function Lobby_SetFDMode( bool mode ) { file.isFDMode = mode } //Function returns whether lobby is currently in "Frontier Defense" lobby mode. bool function Lobby_IsFDMode() { return file.isFDMode } void function Lobby_SetAutoFDOpen( bool autoFD ) { Lobby_SetFDMode( autoFD ) file.shouldAutoOpenFDMenu = autoFD } void function Lobby_SetFDModeBasedOnSearching( string playlistToSearch ) { array< string > searchingPlaylists = split( playlistToSearch, "," ) bool isFDMode = false int searchingCount = searchingPlaylists.len() for( int idx = 0; idx < searchingCount; ++idx ) { isFDMode = isFDMode || IsFDMode( searchingPlaylists[idx] ) if ( isFDMode ) break } Lobby_SetFDMode( isFDMode ) }