aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlemmbaustein <83748124+Klemmbaustein@users.noreply.github.com>2024-07-30 00:45:17 +0200
committerGitHub <noreply@github.com>2024-07-30 00:45:17 +0200
commite4b3cc7d3ee17488053cae24c8a8c981dbe95eab (patch)
treef82c7b13143f73194f1a2aa5a7272c62d400f71b
parentd5b35ee69a1ad7f9c6515ed70474babfb33519f7 (diff)
downloadNorthstarMods-e4b3cc7d3ee17488053cae24c8a8c981dbe95eab.tar.gz
NorthstarMods-e4b3cc7d3ee17488053cae24c8a8c981dbe95eab.zip
Add a generic "JoinServer" function (#693)
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.
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_connect_password.nut9
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut148
2 files changed, 147 insertions, 10 deletions
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_connect_password.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_connect_password.nut
index b89e665b8..acc6bb36f 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_connect_password.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_connect_password.nut
@@ -1,4 +1,5 @@
global function AddNorthstarConnectWithPasswordMenu
+global function SetPasswordTargetServer
struct
{
@@ -6,6 +7,7 @@ struct
var enterPasswordBox
var enterPasswordDummy
var connectButton
+ ServerInfo& targetServer
} file
void function AddNorthstarConnectWithPasswordMenu()
@@ -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" ) ) )
}
} \ No newline at end of file
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
index 22cdffcf9..5517843e8 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
@@ -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
@@ -370,7 +373,7 @@ void function ToggleConnectingHUD( bool vis )
void function ConnectingButton_Activate( var button )
{
- file.cancelConnection = true
+ CancelJoinServer()
}
////////////////////////////
@@ -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
@@ -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() )
{
@@ -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
}