aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
diff options
context:
space:
mode:
authorRémy Raes <raes.remy@gmail.com>2024-11-22 00:50:19 +0100
committerGitHub <noreply@github.com>2024-11-22 00:50:19 +0100
commite7aa1c2a3459c9a4ad63d89b5da577bf10e8366c (patch)
treee042fe8dcde883495e04697adc626f7eeb8d3af9 /Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
parentc1649d1e1d719b2859041afa1cbff32ee090a885 (diff)
downloadNorthstarMods-e7aa1c2a3459c9a4ad63d89b5da577bf10e8366c.tar.gz
NorthstarMods-e7aa1c2a3459c9a4ad63d89b5da577bf10e8366c.zip
Refactor getting mod information (#899)
Mod counterpart to the launcher PR. Adds a struct containing mod information instead of getting every field with its own dedicated function
Diffstat (limited to 'Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut')
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut122
1 files changed, 70 insertions, 52 deletions
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 cdeb8b3e..f2effd12 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
@@ -973,18 +973,27 @@ void function OnServerSelected_Threaded( var button )
foreach ( requiredModInfo in server.requiredMods )
{
// Tolerate core mods having different versions
- if ( requiredModInfo.name.len() > 10 && requiredModInfo.name.slice(0, 10) == "Northstar." )
+ if ( IsCoreMod( requiredModInfo.name ) )
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 ) )
+ print( format ( "\"%s\" was not found locally" + ( autoDownloadAllowed ? ", triggering manifesto fetching." : "." ), requiredModInfo.name ) )
uninstalledModFound = true
break
+ } else {
+ array<string> modVersions = GetModVersions( requiredModInfo.name )
+
+ if ( !modVersions.contains( requiredModInfo.version ) ) {
+ print( format ( "\"%s\" was found locally but has versions:", requiredModInfo.name ) )
+ foreach ( string version in modVersions )
+ {
+ print(" - " + version)
+ }
+ print( format ( "while server requires \"%s\"" + ( autoDownloadAllowed ? ", triggering manifesto fetching." : "." ), requiredModInfo.version ) )
+ uninstalledModFound = true
+ break
+ }
}
}
@@ -992,17 +1001,16 @@ void function OnServerSelected_Threaded( var button )
// 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 )
{
// Tolerate core mods having different versions
- if ( mod.name.len() > 10 && mod.name.slice(0, 10) == "Northstar." )
+ if ( IsCoreMod( mod.name ) )
continue
- if ( !NSGetModNames().contains( mod.name ) || NSGetModVersionByModName( mod.name ) != mod.version )
+ if ( !NSGetModNames().contains( mod.name ) || !GetModVersions( mod.name ).contains( mod.version ) )
{
// Auto-download mod
if ( autoDownloadAllowed )
@@ -1055,43 +1063,8 @@ void function OnServerSelected_Threaded( var button )
return
}
}
- else
- {
- // this uses semver https://semver.org
- array<string> serverModVersion = split( mod.name, "." )
- array<string> clientModVersion = split( NSGetModVersionByModName( mod.name ), "." )
-
- bool semverFail = false
- // if server has invalid semver don't bother checking
- if ( serverModVersion.len() == 3 )
- {
- // bad client semver
- if ( clientModVersion.len() != serverModVersion.len() )
- semverFail = true
- // major version, don't think we should need to check other versions
- else if ( clientModVersion[ 0 ] != serverModVersion[ 0 ] )
- semverFail = true
- }
-
- if ( semverFail )
- {
- DialogData dialogData
- dialogData.header = "#ERROR"
- dialogData.message = Localize( "#WRONG_MOD_VERSION", mod.name, mod.version, NSGetModVersionByModName( mod.name ) )
- 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
- }
- }
+ // If we get here, means that mod version exists locally => we good
}
if ( server.requiresPassword )
@@ -1136,25 +1109,31 @@ void function ThreadedAuthAndConnectToServer( string password = "", bool modsCha
if ( NSWasAuthSuccessful() )
{
// disable all RequiredOnClient mods that are not required by the server and are currently enabled
- foreach ( string modName in NSGetModNames() )
+ foreach ( ModInfo mod in NSGetModsInformation() )
{
- if ( NSIsModRequiredOnClient( modName ) && NSIsModEnabled( modName ) )
+ string modName = mod.name
+ string modVersion = mod.version
+
+ if ( mod.requiredOnClient && mod.enabled )
{
// find the mod name in the list of server required mods
bool found = false
foreach ( RequiredModInfo mod in file.lastSelectedServer.requiredMods )
{
- if (mod.name == modName)
+ // this tolerates a version difference for requiredOnClient core mods (only Northstar.Custom for now)
+ if (mod.name == modName && ( IsCoreMod( modName ) || mod.version == modVersion ))
{
found = true
+ print(format("\"%s\" (v%s) is required and already enabled.", modName, modVersion))
break
}
}
- // if we didnt find the mod name, disable the mod
+ // if we didn't find the mod name, disable the mod
if (!found)
{
modsChanged = true
NSSetModEnabled( modName, false )
+ print(format("Disabled \"%s\" (v%s) since it's not required on server.", modName, modVersion))
}
}
}
@@ -1162,10 +1141,33 @@ void function ThreadedAuthAndConnectToServer( string password = "", bool modsCha
// enable all RequiredOnClient mods that are required by the server and are currently disabled
foreach ( RequiredModInfo mod in file.lastSelectedServer.requiredMods )
{
- if ( NSIsModRequiredOnClient( mod.name ) && !NSIsModEnabled( mod.name ))
+ string modName = mod.name
+ string modVersion = mod.version
+ array<ModInfo> localModInfos = NSGetModInformation( modName )
+
+ // Tolerate core mods (only Northstar.Custom for now) having a different version than server
+ if ( IsCoreMod(modName) )
+ {
+ if ( !localModInfos[0].enabled )
+ {
+ modsChanged = true
+ NSSetModEnabled( modName, true )
+ print(format("Enabled \"%s\" (v%s) to join server.", modName, localModInfos[0].version))
+ }
+ }
+
+ else
{
- modsChanged = true
- NSSetModEnabled( mod.name, true )
+ foreach( localMod in localModInfos )
+ {
+ if ( localMod.version == mod.version )
+ {
+ modsChanged = true
+ NSSetModEnabled( mod.name, true )
+ print(format("Enabled \"%s\" (v%s) to join server.", modName, modVersion))
+ break
+ }
+ }
}
}
@@ -1361,3 +1363,19 @@ void function TriggerConnectToServerCallbacks( ServerInfo ornull targetServer =
callback( expect ServerInfo( targetServer ) )
}
}
+
+const array<string> CORE_MODS = ["Northstar.Client", "Northstar.Coop", "Northstar.CustomServers", "Northstar.Custom"]
+bool function IsCoreMod( string modName )
+{
+ return CORE_MODS.find( modName ) != -1
+}
+
+array<string> function GetModVersions( string modName )
+{
+ array<string> versions = []
+ foreach ( ModInfo mod in NSGetModInformation( modName ) )
+ {
+ versions.append( mod.version )
+ }
+ return versions
+}