Skip to content

Commit

Permalink
Add a generic "JoinServer" function (#693)
Browse files Browse the repository at this point in the history
Adds a function that allows the client to join a server from a `ServerInfo` struct.
This also changes the server browser to use this function.
  • Loading branch information
Klemmbaustein authored Jul 29, 2024
1 parent d5b35ee commit e4b3cc7
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
global function AddNorthstarConnectWithPasswordMenu
global function SetPasswordTargetServer

struct
{
var menu
var enterPasswordBox
var enterPasswordDummy
var connectButton
ServerInfo& targetServer
} file

void function AddNorthstarConnectWithPasswordMenu()
Expand Down Expand Up @@ -51,11 +53,16 @@ void function OnConnectWithPasswordMenuOpened()

}

void function SetPasswordTargetServer( ServerInfo server )
{
file.targetServer = server
}

void function ConnectWithPassword( var button )
{
if ( GetTopNonDialogMenu() == file.menu )
{
TriggerConnectToServerCallbacks()
thread ThreadedAuthAndConnectToServer( Hud_GetUTF8Text( Hud_GetChild( file.menu, "EnterPasswordBox" ) ), true )
thread JoinServer( file.targetServer, Hud_GetUTF8Text( Hud_GetChild( file.menu, "EnterPasswordBox" ) ) )
}
}
148 changes: 139 additions & 9 deletions Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ untyped
// Only way to get Hud_GetPos(sliderButton) working was to use untyped

global function AddNorthstarServerBrowserMenu
global function ThreadedAuthAndConnectToServer

global function JoinServer
global function JoinServerByName
global function CancelJoinServer

global function AddConnectToServerCallback
global function RemoveConnectToServerCallback
Expand Down Expand Up @@ -370,7 +373,7 @@ void function ToggleConnectingHUD( bool vis )

void function ConnectingButton_Activate( var button )
{
file.cancelConnection = true
CancelJoinServer()
}

////////////////////////////
Expand Down Expand Up @@ -1097,17 +1100,18 @@ void function OnServerSelected_Threaded( var button )
if ( server.requiresPassword )
{
OnCloseServerBrowserMenu()
SetPasswordTargetServer( file.lastSelectedServer )
AdvanceMenu( GetMenu( "ConnectWithPasswordMenu" ) )
}
else
{
TriggerConnectToServerCallbacks()
thread ThreadedAuthAndConnectToServer( "", downloadedMods != 0 )
thread ThreadedAuthAndConnectToServer()
}
}


void function ThreadedAuthAndConnectToServer( string password = "", bool modsChanged = false )
void function ThreadedAuthAndConnectToServer( string password = "" )
{
if ( NSIsAuthenticatingWithServer() )
return
Expand Down Expand Up @@ -1135,6 +1139,8 @@ void function ThreadedAuthAndConnectToServer( string password = "", bool modsCha

if ( NSWasAuthSuccessful() )
{
bool modsChanged = false

// disable all RequiredOnClient mods that are not required by the server and are currently enabled
foreach ( string modName in NSGetModNames() )
{
Expand Down Expand Up @@ -1350,14 +1356,138 @@ void function RemoveConnectToServerCallback( void functionref( ServerInfo ) call

void function TriggerConnectToServerCallbacks( ServerInfo ornull targetServer = null )
{
ServerInfo server;
if (targetServer == null)
{
if ( !targetServer )
targetServer = file.lastSelectedServer
}

expect ServerInfo( targetServer )

foreach( callback in file.connectCallbacks )
{
callback( expect ServerInfo( targetServer ) )
callback( targetServer )
}
}

//////////////////////////////////////
// Join server
//////////////////////////////////////

void function CancelJoinServer()
{
file.cancelConnection = true
}

bool function JoinServerByName( string serverName, string password = "" )
{
// Request list of online servers.
NSRequestServerList()
while ( NSIsRequestingServerList() )
{
WaitFrame()
}

// Go through all servers that are currently online
foreach ( server in NSGetGameServers() )
{
// Join the server if it has the correct server name.
if ( server.name == serverName )
{
return JoinServer( server )
}
}

print( format( "Failed to connect to server %s: No such server", serverName ) )

return false
}

bool function JoinServer( ServerInfo server, string password = "" )
{
if ( NSIsAuthenticatingWithServer() )
return false

printt( format( "Connecting to server %s with id of %s", server.name, server.id ) )

TriggerConnectToServerCallbacks( server )
NSTryAuthWithServer( server.index, password )

ToggleConnectingHUD( true )

while ( NSIsAuthenticatingWithServer() && !file.cancelConnection )
WaitFrame()

ToggleConnectingHUD( false )

if ( file.cancelConnection )
{
file.cancelConnection = false
return false
}

file.cancelConnection = false

if ( NSWasAuthSuccessful() )
{
bool modsChanged = false

// disable all RequiredOnClient mods that are not required by the server and are currently enabled
foreach ( string modName in NSGetModNames() )
{
if ( NSIsModRequiredOnClient( modName ) && NSIsModEnabled( modName ) )
{
// find the mod name in the list of server required mods
bool found = false
foreach ( RequiredModInfo mod in server.requiredMods )
{
if ( mod.name == modName )
{
found = true
break
}
}
// if we didnt find the mod name, disable the mod
if ( !found )
{
modsChanged = true
NSSetModEnabled( modName, false )
}
}
}

// enable all RequiredOnClient mods that are required by the server and are currently disabled
foreach ( RequiredModInfo mod in server.requiredMods )
{
if ( NSIsModRequiredOnClient( mod.name ) && !NSIsModEnabled( mod.name ) )
{
modsChanged = true
NSSetModEnabled( mod.name, true )
}
}

// only actually reload if we need to since the uiscript reset on reload lags hard
if ( modsChanged )
ReloadMods()

NSConnectToAuthedServer()
return true
}
else
{
string reason = NSGetAuthFailReason()

DialogData dialogData
dialogData.header = "#ERROR"
dialogData.message = reason
dialogData.image = $"ui/menu/common/dialog_error"

#if PC_PROG
AddDialogButton( dialogData, "#DISMISS" )

AddDialogFooter( dialogData, "#A_BUTTON_SELECT" )
#endif // PC_PROG
AddDialogFooter( dialogData, "#B_BUTTON_DISMISS_RUI" )

OpenDialog( dialogData )
return false
}
return false
}

0 comments on commit e4b3cc7

Please sign in to comment.