aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut')
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut242
1 files changed, 242 insertions, 0 deletions
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut b/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
new file mode 100644
index 00000000..4b3d0f55
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
@@ -0,0 +1,242 @@
+global function InitOpenInvitesMenu
+global function UICodeCallback_OpenInviteUpdated
+global function InPendingOpenInvite
+global function LeaveOpenInvite
+global function JoinOpenInvite
+global function JoinOpenInvite_OnClick
+global function CanJoinOpenInvite
+global function CanLeaveOpenInvite
+global function CanDestroyOpenInvite
+global function LeaveOpenInviteButton
+global function IsOpenInviteVisible
+
+struct
+{
+ bool openInviteJoinable
+ bool openInviteVisible
+} file
+
+bool function InPendingOpenInvite()
+{
+ if ( !file.openInviteVisible )
+ return false
+ OpenInvite openInvite = GetOpenInvite()
+ return openInvite.amIInThis
+}
+
+void function LeaveOpenInviteButton( var button )
+{
+ LeaveOpenInvite()
+}
+
+void function LeaveOpenInvite()
+{
+ EmitUISound( "UI_Networks_Invitation_Canceled" )
+ ClientCommand( "leaveopeninvite" )
+
+ // sort of HACK: revert lobby to non-FD mode when you cancel out of open invite
+ Lobby_SetFDMode( false )
+ Lobby_RefreshButtons()
+}
+
+void function JoinOpenInvite( var button )
+{
+ if ( CanJoinOpenInvite() )
+ {
+ EmitUISound( "UI_Networks_Invitation_Accepted" )
+ ClientCommand( "joinopeninvite" )
+ }
+ else if ( CanLeaveOpenInvite() )
+ {
+ LeaveOpenInvite()
+ }
+}
+
+void function JoinOpenInvite_OnClick( var button )
+{
+ // haaaack. Either join it or leave it here, depending on context
+ OpenInvite openInvite = GetOpenInvite()
+ if ( openInvite.amIInThis )
+ LeaveOpenInvite()
+ else
+ JoinOpenInvite( button )
+}
+
+bool function IsOpenInviteVisible()
+{
+ return file.openInviteVisible
+}
+
+bool function CanDestroyOpenInvite()
+{
+ OpenInvite openInvite = GetOpenInvite()
+ return file.openInviteVisible && openInvite.amILeader
+}
+
+bool function CanJoinOpenInvite()
+{
+ OpenInvite openInvite = GetOpenInvite()
+ int currentPartySize = GetPartySize()
+ return currentPartySize <= 1 && file.openInviteVisible && file.openInviteJoinable && !openInvite.amIInThis
+}
+
+bool function CanLeaveOpenInvite()
+{
+ OpenInvite openInvite = GetOpenInvite()
+ return file.openInviteVisible && file.openInviteJoinable && !openInvite.amILeader && openInvite.amIInThis
+}
+
+void function UpdateOpenInvite()
+{
+ OpenInvite openInvite = GetOpenInvite()
+
+ if ( openInvite.timeLeft <= -1 || openInvite.numFreeSlots == 0 )
+ {
+ HideOpenInvite()
+ if ( openInvite.amILeader )
+ ClientCommand( "openinvitelaunch" )
+ if ( openInvite.amIInThis )
+ {
+ CloseAllToTargetMenu( GetMenu( "LobbyMenu" ) )
+ AdvanceMenu( GetMenu( "SearchMenu" ) )
+ }
+ else
+ {
+ Lobby_SetFDMode( false )
+ Lobby_RefreshButtons()
+ }
+ file.openInviteVisible = false
+ file.openInviteJoinable = false
+ UpdateFooterOptions()
+ return
+ }
+
+ array<string> playlists = split( openInvite.playlistName, "," )
+
+ string message = ""
+ string param1 = ""
+ string ornull param2 = null
+ switch( openInvite.inviteType )
+ {
+ case "party":
+ if ( openInvite.amILeader )
+ message = "#OPENINVITE_SENDER_PARTY";
+ else
+ message = "#OPENINVITE_PARTY";
+ param1 = openInvite.originatorName
+ break;
+ case "playlist":
+ if ( playlists.len() > 1 )
+ {
+ if ( openInvite.amILeader )
+ message = "#OPENINVITE_SENDER_PLAYLIST_MANY"
+ else
+ message = "#OPENINVITE_PLAYLIST_MANY"
+ param1 = openInvite.originatorName
+ param2 = GetPlaylistDisplayName( openInvite.playlistName )
+ }
+ else
+ {
+ if ( openInvite.amILeader )
+ message = "#OPENINVITE_SENDER_PLAYLIST"
+ else
+ message = "#OPENINVITE_PLAYLIST"
+ param1 = openInvite.originatorName
+ param2 = GetPlaylistDisplayName( openInvite.playlistName )
+ }
+ break;
+ case "private_match":
+ if ( openInvite.amILeader )
+ message = "#OPENINVITE_SENDER_PRIVATEMATCH"
+ else
+ message = "#OPENINVITE_PRIVATEMATCH"
+ param1 = openInvite.originatorName
+ break;
+ default:
+ HideOpenInvite()
+ file.openInviteVisible = false
+ file.openInviteJoinable = false
+ UpdateFooterOptions()
+ return;
+ }
+ int timeLeft = int( openInvite.timeLeft ) + 1
+ if ( openInvite.timeLeft <= 0 || openInvite.numFreeSlots == 0 )
+ {
+ if ( file.openInviteJoinable )
+ {
+ file.openInviteJoinable = false
+ UpdateFooterOptions()
+ }
+ timeLeft = 0
+ }
+ else
+ {
+ if ( !file.openInviteJoinable )
+ {
+ file.openInviteJoinable = true
+ UpdateFooterOptions()
+ printt( "openinvite is joinable" )
+ }
+ }
+
+ UpdateOpenInvites( openInvite, message, param1, param2, timeLeft )
+}
+
+void function UpdateOpenInvite_Thread()
+{
+ while ( file.openInviteVisible )
+ {
+ if ( !IsConnected() || !IsLobby() )
+ {
+ HideOpenInvite()
+ file.openInviteVisible = false
+ file.openInviteJoinable = false
+ UpdateFooterOptions()
+ return
+ }
+
+ UpdateOpenInvite()
+ WaitFrame()
+ }
+}
+
+void function UICodeCallback_OpenInviteUpdated()
+{
+ if ( file.openInviteVisible || IsNorthstarServer() )
+ return
+
+ int currentPartySize = GetPartySize()
+ if ( currentPartySize > 1 )
+ {
+ HideOpenInvite()
+ file.openInviteVisible = false
+ return
+ }
+
+ if ( !IsConnected() )
+ {
+ HideOpenInvite()
+ file.openInviteVisible = false
+ return
+ }
+
+ entity player = GetUIPlayer()
+ if ( IsValid( player ) && Player_NextAvailableMatchmakingTime( player ) > 0 )
+ {
+ HideOpenInvite()
+ file.openInviteVisible = false
+ return
+ }
+
+ OpenInvite openInvite = GetOpenInvite()
+ ShowOpenInvite()
+ file.openInviteVisible = true
+ UpdateOpenInvite()
+ thread UpdateOpenInvite_Thread()
+}
+
+void function InitOpenInvitesMenu()
+{
+ file.openInviteVisible = false
+ file.openInviteJoinable = false
+}