aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Raes <raes.remy@gmail.com>2024-07-30 00:41:10 +0200
committerGitHub <noreply@github.com>2024-07-30 00:41:10 +0200
commitd5b35ee69a1ad7f9c6515ed70474babfb33519f7 (patch)
tree010e524f8e49f6890f3a93b1191f0970c9081b2d
parent7abae6cf8326a768729cc314805606b6a0344f33 (diff)
downloadNorthstarMods-d5b35ee69a1ad7f9c6515ed70474babfb33519f7.tar.gz
NorthstarMods-d5b35ee69a1ad7f9c6515ed70474babfb33519f7.zip
Only fetch MAD manifesto on server join (#821)
Previously, the verified mods manifesto was fetched on game start without checking if the verified mod feature is enabled Squirrel-side; with this, the manifesto is only fetched when the user wants to download a mod (meaning they enabled the feature beforehand).
-rw-r--r--.github/nativefuncs.json7
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_english.txt2
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut37
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut96
4 files changed, 115 insertions, 27 deletions
diff --git a/.github/nativefuncs.json b/.github/nativefuncs.json
index 1148d3e5..889432d7 100644
--- a/.github/nativefuncs.json
+++ b/.github/nativefuncs.json
@@ -503,6 +503,13 @@
"argTypes":"string modName"
},
{
+ "name": "NSFetchVerifiedModsManifesto",
+ "helpText": "Retrieves the verified mods list from the central authority (GitHub).",
+ "returnTypeString": "void",
+ "argTypes": ""
+
+ },
+ {
"name": "NSIsModDownloadable",
"helpText": "checks whether a mod is verified and can be auto-downloaded",
"returnTypeString": "bool",
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
index eaec0cc7..baceed22 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
@@ -373,6 +373,8 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"WRONG_MOD_VERSION" "Server has mod \"%s1\" v%s2 while you have v%s3"
"MOD_NOT_VERIFIED" "(mod is not verified, and couldn't be downloaded automatically)"
"MOD_DL_DISABLED" "(automatic mod downloading is disabled)"
+ "MANIFESTO_FETCHING_TITLE" "Setting up mod download"
+ "MANIFESTO_FETCHING_TEXT" "Retrieving the list of verified mods..."
"DOWNLOADING_MOD_TITLE" "Downloading mod"
"DOWNLOADING_MOD_TITLE_W_PROGRESS" "Downloading mod (%s1%)"
"DOWNLOADING_MOD_TEXT" "Downloading %s1 v%s2..."
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut
index 4d299362..3b81c7f9 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut
@@ -1,8 +1,10 @@
global function DownloadMod
global function DisplayModDownloadErrorDialog
+global function FetchVerifiedModsManifesto
global enum eModInstallStatus
{
+ MANIFESTO_FETCHING,
DOWNLOADING,
CHECKSUMING,
EXTRACTING,
@@ -18,7 +20,36 @@ global enum eModInstallStatus
const int MB = 1024*1000;
-bool function DownloadMod( RequiredModInfo mod )
+
+void function FetchVerifiedModsManifesto()
+{
+ print("Start fetching verified mods manifesto from the Internet")
+
+ // Fetching UI
+ DialogData dialogData
+ dialogData.header = Localize( "#MANIFESTO_FETCHING_TITLE" )
+ dialogData.message = Localize( "#MANIFESTO_FETCHING_TEXT" )
+ dialogData.showSpinner = true;
+
+ // Prevent user from closing dialog
+ dialogData.forceChoice = true;
+ OpenDialog( dialogData )
+
+ // Do the actual fetching
+ NSFetchVerifiedModsManifesto()
+
+ ModInstallState state = NSGetModInstallState()
+ while ( state.status == eModInstallStatus.MANIFESTO_FETCHING )
+ {
+ state = NSGetModInstallState()
+ WaitFrame()
+ }
+
+ // Close dialog when manifesto has been received
+ CloseActiveMenu()
+}
+
+bool function DownloadMod( RequiredModInfo mod, string serverName )
{
// Downloading mod UI
DialogData dialogData
@@ -58,6 +89,10 @@ void function UpdateModDownloadDialog( RequiredModInfo mod, ModInstallState stat
{
switch ( state.status )
{
+ case eModInstallStatus.MANIFESTO_FETCHING:
+ Hud_SetText( header, Localize( "#MANIFESTO_FETCHING_TITLE" ) )
+ Hud_SetText( body, Localize( "#MANIFESTO_FETCHING_TEXT" ) )
+ break
case eModInstallStatus.DOWNLOADING:
Hud_SetText( header, Localize( "#DOWNLOADING_MOD_TITLE_W_PROGRESS", string( state.ratio ) ) )
Hud_SetText( body, Localize( "#DOWNLOADING_MOD_TEXT_W_PROGRESS", mod.name, mod.version, floor( state.progress / MB ), floor( state.total / MB ) ) )
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 4f17dedf..22cdffcf 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
@@ -967,49 +967,93 @@ void function OnServerSelected_Threaded( var button )
bool autoDownloadAllowed = GetConVarBool( "allow_mod_auto_download" )
int downloadedMods = 0;
+ // Check out if there's any server-required mod that is not locally installed
+ array<string> modNames = NSGetModNames()
+ bool uninstalledModFound = false
+ foreach ( requiredModInfo in server.requiredMods )
+ {
+ // Tolerate core mods having different versions
+ if ( requiredModInfo.name.len() > 10 && requiredModInfo.name.slice(0, 10) == "Northstar." )
+ continue
+
+ if ( !modNames.contains( requiredModInfo.name ) )
+ {
+ print( format ( "\"%s\" was not found locally, triggering manifesto fetching.", requiredModInfo.name ) )
+ uninstalledModFound = true
+ break
+ } else if ( NSGetModVersionByModName( requiredModInfo.name ) != requiredModInfo.version ) {
+ print( format ( "\"%s\" was found locally but has version \"%s\" while server requires \"%s\", triggering manifesto fetching.", requiredModInfo.name, NSGetModVersionByModName( requiredModInfo.name ), requiredModInfo.version ) )
+ uninstalledModFound = true
+ break
+ }
+ }
+
+ // If yes, we fetch the verified mods manifesto, to check whether uninstalled
+ // mods can be installed through auto-download
+ if ( uninstalledModFound && autoDownloadAllowed )
+ {
+ print("Auto-download is allowed, checking if missing mods can be installed automatically.")
+ FetchVerifiedModsManifesto()
+ }
+
foreach ( RequiredModInfo mod in server.requiredMods )
{
- if ( !NSGetModNames().contains( mod.name ) )
+ // Tolerate core mods having different versions
+ if ( mod.name.len() > 10 && mod.name.slice(0, 10) == "Northstar." )
+ continue
+
+ if ( !NSGetModNames().contains( mod.name ) || NSGetModVersionByModName( mod.name ) != mod.version )
{
- // Check if mod can be auto-downloaded
- bool modIsVerified = NSIsModDownloadable( mod.name, mod.version )
+ // Auto-download mod
+ if ( autoDownloadAllowed )
+ {
+ bool modIsVerified = NSIsModDownloadable( mod.name, mod.version )
+
+ // Display error message if mod is not verified
+ if ( !modIsVerified )
+ {
+ DialogData dialogData
+ dialogData.header = "#ERROR"
+ dialogData.message = Localize( "#MISSING_MOD", mod.name, mod.version )
+ dialogData.message += "\n" + Localize( "#MOD_NOT_VERIFIED" )
+ dialogData.image = $"ui/menu/common/dialog_error"
- // Display an error message if not
- if ( !modIsVerified || !autoDownloadAllowed )
+ AddDialogButton( dialogData, "#DISMISS" )
+ AddDialogFooter( dialogData, "#A_BUTTON_SELECT" )
+ AddDialogFooter( dialogData, "#B_BUTTON_DISMISS_RUI" )
+
+ OpenDialog( dialogData )
+ return
+ }
+ else
+ {
+ if ( DownloadMod( mod, server.name ) )
+ {
+ downloadedMods++
+ }
+ else
+ {
+ DisplayModDownloadErrorDialog( mod.name )
+ return
+ }
+ }
+ }
+
+ // Mod not found, display error message
+ else
{
DialogData dialogData
dialogData.header = "#ERROR"
dialogData.message = Localize( "#MISSING_MOD", mod.name, mod.version )
dialogData.image = $"ui/menu/common/dialog_error"
- // Specify error (only if autoDownloadAllowed is set)
- if ( autoDownloadAllowed )
- {
- dialogData.message += "\n" + Localize( "#MOD_NOT_VERIFIED" )
- }
-
AddDialogButton( dialogData, "#DISMISS" )
-
AddDialogFooter( dialogData, "#A_BUTTON_SELECT" )
AddDialogFooter( dialogData, "#B_BUTTON_DISMISS_RUI" )
OpenDialog( dialogData )
-
return
}
-
- else // Launch download
- {
- if ( DownloadMod( mod ) )
- {
- downloadedMods++
- }
- else
- {
- DisplayModDownloadErrorDialog( mod.name )
- return
- }
- }
}
else
{