Files
pulse/mods/ToneAPI.pulse/mod/scripts/vscripts/ui/menu_lobby.nut
T
okvdai ddfb34a9f8 Change to Thunderstore template
For easier publishing to both platforms
2023-06-07 19:15:14 +02:00

1632 lines
47 KiB
Plaintext

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<var> 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" )
NSSetLoading(true)
NSUpdateListenServer()
}
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()
pulseGetData()
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<ItemData> 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( "ServerBrowserMenu" ) )
}
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 )
}