aboutsummaryrefslogtreecommitdiff
path: root/Northstar.Client/mod
diff options
context:
space:
mode:
Diffstat (limited to 'Northstar.Client/mod')
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_english.txt24
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_french.txt48
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_german.txt2
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_italian.txt65
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt106
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_russian.txt174
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt103
-rw-r--r--Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt83
-rw-r--r--Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut7
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut56
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/chatroom.nut902
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_edit_pilot_loadouts.nut170
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_lobby.nut98
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_mod_settings.nut1
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut18
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut44
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_pilot_loadouts_shared.nut300
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/menu_private_match.nut19
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut5
-rw-r--r--Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut2
20 files changed, 1988 insertions, 239 deletions
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
index 5dabd539..c7b25a70 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt
@@ -227,6 +227,7 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"classic_rodeo" "Classic Rodeo"
"oob_timer_enabled" "Out of Bounds Timer"
"riff_instagib" "Instagib Mode"
+ "player_force_respawn" "Forced Respawn"
"riff_player_bleedout" "Pilot Bleedout"
"player_bleedout_forceHolster" "Holster weapons when downed"
@@ -321,6 +322,11 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"INVALID_MASTERSERVER_TOKEN" "Invalid or expired masterserver token"
"JSON_PARSE_ERROR" "Error parsing json response"
"UNSUPPORTED_VERSION" "The version you are using is no longer supported"
+
+ "AUTHENTICATION_FAILED_HEADER" "Authentication Failed"
+ "AUTHENTICATION_FAILED_BODY" "Failed to authenticate with Atlas!"
+ "AUTHENTICATION_FAILED_ERROR_CODE" "Error code: ^DB6F2C00%s1^"
+ "AUTHENTICATION_FAILED_HELP" "Help"
// Mod Settings
"MOD_SETTINGS" "Mod Settings"
@@ -342,5 +348,23 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a
"MOD_SETTINGS_RESET_ALL" "Reset All"
"NO_RESULTS" "No results."
"NO_MODS" "No settings available! Install more mods at ^5588FF00northstar.thunderstore.io^0."
+
+ // Toggleable progression
+ "TOGGLE_PROGRESSION" "Toggle Progression"
+ "Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Toggle Progression"
+
+ "PROGRESSION_TOGGLE_ENABLED_HEADER" "Disable Progression?"
+ "PROGRESSION_TOGGLE_ENABLED_BODY" "Titans, 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_TOGGLE_DISABLED_HEADER" "Enable Progression?"
+ "PROGRESSION_TOGGLE_DISABLED_BODY" "Titans, Weapons, Factions, Skins, etc. will need to be unlocked by levelling up, or bought with Merits.\n\nThis can be changed at any time in the multiplayer lobby.\n\n^CC000000Warning: if you have currently equipped any items that you do not have unlocked, they will be reset!"
+
+ "PROGRESSION_ENABLED_HEADER" "Progression Enabled!"
+ "PROGRESSION_ENABLED_BODY" "^CCCC0000Progression has been enabled.^\n\nTitans, Weapons, Factions, Skins, etc. will need to be unlocked by levelling up, or bought with Merits.\n\nThis can be changed at any time in the multiplayer lobby."
+
+ "PROGRESSION_DISABLED_HEADER" "Progression Disabled!"
+ "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."
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_french.txt b/Northstar.Client/mod/resource/northstar_client_localisation_french.txt
index d90cea05..377f6917 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_french.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_french.txt
@@ -64,7 +64,7 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"earn_meter_pilot_multiplier" "Multiplicateur de boost pilote"
"earn_meter_titan_multiplier" "Multiplicateur de boost titan"
- "aegis_upgrades" "Aegis Upgrades"
+ "aegis_upgrades" "Upgrades Aegis"
"infinite_doomed_state" "Etat condamné infini"
"titan_shield_regen" "Régénération des boucliers"
@@ -86,13 +86,13 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
// northstar.custom localisation is just deciding not to work, so putting it here for now
"PL_sbox" "Bac à sable"
- "PL_sbox_lobby" "Lobby: Bac à sable"
- "PL_sbox_desc" "GMod, mais en pire..."
+ "PL_sbox_lobby" "Lobby : Bac à sable"
+ "PL_sbox_desc" "GMod, mais en pire"
"PL_sbox_abbr" "SBOX"
"GAMEMODE_SBOX" "Bac à sable"
"PL_gg" "Gun game"
- "PL_gg_lobby" "Lobby: Gun game"
+ "PL_gg_lobby" "Lobby : Gun game"
"PL_gg_desc" "Obtenez une nouvelle arme à chaque frag.\nTuez un pilote avec chaque arme pour gagner."
"PL_gg_hint" "Obtenez une nouvelle arme à chaque frag.\nTuez un pilote avec chaque arme pour gagner."
"PL_gg_abbr" "GG"
@@ -102,21 +102,21 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"gg_execution_reward" "Récompense pourcentage d'exécutions"
"PL_tt" "Titan tag"
- "PL_tt_lobby" "Lobby: Titan tag"
+ "PL_tt_lobby" "Lobby : Titan tag"
"PL_tt_desc" "Gagnez des points lorsque vous êtes dans votre titan.\nDétruisez un titan pour obtenir le vôtre."
"PL_tt_hint" "Gagnez des points lorsque vous êtes dans votre titan.\nDétruisez un titan pour obtenir le vôtre."
"PL_tt_abbr" "TT"
"GAMEMODE_TT" "Titan tag"
"PL_chamber" "Le professionnel"
- "PL_chamber_lobby" "Lobby: Le professionnel"
+ "PL_chamber_lobby" "Lobby : Le professionnel"
"PL_chamber_desc" "Un tir, un mort.\nObtenez une balle en tuant un pilote."
"PL_chamber_hint" "Un tir, un mort.\nObtenez une balle en tuant un pilote."
"PL_chamber_abbr" "CHAMBER"
"GAMEMODE_CHAMBER" "Le professionnel"
"PL_hidden" "Chasse"
- "PL_hidden_lobby" "Lobby: Chasse"
+ "PL_hidden_lobby" "Lobby : Chasse"
"PL_hidden_desc" "Un pilote est invisible et chasse les autres."
"PL_hidden_hint" "Un pilote est invisible et chasse les autres."
"PL_hidden_abbr" "HIDDEN"
@@ -126,7 +126,7 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"HIDDEN_FIRST_HIDDEN" "%s1 est le chasseur."
"PL_sns" "Sticks and Stones"
- "PL_sns_lobby" "Lobby: Sticks and Stones"
+ "PL_sns_lobby" "Lobby : Sticks and Stones"
"PL_sns_desc" "Chacun pour soi.\nLes exécutions et les lames à impulsions réinitialisent le score de vos ennemis."
"PL_sns_abbr" "SNS"
"GAMEMODE_SNS" "Sticks and Stones"
@@ -144,7 +144,7 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"sns_softball_enabled" "Softball activé"
"PL_inf" "Infection"
- "PL_inf_lobby" "Lobby: Infection"
+ "PL_inf_lobby" "Lobby : Infection"
"PL_inf_desc" "Les pilotes survivants deviennent infectés lorsque tués."
"PL_inf_hint" "Les pilotes survivants deviennent infectés lorsque tués."
"PL_inf_abbr" "INF"
@@ -158,14 +158,14 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"INFECTION_SURVIVE_LAST_SURVIVOR" "Survivez."
"PL_tffa" "Chacun pour soi (titans)"
- "PL_tffa_lobby" "Lobby: Chacun pour soi (titans)"
+ "PL_tffa_lobby" "Lobby : Chacun pour soi (titans)"
"PL_tffa_desc" "Chacun pour soi.\nDétruisez les titans ennemis."
"PL_tffa_hint" "Chacun pour soi.\nDétruisez les titans ennemis."
"PL_tffa_abbr" "TFFA"
"GAMEMODE_TFFA" "Chacun pour soi (titans)"
"PL_hs" "Cache-cache"
- "PL_hs_lobby" "Lobby: Cache-cache"
+ "PL_hs_lobby" "Lobby : Cache-cache"
"PL_hs_desc" "Les pilotes doivent se cacher pour ne pas être trouvés par l'un d'eux."
"PL_hs_hint" "Les pilotes doivent se cacher pour ne pas être trouvés par l'un d'eux."
"PL_hs_abbr" "HS"
@@ -185,13 +185,13 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
// these are defined in r1_english but titan war is a shit name so i'm changing it to another one that was referenced in development
"GAMEMODE_fw" "Guerre pour la Frontière"
"PL_fw" "Guerre pour la Frontière"
- "PL_fw_lobby" "Lobby: Guerre pour la Frontière"
+ "PL_fw_lobby" "Lobby : Guerre pour la Frontière"
"PL_fw_desc" "Détruisez le collecteur ennemi et protégez le vôtre."
"PL_fw_abbr" "FW"
"GAMEMODE_kr" "Course aux frags"
"PL_kr" "Course aux frags"
- "PL_kr_lobby" "Lobby: Course aux frags"
+ "PL_kr_lobby" "Lobby : Course aux frags"
"PL_kr_desc" "Capturez le drapeau pour devenir le prédateur.\nFaites des victimes pour établir un nouveau record de frags.\nLe pilote ayant le plus de frags à la fin de la partie l'emporte."
"PL_kr_hint" "Capturez le drapeau pour devenir le prédateur.\nFaites des victimes pour établir un nouveau record de frags.\nLe pilote ayant le plus de frags à la fin de la partie l'emporte."
"PL_kr_abbr" "KR"
@@ -207,12 +207,12 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"GAMEMODE_fastball" "Fastball"
"PL_fastball" "Fastball"
- "PL_fastball_lobby" "Lobby: Fastball"
+ "PL_fastball_lobby" "Lobby : Fastball"
"PL_fastball_desc" "Mort permanente.\nPiratez les panneaux de contrôle pour faire réapparaître vos équipiers."
"PL_fastball_hint" "Mort permanente.\nPiratez les panneaux de contrôle pour faire réapparaître vos équipiers."
"PL_fastball_abbr" "FB"
"FASTBALL_PANEL_CAPTURED" "%s1 a piraté le panneau de contrôle %s2 !"
- "SCOREBOARD_FASTBALL_HACKS" "Panneaux de\ncontrôle capturés"
+ "SCOREBOARD_FASTBALL_HACKS" "Panneaux de contrôle capturés"
"GAMEMODE_ctf_comp" "Capture de drapeau - Compétitif"
@@ -239,7 +239,7 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
// coop stuff
"PL_sp_coop" "(ALPHA) Campagne (coop)"
- "PL_sp_coop_lobby" "Lobby: Campagne (coop)"
+ "PL_sp_coop_lobby" "Lobby : Campagne (coop)"
"PL_sp_coop_desc" "Jouez la campagne avec des amis."
"PL_sp_coop_hint" "Jouez la campagne avec des amis."
"PL_sp_coop_abbr" "SP"
@@ -337,5 +337,21 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst
"MOD_SETTINGS_SERVER" "Serveur"
"MOD_SETTINGS_RESET" "Réinitialiser"
"MOD_SETTINGS_RESET_ALL" "Tout réinitialiser"
+ "SHOW_ONLY_REQUIRED" "Afficher les mods requis"
+ "SHOW_ONLY_NOT_REQUIRED" "Uniquement les mods optionnels"
+ "NO_RESULTS" "Aucun résultat."
+ "NO_MODS" "Aucun paramètre trouvé ! Installez d'autres mods depuis ^5588FF00northstar.thunderstore.io^0."
+ "player_force_respawn" "Réapparition forcée"
+ "PROGRESSION_TOGGLE_ENABLED_HEADER" "Désactiver la progression ?"
+ "PROGRESSION_TOGGLE_ENABLED_BODY" "Les Titans, Armes, Factions, Skins, et autres seront débloqués et utilisables en tout temps.\n\nPeut être changé à n'importe que moment dans le salon multijoueurs."
+ "PROGRESSION_TOGGLE_DISABLED_HEADER" "Activer la progression ?"
+ "PROGRESSION_ENABLED_HEADER" "Progression activée !"
+ "PROGRESSION_DISABLED_HEADER" "Progression désactivée !"
+ "PROGRESSION_DISABLED_BODY" "^CCCC0000La progression a été désactivée.^\n\nLes Titans, Armes, Factions, Skins, et autres seront débloqués et utilisables en tout temps.\n\nPeut être changé à n'importe que moment dans le salon multijoueurs."
+ "PROGRESSION_TOGGLE_DISABLED_BODY" "Les Titans, Armes, Factions, Skins et autres seront débloqués par la monté en niveau ou par leur achats en mérites.\n\nPeut être changé à n'importe que moment dans le salon multijoueurs.\n\n^CC000000Warning : Si vous équiper des objets que vous n'avez pas encore débloqués, ils seront déséquipés !"
+ "PROGRESSION_ENABLED_BODY" "^CCCC0000La progression a été activée.^\n\nLes Titans, Armes, Factions, Skins et autres seront débloqués par la monté en niveau ou par leur achats en mérites.\n\nPeut être changé à n'importe que moment dans le salon multijoueurs."
+ "TOGGLE_PROGRESSION" "Activer la progression"
+ "Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Activer la progression"
+ "PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000Le système de progression peut être activé !^\n\nNorthstar supporte désormais le système de progression du jeu original, vous permettant de choisir si vous souhaitez débloquer les armes, skins, titans etc. en gagnant des niveaux et en complétant des défis.\n\nVous pouvez activer la progression en utilisant le bouton en bas de l'écran d'accueil.\n\nCeci peut être changé à tout moment."
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_german.txt b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt
index 0316bbcf..f1994a24 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_german.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt
@@ -310,5 +310,7 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"INVALID_MASTERSERVER_TOKEN" "Ungültiger oder abgelaufener Token vom Masterserver"
"JSON_PARSE_ERROR" "Fehler beim Verarbeiten der JSON-Antwort"
"UNSUPPORTED_VERSION" "Die Version die du benutzt ist nicht länger unterstützt"
+ "SNS_LEADER_BANKRUPT_SUB" "%s1 Wurde Von %s2 Zurückgesetzt"
+ "SNS_BANKRUPT_SUB" "Dein Punkestand wurde von %s1 zurückgesetzt"
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt
index fa84b6a2..38e67dea 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt
@@ -84,8 +84,8 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
// northstar.custom localisation is just deciding not to work, so putting it here for now
"PL_sbox" "Sandbox"
- "PL_sbox_lobby" "Sandbox Lobby"
- "PL_sbox_desc" "Come gmod ma peggio."
+ "PL_sbox_lobby" "Lobby: Sandbox"
+ "PL_sbox_desc" "Come gmod ma peggio"
"PL_sbox_abbr" "SBOX"
"GAMEMODE_SBOX" "Sandbox"
@@ -170,7 +170,7 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"PL_hs_abbr" "NS"
"GAMEMODE_hs" "Nascondino"
"HIDEANDSEEK_YOU_ARE_SEEKER" "TROVA I GIOCATORI NASCOSTI"
- "HIDEANDSEEK_SEEKER_DESC" "Trova ed uccidi tutti i giocatori nascosti. \nRespawnerai in %s1 secondi."
+ "HIDEANDSEEK_SEEKER_DESC" "Trova ed uccidi tutti i giocatori nascosti. \nRespawnerai in %s1 secondi"
"HIDEANDSEEK_YOU_ARE_HIDER" "NASCONDITI"
"HIDEANDSEEK_HIDER_DESC" "Nasconditi e cerca di non farti trovare."
"HIDEANDSEEK_SEEKERS_INCOMING" "HANNO INIZIATO A CERCARTI"
@@ -178,14 +178,14 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"HIDEANDSEEK_GET_LAST_HIDER" "%s1 è L'ULTIMO CERCATORE"
"HIDEANDSEEK_YOU_ARE_LAST_HIDER" "SEI L'ULTIMO NASCOSTO"
"HIDEANDSEEK_GOT_STIM" "Sei stimolato! Non farti prendere!"
- "hideandseek_balance_teams" "Bilanciamento Squadre..."
+ "hideandseek_balance_teams" "Bilanciamento Squadre"
"hideandseek_hiding_time" "Tempo per Nascondersi"
// these are defined in r1_english but titan war is a shit name so i'm changing it to another one that was referenced in development
"GAMEMODE_fw" "Guerra di Frontiera"
"PL_fw" "Guerra di Frontiera"
"PL_fw_lobby" "Lobby: Guerra di Frontiera"
- "PL_fw_desc" "Distruggi il mietiore nemico e proteggi il tuo."
+ "PL_fw_desc" "Distruggi il mietiore nemico e proteggi il tuo"
"PL_fw_abbr" "FW"
"GAMEMODE_kr" "Killrace Amplificata"
@@ -198,10 +198,10 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"KR_NEW_RACER" "%s1 è il killracer amplificato"
"KR_YOU_ARE_NEW_RACER" "Sei il killracer amplificato"
"KR_YOU_SET_NEW_RECORD" "Stabilisci un nuovo record di uccisioni!"
- "KR_FLAG_INCOMING" "Bandiera in Arrivo!"
+ "KR_FLAG_INCOMING" "Bandiera in Arrivo"
"KR_COLLECT_FLAG" "Raccoglila per diventare il killracer!"
- "KR_ENEMY_KILLRACE_OVER" "La killrace di %s1 è finita."
- "KR_YOUR_KILLRACE_OVER" "La tua killrace è finita."
+ "KR_ENEMY_KILLRACE_OVER" "La killrace di %s1 è finita"
+ "KR_YOUR_KILLRACE_OVER" "La tua killrace è finita"
"KR_YOUR_KILLRACE_SCORE" "Hai ottenuto %s1 uccisioni."
"GAMEMODE_fastball" "Fastball"
@@ -222,7 +222,7 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"custom_air_accel_pilot" "Accelerazione Aerea"
"no_pilot_collision" "Collisione tra Piloti"
"promode_enable" "Armi Modalità Competitiva"
- "fp_embark_enabled" "Imbarchi/esecuzioni in 1ºpers."
+ "fp_embark_enabled" "Imbarchi/esecuzioni in 1º persona"
"classic_rodeo" "Rodeo classico"
"oob_timer_enabled" "Timer Fuori dai Limiti"
"riff_instagib" "Modalità Instagib"
@@ -262,7 +262,7 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"SP_BEACON_CLASSIC_DESC" "Cooper e BT tentano di informare la flotta rimanente dei piani dell'IMC."
"SP_TDAY" "Prova del fuoco"
- "SP_TDAY_CLASSIC_DESC" "Le abilità del Titan di Cooper vengono messe alla prova in una battaglia senza quartiere per la cattura dell'Arca."
+ "SP_TDAY_CLASSIC_DESC" "Le abilità del Titan di Cooper vengono messe alla prova in una battaglia senza quartiere per la cattura dell'Arca"
"SP_S2S" "L'Arca"
"SP_S2S_CLASSIC_DESC" "Cooper e BT inseguono l'Arca affrontando una nave dopo l'altra."
@@ -333,9 +333,52 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo
"SHOULD_RETURN_TO_LOBBY" "Ritorna alla Lobby dopo Fine Partita"
"ARE_YOU_SURE" "Sei sicuro?"
"WILL_RESET_ALL_SETTINGS" "Questo ripristinerà TUTTE le impostazioni che appartengono a questa categoria.\n\nNON può essere annullato."
- "WILL_RESET_SETTING" "Questo ripristinerà l'impostazione %s1 al suo valore predefinito.\n\nNON può essere annullato" // obviously, don't translate %s1.
+ "WILL_RESET_SETTING" "Questo ripristinerà l'impostazione %s1 al suo valore predefinito.\n\nNON è reversibile." // obviously, don't translate %s1.
"MOD_SETTINGS_SERVER" "Server"
"MOD_SETTINGS_RESET" "Ripristina"
"MOD_SETTINGS_RESET_ALL" "Ripristina Tutto"
+ "HUD_CHAT_WHISPER_PREFIX" "[WHISPER]"
+ "NO_RESULTS" "Nessun Risultato."
+ "DISABLE" "Disattiva"
+ "DIALOG_AUTHENTICATING_MASTERSERVER" "Autenticazione al master server."
+ "NS_SERVERBROWSER_UNKNOWNMODE" "Modalità sconosciuta"
+ "respawnprotection" "Tempo di protezione al respawn"
+ "NO_MODS" "Nessuna impostazione disponibile! Installa più mods a ^5588FF00northstar.thunderstore.io^0."
+ "gg_assist_reward" "Percentuale ricompensa per assist"
+ "gg_execution_reward" "Percentuale ricompensa per esecuzione"
+ "PL_sns" "Sticks and Stones"
+ "PL_sns_lobby" "Lobby: Sticks and Stones"
+ "PL_sns_abbr" "SNS"
+ "GAMEMODE_SNS" "Sticks and Stones"
+ "SCOREBOARD_BANKRUPTS" "Uccisioni bancarotta"
+ "SNS_LEADER_BANKRUPT" "Leader punteggio in bancarotta!"
+ "SNS_LEADER_BANKRUPT_SUB" "%s1 è stato resettato da %s2"
+ "SNS_BANKRUPT" "Bancarotta!"
+ "sns_softball_kill_value" "Valore per uccisione Softball"
+ "sns_offhand_kill_value" "Valore per uccisione manuale"
+ "sns_melee_kill_value" "Valore per uccisione corpo a corpo"
+ "sns_softball_enabled" "Softball abilitato"
+ "PL_tffa" "Tutti contro tutti Titan"
+ "PL_tffa_lobby" "Lobby: Tutti contro tutti Titan"
+ "PL_tffa_hint" "Ogni pilota per sè, distruggi tutti i titan nemici."
+ "PL_tffa_abbr" "TFFA"
+ "GAMEMODE_TFFA" "Tutti contro tutti Titan"
+ "sns_reset_pulse_blade_cooldown_on_pulse_blade_kill" "Cooldown reset all'uccisione"
+ "SHOW" "Mostra"
+ "SHOW_ALL" "Tutto"
+ "SHOW_ONLY_ENABLED" "Solo Abilitate"
+ "SHOW_ONLY_DISABLED" "Solo Disabilitate"
+ "SHOW_ONLY_NOT_REQUIRED" "Solo Mods opzionali"
+ "SHOW_ONLY_REQUIRED" "Solo Mods richieste"
+ "WARNING" "Attenzione"
+ "CORE_MOD_DISABLE_WARNING" "Disattivare mods di base può rompere il client!"
+ "AUTHENTICATIONAGREEMENT_NO" "Hai scelto di non autenticarti con Northstar. Puoi vedere l'accordo nel menu delle Mods."
+ "aitdm_archer_grunts" "Soldati Archer"
+ "gg_kill_reward" "Percentuale ricompensa per uccisione"
+ "PL_sns_desc" "Tutti contro tutti. Usa la Lama Impulsi e l'esecuzione per resettare il punteggio avversario"
+ "SNS_BANKRUPT_SUB" "Il you punteggio è stato resettato da %s1"
+ "sns_wme_kill_value" "Valore per uccisione Wingman d'Elite"
+ "sns_reset_kill_value" "Valore per uccisione Lama Impulsi/Esecuzione"
+ "PL_tffa_desc" "Ogni pilota per sè, distruggi tutti i titan nemici."
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt
index 51854726..b6364db4 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt
@@ -15,14 +15,14 @@
"DIALOG_TITLE_INSTALLED_NORTHSTAR" "Obrigado por instalar Northstar!"
"AUTHENTICATION_AGREEMENT_DIALOG_TEXT" "Para o Northstar funcionar é necessário autenticar com o servidor mestre Northstar. Isso requer enviar seu token da Origin para o servidor, ele não será utilizado pra outros propósitos.
Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momento no menu de mods."
- "BACK_AUTHENTICATION_AGREEMENT" "Aceitação de autorização"
- "AUTHENTICATION_AGREEMENT" "Aceitação de autorização"
+ "BACK_AUTHENTICATION_AGREEMENT" "Acordo de Autenticação"
+ "AUTHENTICATION_AGREEMENT" "Acordo de Autenticação"
"AUTHENTICATION_AGREEMENT_RESTART" "Você precisa reiniciar o Titanfall 2 para esta mudança ter efeito."
"DIALOG_AUTHENTICATING_MASTERSERVER" "Autenticando com o servidor mestre."
- "AUTHENTICATIONAGREEMENT_NO" "Você não autorizou a autenticação com Northstar. Troque a configuração no menu de mods."
+ "AUTHENTICATIONAGREEMENT_NO" "Você escolheu não autenticar com Northstar. Você pode ver o acordo no menu de Mods."
- "MENU_TITLE_SERVER_BROWSER" "Servidores"
+ "MENU_TITLE_SERVER_BROWSER" "Lista de Servidores"
"NS_SERVERBROWSER_NOSERVERS" "Nenhum servidor encontrado"
"NS_SERVERBROWSER_UNKNOWNMODE" "Modo desconhecido"
"NS_SERVERBROWSER_WAITINGFORSERVERS" "Aguardando servidores..."
@@ -52,9 +52,9 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"classic_mp" "MP Clássico"
"run_epilogue" "Executar epílogo"
"scorelimit" "Limite de pontos"
- "roundscorelimit" "Limite de pontos (por round)"
+ "roundscorelimit" "Limite de pontos (por rodada)"
"timelimit" "Tempo limite"
- "roundtimelimit" "Tempo limite (por round)"
+ "roundtimelimit" "Tempo limite (por rodada)"
"respawnprotection" "Proteção de reaparecimento"
"pilot_health_multiplier" "Multiplicador de vida"
@@ -64,16 +64,16 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"earn_meter_pilot_multiplier" "Multiplicador de bônus"
"earn_meter_titan_multiplier" "Multiplicador de bônus do titã"
- "aegis_upgrades" "Upgrades Aegis"
+ "aegis_upgrades" "Melhorias de Égide"
"infinite_doomed_state" "Estado condenado infinito"
"titan_shield_regen" "Escudos regeneradores"
- "riff_floorislava" "Deadly Ground"
- "featured_mode_all_holopilot" "The Great Bamboozle"
- "featured_mode_all_grapple" "Attack on Titanfall"
- "featured_mode_all_phase" "The Otherside"
- "featured_mode_all_ticks" "Spicy"
- "featured_mode_tactikill" "Tactikill"
+ "riff_floorislava" "Terreno Mortal"
+ "featured_mode_all_holopilot" "A Grande Enganação"
+ "featured_mode_all_grapple" "Ataque aos Titãs"
+ "featured_mode_all_phase" "O Outro Lado"
+ "featured_mode_all_ticks" "Picante"
+ "featured_mode_tactikill" "Mortático"
"featured_mode_amped_tacticals" "Habilidades táticas melhoradas"
"featured_mode_rocket_arena" "Arena Foguete"
"featured_mode_shotguns_snipers" "Armado e perigoso"
@@ -89,14 +89,14 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"PL_sbox_abbr" "SBOX"
"GAMEMODE_SBOX" "Sandbox"
- "PL_gg" "Gun Game"
- "PL_gg_lobby" "Saguão de Gun Game"
- "PL_gg_desc" "Mate com todas as armas para vencer"
- "PL_gg_hint" "Mate com todas as armas para vencer"
+ "PL_gg" "Jogo de Armas"
+ "PL_gg_lobby" "Saguão de Jogo de Armas"
+ "PL_gg_desc" "Mate com cada arma para vencer."
+ "PL_gg_hint" "Mate com cada arma para vencer."
"PL_gg_abbr" "GG"
- "GAMEMODE_GG" "Gun Game"
+ "GAMEMODE_GG" "Jogo de Armas"
"gg_kill_reward" "% recompensa/morte"
- "gg_assist_reward" "% recompensa/assist"
+ "gg_assist_reward" "% recompensa/assistência"
"gg_execution_reward" "% recompensa/execução"
"PL_tt" "Titan Tag"
@@ -106,20 +106,20 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"PL_tt_abbr" "TT"
"GAMEMODE_TT" "Titan Tag"
- "PL_chamber" "One in the Chamber"
- "PL_chamber_lobby" "Saguão de One in the Chamber"
- "PL_chamber_desc" "Um tiro, uma morte. Ganhe outra munição ao abater um inimigo."
- "PL_chamber_hint" "Um tiro, uma morte. Ganhe outra munição ao abater um inimigo."
- "PL_chamber_abbr" "CHAMBER"
- "GAMEMODE_CHAMBER" "One in the Chamber"
+ "PL_chamber" "Um na Câmara"
+ "PL_chamber_lobby" "Saguão de Um na Câmara"
+ "PL_chamber_desc" "Um tiro, uma morte. Ganhe uma bala no pente ao abater um inimigo."
+ "PL_chamber_hint" "Um tiro, uma morte. Ganhe uma bala no pente ao abater um inimigo."
+ "PL_chamber_abbr" "CÂMARA"
+ "GAMEMODE_CHAMBER" "Um na Câmara"
- "PL_hidden" "O Fantasma"
- "PL_hidden_lobby" "Saguão de O Fantasma"
+ "PL_hidden" "O Oculto"
+ "PL_hidden_lobby" "Saguão de O Oculto"
"PL_hidden_desc" "Um jogador se torna invisível enquanto o resto o caça."
"PL_hidden_hint" "Um jogador se torna invisível enquanto o resto o caça."
"PL_hidden_abbr" "HIDDEN"
- "GAMEMODE_HIDDEN" "The Hidden"
- "HIDDEN_YOU_ARE_HIDDEN" "Você é o fantasma!"
+ "GAMEMODE_HIDDEN" "O Oculto"
+ "HIDDEN_YOU_ARE_HIDDEN" "Você é o ocultado!"
"HIDDEN_KILL_SURVIVORS" "Mate todos os sobreviventes."
"HIDDEN_FIRST_HIDDEN" "%s1 é O Fantasma."
@@ -155,12 +155,12 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"INFECTION_YOU_ARE_LAST_SURVIVOR" "Você é o último sobrevivente!"
"INFECTION_SURVIVE_LAST_SURVIVOR" "Sobreviva."
- "PL_tffa" "Free for All Titã"
- "PL_tffa_lobby" "Saguão de Free for All Titã"
+ "PL_tffa" "Cada Titã por si"
+ "PL_tffa_lobby" "Saguão de Cada Titã por si"
"PL_tffa_desc" "Cada um por si, destrua todos os titãs inimigos."
"PL_tffa_hint" "Cada um por si, destrua todos os titãs inimigos."
"PL_tffa_abbr" "TFFA"
- "GAMEMODE_TFFA" "Free for All Titã"
+ "GAMEMODE_TFFA" "Cada Titã por si"
"PL_hs" "Esconde-esconde"
"PL_hs_lobby" "Saguão de Esconde-esconde"
@@ -168,7 +168,7 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"PL_hs_hint" "Jogo clássico de esconde-esconde."
"PL_hs_abbr" "HS"
"GAMEMODE_hs" "Esconde-esconde"
- "HIDEANDSEEK_YOU_ARE_SEEKER" "VOCÊ PEGA!"
+ "HIDEANDSEEK_YOU_ARE_SEEKER" "VOCÊ PEGA"
"HIDEANDSEEK_SEEKER_DESC" "Ache os outros e bata neles.\nVocê reaparecerá em %s1 segundos"
"HIDEANDSEEK_YOU_ARE_HIDER" "VOCÊ ESCONDE"
"HIDEANDSEEK_HIDER_DESC" "Esconda-se."
@@ -203,8 +203,8 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"KR_YOUR_KILLRACE_OVER" "Sua matança acabou"
"KR_YOUR_KILLRACE_SCORE" "Você conseguiu %s1 mortes."
- "GAMEMODE_fastball" "Fastball"
- "PL_fastball" "Fastball"
+ "GAMEMODE_fastball" "Travessia Impulsionada"
+ "PL_fastball" "Travessia Impulsionada"
"PL_fastball_lobby" "Saguão de Fastball"
"PL_fastball_desc" "Sem reaparecimento. Invada painéis de controle para ganhar rounds e reaparecer seus aliados."
"PL_fastball_hint" "Sem reaparecimento. Invada painéis de controle para ganhar rounds e reaparecer seus aliados."
@@ -236,8 +236,8 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"player_bleedout_aiBleedingPlayerMissChance" "Chance de erro da IA ao cair"
// coop stuff
- "PL_sp_coop" "(UNFINISHED) Singleplayer Coop"
- "PL_sp_coop_lobby" "Saguão de Singleplayer em grupo"
+ "PL_sp_coop" "(NÃO-TERMINADO) Campanha Cooperativa"
+ "PL_sp_coop_lobby" "Saguão de Campanha Cooperativa"
"PL_sp_coop_desc" "Jogue através da campanha com seus amigos"
"PL_sp_coop_hint" "Jogue através da campanha com seus amigos"
"PL_sp_coop_abbr" "SP"
@@ -306,5 +306,37 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
// In-game chat
"HUD_CHAT_WHISPER_PREFIX" "[WHISPER]"
"HUD_CHAT_SERVER_PREFIX" "[SERVER]"
+ "ONLY_HOST_MATCH_SETTINGS" "Somente o Host pode mudar as configurações da Partida Privada"
+ "ONLY_HOST_CAN_START_MATCH" "Somente o Host pode Iniciar a Partida"
+ "LOG_UNKNOWN_CLIENTCOMMANDS" "Registrar Comandos desconhecidos de Clientes"
+ "DISALLOWED_TACTICALS" "Táticos Proibidos"
+ "TACTICAL_REPLACEMENT" "Tático Substituto"
+ "DISALLOWED_WEAPONS" "Armas Proibidas"
+ "REPLACEMENT_WEAPON" "Armas Substitutas"
+ "ARE_YOU_SURE" "Tem certeza?"
+ "WILL_RESET_ALL_SETTINGS" "Isso irá resetar TODAS as configurações que pertecem a essa categoria.\n\nAção não reversível."
+ "MOD_SETTINGS_SERVER" "Servidor"
+ "MOD_SETTINGS_RESET" "Resetar"
+ "MOD_SETTINGS_RESET_ALL" "Resetar Tudo"
+ "NO_RESULTS" "Sem resultados."
+ "NO_MODS" "Sem configurações disponíveis. Instale mais mods em ^5588FF00northstar.thunderstore.io^0."
+ "SHOW_ONLY_NOT_REQUIRED" "Somente Mods Opcionais"
+ "NO_GAMESERVER_RESPONSE" "Não foi possível alcançar o servidor da partida"
+ "BAD_GAMESERVER_RESPONSE" "Servidor da partida sem resposta válida"
+ "UNAUTHORIZED_GAMESERVER" "Servidor da partida não está autorizado a fazer tal requisição"
+ "UNAUTHORIZED_PWD" "Senha inválida"
+ "PLAYER_NOT_FOUND" "Não foi possível encontrar conta do jogador"
+ "INVALID_MASTERSERVER_TOKEN" "Token do servidor mestre inválido ou vencido"
+ "JSON_PARSE_ERROR" "Erro ao ler a resposta json"
+ "SHOW_ONLY_REQUIRED" "Somente Mods Mandatórios"
+ "UNAUTHORIZED_GAME" "Stryder não pode confirmar que esta conta possui Titanfall 2"
+ "STRYDER_RESPONSE" "Não foi possível ler a resposta do Stryder"
+ "UNSUPPORTED_VERSION" "A versão que você está usando não é mais suportada"
+ "MOD_SETTINGS" "Configurações de Mod"
+ "NORTHSTAR_BASE_SETTINGS" "Configurações Base do Northstar"
+ "MATCH_COUNTDOWN_LENGTH" "Duração da contagem da Partida Privada"
+ "SHOULD_RETURN_TO_LOBBY" "Retornar ao saguão após término de Partida"
+ "WILL_RESET_SETTING" "Isso irá resetar a configuração %s1 ao valor padrão.\n\nAção não reversível."
+ "aitdm_archer_grunts" "Soldados com Archer"
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt
index 9ce0c2e3..cf410ff2 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt
@@ -17,7 +17,7 @@
"MENU_TITLE_SERVER_BROWSER" "Список серверов"
"NS_SERVERBROWSER_NOSERVERS" "Серверов не найдено"
"NS_SERVERBROWSER_WAITINGFORSERVERS" "Ожидание серверов..."
- "NS_SERVERBROWSER_CONNECTIONFAILED" "Соединение провалено!"
+ "NS_SERVERBROWSER_CONNECTIONFAILED" "Не удалось подключиться!"
"REFRESH_SERVERS" "Обновить"
"MENU_TITLE_CONNECT_PASSWORD" "Подключиться с помощью пароля"
@@ -41,7 +41,7 @@
"MODE_SETTING_CATEGORY_MATCH" "Матч"
"classic_mp" "Классический мультиплеер"
- "run_epilogue" "Запустить эпилог"
+ "run_epilogue" "Показывать эпилог"
"scorelimit" "Лимит очков"
"roundscorelimit" "Лимит очков (по раундам)"
"timelimit" "Лимит времени"
@@ -58,19 +58,19 @@
"infinite_doomed_state" "Бесконечное обречённое состояние"
"titan_shield_regen" "Регенерация щитов"
- "riff_floorislava" "Смертельная Земля"
+ "riff_floorislava" "Пол это лава"
"featured_mode_all_holopilot" "Великий обманщик"
- "featured_mode_all_grapple" "Зацепщик"
- "featured_mode_all_phase" "Альтернативное пространство"
- "featured_mode_all_ticks" "Острый"
+ "featured_mode_all_grapple" "Зацепер"
+ "featured_mode_all_phase" "Мир иной"
+ "featured_mode_all_ticks" "Крутые перцы"
"featured_mode_tactikill" "Тактический удар"
"featured_mode_amped_tacticals" "Усиленные тактики"
"featured_mode_rocket_arena" "Ракетная Арена"
"featured_mode_shotguns_snipers" "Вооружён и опасен"
"iron_rules" "Правила Железного Титана"
- "cp_amped_capture_points" "Усиленные точки опоры"
- "coliseum_loadouts_enabled" "Выгрузка коллизея"
+ "cp_amped_capture_points" "Усиленные опорные пункты"
+ "coliseum_loadouts_enabled" "Экипировка Колизея"
// northstar.custom localisation is just deciding not to work, so putting it here for now
"PL_sbox" "Песочница"
@@ -81,9 +81,9 @@
"PL_gg" "Гонка вооружений"
"PL_gg_lobby" "Лобби гонки вооружений"
- "PL_gg_desc" "Уничтожьте противника из всех видов оружия чтобы победить."
- "PL_gg_hint" "Уничтожьте противника из всех видов оружия чтобы победить."
- "PL_gg_abbr" "GG"
+ "PL_gg_desc" "Убейте по одному противнику из каждого вида оружия."
+ "PL_gg_hint" "Убейте по одному противнику из каждого вида оружия."
+ "PL_gg_abbr" "ГВ"
"GAMEMODE_GG" "Гонка вооружений"
"PL_tt" "Разборки Титанов"
@@ -99,10 +99,10 @@
"PL_inf_hint" "Переживите инфекцию. Выжившие становятся заражёнными при убийстве."
"PL_inf_abbr" "INF"
"GAMEMODE_INF" "Заражение"
- "INFECTION_YOU_ARE_INFECTED" "Вы были заражены!"
+ "INFECTION_YOU_ARE_INFECTED" "Вас заразили!"
"INFECTION_KILL_SURVIVORS" "Заразите всех оставшихся выживших."
"INFECTION_FIRST_INFECTED" "%s1 был заражён первым."
- "INFECTION_LAST_SURVIVOR" "%s1 выжил последним!"
+ "INFECTION_LAST_SURVIVOR" "%s1 — последний выживший!"
"INFECTION_KILL_LAST_SURVIVOR" "Зарази их, пока время не вышло!"
"INFECTION_YOU_ARE_LAST_SURVIVOR" "Вы последний выживший!"
"INFECTION_SURVIVE_LAST_SURVIVOR" "Выживите."
@@ -116,19 +116,19 @@
"HIDEANDSEEK_YOU_ARE_SEEKER" "ВЫ ИЩЕТЕ"
"HIDEANDSEEK_SEEKER_DESC" "Найдите прячущихся и ударьте их.\nВы появитесь через %s1 секунд(у)"
"HIDEANDSEEK_YOU_ARE_HIDER" "ВЫ ПРЯЧЕТЕСЬ"
- "HIDEANDSEEK_HIDER_DESC" "Спрятайтесь."
+ "HIDEANDSEEK_HIDER_DESC" "Спрячьтесь."
"HIDEANDSEEK_SEEKERS_INCOMING" "ИЩУЩИЕ ВЫДВИГАЮТСЯ"
"HIDEANDSEEK_DONT_GET_FOUND" "Не дайте себя найти!"
"HIDEANDSEEK_GET_LAST_HIDER" "%s1 ПОСЛЕДНИЙ СПРЯТАВШИЙСЯ"
"HIDEANDSEEK_YOU_ARE_LAST_HIDER" "ВЫ ПОСЛЕДНИЙ СПРЯТАВШИЙСЯ"
- "HIDEANDSEEK_GOT_STIM" "Вас остановили! Не попадитесь!"
+ "HIDEANDSEEK_GOT_STIM" "Применён стим! Не попадитесь!"
"hideandseek_balance_teams" "Автобаланс обеих сторон"
"hideandseek_hiding_time" "Время спрятаться"
// these are defined in r1_english but titan war is a shit name so i'm changing it to another one that was referenced in development
- "GAMEMODE_fw" "Пограничная война"
- "PL_fw" "Пограничная война"
- "PL_fw_lobby" "Лобби пограничной войны"
+ "GAMEMODE_fw" "Война за Фронтир"
+ "PL_fw" "Война за Фронтир"
+ "PL_fw_lobby" "Лобби Войны за Фронтир"
"PL_fw_desc" "Уничтожьте харвестер противника и защитите свой"
"PL_fw_abbr" "FW"
@@ -136,22 +136,22 @@
"PL_kr" "Усиленные гонки убийств"
"PL_kr_lobby" "Лобби усиленных гонок убийств"
- "PL_kr_desc" "Получайте убийства, чтобы увеличить продолжительность вашей гонки за убийствами. Соберите флаг, чтобы начать его. Установите рекорд убийств, чтобы победить."
- "PL_kr_hint" "Получайте убийства, чтобы увеличить продолжительность вашей гонки за убийствами. Соберите флаг, чтобы начать его. Установите рекорд убийств, чтобы победить."
+ "PL_kr_desc" "Получайте убийства, чтобы увеличить продолжительность вашей гонки за убийствами. Соберите флаг, чтобы начать её. Установите рекорд убийств, чтобы победить."
+ "PL_kr_hint" "Получайте убийства, чтобы увеличить продолжительность вашей гонки за убийствами. Соберите флаг, чтобы начать её. Установите рекорд убийств, чтобы победить."
"PL_kr_abbr" "KR"
"SCOREBOARD_KR_RECORD" "Рекорд убийств"
"KR_NEW_RACER" "%s1 усиленный гонщик за убийства"
"KR_YOU_ARE_NEW_RACER" "Вы усиленный гонщик за убийства"
"KR_YOU_SET_NEW_RECORD" "Установите новый рекорд убийств!"
"KR_FLAG_INCOMING" "Флаг прибывает"
- "KR_COLLECT_FLAG" "Возьмите его чтобы стать гонщиком за убиства!"
+ "KR_COLLECT_FLAG" "Возьмите его чтобы стать гонщиком за убийства!"
"KR_ENEMY_KILLRACE_OVER" "Гонки убийств у %s1 закончились"
"KR_YOUR_KILLRACE_OVER" "Ваши гонки убийств кончились"
"KR_YOUR_KILLRACE_SCORE" "У вас %s1 убийств."
- "GAMEMODE_fastball" "Фастболл"
- "PL_fastball" "Фастболл"
- "PL_fastball_lobby" "Лобби фастболла"
+ "GAMEMODE_fastball" "Фастбол"
+ "PL_fastball" "Фастбол"
+ "PL_fastball_lobby" "Лобби фастбола"
"PL_fastball_desc" "Перманентная смерть. Взломайте панели управления чтобы побеждать в раундах и возродить своих членов команды."
"PL_fastball_hint" "Перманентная смерть. Взломайте панели управления чтобы побеждать в раундах и возродить своих членов команды."
"PL_fastball_abbr" "FB"
@@ -161,20 +161,20 @@
"GAMEMODE_ctf_comp" "Соревновательное CTF"
// mode settings
- "MODE_SETTING_CATEGORY_PROMODE" "Продвинутое оружие"
+ "MODE_SETTING_CATEGORY_PROMODE" "Режим про"
"MODE_SETTING_CATEGORY_BLEEDOUT" "Кровотечение пилота"
"custom_air_accel_pilot" "Ускорение в воздухе"
- "promode_enable" "Продвинутое оружие"
- "fp_embark_enabled" "Отправления/Казни от первого лица"
+ "promode_enable" "Оружие из режима про"
+ "fp_embark_enabled" "Казни/посадки в титана от первого лица"
"classic_rodeo" "Классическое родео"
"oob_timer_enabled" "Таймер уничтожения за пределами карты"
"riff_instagib" "Моментальная смерть при попадании"
"riff_player_bleedout" "Кровотечение пилота"
- "player_bleedout_forceHolster" "Использовать оружие из кобуры при кровотечении"
+ "player_bleedout_forceHolster" "Убирать оружие при кровотечении"
"player_bleedout_forceDeathOnTeamBleedout" "Смерть при кровотечении во всей команде"
- "player_bleedout_bleedoutTime" "Кремя кровотечения"
+ "player_bleedout_bleedoutTime" "Время кровотечения"
"player_bleedout_firstAidTime" "Время оказания первой помощи"
"player_bleedout_firstAidTimeSelf" "Время оказания помощи самому себе"
"player_bleedout_firstAidHealPercent" "Процент здоровья после лечения"
@@ -187,8 +187,8 @@
"PL_sp_coop_hint" "Сыграть в кампанию с друзьями"
"PL_sp_coop_abbr" "SP"
- "SP_TRAINING" "Тренировачная полоса пилотов"
- "SP_TRAINING_CLASSIC_DESC" "Тренировачная имитация капитана Ластимозы."
+ "SP_TRAINING" "Полоса препятствий"
+ "SP_TRAINING_CLASSIC_DESC" "Симуляция капитана Ластимозы."
"SP_CRASHSITE" "БT-7274"
"SP_CRASHSITE_CLASSIC_DESC" "Джек Купер встречает BT-7274."
@@ -200,7 +200,7 @@
"SP_BOOMTOWN_START_CLASSIC_DESC" "Подземная срезка приводит к неожиданным последствиям."
"SP_HUB_TIMESHIFT" "Следствие и Причина"
- "SP_HUB_TIMESHIFT_CLASSIC_DESC" "Странный феномен был обнаружен на местополжении Майора Андерсена."
+ "SP_HUB_TIMESHIFT_CLASSIC_DESC" "Странный феномен был обнаружен на местоположении Майора Андерсена."
"SP_BEACON" "Маяк"
"SP_BEACON_CLASSIC_DESC" "Купер и БТ пытаются известить оставшийся флот о планах IMC."
@@ -211,7 +211,7 @@
"SP_S2S" "Ковчег"
"SP_S2S_CLASSIC_DESC" "Купер и БТ перемещаются по кораблям, преследуя Ковчег."
- "SP_SKYWAY_V1" "Сложенное оружие"
+ "SP_SKYWAY_V1" "Искажающее орудие"
"SP_SKYWAY_V1_CLASSIC_DESC" "БT и Купер были захвачены Кубеном Блиском."
// Better.Serverbrowser
@@ -229,7 +229,7 @@
"SERVER_DESCRIPTION" "Описание"
"SERVER_MODS" "Моды"
"CLEAR_FILTERS" "ОЧИСТИТЬ"
- "JOIN_BUTTON" "ПРИСОЕДИНИТЬСЯ"
+ "JOIN_BUTTON" "ЗАЙТИ"
"SWITCH_YES" "Да"
"SWITCH_NO" "Нет"
@@ -240,18 +240,110 @@
"TOTAL_SERVERS" "Серверов: ^C46C6C00%s1"
// In-game chat
- "HUD_CHAT_WHISPER_PREFIX" "[WHISPER]"
- "HUD_CHAT_SERVER_PREFIX" "[SERVER]"
+ "HUD_CHAT_WHISPER_PREFIX" "[ЛИЧНОЕ]"
+ "HUD_CHAT_SERVER_PREFIX" "[СЕРВЕР]"
"NO_GAMESERVER_RESPONSE" "Игровой сервер не отвечает"
- "BAD_GAMESERVER_RESPONSE" "Игровой сервер не дал правильного ответа"
+ "BAD_GAMESERVER_RESPONSE" "Игровой сервер вернул некорректный ответ"
"UNAUTHORIZED_GAMESERVER" "Игровой сервер не авторизирован чтобы сделать данный запрос"
- "UNAUTHORIZED_GAME" "Не удалось найти Titanfall 2 на этом аккаунте"
+ "UNAUTHORIZED_GAME" "Stryder не смог найти Titanfall 2 на этом аккаунте"
"UNAUTHORIZED_PWD" "Неправильный пароль"
- "STRYDER_RESPONSE" "Не удалось разобрать ответ stryder"
+ "STRYDER_RESPONSE" "Не удалось разобрать ответ Stryder"
"PLAYER_NOT_FOUND" "Не удалось найти аккаунт игрока"
- "INVALID_MASTERSERVER_TOKEN" "Срок действия жетона главного сервера истек или не является правильным"
- "JSON_PARSE_ERROR" "Ошибка разбора ответа json"
+ "INVALID_MASTERSERVER_TOKEN" "Некорректный или истёкший токен главного сервера"
+ "JSON_PARSE_ERROR" "Ошибка разбора json-ответа"
"UNSUPPORTED_VERSION" "Используемая вами версия больше не поддерживается"
+ "DISABLE" "Выключить"
+ "DIALOG_AUTHENTICATING_MASTERSERVER" "Аутентификация на главном сервере."
+ "WARNING" "Предупреждение"
+ "CORE_MOD_DISABLE_WARNING" "Выключение основных модов может сломать ваш клиент!"
+ "AUTHENTICATIONAGREEMENT_NO" "Вы выбрали не аутентифицироваться с Northstar-ом. Вы можете посмотреть соглашение в меню модов."
+ "NS_SERVERBROWSER_UNKNOWNMODE" "Неизвестный режим"
+ "SNS_BANKRUPT" "Банкрот!"
+ "MOD_SETTINGS" "Настройки модов"
+ "NORTHSTAR_BASE_SETTINGS" "Основные настройки Northstar"
+ "ONLY_HOST_MATCH_SETTINGS" "Только создатель матча может изменять настройки"
+ "ONLY_HOST_CAN_START_MATCH" "Только создатель матча может его начать"
+ "MATCH_COUNTDOWN_LENGTH" "Длительность обратного отсчёта частного матча"
+ "LOG_UNKNOWN_CLIENTCOMMANDS" "Записывать в лог неизвестные команды"
+ "DISALLOWED_TACTICALS" "Запрещённое спецоружие"
+ "TACTICAL_REPLACEMENT" "Заменять запрещённое спецоружие на"
+ "DISALLOWED_WEAPONS" "Запрещённое оружие"
+ "REPLACEMENT_WEAPON" "Заменять запрещённое оружие на"
+ "SHOULD_RETURN_TO_LOBBY" "Возвращаться в лобби после матча"
+ "ARE_YOU_SURE" "Вы уверены?"
+ "WILL_RESET_ALL_SETTINGS" "ВСЕ настройки этой категории будут сброшены.\n\nЭто действие нельзя будет откатить."
+ "WILL_RESET_SETTING" "Это сбросит значение настройки %s1.\n\nЭто действие нельзя будет откатить."
+ "MOD_SETTINGS_SERVER" "Сервер"
+ "MOD_SETTINGS_RESET" "Сброс"
+ "MOD_SETTINGS_RESET_ALL" "Сбросить все"
+ "NO_RESULTS" "Нет результатов."
+ "NO_MODS" "Нечего настраивать! Загрузите моды с ^5588FF00northstar.thunderstore.io^0."
+ "respawnprotection" "Длит. защиты после возрождения"
+ "SNS_BANKRUPT_SUB" "Вас обнулил %s1"
+ "PL_hidden" "Невидимка"
+ "PL_hidden_lobby" "Невидимка — лобби"
+ "GAMEMODE_HIDDEN" "Невидимка"
+ "HIDDEN_YOU_ARE_HIDDEN" "Вы — Невидимка!"
+ "HIDDEN_KILL_SURVIVORS" "Убейте всех."
+ "aitdm_archer_grunts" "Пехотинцы со Стрельцами"
+ "PL_chamber" "Последний патрон"
+ "PL_chamber_lobby" "Последний патрон — лобби"
+ "PL_chamber_abbr" "ПАТРОН"
+ "GAMEMODE_CHAMBER" "Последний патрон"
+ "PL_sns" "Камни и палки"
+ "PL_sns_lobby" "Камни и палки — лобби"
+ "PL_sns_desc" "Все против всех. Убийства пульс. клинком и казни сбрасывают очки противника"
+ "PL_sns_abbr" "КИП"
+ "GAMEMODE_SNS" "Камни и палки"
+ "PL_hidden_hint" "Один из игроков невидим."
+ "PL_hidden_abbr" "НЕВИД"
+ "SCOREBOARD_BANKRUPTS" "Врагов обанкрочено"
+ "SNS_LEADER_BANKRUPT" "Лидер обанкрочен!"
+ "SNS_LEADER_BANKRUPT_SUB" "%s1 был обнулён игроком %s2"
+ "gg_kill_reward" "Множитель награды за убийство"
+ "gg_execution_reward" "Множитель награды за казнь"
+ "PL_tffa" "Все против всех на титанах"
+ "PL_tffa_lobby" "Все против всех на титанах — лобби"
+ "PL_tffa_desc" "Каждый пилот сам за себя. Уничтожьте всех вражеских титанов."
+ "PL_tffa_abbr" "ТВПВ"
+ "sns_wme_kill_value" "Очков за убийство Элитным ведомым"
+ "sns_offhand_kill_value" "Очков за убийство спецоружием"
+ "sns_reset_kill_value" "Очков за убийство пульс./казнь"
+ "sns_melee_kill_value" "Очков за убийство врукопашную"
+ "sns_softball_enabled" "Включить Софтбол"
+ "no_pilot_collision" "Столкновения между пилотами"
+ "SHOW" "Показать"
+ "SHOW_ALL" "Все"
+ "SHOW_ONLY_ENABLED" "Только включенные"
+ "SHOW_ONLY_NOT_REQUIRED" "Только необязательные"
+ "SHOW_ONLY_REQUIRED" "Только обязательные"
+ "HIDDEN_FIRST_HIDDEN" "%s1 — Невидимка."
+ "GAMEMODE_TFFA" "Все против всех на титанах"
+ "SHOW_ONLY_DISABLED" "Только выключенные"
+ "HIDE_LOCKED" "Скрыть недоступные"
+ "PL_chamber_desc" "Один выстрел — один труп. Заработайте ещё один патрон, убив врага первым."
+ "PL_chamber_hint" "Один выстрел — один труп. Заработайте ещё один патрон, убив врага первым."
+ "PL_hidden_desc" "Один из игроков невидим."
+ "PL_tffa_hint" "Каждый пилот сам за себя. Уничтожьте всех вражеских титанов."
+ "sns_softball_kill_value" "Очков за убийство Софтболом"
+ "sns_reset_pulse_blade_cooldown_on_pulse_blade_kill" "Сброс перезарядки пульс. клинка при убийстве им"
+ "gg_assist_reward" "Множитель награды за помощь в убийстве"
+ "TOGGLE_PROGRESSION" "Вкл/выкл прогресс"
+ "Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Вкл/выкл прогресс"
+ "PROGRESSION_TOGGLE_DISABLED_HEADER" "Включить прогресс?"
+ "PROGRESSION_ENABLED_HEADER" "Прогресс включён!"
+ "PROGRESSION_ENABLED_BODY" "^CCCC0000Прогресс включён.^\n\nНедоступных титанов, оружие, фракции, раскраски, и т.п. теперь нужно разблокировать, или купить за Заслуги.\n\nЭту настройку всегда можно изменить в лобби сетевой игры."
+ "PROGRESSION_DISABLED_HEADER" "Прогресс выключен!"
+ "PROGRESSION_DISABLED_BODY" "^CCCC0000Прогресс выключен.^\n\nВсе титаны, оружие, фракции, раскраски, и т.п. теперь доступны.\n\nЭту настройку всегда можно изменить в лобби сетевой игры."
+ "player_force_respawn" "Принудительное возрождение"
+ "PROGRESSION_TOGGLE_ENABLED_HEADER" "Отключить прогресс?"
+ "PROGRESSION_TOGGLE_ENABLED_BODY" "Все титаны, оружие, фракции, раскраски, и т.п. станут разблокированы.\n\nЭту настройку всегда можно изменить в лобби сетевой игры."
+ "PROGRESSION_TOGGLE_DISABLED_BODY" "Будут доступны только разблокированные или купленные вами титаны, оружие, фракции, раскраски, и т.п.\n\nЭту настройку всегда можно изменить в лобби сетевой игры.\n\n^CC000000Внимание: недоступные предметы в экипировке будут заменены на доступные!"
+ "PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000Прогресс!^\n\nВ Northstar теперь работает оригинальная система прогресса разблокировок. Титанов, оружие, фракции, раскраски, и т.п. теперь можно разблокировать через получение новых уровней и прохождение испытаний.\n\nПрогресс можно включить с помощью кнопки внизу меню лобби.\n\nЭту настройку всегда можно изменить."
+ "AUTHENTICATION_FAILED_BODY" "Не удалось войти в Atlas!"
+ "AUTHENTICATION_FAILED_ERROR_CODE" "Код ошибки: ^DB6F2C00%s1^"
+ "AUTHENTICATION_FAILED_HELP" "Справка"
+ "AUTHENTICATION_FAILED_HEADER" "Ошибка аутентификации"
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt b/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt
index 0dc82570..3d9ae4c6 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt
@@ -9,10 +9,10 @@
"MENU_TITLE_MODS" "Mods"
"RELOAD_MODS" "Recargar Mods"
"WARNING" "Advertencia"
- "CORE_MOD_DISABLE_WARNING" "Puedes romper el cliente si deshabilitas los mods principales!"
+ "CORE_MOD_DISABLE_WARNING" "¡Puedes romper el cliente si deshabilitas los mods principales!"
"DISABLE" "Deshabilitar"
- "DIALOG_TITLE_INSTALLED_NORTHSTAR" "Gracias por instalar Northstar!."
+ "DIALOG_TITLE_INSTALLED_NORTHSTAR" "¡Gracias por instalar Northstar!"
"AUTHENTICATION_AGREEMENT_DIALOG_TEXT" "Para que Northstar funcione, necesita autentificarse con el servidor maestro Northstar. Esto requiere enviar tu token Origin al servidor maestro, no se guardará ni se usará para cualquier otro fin.
Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mods en cualquier momento."
"BACK_AUTHENTICATION_AGREEMENT" "Acuerdo de autentificación"
@@ -26,7 +26,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"NS_SERVERBROWSER_NOSERVERS" "No se encontraron servidores"
"NS_SERVERBROWSER_UNKNOWNMODE" "Modo desconocido"
"NS_SERVERBROWSER_WAITINGFORSERVERS" "Esperando por servidores..."
- "NS_SERVERBROWSER_CONNECTIONFAILED" "Connexión fallida!"
+ "NS_SERVERBROWSER_CONNECTIONFAILED" "¡Conexión fallida!"
"REFRESH_SERVERS" "Recargar"
"MENU_TITLE_CONNECT_PASSWORD" "Conectar con contraseña"
@@ -36,7 +36,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"PRIVATE_MATCH_PAGE_NEXT" "Página siguiente"
"MENU_MATCH_SETTINGS" "Configuración de partida"
- "MENU_MATCH_SETTINGS_SUBMENU" "%s1 Configuraciones"
+ "MENU_MATCH_SETTINGS_SUBMENU" "Configuración de %s1"
"PRIVATE_MATCH_SINGLEPLAYER_LEVEL" "%s1 (Un jugador)"
@@ -46,16 +46,16 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
// mode settings
"MODE_SETTING_CATEGORY_PILOT" "Piloto"
"MODE_SETTING_CATEGORY_TITAN" "Titán"
- "MODE_SETTING_CATEGORY_RIFF" "Riffs"
+ "MODE_SETTING_CATEGORY_RIFF" "Fragmento"
"MODE_SETTING_CATEGORY_MATCH" "Partida"
"classic_mp" "Multijugador Clasico"
"run_epilogue" "Habilitar Epílogo"
"scorelimit" "Limite de puntuación"
- "roundscorelimit" "Puntaje limite (rondas)"
- "timelimit" "Tiempo limite"
- "roundtimelimit" "Tiempo limite (rondas)"
- "respawnprotection" "Tiempo de proteccion en reaparición"
+ "roundscorelimit" "Límite de punataje (rondas)"
+ "timelimit" "Límite de tiempo"
+ "roundtimelimit" "Límite de tiempo (rondas)"
+ "respawnprotection" "Tiempo de protección en reaparición"
"pilot_health_multiplier" "Multiplicador de salúd"
"respawn_delay" "Retraso de aparición"
@@ -73,7 +73,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"featured_mode_all_grapple" "Ataque a los titanes"
"featured_mode_all_phase" "El otro lado"
"featured_mode_all_ticks" "Picante"
- "featured_mode_tactikill" "Eliminación tactica"
+ "featured_mode_tactikill" "Eliminación con tactica"
"featured_mode_amped_tacticals" "Tacticas mejoradas"
"featured_mode_rocket_arena" "Arena de cohetes"
"featured_mode_shotguns_snipers" "Armado y peligroso"
@@ -85,11 +85,11 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"aitdm_archer_grunts" "Soldado Archer"
// northstar.custom localisation is just deciding not to work, so putting it here for now
- "PL_sbox" "Sandbox"
- "PL_sbox_lobby" "Vestíbulo de Sandbox"
- "PL_sbox_desc" "como gmod pero peor"
+ "PL_sbox" "Custom"
+ "PL_sbox_lobby" "Vestíbulo de juego abierto"
+ "PL_sbox_desc" "Como \"gmod\" pero peor"
"PL_sbox_abbr" "SBOX"
- "GAMEMODE_SBOX" "Sandbox"
+ "GAMEMODE_SBOX" "CUstom"
"PL_gg" "Carrera armamentística"
"PL_gg_lobby" "Vestíbulo de Carrera armamentística"
@@ -103,37 +103,37 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"PL_tt" "Titan Tag"
"PL_tt_lobby" "Vestíbulo de Titan Tag"
- "PL_tt_desc" "Obtén puntos en tu titán. Destruye un titán para obtener el tuyo."
- "PL_tt_hint" "Obtén puntos en tu titán. Destruye un titán para obtener el tuyo."
+ "PL_tt_desc" "Obtén puntos estando en tu titán. Destruye un titán para obtener el tuyo."
+ "PL_tt_hint" "Obtén puntos estando en tu titán. Destruye un titán para obtener el tuyo."
"PL_tt_abbr" "TT"
"GAMEMODE_TT" "Titan Tag"
"PL_chamber" "Uno en la recamara"
"PL_chamber_lobby" "Vestíbulo de uno en la recamara"
- "PL_chamber_desc" "Un disparo, Una eliminación. Obtén otra bala en tu cargador eliminando a alguien."
- "PL_chamber_hint" "Un disparo, Una eliminación. Obtén otra bala en tu cargador eliminando a alguien."
- "PL_chamber_abbr" "CHAMBER"
- "GAMEMODE_CHAMBER" "Uno en la recamara"
+ "PL_chamber_desc" "Un disparo, una eliminación. Obtén otra bala en tu cargador eliminando a alguien."
+ "PL_chamber_hint" "Un disparo, una eliminación. Obtén otra bala en tu cargador eliminando a alguien."
+ "PL_chamber_abbr" "RECÁMARA"
+ "GAMEMODE_CHAMBER" "Uno en la recámara"
"PL_hidden" "El escondido"
"PL_hidden_lobby" "Vestíbulo de El escondido"
"PL_hidden_desc" "Un jugador es invisible. El escondido caza."
"PL_hidden_hint" "Un jugador es invisible. El escondido caza."
- "PL_hidden_abbr" "HIDDEN"
+ "PL_hidden_abbr" "OCULTO"
"GAMEMODE_HIDDEN" "El escondido"
- "HIDDEN_YOU_ARE_HIDDEN" "Eres el escondido!"
+ "HIDDEN_YOU_ARE_HIDDEN" "¡Eres el escondido!"
"HIDDEN_KILL_SURVIVORS" "Mata a todos los supervivientes."
"HIDDEN_FIRST_HIDDEN" "%s1 es El Escondido."
- "PL_sns" "Piedras y palos"
- "PL_sns_lobby" "Vestíbulo de Piedras y palos"
+ "PL_sns" "Palos y Piedras"
+ "PL_sns_lobby" "Vestíbulo de Palos y Piedras"
"PL_sns_desc" "Todos contra todos. Usa cuchillas de pulso y ejecucciones para reestablecer el puntaje del enemigo"
"PL_sns_abbr" "SNS"
- "GAMEMODE_SNS" "Piedras y palos"
+ "GAMEMODE_SNS" "Palos y Piedras"
"SCOREBOARD_BANKRUPTS" "Eliminaciones de bancarrota"
- "SNS_LEADER_BANKRUPT" "Lider de puntaje en bancarrota!"
- "SNS_LEADER_BANKRUPT_SUB" "%s1 Fue reseteado por %s2"
- "SNS_BANKRUPT" "Arruinado!"
+ "SNS_LEADER_BANKRUPT" "¡Lider de puntaje en bancarrota!"
+ "SNS_LEADER_BANKRUPT_SUB" "%s1 fue reseteado por %s2"
+ "SNS_BANKRUPT" "¡Arruinado!"
"SNS_BANKRUPT_SUB" "Tu puntaje fue reseteado por %s1"
"sns_wme_kill_value" "Valor por eliminacion con Wingman Elite"
"sns_softball_kill_value" "Valor por eliminacion con Softball"
@@ -152,7 +152,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"INFECTION_YOU_ARE_INFECTED" "Has sido infectado!"
"INFECTION_KILL_SURVIVORS" "Infecta a todos los supervivientes restantes."
"INFECTION_FIRST_INFECTED" "%s1 es el primer Infectado."
- "INFECTION_LAST_SURVIVOR" "%s1 es el ultimo superviviente!"
+ "INFECTION_LAST_SURVIVOR" "¡%s1 es el ultimo superviviente!"
"INFECTION_KILL_LAST_SURVIVOR" "Infectalo antes de que el tiempo se acabe!"
"INFECTION_YOU_ARE_LAST_SURVIVOR" "Eres el ultimo superviviente!"
"INFECTION_SURVIVE_LAST_SURVIVOR" "Sobrevive."
@@ -186,7 +186,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"GAMEMODE_fw" "Guerra fronteriza"
"PL_fw" "Guerra fronteriza"
"PL_fw_lobby" "Vestíbulo de Guerra fronteriza"
- "PL_fw_desc" "Destruye el cosechador del enemigo y protege el tuyo."
+ "PL_fw_desc" "Destruye el cosechador del enemigo y protege el tuyo"
"PL_fw_abbr" "FW"
"GAMEMODE_kr" "Carrera por muertes"
@@ -205,8 +205,8 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"KR_YOUR_KILLRACE_OVER" "Tu carrera ha acabado"
"KR_YOUR_KILLRACE_SCORE" "Has obtenido %s1 bajas."
- "GAMEMODE_fastball" "Fastball"
- "PL_fastball" "Fastball"
+ "GAMEMODE_fastball" "Lanzamiento"
+ "PL_fastball" "Lanzamiento"
"PL_fastball_lobby" "Vestíbulo de Fastball"
"PL_fastball_desc" "Muerte permanente. Piratea paneles de control para ganar rondas y hacer reaparecer a tus compañeros de equipo."
"PL_fastball_hint" "Muerte permanente. Piratea paneles de control para ganar rondas y hacer reaparecer a tus compañeros de equipo."
@@ -263,7 +263,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"SP_BEACON_CLASSIC_DESC" "Cooper y BT intentan contactar con lo que queda de la flota para alertar de los planes de IMC."
"SP_TDAY" "Prueba de fuego"
- "SP_TDAY_CLASSIC_DESC" "Las habilidades de Cooper al mando de su titán se ponen a prueba en una batalla total para capturar el Arca."
+ "SP_TDAY_CLASSIC_DESC" "Las habilidades de Cooper al mando de su titán se ponen a prueba en una batalla total para capturar el Arca"
"SP_S2S" "El Arca"
"SP_S2S_CLASSIC_DESC" "Cooper y BT van de nave en nave en busca del Arca."
@@ -284,7 +284,7 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"HIDE_EMPTY_FILTER" "Esconder servidores vacios"
"HIDE_PROT_FILTER" "Esconder servidores protegidos"
"SERVER_DESCRIPTION" "Descripción"
- "SERVER_MODS" "Mods"
+ "SERVER_MODS" "Modificaciones"
"CLEAR_FILTERS" "LIMPIAR"
"JOIN_BUTTON" "UNIR"
@@ -318,6 +318,39 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"PLAYER_NOT_FOUND" "No se encontró la cuenta del jugador"
"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"
+ "UNSUPPORTED_VERSION" "La versión que estás usando ya no está siendo mantenida"
+ "MATCH_COUNTDOWN_LENGTH" "Duración cronometrada de la partida privada"
+ "ONLY_HOST_MATCH_SETTINGS" "Sólo el anfitrión puede cambiar las configuraciones de la partida"
+ "ONLY_HOST_CAN_START_MATCH" "Sólo el anfitrión puede iniciar la partida"
+ "DISALLOWED_WEAPONS" "Armas prohibidas"
+ "REPLACEMENT_WEAPON" "Arma de reemplazo"
+ "MOD_SETTINGS" "Configuración de Mods"
+ "LOG_UNKNOWN_CLIENTCOMMANDS" "Registrar comandos no reconocidos desde el cliente"
+ "DISALLOWED_TACTICALS" "Tácticas prohibidas"
+ "TACTICAL_REPLACEMENT" "Reemplazo de la táctica"
+ "SHOULD_RETURN_TO_LOBBY" "Regresar a la sala de espera después de la partida"
+ "ARE_YOU_SURE" "¿Segur@?"
+ "WILL_RESET_ALL_SETTINGS" "Esto reiniciará TODAS las opciones de ésta categoría.\n\nNo se podrá revertir el proceso."
+ "NORTHSTAR_BASE_SETTINGS" "Opciones de Northstar por defecto"
+ "NO_RESULTS" "No hay resultados."
+ "MOD_SETTINGS_RESET" "Reiniciar"
+ "SHOW_ONLY_NOT_REQUIRED" "Mostrar sólo mods opcionales"
+ "SHOW_ONLY_REQUIRED" "Mostrar sólo mods obligatorios"
+ "NO_MODS" "¡No hay configuraciones disponibles! Instala más mods desde ^5588FF00northstar.thunderstore.io^0."
+ "PROGRESSION_TOGGLE_DISABLED_HEADER" "¿Habilitar progreso?"
+ "PROGRESSION_TOGGLE_ENABLED_HEADER" "¿Deshabilitar progresión?"
+ "PROGRESSION_ENABLED_HEADER" "¡Progreso habilitado!"
+ "PROGRESSION_DISABLED_HEADER" "¡Progreso deshabilitado!"
+ "TOGGLE_PROGRESSION" "Cambiar modo de progresión"
+ "Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Cambiar modo de progresión"
+ "PROGRESSION_TOGGLE_DISABLED_BODY" "Titanes, Armas, Facciones, Aspectos y otros serán desbloqueados sólo al subir de nivel, o a través de Logros.\n\nÉsta opción puede ser cambiada cuando quieras en la sala de espera.\n\n^CC000000Advertencia: ¡Cualquier equipamiento o utensilio será reiniciado si no lo tienes desbloqueado!"
+ "MOD_SETTINGS_SERVER" "Servidor"
+ "MOD_SETTINGS_RESET_ALL" "Reiniciar completamente"
+ "PROGRESSION_TOGGLE_ENABLED_BODY" "Los Titanes, Armas, Facciones, Aspectos y otros serán desbloqueados y permanecerán utilizables.\n\nÉsta opción puede ser cambiada cuando quieras desde la sala de espera."
+ "PROGRESSION_ENABLED_BODY" "^CCCC0000El modo de progreso ha sido habilitado.^\n\nLos Titanes, Armas, Facciones, Aspectos y otros se desbloquearán al subir de nivel o por Logros.\n\nPuedes cambiar ésta opción cuando quieras en la sala de espera."
+ "PROGRESSION_DISABLED_BODY" "^CCCC0000El modo de progreso ha sido deshabilitado.^\n\nLos Titanes, Armas, Facciones, Aspectos y otros están desbloqueados y puedes utilizarlos cuando quieras.\n\nPuedes cambiar ésta opción cuando quieras desde la sala de espera."
+ "WILL_RESET_SETTING" "Ésta acción reiniciará %s1 a su valor por defecto.\n\nNo se podrá revertir el proceso."
+ "PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000El progreso puede ser habilitado desde ahora^\n\nNorthstar ahora es compatible con el progreso normal del juego, esto significa que puedes elegir desbloquear Armas, Aspectos, Titanes y otros a través de desafíos y subiendo de nivel.\n\nPuedes habilitar el progreso normal del juego en la opción ubicada al final de la pantalla de la sala de espera.\n\nÉsta opción puede ser cambiada en cualquier momento."
+ "player_force_respawn" "Reaparición Forzada"
}
}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt
index 12b6cad1..500f8a96 100644
--- a/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt
+++ b/Northstar.Client/mod/resource/northstar_client_localisation_tchinese.txt
@@ -127,7 +127,7 @@
"PL_sns" "冷兵器"
"PL_sns_lobby" "冷兵器大廳"
- "PL_sns_desc" "模擬十字弓和飛斧的作戰模式。使用脈衝刀及處決擊殺來重置敵人的分數。"
+ "PL_sns_desc" "无规则. 使用脈衝刀及處決擊殺來重置敵人的分數"
"PL_sns_abbr" "SNS"
"GAMEMODE_SNS" "冷兵器"
"SCOREBOARD_BANKRUPTS" "破產次數"
@@ -155,7 +155,7 @@
"INFECTION_LAST_SURVIVOR" "%s1是最後的倖存者!"
"INFECTION_KILL_LAST_SURVIVOR" "在時間用盡前感染他!"
"INFECTION_YOU_ARE_LAST_SURVIVOR" "你是最後的倖存者!"
- "INFECTION_SURVIVE_LAST_SURVIVOR" "倖存"
+ "INFECTION_SURVIVE_LAST_SURVIVOR" "最後幸存者."
"PL_tffa" "泰坦混戰"
"PL_tffa_lobby" "泰坦混戰大廳"
@@ -238,38 +238,38 @@
"player_bleedout_aiBleedingPlayerMissChance" "倒地時AI的失誤率"
// coop stuff
- "PL_sp_coop" "(UNFINISHED) Singleplayer Coop"
- "PL_sp_coop_lobby" "Singleplayer Coop Lobby"
- "PL_sp_coop_desc" "Play through the singleplayer campaign with friends"
- "PL_sp_coop_hint" "Play through the singleplayer campaign with friends"
+ "PL_sp_coop" "(未完成) 單人合作"
+ "PL_sp_coop_lobby" "單人合作模式大廳"
+ "PL_sp_coop_desc" "與朋友一起遊玩單人戰役"
+ "PL_sp_coop_hint" "與朋友一起遊玩單人戰役"
"PL_sp_coop_abbr" "SP"
- "SP_TRAINING" "The Pilot's Gauntlet"
- "SP_TRAINING_CLASSIC_DESC" "Captain Lastimosa's training simulation."
+ "SP_TRAINING" "鐵御的試煉"
+ "SP_TRAINING_CLASSIC_DESC" "拉絲提莫沙上尉的模擬訓練."
"SP_CRASHSITE" "BT-7274"
- "SP_CRASHSITE_CLASSIC_DESC" "Jack Cooper meets BT-7274."
+ "SP_CRASHSITE_CLASSIC_DESC" "傑克庫博預見BT-7274."
- "SP_SEWERS1" "Blood and Rust"
- "SP_SEWERS1_CLASSIC_DESC" "Cooper and BT set out to rendezvous with Major Anderson."
+ "SP_SEWERS1" "鮮血與鐵鏽"
+ "SP_SEWERS1_CLASSIC_DESC" "庫博和BT一起出發前往與安德森上尉回合."
- "SP_BOOMTOWN_START" "Into the Abyss"
- "SP_BOOMTOWN_START_CLASSIC_DESC" "An underground shortcut yields unexpected consequences."
+ "SP_BOOMTOWN_START" "踏入虛空"
+ "SP_BOOMTOWN_START_CLASSIC_DESC" "一個地下捷徑造成了不可預見的後果."
- "SP_HUB_TIMESHIFT" "Effect and Cause"
- "SP_HUB_TIMESHIFT_CLASSIC_DESC" "A strange phenomenon is discovered at Major Anderson's coordinates."
+ "SP_HUB_TIMESHIFT" "因果報應"
+ "SP_HUB_TIMESHIFT_CLASSIC_DESC" "在安德森上尉的坐標處發現了奇異的現象."
- "SP_BEACON" "The Beacon"
- "SP_BEACON_CLASSIC_DESC" "Cooper and BT attempt to inform the remaining fleet of the IMC's plans."
+ "SP_BEACON" "信號台"
+ "SP_BEACON_CLASSIC_DESC" "庫博和BT嘗試將IMC的計劃通知給剩餘反抗軍艦隊."
- "SP_TDAY" "Trial by Fire"
- "SP_TDAY_CLASSIC_DESC" "Cooper's Titan skills are put to the test in an all-out battle to capture the Ark"
+ "SP_TDAY" "烈火審判"
+ "SP_TDAY_CLASSIC_DESC" "庫博驾馭泰坦的技術在爭奪聖櫃的全面戰爭中得到考驗"
- "SP_S2S" "The Ark"
- "SP_S2S_CLASSIC_DESC" "Cooper and BT go ship to ship in pursuit of the Ark."
+ "SP_S2S" "聖櫃"
+ "SP_S2S_CLASSIC_DESC" "庫博和BT在艦艇中穿梭追尋聖櫃."
- "SP_SKYWAY_V1" "The Fold Weapon"
- "SP_SKYWAY_V1_CLASSIC_DESC" "BT and Cooper are captured by Kuben Blisk."
+ "SP_SKYWAY_V1" "折疊時空武器"
+ "SP_SKYWAY_V1_CLASSIC_DESC" "BT和庫博被庫本布里斯克擒拿."
// Better.Serverbrowser
"SERVERS_COLUMN" "伺服器"
@@ -310,8 +310,8 @@
"HUD_CHAT_SERVER_PREFIX" "[伺服器]"
// In-game chat
- "HUD_CHAT_WHISPER_PREFIX" "[WHISPER]"
- "HUD_CHAT_SERVER_PREFIX" "[SERVER]"
+ "HUD_CHAT_WHISPER_PREFIX" "[悄悄話]"
+ "HUD_CHAT_SERVER_PREFIX" "[伺服器]"
"NO_GAMESERVER_RESPONSE" "無法連接到遊戲伺服器'"
"BAD_GAMESERVER_RESPONSE" "遊戲伺服器回應無效"
@@ -323,5 +323,38 @@
"INVALID_MASTERSERVER_TOKEN" "主伺服器token過期或無效"
"JSON_PARSE_ERROR" "讀取json回應時發生錯誤"
"UNSUPPORTED_VERSION" "您的遊戲版本過低"
+ "NORTHSTAR_BASE_SETTINGS" "北极星基础设置"
+ "ONLY_HOST_CAN_START_MATCH" "只有服主可以開始對局"
+ "MATCH_COUNTDOWN_LENGTH" "私人對局倒計時時間"
+ "DISALLOWED_TACTICALS" "禁用的技能"
+ "TACTICAL_REPLACEMENT" "替換的技能"
+ "NO_RESULTS" "無結果."
+ "LOG_UNKNOWN_CLIENTCOMMANDS" "登記未知客戶端指令"
+ "SHOULD_RETURN_TO_LOBBY" "對局結束後返回大廳"
+ "ARE_YOU_SURE" "確定?"
+ "WILL_RESET_SETTING" "這將會重置 %s1 的設置為默認值.\n\n此操作不可復原."
+ "MOD_SETTINGS_SERVER" "服務器"
+ "MOD_SETTINGS_RESET" "重置"
+ "MOD_SETTINGS_RESET_ALL" "重置所有"
+ "SHOW_ONLY_NOT_REQUIRED" "僅展示非必需模組"
+ "SHOW_ONLY_REQUIRED" "僅展示必須模組"
+ "MOD_SETTINGS" "模组设置"
+ "ONLY_HOST_MATCH_SETTINGS" "只有服主可以修改私人對局設置"
+ "DISALLOWED_WEAPONS" "禁用的武器"
+ "REPLACEMENT_WEAPON" "替换的武器"
+ "WILL_RESET_ALL_SETTINGS" "這將會重置所有屬於改條目的設置.\n\n此操作不可復原."
+ "NO_MODS" "無可用模組! 前往 ^5588FF00northstar.thunderstore.io^0 下載更多."
+ "player_force_respawn" "強制重生"
+ "PROGRESSION_TOGGLE_DISABLED_HEADER" "啟用個人進度?"
+ "PROGRESSION_ENABLED_HEADER" "個人進度已開啟!"
+ "PROGRESSION_TOGGLE_DISABLED_BODY" "泰坦,武器, 陣營,皮膚以及其他一切需要解鎖的物品將通過升級或是使用點數購買來進行解鎖。.\n\n您可以隨時在多人大廳中更改此項。\n\n^CC000000警告:如果您已經裝備了尚未解鎖的物品,它們將會被重置!"
+ "PROGRESSION_TOGGLE_ENABLED_BODY" "泰坦,武器,陣營,皮膚及所有其他一切需要解鎖的物品都將隨時可以進行解鎖並使用。\n\n您可以隨時在多人大廳中更改此項。"
+ "TOGGLE_PROGRESSION" "遊戲進度"
+ "Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% 遊戲進度"
+ "PROGRESSION_TOGGLE_ENABLED_HEADER" "停用個人進度?"
+ "PROGRESSION_DISABLED_HEADER" "個人進度已關閉!"
+ "PROGRESSION_DISABLED_BODY" "^CCCC0000個人進度已停用^\n\n泰坦,武器,陣營,皮膚及所有其他一切需要解鎖的物品將隨時可以進行解鎖並使用。\n\n您可以隨時在多人大廳中更改此項。"
+ "PROGRESSION_ENABLED_BODY" "^CCCC0000個人進度已啟用^\n\n泰坦,武器, 陣營,皮膚以及其他一切需要解鎖的物品將通過升級或是使用點數購買來進行解鎖。.\n\n您可以隨時在多人大廳中更改此項。"
+ "PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000現在可以隨時開啟個人進度!^\n\nNorthstar 現在支持類似官服的進度系統, 这意味着你可以选择通过升级和完成挑战来解锁武器、皮肤、泰坦等。\n\n您可以通過多人大廳底部的“遊戲進度”按鈕來進行開啟。\n\n您可以隨時在多人大廳中更改此項。"
}
}
diff --git a/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut b/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut
index 2a2ed3db..a844478a 100644
--- a/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut
+++ b/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut
@@ -41,3 +41,10 @@ global struct ServerInfo
string region
array< RequiredModInfo > requiredMods
}
+
+global struct MasterServerAuthResult
+{
+ bool success
+ string errorCode
+ string errorMessage
+}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut b/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut
new file mode 100644
index 00000000..89b7f719
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut
@@ -0,0 +1,56 @@
+global function AtlasAuthDialog
+
+void function AtlasAuthDialog()
+{
+ thread AtlasAuthDialog_Threaded()
+}
+
+void function AtlasAuthDialog_Threaded()
+{
+ // wait at least 1 frame so that the main menu can be loaded first
+ WaitFrame()
+
+ while ( !NSIsMasterServerAuthenticated() || GetConVarBool( "ns_auth_allow_insecure" ) )
+ WaitFrame()
+
+ if ( GetConVarBool( "ns_auth_allow_insecure" ) )
+ return
+
+ MasterServerAuthResult res = NSGetMasterServerAuthResult()
+
+ // do nothing on successful authentication
+ if ( res.success )
+ return
+
+ EmitUISound( "blackmarket_purchase_fail" )
+
+ DialogData dialogData
+ dialogData.image = $"ui/menu/common/dialog_error"
+ dialogData.header = Localize( "#AUTHENTICATION_FAILED_HEADER" )
+
+ // if we got a special error message from Atlas, display it
+ if ( res.errorMessage != "" )
+ dialogData.message = res.errorMessage
+ else
+ dialogData.message = Localize( "#AUTHENTICATION_FAILED_BODY" )
+
+ if ( res.errorCode != "" )
+ dialogData.message += format( "\n\n%s", Localize( "#AUTHENTICATION_FAILED_ERROR_CODE", res.errorCode ) )
+
+ string link = "https://r2northstar.gitbook.io/r2northstar-wiki/installing-northstar/troubleshooting"
+ // link to generic troubleshooting page if we don't have an error code from Atlas
+ if ( res.errorCode != "" )
+ link = format( "%s#%s", link, res.errorCode )
+
+ CloseAllDialogs()
+ AddDialogButton( dialogData, "#OK" )
+ AddDialogButton( dialogData, Localize( "#AUTHENTICATION_FAILED_HELP" ), void function() : ( dialogData, link )
+ {
+ // todo: get MS to redirect, so i can use an MS link or something?
+ LaunchExternalWebBrowser( link, WEBBROWSER_FLAG_FORCEEXTERNAL )
+ // keep the dialog open
+ OpenDialog( dialogData )
+ } )
+
+ OpenDialog( dialogData )
+}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/chatroom.nut b/Northstar.Client/mod/scripts/vscripts/ui/chatroom.nut
new file mode 100644
index 00000000..4e98ee8a
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/chatroom.nut
@@ -0,0 +1,902 @@
+untyped
+
+global function Chatroom_GlobalInit
+global function InitChatroom
+global function UpdateChatroomUI
+global function UICodeCallback_ShowUserInfo
+global function UICodeCallback_RemoteMatchInfoUpdated
+global function UICodeCallback_SetChatroomMode
+global function UpdateOpenInvites
+global function HideOpenInvite
+global function ShowOpenInvite
+global function FillInUserInfoPanel
+global function UpdateChatroomThread
+global function IsVoiceChatPushToTalk
+
+global function bsupdate
+
+global const LOBBY_MATERIAL_OWNER = $"rui/menu/common/lobby_icon_owner"
+global const LOBBY_MATERIAL_ADMIN = $"rui/menu/common/lobby_icon_admin"
+
+struct RemoteMatchPlayerInfoRow
+{
+ var playerPanel
+ var name
+ var score
+ var kills
+ var deaths
+}
+
+struct RemoteMatchInfoPanel
+{
+ var panel
+ var PlaylistName
+ var MapName
+ var ModeName
+ var TimeLeft
+ var ScoreLimit
+ var Team1Score
+ var Team2Score
+ array<RemoteMatchPlayerInfoRow> team1Players
+ array<RemoteMatchPlayerInfoRow> team2Players
+}
+
+struct OpenInviteUI
+{
+ var openInviteJoinButton
+ var openInvitePanel
+ var openInviteMessage
+ var openInviteCountdownText
+ array openInvitePlayerSlots
+ array openInvitePlaylistSlots
+}
+
+global struct UserInfoPanel
+{
+ var Panel
+ var Name
+ var Kills
+ var Wins
+ var Losses
+ var Deaths
+ var XP
+ var callsignCard
+ array communityLabels
+ array communityNames
+}
+
+struct ChatroomWidget
+{
+ var chatroomPanel
+ var chatroomWidget
+ var chatroomTextChat
+
+ var chatroomBackground
+ var chatroomDivider
+ var chatroomHappyHour
+ var chatroomMode
+
+ UserInfoPanel userInfoPanel
+
+ RemoteMatchInfoPanel remoteMatchInfoPanelWidgets
+
+ var communityChatroomModeButton
+ var chatroomHintText
+ var happyHourTimeLeft
+
+ OpenInviteUI openInviteUI
+}
+
+struct
+{
+ string userInfoPanel_hardware = ""
+ string userInfoPanel_userId = "0"
+ var communityChatroomMode
+ bool currentUserIsStreaming = false
+ array<ChatroomWidget> chatroomUIs
+ bool hasFocus
+} file
+
+bool function IsVoiceChatPushToTalk()
+{
+ if ( GetPartySize() > 1 )
+ return true
+ return DoesCurrentCommunitySupportChat()
+}
+
+void function UICodeCallback_SetChatroomMode( string mode )
+{
+ file.communityChatroomMode = mode
+ UpdateChatroomUI()
+}
+
+void function UpdateChatroomUI()
+{
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ if ( file.communityChatroomMode == "chatroom" )
+ {
+ int communityId = GetCurrentCommunityId()
+ CommunitySettings ornull communitySettings = GetCommunitySettings( communityId )
+
+ string communityName
+ if ( communitySettings != null )
+ {
+ expect CommunitySettings( communitySettings )
+ communityName = GetCurrentCommunityName() + " [" + communitySettings.clanTag + "]"
+ }
+ else
+ {
+ communityName = expect string( GetCurrentCommunityName() )
+ }
+
+ if ( IsChatroomMuted() )
+ SetLabelRuiText( chatroomUI.communityChatroomModeButton, Localize( "#COMMUNITY_CHATROOM_MUTED", communityName ) )
+ else
+ SetLabelRuiText( chatroomUI.communityChatroomModeButton, Localize( "#COMMUNITY_CHATROOM", communityName ) )
+ }
+ else if ( file.communityChatroomMode == "party" )
+ {
+ SetLabelRuiText( chatroomUI.communityChatroomModeButton, Localize( "#COMMUNITY_PARTY", GetPartyLeaderName() ) )
+ }
+ else
+ {
+ SetLabelRuiText( chatroomUI.communityChatroomModeButton, Localize( file.communityChatroomMode ) )
+ }
+
+ int meritsLeft = GetHappyHourMeritsLeft()
+ if ( meritsLeft == 0 )
+ {
+ SetLabelRuiText( chatroomUI.happyHourTimeLeft, Localize( "#HAPPYHOUR_NOMERITSLEFT", meritsLeft ) )
+ SetNamedRuiText( chatroomUI.happyHourTimeLeft, "happyHourHintString", "" )
+ //SetNamedRuiText( chatroomUI.happyHourTimeLeft, "happyHourHintString", Localize( "#HAPPYHOUR_HINT_ACTIVE_01" ) )
+ }
+ else if ( meritsLeft >= 1 )
+ {
+ SetLabelRuiText( chatroomUI.happyHourTimeLeft, Localize( GetHappyHourStatus() ) )
+ SetNamedRuiText( chatroomUI.happyHourTimeLeft, "happyHourHintString", Localize( "#HAPPYHOUR_HINT_MERITS", 5 ) )
+ }
+ UICodeCallback_ShowUserInfo( file.userInfoPanel_hardware, file.userInfoPanel_userId )
+ }
+
+ UpdateFooterOptions()
+}
+
+bool function FillInCommunityMembership( UserInfoPanel userInfoPanel, CommunityMembership membershipData, int communityIndex )
+{
+ if ( userInfoPanel.communityNames.len() <= communityIndex )
+ return false;
+
+ string title
+ title = "[" + membershipData.communityClantag + "] " + Localize( membershipData.communityName );
+
+ if ( membershipData.membershipLevel == "owner" )
+ Hud_SetText( userInfoPanel.communityLabels[communityIndex], "#COMMUNITY_MEMBERSHIP_OWNER" )
+ else if ( membershipData.membershipLevel == "admin" )
+ Hud_SetText( userInfoPanel.communityLabels[communityIndex], "#COMMUNITY_MEMBERSHIP_ADMIN" )
+ else if ( membershipData.membershipLevel == "member" )
+ Hud_SetText( userInfoPanel.communityLabels[communityIndex], "#COMMUNITY_MEMBERSHIP_MEMBER" )
+ else
+ Assert( false, "Unknown membership level " + membershipData.membershipLevel + " in FillInCommunityMembership" )
+
+ Hud_SetText( userInfoPanel.communityNames[communityIndex], title )
+ Hud_Show( userInfoPanel.communityLabels[communityIndex] );
+ Hud_Show( userInfoPanel.communityNames[communityIndex] );
+
+ return true
+}
+
+void function FillInUserInfoPanel( UserInfoPanel userInfoPanel, CommunityUserInfo userInfo )
+{
+ file.currentUserIsStreaming = userInfo.isLivestreaming
+
+ Hud_SetText( userInfoPanel.Name, userInfo.name )
+ string killsText = "" + userInfo.kills
+ Hud_SetText( userInfoPanel.Kills, killsText )
+ string winsText = "" + userInfo.wins
+ Hud_SetText( userInfoPanel.Wins, winsText )
+ string lossesText = "" + userInfo.losses
+ Hud_SetText( userInfoPanel.Losses, lossesText )
+ string deathsText = "" + userInfo.deaths
+ Hud_SetText( userInfoPanel.Deaths, deathsText )
+ string xpText = ShortenNumber( userInfo.xp )
+ Hud_EnableKeyBindingIcons( userInfoPanel.XP )
+ Hud_SetText( userInfoPanel.XP, Localize( "#CREDITSIGN_N", xpText ) )
+
+ CallingCard callingCard = CallingCard_GetByIndex( userInfo.callingCardIdx )
+ CallsignIcon callsignIcon = CallsignIcon_GetByIndex( userInfo.callSignIdx )
+
+ var card = userInfoPanel.callsignCard
+ var rui = Hud_GetRui( userInfoPanel.callsignCard )
+ RuiSetImage( rui, "cardImage", callingCard.image )
+ RuiSetImage( rui, "iconImage", callsignIcon.image )
+ RuiSetInt( rui, "layoutType", callingCard.layoutType )
+ RuiSetImage( rui, "cardGenImage", GetGenIcon( userInfo.gen, userInfo.lvl ) )
+ RuiSetString( rui, "playerLevel", PlayerXPDisplayGenAndLevel( userInfo.gen, userInfo.lvl ) )
+ RuiSetString( rui, "playerName", userInfo.name )
+
+ array<CommunityMembership> ownerCommunities
+ array<CommunityMembership> adminCommunities
+ array<CommunityMembership> memberCommunities
+
+ for ( int i = 0; i < userInfo.numCommunities; i++ )
+ {
+ CommunityMembership ornull communityInfo = GetCommunityUserMembershipInfo( userInfo.hardware, userInfo.uid, i )
+ if ( !communityInfo )
+ continue;
+ expect CommunityMembership( communityInfo )
+ string membershipLevel = communityInfo.membershipLevel
+ if ( membershipLevel == "owner" )
+ {
+ ownerCommunities.append( communityInfo )
+ }
+ else if ( membershipLevel == "admin" )
+ {
+ adminCommunities.append( communityInfo )
+ }
+ else if ( membershipLevel == "member" )
+ {
+ memberCommunities.append( communityInfo )
+ }
+ else
+ {
+ printt( "Unknown membershipLevel " + membershipLevel )
+ Assert( false, "Unknown membershipLevel" )
+ }
+ }
+
+ array<CommunityMembership> allCommunities
+ for ( int i = 0; i < ownerCommunities.len(); i++ )
+ allCommunities.append( ownerCommunities[i] )
+ for ( int i = 0; i < adminCommunities.len(); i++ )
+ allCommunities.append( adminCommunities[i] )
+ for ( int i = 0; i < memberCommunities.len(); i++ )
+ allCommunities.append( memberCommunities[i] )
+
+ int currentCommunityIndex = 0
+ for ( ; currentCommunityIndex < allCommunities.len(); currentCommunityIndex++ )
+ {
+ if ( !FillInCommunityMembership( userInfoPanel, allCommunities[currentCommunityIndex], currentCommunityIndex ) )
+ break;
+ }
+
+ for ( ; currentCommunityIndex < userInfoPanel.communityNames.len(); currentCommunityIndex++ )
+ {
+ Hud_Hide( userInfoPanel.communityLabels[currentCommunityIndex] );
+ Hud_Hide( userInfoPanel.communityNames[currentCommunityIndex] );
+ }
+
+ UpdateFooterOptions()
+}
+
+void function GetUserInfoThread( string hardware, string userId )
+{
+ EndSignal( uiGlobal.signalDummy, "StopUserInfoLookups" )
+
+ printt( "getting userinfo for user " + userId )
+
+ CommunityUserInfo fakeSettings
+ fakeSettings.name = Localize( "#COMMUNITY_FETCHING" )
+ foreach ( chatroomUI in file.chatroomUIs )
+ FillInUserInfoPanel( chatroomUI.userInfoPanel, fakeSettings )
+
+ while ( true )
+ {
+ printt( "asking for userinfo for " + hardware + "=" + userId )
+
+ CommunityUserInfo ornull userInfo = GetCommunityUserInfo( hardware, userId )
+ if ( !userInfo )
+ {
+ wait 0.05
+ }
+ else
+ {
+ printt( "Got user info for user " + userId + " on hardware " + hardware )
+ expect CommunityUserInfo( userInfo )
+
+ printt( "User " + userId + " is in " + userInfo.numCommunities + " communities" )
+
+ foreach ( chatroomUI in file.chatroomUIs )
+ FillInUserInfoPanel( chatroomUI.userInfoPanel, userInfo )
+ break
+ }
+ }
+}
+
+
+void function UICodeCallback_ShowUserInfo( string hardware, string userId )
+{
+ Signal( uiGlobal.signalDummy, "StopUserInfoLookups" )
+
+ // printt( "Showing user info for UID " + userId + " on hardware " + hardware )
+
+ file.userInfoPanel_userId = userId
+ file.userInfoPanel_hardware = hardware
+
+ if ( hardware == "" && userId == "0" )
+ {
+ foreach ( chatroomUI in file.chatroomUIs )
+ Hud_Hide( chatroomUI.userInfoPanel.Panel )
+
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ // Hud_SetWidth( chatrooUI.chatroomWidget, Hud_GetBaseWidth( chatrooUI.chatroomWidget ) )
+ Hud_SetWidth( chatroomUI.chatroomBackground, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) )
+ Hud_Show( chatroomUI.chatroomDivider )
+ // Hud_SetWidth( chatrooUI.chatroomHeader, Hud_GetBaseWidth( chatrooUI.chatroomHeader ) )
+ // Hud_SetWidth( chatrooUI.chatroomMode, Hud_GetBaseWidth( chatrooUI.chatroomBackground ) )
+ #if CONSOLE_PROG
+ Hud_Show( chatroomUI.chatroomHintText )
+ #else
+ Hud_Show( chatroomUI.chatroomTextChat )
+ #endif
+ }
+ }
+ else
+ {
+ foreach ( chatroomUI in file.chatroomUIs )
+ Hud_Show( chatroomUI.userInfoPanel.Panel )
+
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ // Hud_SetWidth( chatroomUI.chatroomWidget, Hud_GetBaseWidth( chatroomUI.chatroomWidget ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 24 )
+ Hud_SetWidth( chatroomUI.chatroomBackground, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 12 )
+ Hud_Hide( chatroomUI.chatroomDivider )
+ // Hud_SetWidth( chatroomUI.chatroomHeader, Hud_GetBaseWidth( chatroomUI.chatroomHeader ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 12 )
+ // Hud_SetWidth( chatroomUI.chatroomMode, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 24 )
+ #if CONSOLE_PROG
+ Hud_Hide( chatroomUI.chatroomHintText )
+ #else
+ Hud_Hide( chatroomUI.chatroomTextChat )
+ #endif
+ }
+
+ thread GetUserInfoThread( hardware, userId )
+ }
+}
+
+void function FindRemoteMatchInfoWidgetsInPanel( RemoteMatchInfoPanel infostruct, var panel )
+{
+ infostruct.PlaylistName = Hud_GetChild( panel, "PlaylistName" )
+ infostruct.MapName = Hud_GetChild( panel, "MapName" )
+ infostruct.ModeName = Hud_GetChild( panel, "ModeName" )
+ infostruct.TimeLeft = Hud_GetChild( panel, "TimeLeft" )
+ infostruct.ScoreLimit = Hud_GetChild( panel, "ScoreLimit" )
+ infostruct.Team1Score = Hud_GetChild( panel, "Team1Score" )
+ infostruct.Team2Score = Hud_GetChild( panel, "Team2Score" )
+ for ( int i = 1; i <= 2; i++ )
+ {
+ array<RemoteMatchPlayerInfoRow> teamPlayers
+ if ( i == 1 )
+ teamPlayers = infostruct.team1Players
+ else
+ teamPlayers = infostruct.team2Players
+
+ for ( int j = 1; j <= 8; j++ )
+ {
+ RemoteMatchPlayerInfoRow teamPlayer
+ string key = "Team" + i + "Player" + j
+ teamPlayer.playerPanel = Hud_GetChild( panel, key )
+ teamPlayer.name = Hud_GetChild( teamPlayer.playerPanel, "Name" )
+ teamPlayer.score = Hud_GetChild( teamPlayer.playerPanel, "Score" )
+ teamPlayer.kills = Hud_GetChild( teamPlayer.playerPanel, "Kills" )
+ teamPlayer.deaths = Hud_GetChild( teamPlayer.playerPanel, "Deaths" )
+ teamPlayers.append( teamPlayer )
+ }
+ }
+}
+
+int function RemoteMatchInfoPlayerSort( RemoteClientInfoFromMatchInfo a, RemoteClientInfoFromMatchInfo b )
+{
+ return ( b.score - a.score )
+}
+
+void function FillInRemoteMatchInfoPanel( RemoteMatchInfo info, RemoteMatchInfoPanel panel )
+{
+ Hud_Show( panel.panel )
+
+ Hud_SetText( panel.PlaylistName, GetPlaylistDisplayName( info.playlist ) )
+ Hud_SetText( panel.MapName, Localize( "#" + info.map ) )
+
+ string modeName
+
+ if ( IsFDMode( info.gamemode ) )
+ {
+ modeName = "#GAMEMODE_COOP"
+ // HACK because fd has multiple gamemodes in playlists
+ }
+ else
+ {
+ modeName = GAMETYPE_TEXT[ info.gamemode ]
+ }
+
+ if ( IsFullyConnected() )
+ modeName = GetGameModeDisplayName( info.gamemode )
+
+ Hud_SetText( panel.ModeName, modeName )
+ int minsLeft = info.timeLeftSecs / 60
+ int secsLeft = info.timeLeftSecs % 60
+ string timeLeft = "" + minsLeft
+ if ( secsLeft < 10 )
+ timeLeft = timeLeft + ":0" + secsLeft
+ else
+ timeLeft = timeLeft + ":" + secsLeft
+ Hud_SetText( panel.TimeLeft, timeLeft )
+ string scoreLimit = "" + info.maxScore
+ Hud_SetText( panel.ScoreLimit, scoreLimit )
+ string imcScore = "" + info.teamScores[TEAM_IMC]
+ string milScore = "" + info.teamScores[TEAM_MILITIA]
+ Hud_SetText( panel.Team1Score, imcScore )
+ Hud_SetText( panel.Team2Score, milScore )
+
+ int team1PlayerCount = 0
+ int team2PlayerCount = 0
+
+ info.clients.sort( RemoteMatchInfoPlayerSort )
+
+ for ( int i = 0; i < info.clients.len(); i++ )
+ {
+ RemoteMatchPlayerInfoRow teamPlayer
+ if ( info.clients[i].teamNum == TEAM_IMC )
+ {
+ if ( team1PlayerCount >= panel.team1Players.len() )
+ {
+ printt( "too many team players" )
+ continue
+ }
+
+ teamPlayer = panel.team1Players[team1PlayerCount]
+ team1PlayerCount++
+ }
+ else if ( info.clients[i].teamNum == TEAM_MILITIA )
+ {
+ if ( team2PlayerCount >= panel.team2Players.len() )
+ {
+ printt( "too many team players" )
+ continue
+ }
+
+ teamPlayer = panel.team2Players[team2PlayerCount]
+ team2PlayerCount++
+ }
+ else
+ {
+ printt( "Unhandled player team " + info.clients[i].teamNum )
+ continue
+ }
+ string score = "" + info.clients[i].score
+ string kills = "" + info.clients[i].kills
+ string deaths = "" + info.clients[i].deaths
+
+ Hud_Hide( teamPlayer.playerPanel ) // not enough room for these
+ Hud_SetText( teamPlayer.name, info.clients[i].name )
+ Hud_SetText( teamPlayer.score, score )
+ Hud_SetText( teamPlayer.kills, kills )
+ Hud_SetText( teamPlayer.deaths, deaths )
+ }
+ for ( int i = team1PlayerCount; i < panel.team1Players.len(); i++ )
+ Hud_Hide( panel.team1Players[i].playerPanel )
+ for ( int i = team2PlayerCount; i < panel.team2Players.len(); i++ )
+ Hud_Hide( panel.team2Players[i].playerPanel )
+
+}
+
+void function RemoteMatchInfoVisibilityThread()
+{
+ EndSignal( uiGlobal.signalDummy, "StopRemoteMatchInfoThread" )
+ wait 2
+ foreach ( chatroomUI in file.chatroomUIs )
+ Hud_Hide( chatroomUI.remoteMatchInfoPanelWidgets.panel )
+}
+
+void function UICodeCallback_RemoteMatchInfoUpdated()
+{
+ printt( "Remote Match Info Updated!" )
+
+ RemoteMatchInfo info = GetRemoteMatchInfo()
+ foreach ( chatroomUI in file.chatroomUIs )
+ FillInRemoteMatchInfoPanel( info, chatroomUI.remoteMatchInfoPanelWidgets )
+
+ Signal( uiGlobal.signalDummy, "StopRemoteMatchInfoThread" )
+ thread RemoteMatchInfoVisibilityThread()
+}
+
+void function Chatroom_GlobalInit()
+{
+ RegisterSignal( "StopRemoteMatchInfoThread" )
+}
+
+bool function IsSelectedUserStreaming()
+{
+ if ( !ChatroomHasFocus() )
+ return false
+ return file.currentUserIsStreaming
+}
+
+void function InitChatroom( var parentMenu )
+{
+ RegisterSignal( "StopUserInfoLookups" )
+
+ file.communityChatroomMode = "chatroom"
+
+ var menu = Hud_GetChild( parentMenu, "ChatroomPanel" )
+
+ ChatroomWidget chatroomUI
+ file.chatroomUIs.append( chatroomUI )
+
+ chatroomUI.chatroomPanel = menu
+ chatroomUI.chatroomWidget = Hud_GetChild( menu, "ChatRoom" )
+ chatroomUI.chatroomTextChat = Hud_GetChild( menu, "ChatRoomTextChat" )
+ chatroomUI.chatroomBackground = Hud_GetChild( menu, "ChatbarBackground" )
+ chatroomUI.chatroomDivider = Hud_GetChild( menu, "ChatroomHeaderBackground" )
+ chatroomUI.chatroomHappyHour = Hud_GetChild( menu, "HappyHourTimeLeft" )
+ chatroomUI.chatroomMode = Hud_GetChild( menu, "CommunityChatRoomMode" )
+
+ var remoteMatchInfoPanel = Hud_GetChild( parentMenu, "MatchDetails" )
+ chatroomUI.remoteMatchInfoPanelWidgets.panel = remoteMatchInfoPanel
+ FindRemoteMatchInfoWidgetsInPanel( chatroomUI.remoteMatchInfoPanelWidgets, remoteMatchInfoPanel )
+
+ chatroomUI.userInfoPanel.Panel = Hud_GetChild( parentMenu, "UserInfo" )
+ chatroomUI.userInfoPanel.Name = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Name" )
+ chatroomUI.userInfoPanel.Kills = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Kills" )
+ chatroomUI.userInfoPanel.Wins = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Wins" )
+ chatroomUI.userInfoPanel.Losses = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Losses" )
+ chatroomUI.userInfoPanel.Deaths = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Deaths" )
+ chatroomUI.userInfoPanel.XP = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "XP" )
+ chatroomUI.userInfoPanel.callsignCard = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "CallsignCard" )
+
+ // chatroomUI.userInfoPanel.ViewUserCardButton = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "ViewUserCard" )
+
+ for ( int i = 0; i < 6; i++ )
+ {
+ if ( !Hud_HasChild( chatroomUI.userInfoPanel.Panel, "Community" + i + "Label" ) )
+ break;
+ var communityLabel = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Community" + i + "Label" )
+ var communityName = Hud_GetChild( chatroomUI.userInfoPanel.Panel, "Community" + i )
+ Assert( communityName, "found Community" + i + "Label, but no Community" + i + " in userInfo panel" );
+ chatroomUI.userInfoPanel.communityLabels.append( communityLabel )
+ chatroomUI.userInfoPanel.communityNames.append( communityName )
+ }
+
+ chatroomUI.communityChatroomModeButton = Hud_GetChild( menu, "CommunityChatRoomMode" )
+#if CONSOLE_PROG
+ chatroomUI.chatroomHintText = Hud_GetChild( menu, "TextChatHintForConsole" )
+#endif
+ chatroomUI.happyHourTimeLeft = Hud_GetChild( menu, "HappyHourTimeLeft" )
+ // Hud_EnableKeyBindingIcons( chatroomUI.communityChatroomModeButton )
+
+ OpenInviteUI openInviteUI = chatroomUI.openInviteUI
+ openInviteUI.openInvitePanel = Hud_GetChild( parentMenu, "OpenInvitePanel" )
+ openInviteUI.openInviteMessage = Hud_GetChild( openInviteUI.openInvitePanel, "OpenInviteMessage" )
+ openInviteUI.openInviteCountdownText = Hud_GetChild( openInviteUI.openInvitePanel, "OpenInviteCountdownText" )
+
+ var openInviteBackground = Hud_GetChild( openInviteUI.openInvitePanel, "OpenInviteBox" )
+ RuiSetColorAlpha( Hud_GetRui( openInviteBackground ), "backgroundColor", <0, 0, 0>, 0.9 )
+
+ int i = 0;
+ while ( i < 8 )
+ {
+ int count = i + 1
+ var widget = Hud_GetChild( openInviteUI.openInvitePanel, "OpenInvitePlayer" + count )
+ if ( !widget )
+ break
+ openInviteUI.openInvitePlayerSlots.append( widget )
+ i++
+ }
+ for ( int idx = 0; idx < 9; ++idx )
+ {
+ string widgetName = ("OpenInvitePlaylist" + format( "%02d", idx ))
+ var widget = Hud_GetChild( openInviteUI.openInvitePanel, widgetName )
+ openInviteUI.openInvitePlaylistSlots.append( widget )
+ i++
+ }
+
+ openInviteUI.openInviteJoinButton = Hud_GetChild( openInviteUI.openInvitePanel, "JoinOpenInviteButton" )
+ Hud_EnableKeyBindingIcons( openInviteUI.openInviteJoinButton )
+
+ AddEventHandlerToButton( openInviteUI.openInvitePanel, "JoinOpenInviteButton", UIE_CLICK, JoinOpenInvite_OnClick )
+ AddEventHandlerToButton( openInviteUI.openInvitePanel, "OpenInviteCountdownText", UIE_CLICK, JoinOpenInvite_OnClick )
+ AddEventHandlerToButton( openInviteUI.openInvitePanel, "OpenInviteMessageButtonOverlay", UIE_CLICK, JoinOpenInvite_OnClick )
+
+ AddMenuFooterOption( parentMenu, BUTTON_SHOULDER_LEFT, "#LB_MUTEROOM", "#MUTEROOM", MuteRoom, ChatroomIsNotMuted )
+ AddMenuFooterOption( parentMenu, BUTTON_SHOULDER_LEFT, "#LB_UNMUTEROOM", "#UNMUTEROOM", UnmuteRoom, ChatroomIsMuted )
+ AddMenuFooterOption( parentMenu, BUTTON_Y, "#Y_BUTTON_OPENINVITE_DESTROY_FOOTER", "#OPENINVITE_DESTROY", LeaveOpenInviteButton, CanDestroyOpenInvite )
+ AddMenuFooterOption( parentMenu, BUTTON_Y, "#Y_BUTTON_OPENINVITE_JOIN_FOOTER", "#OPENINVITE_JOIN", JoinOpenInvite, CanJoinOpenInvite )
+ AddMenuFooterOption( parentMenu, BUTTON_Y, "#Y_BUTTON_OPENINVITE_LEAVE_FOOTER", "#OPENINVITE_LEAVE", LeaveOpenInviteButton, CanLeaveOpenInvite )
+ AddMenuFooterOption( parentMenu, BUTTON_A, "#BUTTON_VIEW_PLAYER_PROFILE", "#MOUSE1_VIEW_PROFILE", null, IsChatroomViewProfileValid )
+ AddMenuFooterOption( parentMenu, BUTTON_SHOULDER_RIGHT, "#COMMUNITY_RB_CHATROOM_VIEWSTREAM", "#COMMUNITY_CHATROOM_VIEWSTREAM", null, IsSelectedUserStreaming )
+ AddMenuFooterOption( parentMenu, BUTTON_X, "#BUTTON_MUTE", "#MOUSE2_MUTE", null, ChatroomHasFocus )
+
+ UpdateChatroomUI()
+
+ Hud_AddEventHandler( chatroomUI.chatroomWidget, UIE_LOSE_FOCUS, LostFocus )
+ Hud_AddEventHandler( chatroomUI.chatroomWidget, UIE_GET_FOCUS, GotFocus )
+}
+
+void function bsupdate()
+{
+ ShowOpenInvite()
+
+ OpenInvite openInvite
+ openInvite.amILeader = false
+ openInvite.amIInThis = false
+ openInvite.numSlots = 5
+ openInvite.numClaimedSlots = 1
+
+ string inviteString = openInvite.amILeader ? "#OPENINVITE_SENDER_PLAYLIST" : "#OPENINVITE_PLAYLIST"
+
+ float endTime = Time() + 10.0
+ while ( Time() < endTime )
+ {
+ openInvite.timeLeft = endTime - Time()
+
+ int remainingTime = int( ceil( endTime - Time() ) )
+ UpdateOpenInvites( openInvite, inviteString, "scriptacus", "Bounty Hunt", remainingTime )
+
+ if ( remainingTime == 8 )
+ openInvite.numClaimedSlots = 2
+
+ if ( remainingTime == 6 )
+ openInvite.numClaimedSlots = 4
+
+ //if ( remainingTime == 5 )
+ // openInvite.numClaimedSlots = 5
+ //
+ //if ( remainingTime == 4 )
+ // openInvite.numClaimedSlots = 6
+
+ WaitFrame()
+ }
+}
+
+void function UpdateOpenInvites( OpenInvite openInvite, string message, string param1, string ornull param2, int countdown )
+{
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ if ( param2 )
+ Hud_SetText( chatroomUI.openInviteUI.openInviteMessage, message, param1, param2 );
+ else
+ Hud_SetText( chatroomUI.openInviteUI.openInviteMessage, message, param1 );
+
+ string countdownText = "" + countdown
+// Hud_SetText( chatroomUI.openInviteUI.openInviteCountdownText, "#OPENINVITE_COUNTDOWN", countdownText )
+ var countdownRui = Hud_GetRui( chatroomUI.openInviteUI.openInviteCountdownText )
+ RuiSetFloat( countdownRui, "timeLeft", openInvite.timeLeft )
+ RuiSetFloat( countdownRui, "maxTime", GetConVarFloat( "openinvite_duration_default" ) )
+
+ bool started = openInvite.timeLeft <= 0 || openInvite.numFreeSlots == 0
+
+ if ( started )
+ {
+ Hud_Hide( chatroomUI.openInviteUI.openInviteJoinButton )
+ }
+ else if ( CanDestroyOpenInvite() )
+ {
+ Hud_Show( chatroomUI.openInviteUI.openInviteJoinButton )
+ if ( IsControllerModeActive() )
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#Y_BUTTON_OPENINVITE_DESTROY" )
+ else
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#OPENINVITE_DESTROY" )
+ }
+ else if ( CanLeaveOpenInvite() )
+ {
+ Hud_Show( chatroomUI.openInviteUI.openInviteJoinButton )
+ if ( IsControllerModeActive() )
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#Y_BUTTON_OPENINVITE_LEAVE" )
+ else
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#OPENINVITE_LEAVE" )
+ }
+ else if ( CanJoinOpenInvite() )
+ {
+ Hud_Show( chatroomUI.openInviteUI.openInviteJoinButton )
+ if ( IsControllerModeActive() )
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#Y_BUTTON_OPENINVITE_JOIN" )
+ else
+ SetNamedRuiText( chatroomUI.openInviteUI.openInviteJoinButton, "buttonText", "#OPENINVITE_JOIN" )
+ }
+
+ string myUID = GetPlayerUID()
+ int i = 0
+ foreach ( player in chatroomUI.openInviteUI.openInvitePlayerSlots )
+ {
+ var rui = Hud_GetRui( player )
+ Hud_Show( player )
+
+ if ( i >= openInvite.numSlots )
+ {
+ //Hud_Hide( player )
+ RuiSetBool( rui, "isEnabled", false )
+ RuiSetBool( rui, "hasPlayer", false )
+ }
+ else
+ {
+ CallsignIcon callsignIcon
+ bool isMe = false
+ // asset playerImage
+
+ if ( i < openInvite.numClaimedSlots )
+ {
+ PartyMember member = openInvite.members[i]
+ isMe = ( member.uid == myUID )
+ if ( isMe )
+ {
+ if ( GetUIPlayer() != null ) // this can happen sometimes after a resolution/windowed mode change
+ callsignIcon = PlayerCallsignIcon_GetActive( GetUIPlayer() )
+ else
+ callsignIcon = CallsignIcon_GetByRef( "gc_icon_happyface" )
+ }
+ else
+ {
+ callsignIcon = CallsignIcon_GetByIndex( member.callsignIdx )
+ }
+ }
+ else
+ {
+ callsignIcon = CallsignIcon_GetByRef( "gc_icon_happyface" )
+ }
+
+ Hud_Show( player )
+ RuiSetBool( rui, "isEnabled", true )
+
+ RuiSetBool( rui, "hasPlayer", i < openInvite.numClaimedSlots )
+ RuiSetBool( rui, "isViewPlayer", isMe )
+ RuiSetImage( rui, "playerImage", callsignIcon.image )
+
+ //if ( i < openInvite.numClaimedSlots )
+ // Hud_SetImage( player, $"ui/menu/main_menu/openinvite_occupiedslot" )
+ //else
+ // Hud_SetImage( player, $"ui/menu/main_menu/openinvite_emptyslot" )
+ }
+ i++
+ }
+
+ array<string> checklistPlaylists = GetChecklistPlaylistsArray()
+
+ if ( Lobby_IsFDMode() )
+ checklistPlaylists = GetFDDifficultyArray()
+
+ array<string> invitePlaylists = split( openInvite.playlistName, "," )
+ bool shouldShowCheckboxPlaylists = true
+ if ( !MixtapeMatchmakingIsEnabled() )
+ shouldShowCheckboxPlaylists = false
+ else if ( invitePlaylists.len() == 0 )
+ shouldShowCheckboxPlaylists = false
+ else if ( (invitePlaylists.len() == 1) && (!checklistPlaylists.contains( invitePlaylists[0] )) )
+ shouldShowCheckboxPlaylists = false
+
+ int playlistSlotCount = chatroomUI.openInviteUI.openInvitePlaylistSlots.len()
+ for( int idx = 0; idx < playlistSlotCount; ++idx )
+ {
+ var slot = chatroomUI.openInviteUI.openInvitePlaylistSlots[idx]
+
+ string thisPlaylistName = idx < checklistPlaylists.len() ? checklistPlaylists[idx] : ""
+ if ( (thisPlaylistName == "") || !shouldShowCheckboxPlaylists )
+ {
+ Hud_Hide( slot )
+ continue
+ }
+
+ Hud_Show( slot )
+ var slotRui = Hud_GetRui( slot )
+ asset playlistThumbnail = GetPlaylistThumbnailImage( thisPlaylistName )
+ RuiSetImage( slotRui, "checkImage", playlistThumbnail )
+
+ bool isChecked = invitePlaylists.contains( thisPlaylistName )
+ RuiSetBool( slotRui, "isChecked", isChecked )
+
+ string abbr = GetPlaylistVarOrUseValue( thisPlaylistName, "abbreviation", "" )
+ RuiSetString( slotRui, "abbreviation", Localize( abbr ) )
+ }
+ }
+}
+
+
+void function HideOpenInvite()
+{
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ Hud_Hide( chatroomUI.openInviteUI.openInvitePanel )
+ }
+}
+
+void function ShowOpenInvite()
+{
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ Hud_Show( chatroomUI.openInviteUI.openInvitePanel )
+ }
+}
+
+
+void function LostFocus( panel )
+{
+ Signal( uiGlobal.signalDummy, "StopUserInfoLookups" )
+ printt( "Chatroom lost focus" )
+ foreach ( chatroomUI in file.chatroomUIs )
+ Hud_Hide( chatroomUI.userInfoPanel.Panel )
+ file.hasFocus = false
+
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ // Hud_SetWidth( chatrooUI.chatroomWidget, Hud_GetBaseWidth( chatrooUI.chatroomWidget ) )
+ Hud_SetWidth( chatroomUI.chatroomBackground, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) )
+ Hud_Show( chatroomUI.chatroomDivider )
+ // Hud_SetWidth( chatrooUI.chatroomMode, Hud_GetBaseWidth( chatrooUI.chatroomBackground ) )
+ Hud_Show( chatroomUI.chatroomTextChat )
+ }
+}
+
+
+void function OnChatroomWidgetGetFocus( var widget )
+{
+}
+
+void function OnChatroomWidgetLoseFocus( var widget )
+{
+}
+
+void function GotFocus( panel )
+{
+ printt( "Chatroom got focus" )
+ file.hasFocus = true
+
+ foreach ( chatroomUI in file.chatroomUIs )
+ {
+ // Hud_SetWidth( chatroomUI.chatroomWidget, Hud_GetBaseWidth( chatroomUI.chatroomWidget ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 24 )
+ Hud_SetWidth( chatroomUI.chatroomBackground, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 12 )
+ Hud_Hide( chatroomUI.chatroomDivider )
+ // Hud_SetWidth( chatroomUI.chatroomMode, Hud_GetBaseWidth( chatroomUI.chatroomBackground ) - Hud_GetBaseWidth( chatroomUI.userInfoPanel.Panel ) - 24 )
+ Hud_Hide( chatroomUI.chatroomTextChat )
+ }
+}
+
+bool function IsChatroomViewProfileValid()
+{
+ #if PC_PROG
+ if ( !Origin_IsOverlayAvailable() )
+ return false
+ #endif // PC_PROG
+
+ return ChatroomHasFocus()
+}
+
+bool function ChatroomHasFocus()
+{
+ return file.hasFocus
+}
+
+bool function ChatroomIsMuted()
+{
+ if ( IsControllerModeActive() )
+ return ChatroomHasFocus() && IsChatroomMuted()
+ return IsChatroomMuted()
+}
+
+bool function ChatroomIsNotMuted()
+{
+ if ( IsControllerModeActive() )
+ return ChatroomHasFocus() && !IsChatroomMuted()
+ return !IsChatroomMuted()
+}
+
+void function MuteRoom( var button )
+{
+ printt( "muting the room" )
+ ClientCommand( "muteroom" )
+}
+
+void function UnmuteRoom( var button )
+{
+ printt( "unmuting the room" )
+ ClientCommand( "unmuteroom" )
+}
+
+void function UpdateChatroomThread()
+{
+ EndSignal( uiGlobal.signalDummy, "OnCloseLobbyMenu" )
+ while ( true )
+ {
+ UpdateChatroomUI()
+ wait 30
+ }
+}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_edit_pilot_loadouts.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_edit_pilot_loadouts.nut
new file mode 100644
index 00000000..89479a76
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_edit_pilot_loadouts.nut
@@ -0,0 +1,170 @@
+untyped
+
+global function InitEditPilotLoadoutsMenu
+
+struct
+{
+ var menu
+ var loadoutPanel
+ var[NUM_PERSISTENT_PILOT_LOADOUTS] loadoutHeaders
+ var[NUM_PERSISTENT_PILOT_LOADOUTS] activateButtons
+ bool enteringEdit = false
+ var unlockReq
+} file
+
+void function InitEditPilotLoadoutsMenu()
+{
+ file.menu = GetMenu( "EditPilotLoadoutsMenu" )
+ var menu = file.menu
+
+ AddMenuEventHandler( menu, eUIEvent.MENU_OPEN, OnPilotLoadoutsMenu_Open )
+ AddMenuEventHandler( menu, eUIEvent.MENU_CLOSE, OnPilotLoadoutsMenu_Close )
+ AddMenuEventHandler( menu, eUIEvent.MENU_INPUT_MODE_CHANGED, OnPilotLoadoutsMenu_InputModeChanged )
+
+ for ( int i = 0; i < NUM_PERSISTENT_PILOT_LOADOUTS; i++ )
+ {
+ var activateButton = Hud_GetChild( menu, "Button" + i )
+ activateButton.s.rowIndex <- i
+ Hud_SetVisible( activateButton, true )
+ Hud_AddEventHandler( activateButton, UIE_CLICK, OnLoadoutButton_Activate )
+ Hud_AddEventHandler( activateButton, UIE_GET_FOCUS, OnLoadoutButton_Focused )
+ Hud_AddEventHandler( activateButton, UIE_LOSE_FOCUS, OnLoadoutButton_LostFocus )
+ file.activateButtons[i] = activateButton
+ }
+
+ Hud_SetFocused( file.activateButtons[0] )
+
+ file.loadoutPanel = Hud_GetChild( menu, "PilotLoadoutDisplay" )
+ file.unlockReq = Hud_GetChild( menu, "UnlockReq" )
+
+ AddMenuFooterOption( menu, BUTTON_A, "#A_BUTTON_SELECT" )
+ AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
+}
+
+void function OnPilotLoadoutsMenu_Open()
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return
+
+ RunMenuClientFunction( "ClearEditingPilotLoadoutIndex" )
+
+ int loadoutIndex = uiGlobal.pilotSpawnLoadoutIndex
+ UpdatePilotLoadoutButtons( loadoutIndex, file.activateButtons )
+ UpdatePilotLoadoutPanel( file.loadoutPanel, GetCachedPilotLoadout( loadoutIndex ) )
+ UI_SetPresentationType( ePresentationType.PILOT )
+
+ RefreshCreditsAvailable()
+}
+
+void function OnPilotLoadoutsMenu_Close()
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return
+
+ foreach ( i, button in file.activateButtons )
+ {
+ string pilotLoadoutRef = "pilot_loadout_" + ( i + 1 )
+ if ( !IsItemNew( player, pilotLoadoutRef ) )
+ continue
+
+ ClearNewStatus( button, pilotLoadoutRef )
+ }
+}
+
+void function OnPilotLoadoutsMenu_InputModeChanged()
+{
+ UpdatePilotLoadoutPanelBinds( file.loadoutPanel )
+}
+
+void function OnLoadoutButton_Focused( var button )
+{
+ int index = expect int( button.s.rowIndex )
+
+ // update the editingLoadoutIndex on focus so that it always matches
+ // with the pilot loadout panel
+ uiGlobal.editingLoadoutIndex = index
+ uiGlobal.editingLoadoutType = "pilot"
+
+ UpdatePilotLoadout( index )
+
+ string pilotLoadoutRef = "pilot_loadout_" + ( index + 1 )
+ string unlockReq = GetItemUnlockReqText( pilotLoadoutRef )
+ RHud_SetText( file.unlockReq, unlockReq )
+}
+
+void function UpdatePilotLoadout( int loadoutIndex )
+{
+ PilotLoadoutDef loadout = GetCachedPilotLoadout( loadoutIndex )
+
+ UpdatePilotLoadoutPanel( file.loadoutPanel, loadout )
+ RunMenuClientFunction( "UpdatePilotModel", loadoutIndex )
+}
+
+void function OnLoadoutButton_Activate( var button )
+{
+ if ( !IsFullyConnected() )
+ return
+
+ if ( Hud_IsLocked( button ) )
+ {
+ int index = expect int ( button.s.rowIndex )
+ string pilotLoadoutRef = "pilot_loadout_" + ( index + 1 )
+
+ array<var> buttons
+ foreach ( button in file.activateButtons )
+ {
+ buttons.append( button )
+ }
+
+ OpenBuyItemDialog( buttons, button, GetItemName( pilotLoadoutRef ), pilotLoadoutRef )
+ return
+ }
+
+ int loadoutIndex = expect int ( button.s.rowIndex )
+ SetEditLoadout( "pilot", loadoutIndex )
+
+ if ( EDIT_LOADOUT_SELECTS )
+ {
+ bool indexChanged = loadoutIndex != uiGlobal.pilotSpawnLoadoutIndex
+
+ if ( indexChanged )
+ {
+ EmitUISound( "Menu_LoadOut_Pilot_Select" )
+
+ if ( !IsLobby() )
+ uiGlobal.updatePilotSpawnLoadout = true
+ }
+
+ uiGlobal.pilotSpawnLoadoutIndex = loadoutIndex
+ ClientCommand( "RequestPilotLoadout " + loadoutIndex )
+ }
+
+ if ( PRE_RELEASE_DEMO && loadoutIndex < 3 )
+ {
+ UpdatePilotLoadoutButtons( loadoutIndex, file.activateButtons )
+ return
+ }
+
+ RunMenuClientFunction( "SetEditingPilotLoadoutIndex", loadoutIndex )
+ AdvanceMenu( GetMenu( "EditPilotLoadoutMenu" ) )
+}
+
+void function OnLoadoutButton_LostFocus( var button )
+{
+ entity player = GetUIPlayer()
+ if ( !IsValid( player ) )
+ return
+
+ int loadoutIndex = expect int ( button.s.rowIndex )
+ string pilotLoadoutRef = "pilot_loadout_" + ( loadoutIndex + 1 )
+ ClearNewStatus( button, pilotLoadoutRef )
+
+ if ( IsItemLocked( player, pilotLoadoutRef ) )
+ return
+
+ PilotLoadoutDef loadout = GetCachedPilotLoadout( loadoutIndex )
+ if ( (RefHasAnyNewSubitem( player, loadout.primary ) || RefHasAnyNewSubitem( player, loadout.secondary ) || RefHasAnyNewSubitem( player, loadout.weapon3 )) )
+ Hud_SetNew( button, true )
+}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_lobby.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_lobby.nut
index 2bef0e20..23dae99d 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_lobby.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_lobby.nut
@@ -178,6 +178,8 @@ void function InitLobbyMenu()
AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
AddMenuFooterOption( menu, BUTTON_BACK, "#BACK_BUTTON_POSTGAME_REPORT", "#POSTGAME_REPORT", OpenPostGameMenu, IsPostGameMenuValid )
AddMenuFooterOption( menu, BUTTON_TRIGGER_RIGHT, "#R_TRIGGER_CHAT", "", null, IsVoiceChatPushToTalk )
+ // Client side progression toggle
+ AddMenuFooterOption( menu, BUTTON_Y, "#Y_BUTTON_TOGGLE_PROGRESSION", "#TOGGLE_PROGRESSION", ShowToggleProgressionDialog )
InitChatroom( menu )
@@ -226,6 +228,57 @@ void function InitLobbyMenu()
RegisterSignal( "LeaveParty" )
}
+void function ShowToggleProgressionDialog( var button )
+{
+ bool enabled = Progression_GetPreference()
+
+ DialogData dialogData
+ dialogData.menu = GetMenu( "AnnouncementDialog" )
+ dialogData.header = enabled ? "#PROGRESSION_TOGGLE_ENABLED_HEADER" : "#PROGRESSION_TOGGLE_DISABLED_HEADER"
+ dialogData.message = enabled ? "#PROGRESSION_TOGGLE_ENABLED_BODY" : "#PROGRESSION_TOGGLE_DISABLED_BODY"
+ dialogData.image = $"ui/menu/common/dialog_announcement_1"
+
+ AddDialogButton( dialogData, "#NO" )
+ AddDialogButton( dialogData, "#YES", enabled ? DisableProgression : EnableProgression )
+
+ OpenDialog( dialogData )
+}
+
+void function EnableProgression()
+{
+ Progression_SetPreference( true )
+
+ // update the cache just in case something changed
+ UpdateCachedLoadouts_Delayed()
+
+ DialogData dialogData
+ dialogData.menu = GetMenu( "AnnouncementDialog" )
+ dialogData.header = "#PROGRESSION_ENABLED_HEADER"
+ dialogData.message = "#PROGRESSION_ENABLED_BODY"
+ dialogData.image = $"ui/menu/common/dialog_announcement_1"
+
+ AddDialogButton( dialogData, "#OK" )
+
+ EmitUISound( "UI_Menu_Item_Purchased_Stinger" )
+
+ OpenDialog( dialogData )
+}
+
+void function DisableProgression()
+{
+ Progression_SetPreference( false )
+
+ DialogData dialogData
+ dialogData.menu = GetMenu( "AnnouncementDialog" )
+ dialogData.header = "#PROGRESSION_DISABLED_HEADER"
+ dialogData.message = "#PROGRESSION_DISABLED_BODY"
+ dialogData.image = $"ui/menu/common/dialog_announcement_1"
+
+ AddDialogButton( dialogData, "#OK" )
+
+ OpenDialog( dialogData )
+}
+
void function SetupComboButtonTest( var menu )
{
ComboStruct comboStruct = ComboButtons_Create( menu )
@@ -235,44 +288,21 @@ void function SetupComboButtonTest( var menu )
int buttonIndex = 0
file.playHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_PLAY" )
- bool isModded = IsNorthstarServer()
-
-
- // this will be the server browser
- if ( isModded )
- {
- file.findGameButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_SERVER_BROWSER" )
- file.lobbyButtons.append( file.findGameButton )
- Hud_SetLocked( file.findGameButton, true )
- Hud_AddEventHandler( file.findGameButton, UIE_CLICK, OpenServerBrowser )
- }
- else
- {
- file.findGameButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_FIND_GAME" )
- file.lobbyButtons.append( file.findGameButton )
- Hud_AddEventHandler( file.findGameButton, UIE_CLICK, BigPlayButton1_Activate )
- }
+ // server browser
+ file.findGameButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_SERVER_BROWSER" )
+ file.lobbyButtons.append( file.findGameButton )
+ Hud_SetLocked( file.findGameButton, true )
+ Hud_AddEventHandler( file.findGameButton, UIE_CLICK, OpenServerBrowser )
- // this is used for launching private matches now
- if ( isModded )
- {
- file.inviteRoomButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#PRIVATE_MATCH" )
- Hud_AddEventHandler( file.inviteRoomButton, UIE_CLICK, StartPrivateMatch )
- }
- else
- {
- file.inviteRoomButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INVITE_ROOM" )
- Hud_AddEventHandler( file.inviteRoomButton, UIE_CLICK, DoRoomInviteIfAllowed )
- }
+ // private match
+ file.inviteRoomButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#PRIVATE_MATCH" )
+ Hud_AddEventHandler( file.inviteRoomButton, UIE_CLICK, StartPrivateMatch )
file.inviteFriendsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INVITE_FRIENDS" )
Hud_AddEventHandler( file.inviteFriendsButton, UIE_CLICK, InviteFriendsIfAllowed )
-
- if ( isModded )
- {
- Hud_SetEnabled( file.inviteFriendsButton, false )
- Hud_SetVisible( file.inviteFriendsButton, false )
- }
+
+ Hud_SetEnabled( file.inviteFriendsButton, false )
+ Hud_SetVisible( file.inviteFriendsButton, false )
// file.toggleMenuModeButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_LOBBY_SWITCH_FD" )
// Hud_AddEventHandler( file.toggleMenuModeButton, UIE_CLICK, ToggleLobbyMode )
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_mod_settings.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_mod_settings.nut
index a45082c7..8c13955c 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_mod_settings.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_mod_settings.nut
@@ -949,6 +949,7 @@ void function SendTextPanelChanges( var textPanel )
ThrowInvalidValue( "This setting is an integer, and only accepts whole numbers." )
Hud_SetText( textPanel, GetConVarString( c.conVar ) )
}
+ break
case "bool":
if ( newSetting != "0" && newSetting != "1" )
{
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
index b757d089..3d1cc15f 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut
@@ -18,8 +18,8 @@ void function InitModesMenu()
AddMenuFooterOption( menu, BUTTON_A, "#A_BUTTON_SELECT" )
AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
- AddMenuFooterOption( menu, BUTTON_SHOULDER_LEFT, "#PRIVATE_MATCH_PAGE_PREV", "#PRIVATE_MATCH_PAGE_PREV", CycleModesBack, IsNorthstarServer )
- AddMenuFooterOption( menu, BUTTON_SHOULDER_RIGHT, "#PRIVATE_MATCH_PAGE_NEXT", "#PRIVATE_MATCH_PAGE_NEXT", CycleModesForward, IsNorthstarServer )
+ AddMenuFooterOption( menu, BUTTON_SHOULDER_LEFT, "#PRIVATE_MATCH_PAGE_PREV", "#PRIVATE_MATCH_PAGE_PREV", CycleModesBack )
+ AddMenuFooterOption( menu, BUTTON_SHOULDER_RIGHT, "#PRIVATE_MATCH_PAGE_NEXT", "#PRIVATE_MATCH_PAGE_NEXT", CycleModesForward )
}
void function OnOpenModesMenu()
@@ -58,13 +58,7 @@ void function UpdateVisibleModes()
else if( IsFDMode( modesArray[ i ] ) )
Hud_SetLocked( buttons[ i ], false )
else
- Hud_SetLocked( buttons[ i ], true )
-
- if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), modesArray[ modeIndex ] ) && !IsNorthstarServer() )
- {
- Hud_SetLocked( buttons[ i ], true )
- SetButtonRuiText( buttons[ i ], Localize( "#PRIVATE_MATCH_UNAVAILABLE", Localize( GetGameModeDisplayName( modesArray[ modeIndex ] ) ) ) )
- }
+ Hud_SetLocked( buttons[ i ], true )
}
}
@@ -92,9 +86,7 @@ void function ModeButton_GetFocus( var button )
string mapName = PrivateMatch_GetSelectedMap()
bool mapSupportsMode = PrivateMatch_IsValidMapModeCombo( mapName, modeName )
- if ( !mapSupportsMode && !IsNorthstarServer() )
- Hud_SetText( nextModeDesc, Localize( "#PRIVATE_MATCH_MODE_NO_MAP_SUPPORT", Localize( GetGameModeDisplayName( modeName ) ), Localize( GetMapDisplayName( mapName ) ) ) )
- else if ( IsFDMode( modeName ) ) // HACK!
+ if ( IsFDMode( modeName ) ) // HACK!
Hud_SetText( nextModeDesc, Localize( "#FD_PLAYERS_DESC", Localize( GetGameModeDisplayHint( modeName ) ) ) )
else
Hud_SetText( nextModeDesc, GetGameModeDisplayHint( modeName ) )
@@ -116,7 +108,7 @@ void function ModeButton_Click( var button )
// on modded servers set us to the first map for that mode automatically
// need this for coliseum mainly which is literally impossible to select without this
- if ( IsNorthstarServer() && !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), modesArray[ modeID ] ) )
+ if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), modesArray[ modeID ] ) )
ClientCommand( "SetCustomMap " + GetPrivateMatchMapsForMode( modeName )[ 0 ] )
// set it
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 7ea8134a..efc8d66c 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut
@@ -1059,15 +1059,39 @@ void function ThreadedAuthAndConnectToServer( string password = "" )
if ( NSWasAuthSuccessful() )
{
- bool modsChanged
+ bool modsChanged = false
- // unload mods we don't need, load necessary ones and reload mods before connecting
+ // 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 file.lastSelectedServer.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 file.lastSelectedServer.requiredMods )
{
- if ( NSIsModRequiredOnClient( mod.name ) )
+ if ( NSIsModRequiredOnClient( mod.name ) && !NSIsModEnabled( mod.name ))
{
- modsChanged = modsChanged || NSIsModEnabled( mod.name ) != file.lastSelectedServer.requiredMods.contains( mod )
- NSSetModEnabled( mod.name, file.lastSelectedServer.requiredMods.contains( mod ) )
+ modsChanged = true
+ NSSetModEnabled( mod.name, true )
}
}
@@ -1250,10 +1274,16 @@ void function RemoveConnectToServerCallback( void functionref( ServerInfo ) call
file.connectCallbacks.fastremovebyvalue( callback )
}
-void function TriggerConnectToServerCallbacks()
+void function TriggerConnectToServerCallbacks( ServerInfo ornull targetServer = null )
{
+ ServerInfo server;
+ if (targetServer == null)
+ {
+ targetServer = file.lastSelectedServer
+ }
+
foreach( callback in file.connectCallbacks )
{
- callback( file.lastSelectedServer )
+ callback( expect ServerInfo( targetServer ) )
}
}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_pilot_loadouts_shared.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_pilot_loadouts_shared.nut
new file mode 100644
index 00000000..f0139e04
--- /dev/null
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_pilot_loadouts_shared.nut
@@ -0,0 +1,300 @@
+
+global function UpdatePilotLoadoutPanel
+global function UpdatePilotLoadoutPanelBinds
+global function UpdatePilotLoadoutButtons
+global function UpdatePilotItemButton
+
+void function UpdatePilotLoadoutButtons( int selectedIndex, var[NUM_PERSISTENT_PILOT_LOADOUTS] buttons, bool focusSelected = true )
+{
+ entity player = GetUIPlayer()
+ if ( player == null )
+ return
+
+ int numLoadouts = GetAllCachedPilotLoadouts().len()
+
+ // HACK: num_pilot_loadouts is just used to disable certain loadouts for FNF
+ int numLoadoutsForPlaylist = GetCurrentPlaylistVarInt( "num_pilot_loadouts", 0 )
+ if ( numLoadoutsForPlaylist > 0 )
+ numLoadouts = numLoadoutsForPlaylist
+
+ foreach ( index, button in buttons )
+ {
+ PilotLoadoutDef loadout = GetCachedPilotLoadout( index )
+ RHud_SetText( button, GetPilotLoadoutName( loadout ) )
+ Hud_SetPanelAlpha( button, 0 )
+
+ bool isSelected = ( index == selectedIndex ) ? true : false
+ Hud_SetSelected( button, isSelected )
+
+ string pilotLoadoutRef = "pilot_loadout_" + ( index + 1 )
+ Hud_SetLocked( button, IsItemLocked( player, pilotLoadoutRef ) )
+
+ bool shouldShowNew = ButtonShouldShowNew( eItemTypes.FEATURE, pilotLoadoutRef )
+ if ( !shouldShowNew && (RefHasAnyNewSubitem( player, loadout.primary ) || RefHasAnyNewSubitem( player, loadout.secondary ) || RefHasAnyNewSubitem( player, loadout.weapon3 )) )
+ shouldShowNew = true
+
+ if ( IsItemLocked( player, pilotLoadoutRef ) )
+ shouldShowNew = false
+
+ Hud_SetNew( button, shouldShowNew )
+
+ RefreshButtonCost( button, pilotLoadoutRef )
+ }
+
+ if ( focusSelected )
+ Hud_SetFocused( buttons[ selectedIndex ] )
+}
+
+void function UpdatePilotLoadoutPanel( var loadoutPanel, PilotLoadoutDef loadout )
+{
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "TacticalName" ), Localize( GetItemName( loadout.special ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "PrimaryName" ), Localize( GetItemName( loadout.primary ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "SecondaryName" ), Localize( GetItemName( loadout.secondary ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "Weapon3Name" ), Localize( GetItemName( loadout.weapon3 ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "OrdnanceName" ), Localize( GetItemName( loadout.ordnance ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "Kit1Name" ), Localize( GetItemName( loadout.passive1 ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "Kit2Name" ), Localize( GetItemName( loadout.passive2 ) ) )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "ExecutionName" ), Localize( GetItemName( loadout.execution ) ) )
+
+ UpdatePilotLoadoutPanelBinds( loadoutPanel )
+
+ var menu = Hud_GetParent( loadoutPanel )
+ array<var> buttons = GetElementsByClassname( menu, "PilotLoadoutPanelButtonClass" )
+
+ /*if ( button )
+ {
+ // TEMP disabled since Hud_GetChild( menu, "ButtonTooltip" ) will fail
+ //if ( HandleLockedMenuItem( menu, button ) )
+ // return
+ }*/
+ bool isEdit
+ if ( Hud_GetHudName( loadoutPanel ) == "PilotLoadoutButtons" ) // Edit menu
+ isEdit = true
+ else // Select menu
+ isEdit = false
+
+ foreach ( button in buttons )
+ UpdatePilotItemButton( button, loadout, isEdit )
+
+ var renameEditBox = Hud_GetChild( loadoutPanel, "RenameEditBox" )
+
+ asset pilotAppearanceImage = loadout.camoIndex > 0 ? CamoSkin_GetImage( CamoSkins_GetByIndex( loadout.camoIndex ) ) : $"rui/menu/common/appearance_button_swatch"
+
+ asset primaryAppearanceImage
+ if ( loadout.primarySkinIndex == 0 ) // default skin
+ primaryAppearanceImage = $"rui/menu/common/appearance_button_swatch"
+ else if ( loadout.primarySkinIndex == 1 ) // camo
+ primaryAppearanceImage = CamoSkin_GetImage( CamoSkins_GetByIndex( loadout.primaryCamoIndex ) )
+ else // warpaint skin
+ primaryAppearanceImage = GetItemImageFromWeaponRefAndPersistenceValue( loadout.primary, loadout.primarySkinIndex, "primarySkinIndex" )
+
+ asset secondaryAppearanceImage
+ if ( loadout.secondarySkinIndex == 0 ) // default skin
+ secondaryAppearanceImage = $"rui/menu/common/appearance_button_swatch"
+ else if ( loadout.secondarySkinIndex == 1 ) // camo
+ secondaryAppearanceImage = CamoSkin_GetImage( CamoSkins_GetByIndex( loadout.secondaryCamoIndex ) )
+ else // warpaint skin
+ secondaryAppearanceImage = GetItemImageFromWeaponRefAndPersistenceValue( loadout.secondary, loadout.secondarySkinIndex, "secondarySkinIndex" )
+
+ asset weapon3AppearanceImage
+ if ( loadout.weapon3SkinIndex == 0 ) // default skin
+ weapon3AppearanceImage = $"rui/menu/common/appearance_button_swatch"
+ else if ( loadout.weapon3SkinIndex == 1 ) // camo
+ weapon3AppearanceImage = CamoSkin_GetImage( CamoSkins_GetByIndex( loadout.weapon3CamoIndex ) )
+ else // warpaint skin
+ weapon3AppearanceImage = GetItemImageFromWeaponRefAndPersistenceValue( loadout.weapon3, loadout.weapon3SkinIndex, "weapon3SkinIndex" )
+
+ RuiSetImage( Hud_GetRui( Hud_GetChild( loadoutPanel, "ButtonPilotCamo" ) ), "camoImage", pilotAppearanceImage )
+ RuiSetImage( Hud_GetRui( Hud_GetChild( loadoutPanel, "ButtonPrimarySkin" ) ), "camoImage", primaryAppearanceImage )
+ RuiSetImage( Hud_GetRui( Hud_GetChild( loadoutPanel, "ButtonSecondarySkin" ) ), "camoImage", secondaryAppearanceImage )
+ RuiSetImage( Hud_GetRui( Hud_GetChild( loadoutPanel, "ButtonWeapon3Skin" ) ), "camoImage", weapon3AppearanceImage )
+
+ array<var> nonItemElements
+ nonItemElements.append( Hud_GetChild( loadoutPanel, "ButtonPilotCamo" ) )
+ nonItemElements.append( Hud_GetChild( loadoutPanel, "ButtonGender" ) )
+ nonItemElements.append( Hud_GetChild( loadoutPanel, "ButtonPrimarySkin" ) )
+ nonItemElements.append( Hud_GetChild( loadoutPanel, "ButtonSecondarySkin" ) )
+ nonItemElements.append( Hud_GetChild( loadoutPanel, "ButtonWeapon3Skin" ) )
+ nonItemElements.append( renameEditBox )
+
+ foreach ( elem in nonItemElements )
+ {
+ if ( isEdit )
+ Hud_Show( elem )
+ else
+ Hud_Hide( elem )
+ }
+ Hud_SetEnabled( renameEditBox, isEdit )
+}
+
+void function UpdatePilotItemButton( var button, PilotLoadoutDef loadout, bool isEdit )
+{
+ string propertyName = Hud_GetScriptID( button )
+ string itemRef = GetPilotLoadoutValue( loadout, propertyName )
+ int itemType = GetItemTypeFromPilotLoadoutProperty( propertyName )
+ asset image
+
+ ItemDisplayData parentItem
+
+ if ( itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT || itemType == eItemTypes.PILOT_PRIMARY_MOD || itemType == eItemTypes.PILOT_SECONDARY_MOD || itemType == eItemTypes.PILOT_WEAPON_MOD3 )
+ {
+ string parentProperty = GetParentLoadoutProperty( "pilot", propertyName )
+ Assert( parentProperty == "primary" || parentProperty == "secondary" || parentProperty == "weapon3" )
+
+ if ( parentProperty == "primary" )
+ parentItem = GetItemDisplayData( loadout.primary )
+ else if ( parentProperty == "secondary" )
+ parentItem = GetItemDisplayData( loadout.secondary )
+ else
+ parentItem = GetItemDisplayData( loadout.weapon3 )
+
+ bool isHiddenAttachment = false
+
+ if ( itemType == eItemTypes.PILOT_PRIMARY_ATTACHMENT )
+ {
+ // Disable attachment option for "special" primary weapons
+ if ( "menuCategory" in parentItem.i && ( expect int( parentItem.i.menuCategory ) == ePrimaryWeaponCategory.SPECIAL || expect int( parentItem.i.menuCategory ) == ePrimaryWeaponCategory.HANDGUN ) )
+ {
+ isHiddenAttachment = true
+
+ Hud_SetWidth( button, 0 )
+ Hud_SetPos( button, 0, 0 ) // Clear sibling offset
+ }
+ else
+ {
+ int defaultButtonWidth = int( ContentScaledX( 72 ) )
+ int defaultOffsetX = int( ContentScaledX( 6 ) )
+
+ Hud_SetWidth( button, defaultButtonWidth )
+ Hud_SetPos( button, defaultOffsetX, 0 )
+ }
+ }
+
+ if ( !isHiddenAttachment )
+ image = GetImage( itemType, parentItem.ref, itemRef )
+ }
+ else
+ {
+ image = GetImage( itemType, itemRef )
+ }
+
+ if ( itemType == eItemTypes.PILOT_PRIMARY || itemType == eItemTypes.PILOT_SECONDARY )
+ {
+ //if ( isEdit )
+ //{
+ // RuiSetString( Hud_GetRui( button ), "subText", "" )
+ // RuiSetFloat( Hud_GetRui( button ), "numSegments", 0 )
+ // RuiSetFloat( Hud_GetRui( button ), "filledSegments", 0 )
+ //}
+ //else
+ {
+ int currentXP = WeaponGetXP( GetLocalClientPlayer(), itemRef )
+ int numPips = WeaponGetNumPipsForXP( itemRef, currentXP )
+ int filledPips = WeaponGetFilledPipsForXP( itemRef, currentXP )
+ RuiSetString( Hud_GetRui( button ), "subText", WeaponGetDisplayGenAndLevelForXP( itemRef, currentXP ) )
+ RuiSetFloat( Hud_GetRui( button ), "numSegments", float( numPips ) )
+ RuiSetFloat( Hud_GetRui( button ), "filledSegments", float( filledPips ) )
+ }
+ }
+
+ var rui = Hud_GetRui( button )
+
+ if ( image == $"" )
+ {
+ RuiSetBool( rui, "isVisible", false )
+ Hud_SetEnabled( button, false )
+ }
+ else
+ {
+ RuiSetBool( rui, "isVisible", true )
+ RuiSetImage( rui, "buttonImage", image )
+
+ Hud_SetEnabled( button, true )
+ }
+
+ bool isLocked = false
+ bool shouldShowNew = false
+
+ // For unlock and subitem checks below, treat weapon3 as secondary
+ if ( propertyName == "weapon3Mod1" )
+ propertyName = "secondaryMod1"
+ else if ( propertyName == "weapon3Mod2" )
+ propertyName = "secondaryMod2"
+ else if ( propertyName == "weapon3Mod3" )
+ propertyName = "secondaryMod3"
+
+ string propertyRef = propertyName.tolower()
+
+ if ( !IsSubItemType( itemType ) )
+ {
+ if ( IsUnlockValid( propertyRef ) && IsItemLocked( GetUIPlayer(), propertyRef ) )
+ {
+ RefreshButtonCost( button, propertyRef )
+ isLocked = true
+ }
+ shouldShowNew = ButtonShouldShowNew( itemType, itemRef )
+ }
+ else
+ {
+ if ( IsUnlockValid( propertyRef, parentItem.ref ) && IsSubItemLocked( GetUIPlayer(), propertyRef, parentItem.ref ) )
+ {
+ RefreshButtonCost( button, propertyRef )
+ isLocked = true
+ }
+ shouldShowNew = ButtonShouldShowNew( itemType, itemRef, parentItem.ref )
+ }
+
+ Hud_SetLocked( button, isLocked )
+
+ if ( !shouldShowNew && IsUnlockValid( propertyRef, parentItem.ref ) )
+ shouldShowNew = ButtonShouldShowNew( GetSubitemType( parentItem.ref, propertyRef ), propertyRef, parentItem.ref )
+ Hud_SetNew( button, shouldShowNew )
+
+#if HAS_THREAT_SCOPE_SLOT_LOCK
+ if ( propertyName == "primaryMod2" )
+ {
+ string attatchmentRef = GetPilotLoadoutValue( loadout, "primaryAttachment" )
+ if ( attatchmentRef == "threat_scope" )
+ {
+ Hud_SetLocked( button, true )
+ RefreshButtonCost( button, propertyRef, "", 0, 0 )
+ Hud_SetNew( button, false )
+ }
+ }
+#endif
+}
+
+void function UpdatePilotLoadoutPanelBinds( var loadoutPanel )
+{
+ if ( IsControllerModeActive() )
+ {
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "PrimaryBind" ), "%weaponCycle%" )
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "SecondaryBind" ), "%weaponCycle%" )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "Weapon3Bind" ), Localize( "#WEAPON3_HOLD_HINT" ) )
+ }
+ else
+ {
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "PrimaryBind" ), "%weaponSelectPrimary0%" )
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "SecondaryBind" ), "%weaponSelectPrimary1%" )
+ SetLabelRuiText( Hud_GetChild( loadoutPanel, "Weapon3Bind" ), Localize( "#WEAPON3_PRESS_HINT" ) )
+ }
+
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "TacticalBind" ), Localize( "%offhand1%" ) )
+ //SetLabelRuiText( Hud_GetChild( loadoutPanel, "OrdnanceBind" ), Localize( "%offhand0%" ) )
+}
+
+asset function GetItemImageFromWeaponRefAndPersistenceValue(string weaponRef, int persistenceValue, string loadoutProperty)
+{
+ string skinRef = GetSkinRefFromWeaponRefAndPersistenceValue( weaponRef, persistenceValue )
+ if (!IsRefValid(skinRef))
+ {
+ if (uiGlobal.editingLoadoutIndex != -1)
+ {
+ printt( "Resetting invalid " + loadoutProperty + " for weapon " + weaponRef )
+ SetCachedLoadoutValue(GetUIPlayer(), "pilot", uiGlobal.editingLoadoutIndex, loadoutProperty, "0")
+ }
+ return $"rui/menu/common/appearance_button_swatch"
+ }
+
+ return GetItemImage( skinRef )
+}
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_private_match.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_private_match.nut
index d7c7442f..e3c1f268 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/menu_private_match.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_private_match.nut
@@ -247,10 +247,7 @@ void function OnSelectMatchSettings_Activate( var button )
if ( Hud_IsLocked( button ) )
return
- if ( !IsNorthstarServer() )
- AdvanceMenu( GetMenu( "MatchSettingsMenu" ) )
- else
- AdvanceMenu( GetMenu( "CustomMatchSettingsCategoryMenu" ) )
+ AdvanceMenu( GetMenu( "CustomMatchSettingsCategoryMenu" ) )
}
void function SetupComboButtons( var menu, var navUpButton, var navDownButton )
@@ -274,13 +271,6 @@ void function SetupComboButtons( var menu, var navUpButton, var navDownButton )
file.matchSettingsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_MATCH_SETTINGS" )
Hud_AddEventHandler( file.matchSettingsButton, UIE_CLICK, OnSelectMatchSettings_Activate )
- if ( !IsNorthstarServer() )
- {
- var friendsButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#MENU_TITLE_INVITE_FRIENDS" )
- file.inviteFriendsButton = friendsButton
- Hud_AddEventHandler( friendsButton, UIE_CLICK, InviteFriendsIfAllowed )
- }
-
headerIndex++
buttonIndex = 0
file.customizeHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_LOADOUTS" )
@@ -575,17 +565,12 @@ function UpdatePrivateMatchButtons()
Hud_SetLocked( file.selectMapButton, true )
Hud_SetLocked( file.selectModeButton, true )
Hud_SetLocked( file.matchSettingsButton, true )
-
- if ( !IsNorthstarServer() )
- Hud_SetLocked( file.inviteFriendsButton, true )
}
else
{
RHud_SetText( file.startMatchButton, "#START_MATCH" )
Hud_SetLocked( file.selectMapButton, false )
Hud_SetLocked( file.selectModeButton, false )
- if ( !IsNorthstarServer() )
- Hud_SetLocked( file.inviteFriendsButton, false )
string modeName = PrivateMatch_GetSelectedMode()
bool settingsLocked = IsFDMode( modeName )
@@ -648,7 +633,7 @@ function UpdateLobby()
{
float varOrigVal = float( GetCurrentPlaylistGamemodeByIndexVar( gamemodeIdx, varName, false ) )
float varOverrideVal = float( GetCurrentPlaylistGamemodeByIndexVar( gamemodeIdx, varName, true ) )
- if ( varOrigVal == varOverrideVal && !IsNorthstarServer() ) // stuff seems to break outside of northstar servers since we dont always use private_match playlist
+ if ( varOrigVal == varOverrideVal ) // stuff seems to break outside of northstar servers since we dont always use private_match playlist
continue
string label = Localize( MatchSettings_PlaylistVarLabels[varName] ) + ": "
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut b/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
index 4b3d0f55..f91231b6 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/openinvites.nut
@@ -202,7 +202,10 @@ void function UpdateOpenInvite_Thread()
void function UICodeCallback_OpenInviteUpdated()
{
- if ( file.openInviteVisible || IsNorthstarServer() )
+ // don't support on northstar
+ return
+
+ if ( file.openInviteVisible )
return
int currentPartySize = GetPartySize()
diff --git a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut
index eef19b5e..c97c8cdc 100644
--- a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut
+++ b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut
@@ -531,7 +531,6 @@ void function OnPlayFDButton_Activate( var button ) // repurposed for launching
{
if ( !Hud_IsLocked( button ) )
{
- SetConVarBool( "ns_is_modded_server", true )
SetConVarString( "communities_hostname", "" ) // disable communities due to crash exploits that are still possible through it
NSTryAuthWithLocalServer()
thread TryAuthWithLocalServer()
@@ -601,7 +600,6 @@ void function OnPlayMPButton_Activate( var button )
{
Lobby_SetAutoFDOpen( false )
// Lobby_SetFDMode( false )
- SetConVarBool( "ns_is_modded_server", false )
thread file.mpButtonActivateFunc()
}
}