Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] main from R2Northstar:main #8

Closed
wants to merge 19 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
1486b86
Add translation status indicator badge to README (#758)
GeckoEidechse Nov 18, 2023
4e394ce
Implement missing Score Events (#700)
ASpoonPlaysGames Nov 21, 2023
bdb73b1
Fix crash when calling for invalid loadout index (#764)
x3Karma Dec 1, 2023
0c5c9b1
Add a doc comment to `StringReplace` (#748)
GeckoEidechse Dec 4, 2023
7140cce
Treat `.gnut` files as `.nut` for syntax highlighting (#770)
GeckoEidechse Dec 13, 2023
f4df314
Add Winter holiday event models to the lobby (#768)
RoyalBlue1 Dec 14, 2023
6d678ac
Add Aegis Rank reset functionality command for Progression (#727)
Zanieon Dec 14, 2023
e49e7e8
Mod download UI integration (#761)
Alystrasz Dec 14, 2023
93b9c73
Fix `spec_mode` bind not working (#706)
ASpoonPlaysGames Dec 17, 2023
a169e16
Fix restricting Aegis Rank reset functionality to MP (#771)
Zanieon Dec 18, 2023
bbd4ced
Make `RequiredOnClient` text clearer (#720)
ASpoonPlaysGames Dec 19, 2023
d90a986
Add Action to add label to PR on merge conflict (#772)
GeckoEidechse Dec 20, 2023
feee261
Add missing server browser localisation for `WRONG_MOD_VERSION` (#710)
ASpoonPlaysGames Dec 20, 2023
00a4bb6
Translations update from Weblate (#776)
harmony-weblate Dec 31, 2023
fd02b45
Add validity check to `SaveStatsPeriodically_Threaded` (#769)
CTalvio Jan 2, 2024
af84c42
Add validity check to `HandleDistanceAndTimeStats_Threaded` to preven…
CTalvio Jan 2, 2024
0e15364
Fix spectating for LTS (#774)
L1ghtman2k Jan 2, 2024
4450583
Prevent crash when selecting first infected (#731)
ASpoonPlaysGames Jan 4, 2024
76582b6
Use `getrandom()` instead of random int from player array (#778)
GeckoEidechse Jan 4, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
/Northstar.Client/mod/resource/northstar_client_localisation_*.txt text diff working-tree-encoding=UTF-16LE-BOM
/Northstar.Client/mod/resource/northstar_client_localisation_*.txt text diff working-tree-encoding=UTF-16LE-BOM

# Highlight `.gnut` like `.nut` files
*.gnut linguist-language=Squirrel
19 changes: 19 additions & 0 deletions .github/nativefuncs.json
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,25 @@
"returnTypeString":"array<string>",
"argTypes":"string modName"
},
{
"name": "NSIsModDownloadable",
"helpText": "checks whether a mod is verified and can be auto-downloaded",
"returnTypeString": "bool",
"argTypes": "string name, string version"

},
{
"name": "NSDownloadMod",
"helpText": "downloads a given mod from distant API to local game profile",
"returnTypeString": "void",
"argTypes": "string name, string version"
},
{
"name": "NSGetModInstallState",
"helpText": "get status of the mod currently being installed",
"returnTypeString": "ModInstallState",
"argTypes": ""
},
{
"name":"NSReloadMods",
"helpText":"",
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/merge-conflict-auto-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Merge Conflict Auto Label
on:
push:
branches:
- main

jobs:
triage:
runs-on: ubuntu-latest
steps:
- uses: mschilde/auto-label-merge-conflicts@master
with:
CONFLICT_LABEL_NAME: "merge conflicts"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MAX_RETRIES: 5
WAIT_MS: 5000
8 changes: 8 additions & 0 deletions Northstar.Client/mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
"LoadPriority": 0,
"InitScript": "cl_northstar_client_init.nut",
"ConVars": [
{
"Name": "allow_mod_auto_download",
"DefaultValue": "0"
},
{
"Name": "filter_hide_empty",
"DefaultValue": "0"
Expand Down Expand Up @@ -82,6 +86,10 @@
"After": "NSUpdateGameStateClientStart"
}
},
{
"Path": "ui/menu_ns_moddownload.nut",
"RunOn": "UI"
},
{
"Path": "ui/menu_ns_serverbrowser.nut",
"RunOn": "UI",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"SHOW_ONLY_DISABLED" "Only Disabled"
"SHOW_ONLY_NOT_REQUIRED" "Only Optional Mods"
"SHOW_ONLY_REQUIRED" "Only Required Mods"
"MOD_REQUIRED_WARNING" " : This mod may get (un)loaded when joining a server"

// Maps menu
"HIDE_LOCKED" "Hide locked"
Expand Down Expand Up @@ -366,5 +367,26 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"PROGRESSION_DISABLED_BODY" "^CCCC0000Progression has been disabled.^\n\nTitans, Weapons, Factions, Skins, etc. will all be unlocked and usable at any time.\n\nThis can be changed at any time in the multiplayer lobby."

"PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000Progression can now be enabled!^\n\nNorthstar now supports vanilla progression, meaning you can choose to unlock Weapons, Skins, Titans, etc. through levelling up and completing challenges.\n\nYou can enable progression using the button at the bottom of the lobby screen.\n\nThis can be changed at any time."

// Mod downloading
"MISSING_MOD" "Missing mod \"%s1\" v%s2"
"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)"
"DOWNLOADING_MOD_TITLE" "Downloading mod"
"DOWNLOADING_MOD_TITLE_W_PROGRESS" "Downloading mod (%s1%)"
"DOWNLOADING_MOD_TEXT" "Downloading %s1 v%s2..."
"DOWNLOADING_MOD_TEXT_W_PROGRESS" "Downloading %s1 v%s2...\n(%s3/%s4 MB)"
"CHECKSUMING_TITLE" "Checksuming mod"
"CHECKSUMING_TEXT" "Verifying contents of %s1 v%s2..."
"EXTRACTING_MOD_TITLE" "Extracting mod (%s1%)"
"EXTRACTING_MOD_TEXT" "Extracting %s1 v%s2...\n(%s3/%s4 MB)"
"FAILED_DOWNLOADING" "Failed downloading mod"
"FAILED_READING_ARCHIVE" "An error occurred while reading mod archive."
"FAILED_WRITING_TO_DISK" "An error occurred while extracting mod files to the filesystem."
"MOD_FETCHING_FAILED" "Mod archive could not be downloaded from Thunderstore."
"MOD_CORRUPTED" "Downloaded archive checksum does not match verified signature."
"NO_DISK_SPACE_AVAILABLE" "There is not enough space on your disk."
"MOD_FETCHING_FAILED_GENERAL" "Mod extraction failed. Check logs for more details."
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -319,5 +319,35 @@ Si estas de acuerdo con esto, presiona SI. Esta decision puede ser cambiada en e
"INVALID_MASTERSERVER_TOKEN" "Token de jugador expirado o invalido"
"JSON_PARSE_ERROR" "Error procesando respuesta json"
"UNSUPPORTED_VERSION" "La versión que estas usando ya no esta soportada"
"SHOW_ONLY_REQUIRED" "Solo Mods requeridos"
"player_force_respawn" "Reaparición Forzada"
"TOGGLE_PROGRESSION" "Alternar Progreso"
"PROGRESSION_TOGGLE_ENABLED_HEADER" "Desactivar Progreso?"
"NO_RESULTS" "No hay resultados."
"NO_MODS" "No hay configuraciones disponibles! Instala mas mods en: ^5588FF00northstar.thunderstore.io^0."
"AUTHENTICATION_FAILED_HEADER" "Verificacion fallida"
"AUTHENTICATION_FAILED_BODY" "Autenticación fallada con Atlas!"
"AUTHENTICATION_FAILED_ERROR_CODE" "Codigo de error: ^DB6F2C00%s1^"
"AUTHENTICATION_FAILED_HELP" "Ayuda"
"WILL_RESET_ALL_SETTINGS" "Esto reiniciará TODAS las configuraciones de categoría\nEsto no es reversible"
"WILL_RESET_SETTING" "Esto revertirá %s1 a la configuracion por defecto. \n \nEsto no es revertible."
"MOD_SETTINGS_SERVER" "Servidor"
"MOD_SETTINGS_RESET" "Reiniciar"
"MOD_SETTINGS_RESET_ALL" "Reiniciar todo"
"MOD_REQUIRED_WARNING" " Este mod puede ser deshabilitado al entrar a un servidor"
"MOD_SETTINGS" "Configuracion de Mods"
"NORTHSTAR_BASE_SETTINGS" "Configuracion base de Northstar"
"ONLY_HOST_MATCH_SETTINGS" "Solo el Host puede cambiar ajustes de partida"
"ONLY_HOST_CAN_START_MATCH" "Solo el host puede iniciar la partida"
"MATCH_COUNTDOWN_LENGTH" "Cuenta Atrás de partida privada"
"LOG_UNKNOWN_CLIENTCOMMANDS" "Registro desconocido de comandos de cliente"
"DISALLOWED_TACTICALS" "Tactica Prohibida"
"TACTICAL_REPLACEMENT" "Reemplazo de Tactica"
"DISALLOWED_WEAPONS" "Arma Prohibida"
"REPLACEMENT_WEAPON" "Arma de Reemplazo"
"SHOULD_RETURN_TO_LOBBY" "Volver al lobby al finalizar partida"
"ARE_YOU_SURE" "Seguro?"
"Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Alternar Progreso"
"SHOW_ONLY_NOT_REQUIRED" "Solo Mods Opcionales"
}
}
4 changes: 2 additions & 2 deletions Northstar.Client/mod/resource/ui/menus/modlist.menu
Original file line number Diff line number Diff line change
Expand Up @@ -488,8 +488,8 @@ resource/ui/menus/modlist.menu
{
ControlName Label

labelText " : This mod gets (un)loaded automatically"
wide 500
labelText "#MOD_REQUIRED_WARNING"
auto_wide_tocontents 1
tall 50
visible 0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,11 @@ global struct MasterServerAuthResult
string errorCode
string errorMessage
}

global struct ModInstallState
{
int status
int progress
int total
float ratio
}
117 changes: 117 additions & 0 deletions Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
global function DownloadMod
global function DisplayModDownloadErrorDialog

global enum eModInstallStatus
{
DOWNLOADING,
CHECKSUMING,
EXTRACTING,
DONE,
FAILED,
FAILED_READING_ARCHIVE,
FAILED_WRITING_TO_DISK,
MOD_FETCHING_FAILED,
MOD_CORRUPTED,
NO_DISK_SPACE_AVAILABLE,
NOT_FOUND
}

const int MB = 1024*1000;

bool function DownloadMod( RequiredModInfo mod )
{
// Downloading mod UI
DialogData dialogData
dialogData.header = Localize( "#DOWNLOADING_MOD_TITLE" )
dialogData.message = Localize( "#DOWNLOADING_MOD_TEXT", mod.name, mod.version )
dialogData.showSpinner = true;

// Prevent user from closing dialog
dialogData.forceChoice = true;
OpenDialog( dialogData )

// Save reference to UI elements, to update their content
var menu = GetMenu( "Dialog" )
var header = Hud_GetChild( menu, "DialogHeader" )
var body = GetSingleElementByClassname( menu, "DialogMessageClass" )

// Start actual mod downloading
NSDownloadMod( mod.name, mod.version )

ModInstallState state = NSGetModInstallState()
while ( state.status < eModInstallStatus.DONE )
{
state = NSGetModInstallState()
UpdateModDownloadDialog( mod, state, menu, header, body )
WaitFrame()
}

printt( "Mod status:", state.status )

// Close loading dialog
CloseActiveMenu()

return state.status == eModInstallStatus.DONE
}

void function UpdateModDownloadDialog( RequiredModInfo mod, ModInstallState state, var menu, var header, var body )
{
switch ( state.status )
{
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 ) ) )
break
case eModInstallStatus.CHECKSUMING:
Hud_SetText( header, Localize( "#CHECKSUMING_TITLE" ) )
Hud_SetText( body, Localize( "#CHECKSUMING_TEXT", mod.name, mod.version ) )
break
case eModInstallStatus.EXTRACTING:
Hud_SetText( header, Localize( "#EXTRACTING_MOD_TITLE", string( state.ratio ) ) )
Hud_SetText( body, Localize( "#EXTRACTING_MOD_TEXT", mod.name, mod.version, floor( state.progress / MB ), floor( state.total / MB ) ) )
break
default:
break
}
}

void function DisplayModDownloadErrorDialog( string modName )
{
ModInstallState state = NSGetModInstallState()

DialogData dialogData
dialogData.header = Localize( "#FAILED_DOWNLOADING", modName )
dialogData.image = $"ui/menu/common/dialog_error"

switch ( state.status )
{
case eModInstallStatus.FAILED_READING_ARCHIVE:
dialogData.message = Localize( "#FAILED_READING_ARCHIVE" )
break
case eModInstallStatus.FAILED_WRITING_TO_DISK:
dialogData.message = Localize( "#FAILED_WRITING_TO_DISK" )
break
case eModInstallStatus.MOD_FETCHING_FAILED:
dialogData.message = Localize( "#MOD_FETCHING_FAILED" )
break
case eModInstallStatus.MOD_CORRUPTED:
dialogData.message = Localize( "#MOD_CORRUPTED" )
break
case eModInstallStatus.NO_DISK_SPACE_AVAILABLE:
dialogData.message = Localize( "#NO_DISK_SPACE_AVAILABLE" )
break
case eModInstallStatus.NOT_FOUND:
dialogData.message = Localize( "#NOT_FOUND" )
break
case eModInstallStatus.FAILED:
default:
dialogData.message = Localize( "#MOD_FETCHING_FAILED_GENERAL" )
break
}

AddDialogButton( dialogData, "#DISMISS" )
AddDialogFooter( dialogData, "#A_BUTTON_SELECT" )
AddDialogFooter( dialogData, "#B_BUTTON_DISMISS_RUI" )

OpenDialog( dialogData )
}
61 changes: 50 additions & 11 deletions Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
Original file line number Diff line number Diff line change
Expand Up @@ -951,33 +951,65 @@ string function FillInServerModsLabel( array<RequiredModInfo> mods )


void function OnServerSelected( var button )
{
thread OnServerSelected_Threaded( button )
}

void function OnServerSelected_Threaded( var button )
{
if ( NSIsRequestingServerList() || NSGetServerCount() == 0 || file.serverListRequestFailed )
return

ServerInfo server = file.focusedServer

file.lastSelectedServer = server

// Count mods that have been successfully downloaded
bool autoDownloadAllowed = GetConVarBool( "allow_mod_auto_download" )
int downloadedMods = 0;

foreach ( RequiredModInfo mod in server.requiredMods )
{
if ( !NSGetModNames().contains( mod.name ) )
{
DialogData dialogData
dialogData.header = "#ERROR"
dialogData.message = format( "Missing mod \"%s\" v%s", mod.name, mod.version )
dialogData.image = $"ui/menu/common/dialog_error"
// Check if mod can be auto-downloaded
bool modIsVerified = NSIsModDownloadable( mod.name, mod.version )

// Display an error message if not
if ( !modIsVerified || !autoDownloadAllowed )
{
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" )
}

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

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

OpenDialog( dialogData )
OpenDialog( dialogData )

return
}

return
else // Launch download
{
if ( DownloadMod( mod ) )
{
downloadedMods++
}
else
{
DisplayModDownloadErrorDialog( mod.name )
return
}
}
}
else
{
Expand All @@ -1001,7 +1033,7 @@ void function OnServerSelected( var button )
{
DialogData dialogData
dialogData.header = "#ERROR"
dialogData.message = format( "Server has mod \"%s\" v%s while we have v%s", mod.name, mod.version, NSGetModVersionByModName( mod.name ) )
dialogData.message = Localize( "#WRONG_MOD_VERSION", mod.name, mod.version, NSGetModVersionByModName( mod.name ) )
dialogData.image = $"ui/menu/common/dialog_error"

#if PC_PROG
Expand All @@ -1018,6 +1050,13 @@ void function OnServerSelected( var button )
}
}

// Make Northstar aware new mods have been added
if ( downloadedMods > 0 )
{
print( "Some new mods have been downloaded or enabled, reloading mods." )
NSReloadMods();
}

if ( server.requiresPassword )
{
OnCloseServerBrowserMenu()
Expand Down
Loading
Loading