diff options
author | F1F7Y <64418963+F1F7Y@users.noreply.github.com> | 2021-12-30 23:52:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-30 23:52:05 +0100 |
commit | 66ddb8c0afd4b91f0dbdc35dd4a4cac5d28dcca5 (patch) | |
tree | 2b8fe2d0fc65af16ba57cdc4163ef16030fdf841 | |
parent | 8ea10a9e5c32daac938b0672efa13e7401968f0b (diff) | |
parent | aed2841ebbecb6376f00bf190503ce5c694f9fa4 (diff) | |
download | NorthstarMods-66ddb8c0afd4b91f0dbdc35dd4a4cac5d28dcca5.tar.gz NorthstarMods-66ddb8c0afd4b91f0dbdc35dd4a4cac5d28dcca5.zip |
Merge branch 'R2Northstar:main' into main
17 files changed, 1127 insertions, 601 deletions
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_german.txt b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt new file mode 100644 index 00000000..fdea511e --- /dev/null +++ b/Northstar.Client/mod/resource/northstar_client_localisation_german.txt @@ -0,0 +1,216 @@ +"lang"
+{
+ "Language" "german"
+ "Tokens"
+ {
+ "MENU_LAUNCH_NORTHSTAR" "Starte Northstar"
+ "MENU_TITLE_MODS" "Mods"
+ "RELOAD_MODS" "Mods neu laden"
+
+ "DIALOG_TITLE_INSTALLED_NORTHSTAR" "Danke, dass du Northstar installiert hast!"
+ "AUTHENTICATION_AGREEMENT_DIALOG_TEXT" "Damit Northstar funktionieren kann, muss es mithilfe des Northstar Masterservers authentifizieren. Dies setzt ein Weitergeben deines Origin Tokens an den Masterserver voraus, er wird nicht gespeichert oder für andere Zwecke verwendet.
+Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü ändern."
+ "BACK_AUTHENTICATION_AGREEMENT" "Authentifizierungs-Einwilligung"
+ "AUTHENTICATION_AGREEMENT" "Authentifizierungs-Einwilligung"
+ "AUTHENTICATION_AGREEMENT_RESTART" "Ein Neustart ist notwendig, um diese Änderung zu übernehmen"
+
+ "MENU_TITLE_SERVER_BROWSER" "Server Browser"
+ "NS_SERVERBROWSER_NOSERVERS" "Keine Server gefunden"
+ "NS_SERVERBROWSER_WAITINGFORSERVERS" "Warte auf Server..."
+ "NS_SERVERBROWSER_CONNECTIONFAILED" "Verbindung fehlgeschlagen!"
+ "REFRESH_SERVERS" "Neu laden"
+
+ "MENU_TITLE_CONNECT_PASSWORD" "Verbinden mit Passwort"
+ "MENU_CONNECT_MENU_CONNECT" "Verbinden"
+
+ "PRIVATE_MATCH_PAGE_PREV" "Vorherige Seite"
+ "PRIVATE_MATCH_PAGE_NEXT" "Nächste Seite"
+
+ "MENU_MATCH_SETTINGS" "Match Einstellungen"
+ "MENU_MATCH_SETTINGS_SUBMENU" "%s1 Einstellungen"
+
+ "PRIVATE_MATCH_SINGLEPLAYER_LEVEL" "%s1 (Einzelspieler)"
+
+ // fra hint for private match menu, because fra only has PL_fra_desc in vanilla
+ "PL_fra_hint" "Du bist alleine. Töte Piloten, um zu siegen. Sammle 3 Batterien für einen Titanfall."
+
+ // mode settings
+ "MODE_SETTING_CATEGORY_PILOT" "Pilot"
+ "MODE_SETTING_CATEGORY_TITAN" "Titan"
+ "MODE_SETTING_CATEGORY_RIFF" "Extras"
+ "MODE_SETTING_CATEGORY_MATCH" "Match"
+
+ "classic_mp" "Klassischer Multiplayer"
+ "run_epilogue" "Epilog"
+ "scorelimit" "Höchstpunktzahl"
+ "roundscorelimit" "Höchstpunktzahl (rundenbasiert)"
+ "timelimit" "Zeitlimit"
+ "roundtimelimit" "Zeitlimit (rundenbasiert)"
+
+ "pilot_health_multiplier" "HP Multiplikator"
+ "respawn_delay" "Respawn-Verzögerung"
+ "boosts_enabled" "Boosts"
+ "earn_meter_pilot_overdrive" "Boost-Meter overdrive"
+ "earn_meter_pilot_multiplier" "Piloten Boost-Meter Multiplikator"
+
+ "earn_meter_titan_multiplier" "Titan Boost-Meter Multiplikator"
+ "aegis_upgrades" "Aegis Upgrades"
+ "infinite_doomed_state" "Unendlicher Todgeweiht-Status"
+ "titan_shield_regen" "Regenerierende Schilde"
+
+ "riff_floorislava" "Tödlicher Boden"
+ "featured_mode_all_holopilot" "The Great Bamboozle"
+ "featured_mode_all_grapple" "Attack on Titanfall"
+ "featured_mode_all_phase" "The Otherside"
+ "featured_mode_all_ticks" "Scharf"
+ "featured_mode_tactikill" "Tactikill"
+ "featured_mode_amped_tacticals" "Verstärkte Tacticals"
+ "featured_mode_rocket_arena" "Rocket Arena"
+ "featured_mode_shotguns_snipers" "Bewaffnet und gefährlich"
+ "iron_rules" "Iron Titan Regeln"
+
+ "cp_amped_capture_points" "Verstärkte Hardpoints"
+ "coliseum_loadouts_enabled" "Coliseum Loadouts"
+
+ // 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" "Wie gmod, nur schlechter"
+ "PL_sbox_abbr" "SBOX"
+ "GAMEMODE_SBOX" "Sandbox"
+
+ "PL_gg" "Gun Game"
+ "PL_gg_lobby" "Gun Game Lobby"
+ "PL_gg_desc" "Erhalte einen Kill mit jeder Waffe um zu siegen."
+ "PL_gg_hint" "Erhalte einen Kill mit jeder Waffe um zu siegen."
+ "PL_gg_abbr" "GG"
+ "GAMEMODE_GG" "Gun Game"
+
+ "PL_tt" "Titan Tag"
+ "PL_tt_lobby" "Titan Tag Lobby"
+ "PL_tt_desc" "Erringe Punkte in deinem Titan. Zerstöre einen Titan für deinen Eigenen."
+ "PL_tt_hint" "Erringe Punkte in deinem Titan. Zerstöre einen Titan für deinen Eigenen."
+ "PL_tt_abbr" "TT"
+ "GAMEMODE_TT" "Titan Tag"
+
+ "PL_inf" "Infektion"
+ "PL_inf_lobby" "Infektion-Lobby"
+ "PL_inf_desc" "Überlebe die Infektion. Überlebende werden nach dem Tod infiziert."
+ "PL_inf_hint" "Überlebe die Infektion. Überlebende werden nach dem Tod infiziert."
+ "PL_inf_abbr" "INF"
+ "GAMEMODE_INF" "Infektion"
+ "INFECTION_YOU_ARE_INFECTED" "Du wurdest infiziert!"
+ "INFECTION_KILL_SURVIVORS" "Töte die restlichen Überlebenden."
+ "INFECTION_FIRST_INFECTED" "%s1 ist der erste Infizierte."
+ "INFECTION_LAST_SURVIVOR" "%s1 ist der letzte Überlebende!"
+ "INFECTION_KILL_LAST_SURVIVOR" "Infiziere sie bevor die Zeit abläuft!"
+ "INFECTION_YOU_ARE_LAST_SURVIVOR" "Du bist der letzte Überlebende!"
+ "INFECTION_SURVIVE_LAST_SURVIVOR" "Überlebe."
+
+ "PL_hs" "Hide and Seek"
+ "PL_hs_lobby" "Hide and Seek Lobby"
+ "PL_hs_desc" "Sucher versuchen, Versteckende zu finden."
+ "PL_hs_hint" "Sucher versuchen, Versteckende zu finden."
+ "PL_hs_abbr" "HS"
+ "GAMEMODE_hs" "Hide and Seek"
+ "HIDEANDSEEK_YOU_ARE_SEEKER" "DU BIST EIN SUCHER"
+ "HIDEANDSEEK_SEEKER_DESC" "Töte Versteckende mit Nahkampf.\nDu spawnst in %s1 Sekunden"
+ "HIDEANDSEEK_YOU_ARE_HIDER" "DU BIST VERSTECKENDER"
+ "HIDEANDSEEK_HIDER_DESC" "Verstecke dich vor Suchern."
+ "HIDEANDSEEK_SEEKERS_INCOMING" "SUCHER KOMMEN"
+ "HIDEANDSEEK_DONT_GET_FOUND" "Lass dich nicht finden!"
+ "HIDEANDSEEK_GET_LAST_HIDER" "%s1 ist der letzte Versteckende"
+ "HIDEANDSEEK_YOU_ARE_LAST_HIDER" "DU BIST DER LETZTE VERSTECKENDE"
+ "HIDEANDSEEK_GOT_STIM" "Du hast Stim! Lass dich nicht finden!"
+ "hideandseek_balance_teams" "Autobalance Hiders/Seekers"
+ "hideandseek_hiding_time" "Zeit zum Verstecken"
+
+ // 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" "Grenzland-Krieg"
+ "PL_fw" "Grenzland-Krieg"
+ "PL_fw_lobby" "Grenzland-Krieg Lobby"
+ "PL_fw_desc" "Zerstöre den feindlichen Ernter und beschütze Euren"
+ "PL_fw_abbr" "GK"
+
+ "GAMEMODE_kr" "Verstärktes Killrace"
+ "PL_kr" "Verstärktes Killrace"
+ "PL_kr_lobby" "Verstärktes Killrace Lobby"
+ "PL_kr_desc" "Töte Piloten um die Länge deiner Killstreak zu erhöhen. Sammle die Fahne ein, um sie zu starten. Setze den Rekord, um zu gewinnen."
+ "PL_kr_hint" "Töte Piloten um die Länge deiner Killstreak zu erhöhen. Sammle die Fahne ein, um sie zu starten. Setze den Rekord, um zu gewinnen."
+ "PL_kr_abbr" "KR"
+ "SCOREBOARD_KR_RECORD" "Kill-Rekord"
+ "KR_NEW_RACER" "%s1 ist der Killracer"
+ "KR_YOU_ARE_NEW_RACER" "Du bist der Killracer"
+ "KR_YOU_SET_NEW_RECORD" "Setze einen neuen Kill-Rekord!"
+ "KR_FLAG_INCOMING" "Fahne erscheint"
+ "KR_COLLECT_FLAG" "Sammle sie ein um zum Killracer zu werden!"
+ "KR_ENEMY_KILLRACE_OVER" "%s1's Killstreak ist vorbei"
+ "KR_YOUR_KILLRACE_OVER" "Deine Killstreak ist vorbei"
+ "KR_YOUR_KILLRACE_SCORE" "Du hast %s1 Kills."
+
+ "GAMEMODE_fastball" "Fastball"
+ "PL_fastball" "Fastball"
+ "PL_fastball_lobby" "Fastball Lobby"
+ "PL_fastball_desc" "Permatod. Häcke Kontrollkonsolen um Punkte zu gewinnen und deine Kameraden zurückzuholen."
+ "PL_fastball_hint" "Permatod. Häcke Kontrollkonsolen um Punkte zu gewinnen und deine Kameraden zurückzuholen."
+ "PL_fastball_abbr" "FB"
+ "FASTBALL_PANEL_CAPTURED" "%s1 eroberte Konsole %s2"
+ "SCOREBOARD_FASTBALL_HACKS" "Konsolen erobert"
+
+ "GAMEMODE_ctf_comp" "Competitive CTF"
+
+ // mode settings
+ "MODE_SETTING_CATEGORY_PROMODE" "Pro-Modus"
+ "MODE_SETTING_CATEGORY_BLEEDOUT" "Pilot Bleedout"
+
+ "custom_air_accel_pilot" "Luftbeschleunigung"
+ "promode_enable" "Pro-mode Waffen"
+ "fp_embark_enabled" "Firstperson Einstiege/Exekutionen"
+ "classic_rodeo" "Klassisches Rodeo"
+ "oob_timer_enabled" "Out of Bounds Timer"
+ "riff_instagib" "Instagib Mode"
+
+ "riff_player_bleedout" "Piloten Bleedout"
+ "player_bleedout_forceHolster" "Waffen während Ausgeschaltet wegstecken"
+ "player_bleedout_forceDeathOnTeamBleedout" "Stirb bei Team Bleedout"
+ "player_bleedout_bleedoutTime" "Bleedout Zeit"
+ "player_bleedout_firstAidTime" "Erste Hilfe Zeit"
+ "player_bleedout_firstAidTimeSelf" "Self-res time"
+ "player_bleedout_firstAidHealPercent" "Erste Hilfe HP Prozent"
+ "player_bleedout_aiBleedingPlayerMissChance" "Ausgeschaltet AI Verfehl-Chance"
+
+ // coop stuff
+ "PL_sp_coop" "(UNFINISHED) Kampagne Koop"
+ "PL_sp_coop_lobby" "Kampagne Koop Lobby"
+ "PL_sp_coop_desc" "Spiele mit Freuden durch die Einzelspieler-Kampagne"
+ "PL_sp_coop_hint" "Spiele mit Freuden durch die Einzelspieler-Kampagne"
+ "PL_sp_coop_abbr" "SP"
+
+ "SP_TRAINING" "Der Piloten-Parkour"
+ "SP_TRAINING_CLASSIC_DESC" "Captain Lastimosas Trainingssimulation."
+
+ "SP_CRASHSITE" "BT-7274"
+ "SP_CRASHSITE_CLASSIC_DESC" "Jack Cooper trifft BT-7274."
+
+ "SP_SEWERS1" "Blut und Rost"
+ "SP_SEWERS1_CLASSIC_DESC" "Cooper und BT machen sich auf den Weg zum Treffpunkt mit Major Anderson."
+
+ "SP_BOOMTOWN_START" "In den Abgrund"
+ "SP_BOOMTOWN_START_CLASSIC_DESC" "Eine unterirdische Abkürzung zieht unerwartete Konsequenzen mit sich."
+
+ "SP_HUB_TIMESHIFT" "Wirkung und Ursache"
+ "SP_HUB_TIMESHIFT_CLASSIC_DESC" "An Major Andersons Koordinaten trifft ein seltsames Phänomen auf."
+
+ "SP_BEACON" "Der Sender"
+ "SP_BEACON_CLASSIC_DESC" "Cooper und BT versuchen, die Restflotte über die Pläne der IMC zu informieren."
+
+ "SP_TDAY" "Feuerprobe"
+ "SP_TDAY_CLASSIC_DESC" "Coopers Titan-Fähigkeiten werden im Kampf um die Lade auf eine harte Probe gestellt"
+
+ "SP_S2S" "Die Lade"
+ "SP_S2S_CLASSIC_DESC" "Cooper und BT gehen von Schiff zu Schiff, um die Lade zu finden."
+
+ "SP_SKYWAY_V1" "Die Faltwaffe"
+ "SP_SKYWAY_V1_CLASSIC_DESC" "BT und Cooper werden von Kuben Blist gefangen genommen."
+ }
+}
diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt new file mode 100644 index 00000000..332d25f8 --- /dev/null +++ b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt @@ -0,0 +1,216 @@ +"lang" +{ + "Language" "portuguese" + "Tokens" + { + "MENU_LAUNCH_NORTHSTAR" "Abrir Northstar" + "MENU_TITLE_MODS" "Mods" + "RELOAD_MODS" "Recarregar Mods" + + "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" + "AUTHENTICATION_AGREEMENT_RESTART" "Você precisa reiniciar o Titanfall 2 para esta mudança ter efeito." + + "MENU_TITLE_SERVER_BROWSER" "Lista de servidores" + "NS_SERVERBROWSER_NOSERVERS" "Nenhum servidor encontrado" + "NS_SERVERBROWSER_WAITINGFORSERVERS" "Aguardando servidores..." + "NS_SERVERBROWSER_CONNECTIONFAILED" "Falha de conexão!" + "REFRESH_SERVERS" "Atualizar" + + "MENU_TITLE_CONNECT_PASSWORD" "Conectar com senha" + "MENU_CONNECT_MENU_CONNECT" "Conectar" + + "PRIVATE_MATCH_PAGE_PREV" "Página anterior" + "PRIVATE_MATCH_PAGE_NEXT" "Próxima página" + + "MENU_MATCH_SETTINGS" "Configurações de partida" + "MENU_MATCH_SETTINGS_SUBMENU" "%s1 Configurações" + + "PRIVATE_MATCH_SINGLEPLAYER_LEVEL" "%s1 (Um jogador)" + + // fra hint for private match menu, because fra only has PL_fra_desc in vanilla + "PL_fra_hint" "Você está só. Mate inimigos para vencer. Colete 3 baterias para chamar um titã." + + // mode settings + "MODE_SETTING_CATEGORY_PILOT" "Piloto" + "MODE_SETTING_CATEGORY_TITAN" "Titã" + "MODE_SETTING_CATEGORY_RIFF" "Riffs" + "MODE_SETTING_CATEGORY_MATCH" "Partida" + + "classic_mp" "MP Clássico" + "run_epilogue" "Executar epílogo" + "scorelimit" "Limite de pontos" + "roundscorelimit" "Limite de pontos (por round)" + "timelimit" "Tempo limite" + "roundtimelimit" "Tempo limite (por round)" + + "pilot_health_multiplier" "Multiplicador de vida" + "respawn_delay" "Delay de reaparecimento" + "boosts_enabled" "Bônus" + "earn_meter_pilot_overdrive" "Medidor de bônus acelerado" + "earn_meter_pilot_multiplier" "Multiplicador de bônus do piloto" + + "earn_meter_titan_multiplier" "Multiplicador de bônus do titã" + "aegis_upgrades" "Upgrades Aegis" + "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" + "featured_mode_amped_tacticals" "Habilidades táticas melhoradas" + "featured_mode_rocket_arena" "Arena Foguete" + "featured_mode_shotguns_snipers" "Armado e perigoso" + "iron_rules" "Titã de ferro" + + "cp_amped_capture_points" "Pontos de captura melhorados" + "coliseum_loadouts_enabled" "Classes do Coliseu" + + // northstar.custom localisation is just deciding not to work, so putting it here for now + "PL_sbox" "Sandbox" + "PL_sbox_lobby" "Saguão de Sandbox" + "PL_sbox_desc" "gmod só que pior" + "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_abbr" "GG" + "GAMEMODE_GG" "Gun Game" + + "PL_tt" "Titan Tag" + "PL_tt_lobby" "Saguão de Titan Tag" + "PL_tt_desc" "Ganhe pontos com seu titã. Destrua um para chamar o seu." + "PL_tt_hint" "Ganhe pontos com seu titã. Destrua um para chamar o seu." + "PL_tt_abbr" "TT" + "GAMEMODE_TT" "Titan Tag" + + "PL_inf" "Infecção" + "PL_inf_lobby" "Saguão de Infecção" + "PL_inf_desc" "Sobreviva à infecção. Sobreviventes são infectados quando mortos." + "PL_inf_hint" "Sobreviva à infecção. Sobreviventes são infectados quando mortos." + "PL_inf_abbr" "INF" + "GAMEMODE_INF" "Infecção" + "INFECTION_YOU_ARE_INFECTED" "Você foi infectado!" + "INFECTION_KILL_SURVIVORS" "Infecte todos os sobreviventes restantes." + "INFECTION_FIRST_INFECTED" "%s1 é o paciente zero." + "INFECTION_LAST_SURVIVOR" "%s1 é o último sobrevivente!" + "INFECTION_KILL_LAST_SURVIVOR" "Infecte eles antes que o tempo acabe!" + "INFECTION_YOU_ARE_LAST_SURVIVOR" "Você é o último sobrevivente!" + "INFECTION_SURVIVE_LAST_SURVIVOR" "Sobreviva." + + "PL_hs" "Esconde-esconde" + "PL_hs_lobby" "Saguão de Esconde-esconde" + "PL_hs_desc" "Jogo clássico de esconde-esconde." + "PL_hs_hint" "Jogo clássico de esconde-esconde." + "PL_hs_abbr" "HS" + "GAMEMODE_hs" "Esconde-esconde" + "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." + "HIDEANDSEEK_SEEKERS_INCOMING" "LÁ VEM ELES" + "HIDEANDSEEK_DONT_GET_FOUND" "Não seja encontrado!" + "HIDEANDSEEK_GET_LAST_HIDER" "%s1 É O ULTIMO ESCONDIDO" + "HIDEANDSEEK_YOU_ARE_LAST_HIDER" "VOCÊ É O ÚLTIMO ESCONDIDO" + "HIDEANDSEEK_GOT_STIM" "Você está estimulado! Não seja pego!" + "hideandseek_balance_teams" "Rebalanceamento de times" + "hideandseek_hiding_time" "Tempo escondido" + + // 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 pela Fronteira" + "PL_fw" "Guerra pela Fronteira" + "PL_fw_lobby" "Saguão de Guerra pela Fronteira" + "PL_fw_desc" "Destrua a colheitadeira do inimigo e proteja a sua" + "PL_fw_abbr" "FW" + + "GAMEMODE_kr" "Corrida de Matança" + "PL_kr" "Corrida de Matança" + "PL_kr_lobby" "Saguão de Matança" + "PL_kr_desc" "Acabe com inimigos para aumentar sua matança. Capture a bandeira para começar. Vença matando mais." + "PL_kr_hint" "Acabe com inimigos para aumentar sua matança. Capture a bandeira para começar. Vença matando mais." + "PL_kr_abbr" "KR" + "SCOREBOARD_KR_RECORD" "Recorde de mortes" + "KR_NEW_RACER" "%s1 é o matador" + "KR_YOU_ARE_NEW_RACER" "Você é o matador" + "KR_YOU_SET_NEW_RECORD" "Bateu o recorde!" + "KR_FLAG_INCOMING" "Bandeira reaparecerá em breve" + "KR_COLLECT_FLAG" "Capture a bandeira para virar um Matador!" + "KR_ENEMY_KILLRACE_OVER" "A matança de %s1 acabou" + "KR_YOUR_KILLRACE_OVER" "Sua matança acabou" + "KR_YOUR_KILLRACE_SCORE" "Você conseguiu %s1 mortes." + + "GAMEMODE_fastball" "Fastball" + "PL_fastball" "Fastball" + "PL_fastball_lobby" "Fastball Lobby" + "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." + "PL_fastball_abbr" "FB" + "FASTBALL_PANEL_CAPTURED" "%s1 capturou painel %s2" + "SCOREBOARD_FASTBALL_HACKS" "Painéis capturados" + + "GAMEMODE_ctf_comp" "CTF Competitivo" + + // mode settings + "MODE_SETTING_CATEGORY_PROMODE" "Modo PRO" + "MODE_SETTING_CATEGORY_BLEEDOUT" "Sangramento de piloto" + + "custom_air_accel_pilot" "Aceleração aérea" + "promode_enable" "Armas de Modo PRO" + "fp_embark_enabled" "Execuções/embarque em 1a pessoa" + "classic_rodeo" "Rodeio clássico" + "oob_timer_enabled" "Temporizador fora do mapa" + "riff_instagib" "Modo Instagib" + + "riff_player_bleedout" "Sangramento de piloto" + "player_bleedout_forceHolster" "Guardar armas ao cair" + "player_bleedout_forceDeathOnTeamBleedout" "Morrer ao time cair" + "player_bleedout_bleedoutTime" "Tempo de sangramento" + "player_bleedout_firstAidTime" "Tempo de recuperação" + "player_bleedout_firstAidTimeSelf" "Tempo de auto-recuperação" + "player_bleedout_firstAidHealPercent" "Porcentagem de vida recuperada" + "player_bleedout_aiBleedingPlayerMissChance" "Chance de erro da IA ao cair" + + // 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_abbr" "SP" + + "SP_TRAINING" "O Desafio do Piloto" + "SP_TRAINING_CLASSIC_DESC" "Simulação de treinamento do Capitão Lastimosa." + + "SP_CRASHSITE" "BT-7274" + "SP_CRASHSITE_CLASSIC_DESC" "Jack Cooper encontra BT-7274." + + "SP_SEWERS1" "Sangue e Ferrugem" + "SP_SEWERS1_CLASSIC_DESC" "Cooper e BT saem para se encontrar com Major Anderson." + + "SP_BOOMTOWN_START" "Jornada ao abismo" + "SP_BOOMTOWN_START_CLASSIC_DESC" "Um atalho debaixo da terra revela consequências inesperadas." + + "SP_HUB_TIMESHIFT" "Causa e Efeito" + "SP_HUB_TIMESHIFT_CLASSIC_DESC" "Um fenônemo não identificado é descoberto nas coordenadas do Major Anderson." + + "SP_BEACON" "O Sinalizador" + "SP_BEACON_CLASSIC_DESC" "Cooper e BT tentam informar o resto da frota sobre os planos da IMC." + + "SP_TDAY" "Prova de Fogo" + "SP_TDAY_CLASSIC_DESC" "As habilidades do tiã de Cooper são postas à prova numa batalha para capturar a Arca" + + "SP_S2S" "A Arca" + "SP_S2S_CLASSIC_DESC" "Cooper e BT vão de nave em nave em busca da Arca." + + "SP_SKYWAY_V1" "A Arma Quântica" + "SP_SKYWAY_V1_CLASSIC_DESC" "BT e Cooper são capturados por Kuben Blisk." + } +} diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt Binary files differnew file mode 100644 index 00000000..76b61591 --- /dev/null +++ b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt b/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt Binary files differnew file mode 100644 index 00000000..86f57a41 --- /dev/null +++ b/Northstar.Client/mod/resource/northstar_client_localisation_spanish.txt 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 fb74a6f5..26a157bf 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut @@ -83,47 +83,6 @@ bool function floatCompareInRange(float arg1, float arg2, float tolerance) } - -// Hard coded for now -array<string> function GetNorthstarGamemodes() -{ - array<string> modes - - //modes.append( "#PL_aitdm" ) - modes.append( "#PL_pilot_hunter" ) - modes.append( "#PL_hardpoint" ) - //modes.append( "#PL_attrition" ) - modes.append( "#PL_capture_the_flag" ) - modes.append( "#PL_last_titan_standing" ) - modes.append( "#PL_pilot_skirmish" ) - modes.append( "#PL_live_fire" ) - modes.append( "#PL_marked_for_death" ) - modes.append( "#PL_titan_brawl" ) - //modes.append( "#PL_fd_easy" ) - //modes.append( "#PL_fd_normal" ) - //modes.append( "#PL_fd_hard" ) - //modes.append( "#PL_fd_master" ) - //modes.append( "#PL_fd_insane" ) - modes.append( "#PL_ffa" ) - modes.append( "#PL_fra" ) - modes.append( "#PL_coliseum" ) - modes.append( "#PL_aegis_titan_brawl" ) - modes.append( "#PL_titan_brawl_turbo" ) - modes.append( "#PL_aegis_last_titan_standing" ) - modes.append( "#PL_turbo_last_titan_standing" ) - modes.append( "#PL_rocket_arena" ) - modes.append( "#PL_all_holopilot" ) - modes.append( "#PL_gg" ) - modes.append( "#PL_tt" ) - modes.append( "#PL_inf" ) - modes.append( "#PL_kr" ) - modes.append( "#PL_fastball" ) - modes.append( "#GAMEMODE_hs" ) - modes.append( "#GAMEMODE_ctf_comp" ) - - - return modes -} //////////////////////////// // Init //////////////////////////// @@ -154,7 +113,7 @@ void function InitServerBrowserMenu() Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtBtnSelectMap" ) , map, string( enum_ ) ) - filterArguments.filterGamemodes = GetNorthstarGamemodes() + filterArguments.filterGamemodes = clone GetPrivateMatchModes() filterArguments.filterGamemodes.insert(0, "SWITCH_ANY") // GetGameModeDisplayName( mode ) requires server talk even if it can be entirely client side @@ -405,9 +364,13 @@ void function UpdateServerInfoBasedOnRes() //////////////////////////// void function OnCloseServerBrowserMenu() { - DeregisterButtonPressedCallback(MOUSE_WHEEL_UP , OnScrollUp) - DeregisterButtonPressedCallback(MOUSE_WHEEL_DOWN , OnScrollDown) - DeregisterButtonPressedCallback(KEY_TAB , OnKeyTabPressed) + try + { + DeregisterButtonPressedCallback(MOUSE_WHEEL_UP , OnScrollUp) + DeregisterButtonPressedCallback(MOUSE_WHEEL_DOWN , OnScrollDown) + DeregisterButtonPressedCallback(KEY_TAB , OnKeyTabPressed) + } + catch ( ex ) {} } void function OnServerBrowserMenuOpened() diff --git a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut index 25097c6f..ecb34d47 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut @@ -502,9 +502,9 @@ void function TryUnlockNorthstarButton() // unlock "Launch Northstar" button until you're authed with masterserver, are allowing insecure auth, or 7.5 seconds have passed float time = Time() - while ( Time() < time + 7.5 || GetConVarInt( "ns_has_agreed_to_send_token" ) != NS_AGREED_TO_SEND_TOKEN ) + while ( GetConVarInt( "ns_has_agreed_to_send_token" ) != NS_AGREED_TO_SEND_TOKEN ) { - if ( NSIsMasterServerAuthenticated() || GetConVarBool( "ns_auth_allow_insecure" ) ) + if ( ( NSIsMasterServerAuthenticated() && IsStryderAllowingMP() ) || GetConVarBool( "ns_auth_allow_insecure" ) ) break WaitFrame() diff --git a/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt b/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt new file mode 100644 index 00000000..62835f52 --- /dev/null +++ b/Northstar.Custom/mod/resource/northstar_custom_portuguese.txt @@ -0,0 +1,69 @@ +"lang" +{ + "Language" "portuguese" + "Tokens" + { + "PL_sbox" "Sandbox" + "PL_sbox_lobby" "Saguão de Sandbox" + "PL_sbox_desc" "gmod só que pior" + "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_abbr" "GG" + "GAMEMODE_GG" "Gun Game" + + "PL_tt" "Titan Tag" + "PL_tt_lobby" "Saguão de Titan Tag" + "PL_tt_desc" "Ganhe pontos com seu titã. Destrua um para chamar o seu." + "PL_tt_abbr" "TT" + "GAMEMODE_TT" "Titan Tag" + + "PL_inf" "Infecção" + "PL_inf_lobby" "Saguão de Infecção" + "PL_inf_desc" "Sobreviva à infecção. Sobreviventes são infectados quando mortos." + "PL_inf_abbr" "INF" + "GAMEMODE_INF" "Infecção" + "INFECTION_YOU_ARE_INFECTED" "Você foi infectado!" + "INFECTION_KILL_SURVIVORS" "Infecte todos os sobreviventes restantes." + "INFECTION_FIRST_INFECTED" "%s1 é o paciente zero." + "INFECTION_LAST_SURVIVOR" "%s1 é o último sobrevivente!" + "INFECTION_KILL_LAST_SURVIVOR" "Infecte eles antes que o tempo acabe!" + "INFECTION_YOU_ARE_LAST_SURVIVOR" "Você é o último sobrevivente!" + "INFECTION_SURVIVE_LAST_SURVIVOR" "Sobreviva." + + // 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 pela Fronteira" + "PL_fw" "Guerra pela Fronteira" + "PL_fw_lobby" "Saguão de Guerra pela Fronteira" + "PL_fw_desc" "Destrua a colheitadeira do inimigo e proteja a sua" + "PL_fw_abbr" "FW" + + "GAMEMODE_kr" "Corrida de Matança" + "PL_kr" "Corrida de Matança" + "PL_kr_lobby" "Saguão de Matança" + "PL_kr_desc" "Acabe com inimigos para aumentar sua matança. Capture a bandeira para começar. Vença matando mais." + "PL_kr_abbr" "KR" + "SCOREBOARD_KR_RECORD" "Recorde de mortes" + "KR_NEW_RACER" "%s1 é o matador" + "KR_YOU_ARE_NEW_RACER" "Você é o matador" + "KR_YOU_SET_NEW_RECORD" "Bateu o recorde!" + "KR_FLAG_INCOMING" "Bandeira reaparecerá em breve" + "KR_COLLECT_FLAG" "Capture a bandeira para virar um Matador!" + "KR_ENEMY_KILLRACE_OVER" "A matança de %s1 acabou" + "KR_YOUR_KILLRACE_OVER" "Sua matança acabou" + "KR_YOUR_KILLRACE_SCORE" "Você conseguiu %s1 mortes." + + "GAMEMODE_fastball" "Fastball" + "PL_fastball" "Fastball" + "PL_fastball_lobby" "Fastball Lobby" + "PL_fastball_desc" "Sem reaparecimento. Invada painéis de controle para ganhar rounds e reaparecer seus aliados." + "PL_fastball_abbr" "FB" + "FASTBALL_PANEL_CAPTURED" "%s1 capturou painel %s2" + "SCOREBOARD_FASTBALL_HACKS" "Painéis capturados" + + "GAMEMODE_ctf_comp" "CTF Competitivo" + } +} diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut index ee6c2c0a..a0e0b743 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut @@ -2,6 +2,7 @@ global function GamemodeInfection_Init struct { bool hasHadFirstInfection = false + bool hasHadLastInfection = false array<entity> playersToNotifyOfInfection } file @@ -10,6 +11,7 @@ void function GamemodeInfection_Init() SetSpawnpointGamemodeOverride( FFA ) SetLoadoutGracePeriodEnabled( false ) // prevent modifying loadouts with grace period SetWeaponDropsEnabled( false ) + SetShouldUseRoundWinningKillReplay( true ) Riff_ForceTitanAvailability( eTitanAvailability.Never ) Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) ClassicMP_ForceDisableEpilogue( true ) @@ -69,7 +71,7 @@ void function InfectPlayer( entity player ) array<entity> survivors = GetPlayerArrayOfTeam( INFECTION_TEAM_SURVIVOR ) if ( survivors.len() == 0 ) SetWinner( INFECTION_TEAM_INFECTED ) - else if ( survivors.len() == 1 ) + else if ( survivors.len() == 1 && !file.hasHadLastInfection ) SetLastSurvivor( survivors[ 0 ] ) if ( !file.hasHadFirstInfection ) @@ -175,6 +177,8 @@ void function SetLastSurvivor( entity player ) if ( GameTime_TimeLeftSeconds() > 45 ) SetServerVar( "gameEndTime", Time() + 45.0 ) + + file.hasHadLastInfection = true } int function TimeoutCheckSurvivors() @@ -188,4 +192,4 @@ int function TimeoutCheckSurvivors() bool function InfectionShouldPlayerStartBleedout( entity player, var damageInfo ) { return player.GetTeam() != INFECTION_TEAM_INFECTED -}
\ No newline at end of file +} diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_gamemode_fw_custom.nut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_gamemode_fw_custom.nut index 8c6e3f63..ca238d5d 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_gamemode_fw_custom.nut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/sh_gamemode_fw_custom.nut @@ -13,8 +13,6 @@ void function SHCreateGamemodeFW_Init() void function CreateGamemodeFW() { - //entity e = CreateEntity("npc_turret_mega"); SetAISettingsWrapper( e, "npc_turret_mega_fortwar" ); e.SetOrigin(GetPlayerArray()[0].GetOrigin()); SetTeam(e,3); DispatchSpawn(e) - // we have to manually add the client/shared scripts to scripts.rson atm so we need to prevent compile errors when they aren't included // best way to do this is to just ignore this whole block for now and wait until we don't have to add them manually diff --git a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut index 3151a0f2..3eb6bda6 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/burnmeter/_burnmeter.gnut @@ -1,435 +1,441 @@ -untyped - -global function BurnMeter_Init -global function ForceSetGlobalBurncardOverride -global function GetSelectedBurncardRefFromWeaponOrPlayer -global function RunBurnCardUseFunc -global function UseBurnCardWeapon -global function UseBurnCardWeaponInCriticalSection -global function BurnMeter_GiveRewardDirect -global function GetBurnCardWeaponSkin -global function InitBurnMeterPersistentData - -const float PHASE_REWIND_LENGTH = 2.0 -// taken from wraith portal in apex, assuming it's the same as tf2's -const float PHASE_REWIND_PATH_SNAPSHOT_INTERVAL = 0.1 -const int PHASE_REWIND_MAX_SNAPSHOTS = int( PHASE_REWIND_LENGTH / PHASE_REWIND_PATH_SNAPSHOT_INTERVAL ) - -const float AMPED_WEAPONS_LENGTH = 30.0 - -const int MAPHACK_PULSE_COUNT = 4 -const float MAPHACK_PULSE_DELAY = 2.0 - -struct { - string forcedGlobalBurncardOverride = "" -} file - -void function BurnMeter_Init() -{ - // turret precaches - // do we have to cache these on client? release builds sure don't - PrecacheModel( Dev_GetAISettingAssetByKeyField_Global( "npc_turret_sentry_burn_card_ap", "DefaultModelName" ) ) - PrecacheModel( Dev_GetAISettingAssetByKeyField_Global( "npc_turret_sentry_burn_card_at", "DefaultModelName" ) ) - - // setup burncard use funcs - BurnReward_GetByRef( "burnmeter_amped_weapons" ).rewardAvailableCallback = PlayerUsesAmpedWeaponsBurncard - BurnReward_GetByRef( "burnmeter_smart_pistol" ).rewardAvailableCallback = PlayerUsesSmartPistolBurncard - BurnReward_GetByRef( "burnmeter_emergency_battery" ).rewardAvailableCallback = PlayerUsesBatteryBurncard - BurnReward_GetByRef( "burnmeter_radar_jammer" ).rewardAvailableCallback = PlayerUsesRadarJammerBurncard - BurnReward_GetByRef( "burnmeter_maphack" ).rewardAvailableCallback = PlayerUsesMaphackBurncard - BurnReward_GetByRef( "burnmeter_phase_rewind" ).rewardAvailableCallback = PlayerUsesPhaseRewindBurncard - - // these ones aren't so important, they're either for fd ( unsupported rn ) or unused - //BurnReward_GetByRef( "burnmeter_harvester_shield" ).rewardAvailableCallback = - BurnReward_GetByRef( "burnmeter_rodeo_grenade" ).rewardAvailableCallback = PlayerUsesRodeoGrenadeBurncard - BurnReward_GetByRef( "burnmeter_nuke_titan" ).rewardAvailableCallback = PlayerUsesNukeTitanBurncard // unused in vanilla, fun though - - // setup player callbacks - AddCallback_GameStateEnter( eGameState.Playing, InitBurncardsForIntroPlayers ) - AddCallback_OnClientConnected( InitBurncardsForLateJoiner ) - - AddCallback_OnPlayerRespawned( StartPhaseRewindLifetime ) - AddCallback_OnTitanBecomesPilot( RemoveAmpedWeaponsForTitanPilot ) - - // necessary signals - RegisterSignal( "StopAmpedWeapons" ) -} - -void function ForceSetGlobalBurncardOverride( string ref ) -{ - file.forcedGlobalBurncardOverride = ref -} - -string function GetSelectedBurncardRefFromWeaponOrPlayer( entity weapon, entity player ) -{ - // determine the burncard we're using - // in actual gameplay, this will always be the player's selected burncard - // however, if we want to manually give burncards and such, we want to make sure they'll still work - // so some extra work goes into this - - string ref = GetSelectedBurnCardRef( player ) - - if ( file.forcedGlobalBurncardOverride.len() > 0 ) - ref = file.forcedGlobalBurncardOverride - - if ( IsValid( weapon ) ) - { - // determine via weapon mods, this assumes weapon mod names are the same as burn refs, which works in practice but is a bit weird - // this does crash with the burnmeter_doublexp mod, but who cares, it doesn't get hit normally - if ( weapon.GetWeaponClassName() == "mp_ability_burncardweapon" ) - { - foreach ( string mod in weapon.GetMods() ) - if ( mod.find( "burnmeter_" ) == 0 ) - return mod - } - // determine via weapon name in the case of stuff like holopilot etc - else - { - // unfortunately, we have to hardcode this, we don't have a way of getting refs directly from weapons other than the burncard weapon - // this should be modular at some point, wish we could just iterate over burncards and find ones with the current weapon, but this isn't possible - switch ( weapon.GetWeaponClassName() ) - { - case "mp_ability_holopilot_nova": - return "burnmeter_holopilot_nova" - - case "mp_weapon_arc_trap": - return "burnmeter_arc_trap" - - case "mp_weapon_frag_drone": - return "burnmeter_ticks" - - case "mp_weapon_hard_cover": - return "burnmeter_hard_cover" - - case "mp_ability_turretweapon": - // turret has 2 burncards, antititan and antipilot - if( weapon.HasMod( "burnmeter_at_turret_weapon" ) || weapon.HasMod( "burnmeter_at_turret_weapon_inf" ) ) - return "burnmeter_at_turret_weapon" - else - return "burnmeter_ap_turret_weapon" - - // note: cloak and stim both have burn_card_weapon_mod mods, but they aren't used and don't call burncard code at all, likely for tf1 infinite stim/cloak burncards? - - default: - print( "tried to use unknown burncard weapon " + weapon.GetWeaponClassName() ) - return "burnmeter_amped_weapons" - } - } - } - - return ref -} - -void function InitPlayerBurncards( entity player ) -{ - string ref = GetSelectedBurncardRefFromWeaponOrPlayer( null, player ) - BurnReward reward = BurnReward_GetByRef( ref ) - player.SetPlayerNetInt( TOP_INVENTORY_ITEM_BURN_CARD_ID, reward.id ) - - if ( IsAlive( player ) ) - thread PhaseRewindLifetime( player ) -} - -void function InitBurncardsForIntroPlayers() -{ - // gotta do this, since sh_burnmeter uses this netint - foreach ( entity player in GetPlayerArray() ) - InitPlayerBurncards( player ) -} - -void function InitBurncardsForLateJoiner( entity player ) -{ - // gotta do this, since sh_burnmeter uses this netint - if ( GetGameState() > eGameState.Prematch ) - InitPlayerBurncards( player ) -} - -void function StartPhaseRewindLifetime( entity player ) -{ - thread PhaseRewindLifetime( player ) -} - -void function PhaseRewindLifetime( entity player ) -{ - player.EndSignal( "OnDestroy" ) - player.EndSignal( "OnDeath" ) - - OnThreadEnd( function() : ( player ) - { - player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.clear() - }) - - while ( true ) - { - PhaseRewindData rewindData - rewindData.origin = player.GetOrigin() - rewindData.angles = player.GetAngles() - rewindData.velocity = player.GetVelocity() - rewindData.wasInContextAction = player.ContextAction_IsActive() - rewindData.wasCrouched = player.IsCrouched() - - if ( player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.len() >= PHASE_REWIND_MAX_SNAPSHOTS ) - { - // shift all snapshots left - for ( int i = 0; i < PHASE_REWIND_MAX_SNAPSHOTS - 1; i++ ) - player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ i ] = player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ i + 1 ] - - player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ PHASE_REWIND_MAX_SNAPSHOTS - 1 ] = rewindData - } - else - player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.append( rewindData ) - - wait PHASE_REWIND_PATH_SNAPSHOT_INTERVAL - } -} - -void function RunBurnCardUseFunc( entity player, string itemRef ) -{ - void functionref( entity ) ornull func = BurnReward_GetByRef( itemRef ).rewardAvailableCallback - if ( func != null ) - ( expect void functionref( entity ) ( func ) )( player ) -} - -void function UseBurnCardWeapon( entity weapon, entity player ) -{ - string ref = GetSelectedBurncardRefFromWeaponOrPlayer( weapon, player ) - - Remote_CallFunction_Replay( player, "ServerCallback_RewardUsed", BurnReward_GetByRef( ref ).id ) - RunBurnCardUseFunc( player, ref ) - - // dont remove in RunBurnCardUseFunc because it can be called in non-burn_card_weapon_mod contexts - // TODO: currently not sure how burncards can be stacked ( max clipcount for all burncards is 1, so can't just set that ) - // if this gets figured out, add a conditional check here to prevent removes if they've got burncards left - if ( PlayerEarnMeter_IsRewardAvailable( player ) ) - PlayerEarnMeter_SetRewardUsed( player ) - - player.TakeWeapon( BurnReward_GetByRef( ref ).weaponName ) -} - -void function UseBurnCardWeaponInCriticalSection( entity weapon, entity ownerPlayer ) -{ - // ignoring critical section stuff, assuming it was necessary in tf1 where burncards were part of inventory, but not here - UseBurnCardWeapon( weapon, ownerPlayer ) -} - -void function BurnMeter_GiveRewardDirect( entity player, string itemRef ) -{ - -} - -int function GetBurnCardWeaponSkin( entity weapon ) -{ - return GetBoostSkin( GetSelectedBurncardRefFromWeaponOrPlayer( weapon, weapon.GetOwner() ) ) -} - -// stub -void function InitBurnMeterPersistentData( entity player ) -{} - - -// burncard use funcs - -void function PlayerUsesAmpedWeaponsBurncard( entity player ) -{ - thread PlayerUsesAmpedWeaponsBurncardThreaded( player ) -} - -void function PlayerUsesAmpedWeaponsBurncardThreaded( entity player ) -{ - array<entity> weapons = player.GetMainWeapons() - //weapons.extend( player.GetOffhandWeapons() ) // idk? unsure of vanilla behaviour here - foreach ( entity weapon in weapons ) - { - weapon.RemoveMod( "silencer" ) // both this and the burnmod will override firing fx, if a second one overrides this we crash - foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) ) - { - // catch incompatibilities just in case - try - { - weapon.AddMod( mod ) - } - catch( ex ) - { - weapons.removebyvalue( weapon ) - } - } - - // needed to display amped weapon time left - weapon.SetScriptFlags0( weapon.GetScriptFlags0() | WEAPONFLAG_AMPED ) - weapon.SetScriptTime0( Time() + AMPED_WEAPONS_LENGTH ) - } - - wait AMPED_WEAPONS_LENGTH - - // note: weapons may have been destroyed or picked up by other people by this point, so need to verify this - foreach ( entity weapon in weapons ) - { - if ( !IsValid( weapon ) ) - continue - - foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) ) - weapon.RemoveMod( mod ) - - weapon.SetScriptFlags0( weapon.GetScriptFlags0() & ~WEAPONFLAG_AMPED ) - } -} - -void function RemoveAmpedWeaponsForTitanPilot( entity player, entity titan ) -{ - foreach ( entity weapon in player.GetMainWeapons() ) - foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) ) - weapon.RemoveMod( mod ) -} - -void function PlayerUsesSmartPistolBurncard( entity player ) -{ - // take secondary weapon - array<entity> sidearms = player.GetMainWeapons() - if ( sidearms.len() > 1 ) - player.TakeWeaponNow( sidearms[ 1 ].GetWeaponClassName() ) // take secondary weapon - - player.GiveWeapon( "mp_weapon_smart_pistol" ) - player.SetActiveWeaponByName( "mp_weapon_smart_pistol" ) - - // do we need to track the player losing smart pistol, then give their old weapon back? idk not implementing for now, check later -} - -void function PlayerUsesBatteryBurncard( entity player ) -{ - Rodeo_GiveBatteryToPlayer( player ) -} - -void function PlayerUsesRadarJammerBurncard( entity player ) -{ - foreach ( entity otherPlayer in GetPlayerArray() ) - { - MessageToPlayer( otherPlayer, eEventNotifications.BurnMeter_RadarJammerUsed, player ) - - if ( otherPlayer.GetTeam() != player.GetTeam() ) - StatusEffect_AddTimed( otherPlayer, eStatusEffect.minimap_jammed, 1.0, RADAR_JAM_TIME, RADAR_JAM_TIME ) - } -} - -void function PlayerUsesMaphackBurncard( entity player ) -{ - thread PlayerUsesMaphackBurncardThreaded( player ) -} - -void function PlayerUsesMaphackBurncardThreaded( entity player ) -{ - player.EndSignal( "OnDestroy" ) - player.EndSignal( "OnDeath" ) - - // todo: potentially look into ScanMinimap in _passives for doing this better? boost is pretty likely based off it pretty heavily - for ( int i = 0; i < MAPHACK_PULSE_COUNT; i++ ) - { - EmitSoundOnEntityOnlyToPlayer( player, player, "Burn_Card_Map_Hack_Radar_Pulse_V1_1P" ) - - foreach ( entity otherPlayer in GetPlayerArray() ) - { - Remote_CallFunction_Replay( otherPlayer, "ServerCallback_SonarPulseFromPosition", player.GetOrigin().x, player.GetOrigin().y, player.GetOrigin().z, SONAR_GRENADE_RADIUS ) - - if ( otherPlayer.GetTeam() != player.GetTeam() ) - { - StatusEffect_AddTimed( player, eStatusEffect.maphack_detected, 1.0, MAPHACK_PULSE_DELAY / 2, 0.0 ) - SonarStart( otherPlayer, player.GetOrigin(), player.GetTeam(), player ) - } - } - - wait MAPHACK_PULSE_DELAY - } -} - -void function PlayerUsesPhaseRewindBurncard( entity player ) -{ - thread PlayerUsesPhaseRewindBurncardThreaded( player ) -} - -void function PlayerUsesPhaseRewindBurncardThreaded( entity player ) -{ - player.EndSignal( "OnDestroy" ) - player.EndSignal( "OnDeath" ) - - entity mover = CreateScriptMover( player.GetOrigin(), player.GetAngles() ) - player.SetParent( mover, "REF" ) - - OnThreadEnd( function() : ( player, mover ) - { - CancelPhaseShift( player ) - player.DeployWeapon() - player.SetPredictionEnabled( true ) - player.ClearParent() - ViewConeFree( player ) - mover.Destroy() - }) - - array<PhaseRewindData> positions = clone player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions - - ViewConeZero( player ) - player.HolsterWeapon() - player.SetPredictionEnabled( false ) - PhaseShift( player, 0.0, positions.len() * PHASE_REWIND_PATH_SNAPSHOT_INTERVAL * 1.5 ) - - for ( int i = positions.len() - 1; i > -1; i-- ) - { - mover.NonPhysicsMoveTo( positions[ i ].origin, PHASE_REWIND_PATH_SNAPSHOT_INTERVAL, 0, 0 ) - mover.NonPhysicsRotateTo( positions[ i ].angles, PHASE_REWIND_PATH_SNAPSHOT_INTERVAL, 0, 0 ) - wait PHASE_REWIND_PATH_SNAPSHOT_INTERVAL - } - - // this isn't vanilla but it's cool lol, should prolly remove it tho - player.SetVelocity( -positions[ positions.len() - 1 ].velocity ) -} - -void function PlayerUsesNukeTitanBurncard( entity player ) -{ - thread PlayerUsesNukeBurncardThreaded( player ) -} - -void function PlayerUsesNukeBurncardThreaded( entity player ) -{ - // if this is given manually ( i.e. not the equipped burnreward in inventory ), this will run at bad times - // so do this check here, yes, this will cause people to lose their cards and get nothing, but better than free titan regens - if ( !BurnMeterPlayer_CanUseReward( player, BurnReward_GetByRef( "burnmeter_nuke_titan" ) ) ) - return - - float ownedFrac = PlayerEarnMeter_GetOwnedFrac( player ) - - // use player's titan loadout, but with warpfall so faster and no dome - TitanLoadoutDef titanLoadout = GetTitanLoadoutForPlayer( player ) - titanLoadout.passive3 = "pas_warpfall" - - thread CreateTitanForPlayerAndHotdrop( player, GetTitanReplacementPoint( player, false ) ) - - entity titan = player.GetPetTitan() - SetTeam( titan, TEAM_UNASSIGNED ) // make it so you can kill yourself lol - DoomTitan( titan ) - NPC_SetNuclearPayload( titan ) - // this should get run after the vanilla set_usable's event, so titan is never embarkable - // embarking a titan in this state WILL kill the server so uhh, pretty bad - AddAnimEvent( titan, "set_usable", void function( entity titan ) { titan.UnsetUsable() } ) - - titan.WaitSignal( "TitanHotDropComplete" ) - AutoTitan_SelfDestruct( titan ) - - while ( PlayerEarnMeter_GetMode( player ) == eEarnMeterMode.PET ) - WaitFrame() - - // restore original earnmeter values, no way to set earned that's exposed unfortunately - PlayerEarnMeter_SetOwnedFrac( player, ownedFrac ) -} - -void function PlayerUsesRodeoGrenadeBurncard( entity player ) -{ - player.SetPlayerNetInt( "numSuperRodeoGrenades", player.GetPlayerNetInt( "numSuperRodeoGrenades" ) + 1 ) -} - -// unused burncard that's mentioned in a few areas and has a validiation function in sh_burnmeter ( BurnMeter_SummonReaperCanUse ), thought it'd be neat to add it -void function PlayerUsesReaperfallBurncard( entity player ) -{ - Point spawnpoint = GetTitanReplacementPoint( player, false ) - entity reaper = CreateSuperSpectre( player.GetTeam(), spawnpoint.origin, spawnpoint.angles ) - DispatchSpawn( reaper ) - - thread SuperSpectre_WarpFall( reaper ) +untyped
+
+global function BurnMeter_Init
+global function ForceSetGlobalBurncardOverride
+global function GetSelectedBurncardRefFromWeaponOrPlayer
+global function RunBurnCardUseFunc
+global function UseBurnCardWeapon
+global function UseBurnCardWeaponInCriticalSection
+global function BurnMeter_GiveRewardDirect
+global function GetBurnCardWeaponSkin
+global function InitBurnMeterPersistentData
+
+const float PHASE_REWIND_LENGTH = 2.0
+// taken from wraith portal in apex, assuming it's the same as tf2's
+const float PHASE_REWIND_PATH_SNAPSHOT_INTERVAL = 0.1
+const int PHASE_REWIND_MAX_SNAPSHOTS = int( PHASE_REWIND_LENGTH / PHASE_REWIND_PATH_SNAPSHOT_INTERVAL )
+
+const float AMPED_WEAPONS_LENGTH = 30.0
+
+const int MAPHACK_PULSE_COUNT = 4
+const float MAPHACK_PULSE_DELAY = 2.0
+
+struct {
+ string forcedGlobalBurncardOverride = ""
+} file
+
+void function BurnMeter_Init()
+{
+ // turret precaches
+ // do we have to cache these on client? release builds sure don't
+ PrecacheModel( Dev_GetAISettingAssetByKeyField_Global( "npc_turret_sentry_burn_card_ap", "DefaultModelName" ) )
+ PrecacheModel( Dev_GetAISettingAssetByKeyField_Global( "npc_turret_sentry_burn_card_at", "DefaultModelName" ) )
+
+ // setup burncard use funcs
+ BurnReward_GetByRef( "burnmeter_amped_weapons" ).rewardAvailableCallback = PlayerUsesAmpedWeaponsBurncard
+ BurnReward_GetByRef( "burnmeter_smart_pistol" ).rewardAvailableCallback = PlayerUsesSmartPistolBurncard
+ BurnReward_GetByRef( "burnmeter_emergency_battery" ).rewardAvailableCallback = PlayerUsesBatteryBurncard
+ BurnReward_GetByRef( "burnmeter_radar_jammer" ).rewardAvailableCallback = PlayerUsesRadarJammerBurncard
+ BurnReward_GetByRef( "burnmeter_maphack" ).rewardAvailableCallback = PlayerUsesMaphackBurncard
+ BurnReward_GetByRef( "burnmeter_phase_rewind" ).rewardAvailableCallback = PlayerUsesPhaseRewindBurncard
+
+ // these ones aren't so important, they're either for fd ( unsupported rn ) or unused
+ //BurnReward_GetByRef( "burnmeter_harvester_shield" ).rewardAvailableCallback =
+ BurnReward_GetByRef( "burnmeter_rodeo_grenade" ).rewardAvailableCallback = PlayerUsesRodeoGrenadeBurncard
+ BurnReward_GetByRef( "burnmeter_nuke_titan" ).rewardAvailableCallback = PlayerUsesNukeTitanBurncard // unused in vanilla, fun though
+
+ // setup player callbacks
+ AddCallback_GameStateEnter( eGameState.Playing, InitBurncardsForIntroPlayers )
+ AddCallback_OnClientConnected( InitBurncardsForLateJoiner )
+
+ AddCallback_OnPlayerRespawned( StartPhaseRewindLifetime )
+ AddCallback_OnTitanBecomesPilot( RemoveAmpedWeaponsForTitanPilot )
+
+ // necessary signals
+ RegisterSignal( "StopAmpedWeapons" )
+}
+
+void function ForceSetGlobalBurncardOverride( string ref )
+{
+ file.forcedGlobalBurncardOverride = ref
+}
+
+string function GetSelectedBurncardRefFromWeaponOrPlayer( entity weapon, entity player )
+{
+ // determine the burncard we're using
+ // in actual gameplay, this will always be the player's selected burncard
+ // however, if we want to manually give burncards and such, we want to make sure they'll still work
+ // so some extra work goes into this
+
+ string ref = GetSelectedBurnCardRef( player )
+
+ if ( file.forcedGlobalBurncardOverride.len() > 0 )
+ ref = file.forcedGlobalBurncardOverride
+
+ if ( IsValid( weapon ) )
+ {
+ // determine via weapon mods, this assumes weapon mod names are the same as burn refs, which works in practice but is a bit weird
+ // this does crash with the burnmeter_doublexp mod, but who cares, it doesn't get hit normally
+ if ( weapon.GetWeaponClassName() == "mp_ability_burncardweapon" )
+ {
+ foreach ( string mod in weapon.GetMods() )
+ if ( mod.find( "burnmeter_" ) == 0 )
+ return mod
+ }
+ // determine via weapon name in the case of stuff like holopilot etc
+ else
+ {
+ // unfortunately, we have to hardcode this, we don't have a way of getting refs directly from weapons other than the burncard weapon
+ // this should be modular at some point, wish we could just iterate over burncards and find ones with the current weapon, but this isn't possible
+ switch ( weapon.GetWeaponClassName() )
+ {
+ case "mp_ability_holopilot_nova":
+ return "burnmeter_holopilot_nova"
+
+ case "mp_weapon_arc_trap":
+ return "burnmeter_arc_trap"
+
+ case "mp_weapon_frag_drone":
+ return "burnmeter_ticks"
+
+ case "mp_weapon_hard_cover":
+ return "burnmeter_hard_cover"
+
+ case "mp_ability_turretweapon":
+ // turret has 2 burncards, antititan and antipilot
+ if( weapon.HasMod( "burnmeter_at_turret_weapon" ) || weapon.HasMod( "burnmeter_at_turret_weapon_inf" ) )
+ return "burnmeter_at_turret_weapon"
+ else
+ return "burnmeter_ap_turret_weapon"
+
+ // note: cloak and stim both have burn_card_weapon_mod mods, but they aren't used and don't call burncard code at all, likely for tf1 infinite stim/cloak burncards?
+
+ default:
+ print( "tried to use unknown burncard weapon " + weapon.GetWeaponClassName() )
+ return "burnmeter_amped_weapons"
+ }
+ }
+ }
+
+ return ref
+}
+
+void function InitPlayerBurncards( entity player )
+{
+ string ref = GetSelectedBurncardRefFromWeaponOrPlayer( null, player )
+ BurnReward reward = BurnReward_GetByRef( ref )
+ player.SetPlayerNetInt( TOP_INVENTORY_ITEM_BURN_CARD_ID, reward.id )
+
+ if ( IsAlive( player ) )
+ thread PhaseRewindLifetime( player )
+}
+
+void function InitBurncardsForIntroPlayers()
+{
+ // gotta do this, since sh_burnmeter uses this netint
+ foreach ( entity player in GetPlayerArray() )
+ InitPlayerBurncards( player )
+}
+
+void function InitBurncardsForLateJoiner( entity player )
+{
+ // gotta do this, since sh_burnmeter uses this netint
+ if ( GetGameState() > eGameState.Prematch )
+ InitPlayerBurncards( player )
+}
+
+void function StartPhaseRewindLifetime( entity player )
+{
+ thread PhaseRewindLifetime( player )
+}
+
+void function PhaseRewindLifetime( entity player )
+{
+ player.EndSignal( "OnDestroy" )
+ player.EndSignal( "OnDeath" )
+
+ OnThreadEnd( function() : ( player )
+ {
+ player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.clear()
+ })
+
+ while ( true )
+ {
+ PhaseRewindData rewindData
+ rewindData.origin = player.GetOrigin()
+ rewindData.angles = player.GetAngles()
+ rewindData.velocity = player.GetVelocity()
+ rewindData.wasInContextAction = player.ContextAction_IsActive()
+ rewindData.wasCrouched = player.IsCrouched()
+
+ if ( player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.len() >= PHASE_REWIND_MAX_SNAPSHOTS )
+ {
+ // shift all snapshots left
+ for ( int i = 0; i < PHASE_REWIND_MAX_SNAPSHOTS - 1; i++ )
+ player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ i ] = player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ i + 1 ]
+
+ player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions[ PHASE_REWIND_MAX_SNAPSHOTS - 1 ] = rewindData
+ }
+ else
+ player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions.append( rewindData )
+
+ wait PHASE_REWIND_PATH_SNAPSHOT_INTERVAL
+ }
+}
+
+void function RunBurnCardUseFunc( entity player, string itemRef )
+{
+ void functionref( entity ) ornull func = BurnReward_GetByRef( itemRef ).rewardAvailableCallback
+ if ( func != null )
+ ( expect void functionref( entity ) ( func ) )( player )
+}
+
+void function UseBurnCardWeapon( entity weapon, entity player )
+{
+ string ref = GetSelectedBurncardRefFromWeaponOrPlayer( weapon, player )
+
+ Remote_CallFunction_Replay( player, "ServerCallback_RewardUsed", BurnReward_GetByRef( ref ).id )
+ RunBurnCardUseFunc( player, ref )
+
+ // dont remove in RunBurnCardUseFunc because it can be called in non-burn_card_weapon_mod contexts
+ // TODO: currently not sure how burncards can be stacked ( max clipcount for all burncards is 1, so can't just set that )
+ // if this gets figured out, add a conditional check here to prevent removes if they've got burncards left
+ if ( PlayerEarnMeter_IsRewardAvailable( player ) )
+ PlayerEarnMeter_SetRewardUsed( player )
+
+ player.TakeWeapon( BurnReward_GetByRef( ref ).weaponName )
+}
+
+void function UseBurnCardWeaponInCriticalSection( entity weapon, entity ownerPlayer )
+{
+ // ignoring critical section stuff, assuming it was necessary in tf1 where burncards were part of inventory, but not here
+ UseBurnCardWeapon( weapon, ownerPlayer )
+}
+
+void function BurnMeter_GiveRewardDirect( entity player, string itemRef )
+{
+
+}
+
+int function GetBurnCardWeaponSkin( entity weapon )
+{
+ return GetBoostSkin( GetSelectedBurncardRefFromWeaponOrPlayer( weapon, weapon.GetOwner() ) )
+}
+
+// stub
+void function InitBurnMeterPersistentData( entity player )
+{}
+
+
+// burncard use funcs
+
+void function PlayerUsesAmpedWeaponsBurncard( entity player )
+{
+ thread PlayerUsesAmpedWeaponsBurncardThreaded( player )
+}
+
+void function PlayerUsesAmpedWeaponsBurncardThreaded( entity player )
+{
+ array<entity> weapons = player.GetMainWeapons()
+ //weapons.extend( player.GetOffhandWeapons() ) // idk? unsure of vanilla behaviour here
+ foreach ( entity weapon in weapons )
+ {
+ weapon.RemoveMod( "silencer" ) // both this and the burnmod will override firing fx, if a second one overrides this we crash
+ foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
+ {
+ // catch incompatibilities just in case
+ try
+ {
+ weapon.AddMod( mod )
+ }
+ catch( ex )
+ {
+ weapons.removebyvalue( weapon )
+ }
+ }
+
+ // needed to display amped weapon time left
+ weapon.SetScriptFlags0( weapon.GetScriptFlags0() | WEAPONFLAG_AMPED )
+ weapon.SetScriptTime0( Time() + AMPED_WEAPONS_LENGTH )
+ }
+
+ wait AMPED_WEAPONS_LENGTH
+
+ // note: weapons may have been destroyed or picked up by other people by this point, so need to verify this
+ foreach ( entity weapon in weapons )
+ {
+ if ( !IsValid( weapon ) )
+ continue
+
+ foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
+ weapon.RemoveMod( mod )
+
+ weapon.SetScriptFlags0( weapon.GetScriptFlags0() & ~WEAPONFLAG_AMPED )
+ }
+}
+
+void function RemoveAmpedWeaponsForTitanPilot( entity player, entity titan )
+{
+ foreach ( entity weapon in player.GetMainWeapons() )
+ foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
+ weapon.RemoveMod( mod )
+}
+
+void function PlayerUsesSmartPistolBurncard( entity player )
+{
+ // take secondary weapon
+ array<entity> sidearms = player.GetMainWeapons()
+ if ( sidearms.len() > 1 )
+ player.TakeWeaponNow( sidearms[ 1 ].GetWeaponClassName() ) // take secondary weapon
+
+ player.GiveWeapon( "mp_weapon_smart_pistol" )
+ player.SetActiveWeaponByName( "mp_weapon_smart_pistol" )
+
+ // do we need to track the player losing smart pistol, then give their old weapon back? idk not implementing for now, check later
+}
+
+void function PlayerUsesBatteryBurncard( entity player )
+{
+ Rodeo_GiveBatteryToPlayer( player )
+}
+
+void function PlayerUsesRadarJammerBurncard( entity player )
+{
+ foreach ( entity otherPlayer in GetPlayerArray() )
+ {
+ MessageToPlayer( otherPlayer, eEventNotifications.BurnMeter_RadarJammerUsed, player )
+
+ if ( otherPlayer.GetTeam() != player.GetTeam() )
+ StatusEffect_AddTimed( otherPlayer, eStatusEffect.minimap_jammed, 1.0, RADAR_JAM_TIME, RADAR_JAM_TIME )
+ }
+}
+
+void function PlayerUsesMaphackBurncard( entity player )
+{
+ thread PlayerUsesMaphackBurncardThreaded( player )
+}
+
+void function PlayerUsesMaphackBurncardThreaded( entity player )
+{
+ player.EndSignal( "OnDestroy" )
+ player.EndSignal( "OnDeath" )
+
+ // todo: potentially look into ScanMinimap in _passives for doing this better? boost is pretty likely based off it pretty heavily
+ for ( int i = 0; i < MAPHACK_PULSE_COUNT; i++ )
+ {
+ EmitSoundOnEntityOnlyToPlayer( player, player, "Burn_Card_Map_Hack_Radar_Pulse_V1_1P" )
+ array<entity> aliveplayers = GetPlayerArray()
+ foreach ( entity otherPlayer in GetPlayerArray() )
+ {
+ Remote_CallFunction_Replay( otherPlayer, "ServerCallback_SonarPulseFromPosition", player.GetOrigin().x, player.GetOrigin().y, player.GetOrigin().z, SONAR_GRENADE_RADIUS )
+
+ if ( otherPlayer.GetTeam() != player.GetTeam() && aliveplayers.find(otherPlayer) != -1 && aliveplayers.find(player) != -1 )
+ {
+ StatusEffect_AddTimed( otherPlayer, eStatusEffect.maphack_detected, 1.0, MAPHACK_PULSE_DELAY / 2, 0.0 )
+ SonarStart( otherPlayer, player.GetOrigin(), player.GetTeam(), player )
+ IncrementSonarPerTeam( player.GetTeam() )
+ }
+ }
+ wait MAPHACK_PULSE_DELAY
+ foreach ( entity otherPlayer in GetPlayerArray() ) {
+ if ( otherPlayer.GetTeam() != player.GetTeam() && aliveplayers.find(otherPlayer) != -1 && aliveplayers.find(player) != -1 ) {
+ SonarEnd (otherPlayer, player.GetTeam() )
+ DecrementSonarPerTeam( player.GetTeam() )
+ }
+ }
+ }
+}
+
+void function PlayerUsesPhaseRewindBurncard( entity player )
+{
+ thread PlayerUsesPhaseRewindBurncardThreaded( player )
+}
+
+void function PlayerUsesPhaseRewindBurncardThreaded( entity player )
+{
+ player.EndSignal( "OnDestroy" )
+ player.EndSignal( "OnDeath" )
+
+ entity mover = CreateScriptMover( player.GetOrigin(), player.GetAngles() )
+ player.SetParent( mover, "REF" )
+
+ OnThreadEnd( function() : ( player, mover )
+ {
+ CancelPhaseShift( player )
+ player.DeployWeapon()
+ player.SetPredictionEnabled( true )
+ player.ClearParent()
+ ViewConeFree( player )
+ mover.Destroy()
+ })
+
+ array<PhaseRewindData> positions = clone player.p.burnCardPhaseRewindStruct.phaseRetreatSavedPositions
+
+ ViewConeZero( player )
+ player.HolsterWeapon()
+ player.SetPredictionEnabled( false )
+ PhaseShift( player, 0.0, positions.len() * PHASE_REWIND_PATH_SNAPSHOT_INTERVAL * 1.5 )
+
+ for ( int i = positions.len() - 1; i > -1; i-- )
+ {
+ mover.NonPhysicsMoveTo( positions[ i ].origin, PHASE_REWIND_PATH_SNAPSHOT_INTERVAL, 0, 0 )
+ mover.NonPhysicsRotateTo( positions[ i ].angles, PHASE_REWIND_PATH_SNAPSHOT_INTERVAL, 0, 0 )
+ wait PHASE_REWIND_PATH_SNAPSHOT_INTERVAL
+ }
+
+ // this isn't vanilla but it's cool lol, should prolly remove it tho
+ player.SetVelocity( -positions[ positions.len() - 1 ].velocity )
+}
+
+void function PlayerUsesNukeTitanBurncard( entity player )
+{
+ thread PlayerUsesNukeBurncardThreaded( player )
+}
+
+void function PlayerUsesNukeBurncardThreaded( entity player )
+{
+ // if this is given manually ( i.e. not the equipped burnreward in inventory ), this will run at bad times
+ // so do this check here, yes, this will cause people to lose their cards and get nothing, but better than free titan regens
+ if ( !BurnMeterPlayer_CanUseReward( player, BurnReward_GetByRef( "burnmeter_nuke_titan" ) ) )
+ return
+
+ float ownedFrac = PlayerEarnMeter_GetOwnedFrac( player )
+
+ // use player's titan loadout, but with warpfall so faster and no dome
+ TitanLoadoutDef titanLoadout = GetTitanLoadoutForPlayer( player )
+ titanLoadout.passive3 = "pas_warpfall"
+
+ thread CreateTitanForPlayerAndHotdrop( player, GetTitanReplacementPoint( player, false ) )
+
+ entity titan = player.GetPetTitan()
+ SetTeam( titan, TEAM_UNASSIGNED ) // make it so you can kill yourself lol
+ DoomTitan( titan )
+ NPC_SetNuclearPayload( titan )
+ // this should get run after the vanilla set_usable's event, so titan is never embarkable
+ // embarking a titan in this state WILL kill the server so uhh, pretty bad
+ AddAnimEvent( titan, "set_usable", void function( entity titan ) { titan.UnsetUsable() } )
+
+ titan.WaitSignal( "TitanHotDropComplete" )
+ AutoTitan_SelfDestruct( titan )
+
+ while ( PlayerEarnMeter_GetMode( player ) == eEarnMeterMode.PET )
+ WaitFrame()
+
+ // restore original earnmeter values, no way to set earned that's exposed unfortunately
+ PlayerEarnMeter_SetOwnedFrac( player, ownedFrac )
+}
+
+void function PlayerUsesRodeoGrenadeBurncard( entity player )
+{
+ player.SetPlayerNetInt( "numSuperRodeoGrenades", player.GetPlayerNetInt( "numSuperRodeoGrenades" ) + 1 )
+}
+
+// unused burncard that's mentioned in a few areas and has a validiation function in sh_burnmeter ( BurnMeter_SummonReaperCanUse ), thought it'd be neat to add it
+void function PlayerUsesReaperfallBurncard( entity player )
+{
+ Point spawnpoint = GetTitanReplacementPoint( player, false )
+ entity reaper = CreateSuperSpectre( player.GetTeam(), spawnpoint.origin, spawnpoint.angles )
+ DispatchSpawn( reaper )
+
+ thread SuperSpectre_WarpFall( reaper )
}
\ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/evac/_evac.gnut b/Northstar.CustomServers/mod/scripts/vscripts/evac/_evac.gnut index a4f23b85..b861ed9f 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/evac/_evac.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/evac/_evac.gnut @@ -103,11 +103,20 @@ void function EvacEpilogue() if ( canRunEvac ) { - SetRespawnsEnabled( false ) + thread SetRespawnAndWait( false ) thread Evac( GetOtherTeam( winner ), EVAC_INITIAL_WAIT, EVAC_ARRIVAL_TIME, EVAC_WAIT_TIME, EvacEpiloguePlayerCanBoard, EvacEpilogueShouldLeaveEarly, EvacEpilogueCompleted ) } else - thread EvacEpilogueCompleted( null ) // this is hacky but like, this also shouldn't really be hit in normal gameplay + { + thread SetRespawnAndWait( false ) //prevent respawns during the fade to black, should only be an issue if the match is a draw + thread EvacEpilogueCompleted( null ) //this is hacky but like, this also shouldn't really be hit in normal gameplay + } +} + +void function SetRespawnAndWait(bool mode) +{ + wait GAME_EPILOGUE_PLAYER_RESPAWN_LEEWAY + SetRespawnsEnabled( mode ) } bool function EvacEpiloguePlayerCanBoard( entity dropship, entity player ) @@ -386,4 +395,4 @@ void function EvacDropshipKilled( entity dropship, var damageInfo ) player.Die( DamageInfo_GetAttacker( damageInfo ), DamageInfo_GetWeapon( damageInfo ), { damageSourceId = eDamageSourceId.evac_dropship_explosion, scriptType = DF_GIB } ) } } -}
\ No newline at end of file +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ps.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ps.nut index 4e62e8c5..7eec7c89 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ps.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ps.nut @@ -1,15 +1,27 @@ -global function GamemodePs_Init - -void function GamemodePs_Init() -{ - Riff_ForceTitanAvailability( eTitanAvailability.Never ) - - AddCallback_OnPlayerKilled( GiveScoreForPlayerKill ) - ScoreEvent_SetupEarnMeterValuesForMixedModes() -} - -void function GiveScoreForPlayerKill( entity victim, entity attacker, var damageInfo ) -{ - if ( victim != attacker && victim.IsPlayer() && attacker.IsPlayer() ) - AddTeamScore( attacker.GetTeam(), 1 ) +global function GamemodePs_Init
+
+void function GamemodePs_Init()
+{
+ Riff_ForceTitanAvailability( eTitanAvailability.Never )
+
+ AddCallback_OnPlayerKilled( GiveScoreForPlayerKill )
+ ScoreEvent_SetupEarnMeterValuesForMixedModes()
+ SetTimeoutWinnerDecisionFunc( CheckScoreForDraw )
+
+}
+
+void function GiveScoreForPlayerKill( entity victim, entity attacker, var damageInfo )
+{
+ if ( victim != attacker && victim.IsPlayer() && attacker.IsPlayer() || GetGameState() != eGameState.Playing )
+ AddTeamScore( attacker.GetTeam(), 1 )
+}
+
+int function CheckScoreForDraw()
+{
+ if (GameRules_GetTeamScore(TEAM_IMC) > GameRules_GetTeamScore(TEAM_MILITIA))
+ return TEAM_IMC
+ else if (GameRules_GetTeamScore(TEAM_MILITIA) > GameRules_GetTeamScore(TEAM_IMC))
+ return TEAM_MILITIA
+
+ return TEAM_UNASSIGNED
}
\ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut index cef0af6b..3bc11c3a 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_speedball.nut @@ -25,6 +25,7 @@ void function GamemodeSpeedball_Init() AddCallback_OnTouchHealthKit( "item_flag", OnFlagCollected ) AddCallback_OnPlayerKilled( OnPlayerKilled ) SetTimeoutWinnerDecisionFunc( TimeoutCheckFlagHolder ) + AddCallback_OnRoundEndCleanup ( ResetFlag ) ClassicMP_SetCustomIntro( ClassicMP_DefaultNoIntro_Setup, ClassicMP_DefaultNoIntro_GetLength() ) ClassicMP_ForceDisableEpilogue( true ) @@ -103,7 +104,9 @@ void function DropFlag() file.flag.ClearParent() file.flag.SetAngles( < 0, 0, 0 > ) SetGlobalNetEnt( "flagCarrier", file.flag ) - EmitSoundOnEntityOnlyToPlayer( file.flagCarrier, file.flagCarrier, "UI_CTF_1P_FlagDrop" ) + + if ( IsValid( file.flagCarrier ) ) + EmitSoundOnEntityOnlyToPlayer( file.flagCarrier, file.flagCarrier, "UI_CTF_1P_FlagDrop" ) foreach ( entity player in GetPlayerArray() ) MessageToPlayer( player, eEventNotifications.SPEEDBALL_FlagDropped, file.flagCarrier ) @@ -127,4 +130,4 @@ int function TimeoutCheckFlagHolder() return TEAM_UNASSIGNED return file.flagCarrier.GetTeam() -}
\ No newline at end of file +} diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_tdm.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_tdm.nut index 5dd8a403..ba180790 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_tdm.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_tdm.nut @@ -1,20 +1,31 @@ -global function GamemodeTdm_Init -global function RateSpawnpoints_Directional - -void function GamemodeTdm_Init() -{ - AddCallback_OnPlayerKilled( GiveScoreForPlayerKill ) - ScoreEvent_SetupEarnMeterValuesForMixedModes() -} - -void function GiveScoreForPlayerKill( entity victim, entity attacker, var damageInfo ) -{ - if ( victim != attacker && victim.IsPlayer() && attacker.IsPlayer() ) - AddTeamScore( attacker.GetTeam(), 1 ) -} - -void function RateSpawnpoints_Directional( int checkclass, array<entity> spawnpoints, int team, entity player ) -{ - // temp - RateSpawnpoints_Generic( checkclass, spawnpoints, team, player ) +global function GamemodeTdm_Init
+global function RateSpawnpoints_Directional
+
+void function GamemodeTdm_Init()
+{
+ AddCallback_OnPlayerKilled( GiveScoreForPlayerKill )
+ ScoreEvent_SetupEarnMeterValuesForMixedModes()
+ SetTimeoutWinnerDecisionFunc( CheckScoreForDraw )
+}
+
+void function GiveScoreForPlayerKill( entity victim, entity attacker, var damageInfo )
+{
+ if ( victim != attacker && victim.IsPlayer() && attacker.IsPlayer() || GetGameState() != eGameState.Playing )
+ AddTeamScore( attacker.GetTeam(), 1 )
+}
+
+void function RateSpawnpoints_Directional( int checkclass, array<entity> spawnpoints, int team, entity player )
+{
+ // temp
+ RateSpawnpoints_Generic( checkclass, spawnpoints, team, player )
+}
+
+int function CheckScoreForDraw()
+{
+ if (GameRules_GetTeamScore(TEAM_IMC) > GameRules_GetTeamScore(TEAM_MILITIA))
+ return TEAM_IMC
+ else if (GameRules_GetTeamScore(TEAM_MILITIA) > GameRules_GetTeamScore(TEAM_IMC))
+ return TEAM_MILITIA
+
+ return TEAM_UNASSIGNED
}
\ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut index 9e5d95ba..c72fcb0d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_gamemode_ttdm.nut @@ -1,76 +1,87 @@ -global function GamemodeTTDM_Init - -const float TTDMIntroLength = 15.0 - -void function GamemodeTTDM_Init() -{ - Riff_ForceSetSpawnAsTitan( eSpawnAsTitan.Always ) - Riff_ForceTitanExitEnabled( eTitanExitEnabled.Never ) - TrackTitanDamageInPlayerGameStat( PGS_ASSAULT_SCORE ) - ScoreEvent_SetupEarnMeterValuesForMixedModes() - SetLoadoutGracePeriodEnabled( false ) - - ClassicMP_SetCustomIntro( TTDMIntroSetup, TTDMIntroLength ) - ClassicMP_ForceDisableEpilogue( true ) - - AddCallback_OnPlayerKilled( AddTeamScoreForPlayerKilled ) // dont have to track autotitan kills since you cant leave your titan in this mode - - // probably needs scoreevent earnmeter values -} - -void function TTDMIntroSetup() -{ - // this should show intermission cam for 15 sec in prematch, before spawning players as titans - AddCallback_GameStateEnter( eGameState.Prematch, TTDMIntroStart ) - AddCallback_OnClientConnected( TTDMIntroShowIntermissionCam ) -} - -void function TTDMIntroStart() -{ - thread TTDMIntroStartThreaded() -} - -void function TTDMIntroStartThreaded() -{ - ClassicMP_OnIntroStarted() - - foreach ( entity player in GetPlayerArray() ) - TTDMIntroShowIntermissionCam( player ) - - wait TTDMIntroLength - - ClassicMP_OnIntroFinished() -} - -void function TTDMIntroShowIntermissionCam( entity player ) -{ - if ( GetGameState() != eGameState.Prematch ) - return - - thread PlayerWatchesTTDMIntroIntermissionCam( player ) -} - -void function PlayerWatchesTTDMIntroIntermissionCam( entity player ) -{ - ScreenFadeFromBlack( player ) - - entity intermissionCam = GetEntArrayByClass_Expensive( "info_intermission" )[ 0 ] - - // the angle set here seems sorta inconsistent as to whether it actually works or just stays at 0 for some reason - player.SetObserverModeStaticPosition( intermissionCam.GetOrigin() ) - player.SetObserverModeStaticAngles( intermissionCam.GetAngles() ) - player.StartObserverMode( OBS_MODE_STATIC_LOCKED ) - - wait TTDMIntroLength - - RespawnAsTitan( player, false ) - TryGameModeAnnouncement( player ) -} - -void function AddTeamScoreForPlayerKilled( entity victim, entity attacker, var damageInfo ) -{ - if ( victim == attacker || !victim.IsPlayer() || !attacker.IsPlayer() ) - return - - AddTeamScore( GetOtherTeam( victim.GetTeam() ), 1 ) +global function GamemodeTTDM_Init
+
+const float TTDMIntroLength = 15.0
+
+void function GamemodeTTDM_Init()
+{
+ Riff_ForceSetSpawnAsTitan( eSpawnAsTitan.Always )
+ Riff_ForceTitanExitEnabled( eTitanExitEnabled.Never )
+ TrackTitanDamageInPlayerGameStat( PGS_ASSAULT_SCORE )
+ ScoreEvent_SetupEarnMeterValuesForMixedModes()
+ SetLoadoutGracePeriodEnabled( false )
+
+ ClassicMP_SetCustomIntro( TTDMIntroSetup, TTDMIntroLength )
+ ClassicMP_ForceDisableEpilogue( true )
+ SetTimeoutWinnerDecisionFunc( CheckScoreForDraw )
+
+ AddCallback_OnPlayerKilled( AddTeamScoreForPlayerKilled ) // dont have to track autotitan kills since you cant leave your titan in this mode
+
+ // probably needs scoreevent earnmeter values
+}
+
+void function TTDMIntroSetup()
+{
+ // this should show intermission cam for 15 sec in prematch, before spawning players as titans
+ AddCallback_GameStateEnter( eGameState.Prematch, TTDMIntroStart )
+ AddCallback_OnClientConnected( TTDMIntroShowIntermissionCam )
+}
+
+void function TTDMIntroStart()
+{
+ thread TTDMIntroStartThreaded()
+}
+
+void function TTDMIntroStartThreaded()
+{
+ ClassicMP_OnIntroStarted()
+
+ foreach ( entity player in GetPlayerArray() )
+ TTDMIntroShowIntermissionCam( player )
+
+ wait TTDMIntroLength
+
+ ClassicMP_OnIntroFinished()
+}
+
+void function TTDMIntroShowIntermissionCam( entity player )
+{
+ if ( GetGameState() != eGameState.Prematch )
+ return
+
+ thread PlayerWatchesTTDMIntroIntermissionCam( player )
+}
+
+void function PlayerWatchesTTDMIntroIntermissionCam( entity player )
+{
+ ScreenFadeFromBlack( player )
+
+ entity intermissionCam = GetEntArrayByClass_Expensive( "info_intermission" )[ 0 ]
+
+ // the angle set here seems sorta inconsistent as to whether it actually works or just stays at 0 for some reason
+ player.SetObserverModeStaticPosition( intermissionCam.GetOrigin() )
+ player.SetObserverModeStaticAngles( intermissionCam.GetAngles() )
+ player.StartObserverMode( OBS_MODE_STATIC_LOCKED )
+
+ wait TTDMIntroLength
+
+ RespawnAsTitan( player, false )
+ TryGameModeAnnouncement( player )
+}
+
+void function AddTeamScoreForPlayerKilled( entity victim, entity attacker, var damageInfo )
+{
+ if ( victim == attacker || !victim.IsPlayer() || !attacker.IsPlayer() || GetGameState() != eGameState.Playing )
+ return
+
+ AddTeamScore( GetOtherTeam( victim.GetTeam() ), 1 )
+}
+
+int function CheckScoreForDraw()
+{
+ if (GameRules_GetTeamScore(TEAM_IMC) > GameRules_GetTeamScore(TEAM_MILITIA))
+ return TEAM_IMC
+ else if (GameRules_GetTeamScore(TEAM_MILITIA) > GameRules_GetTeamScore(TEAM_IMC))
+ return TEAM_MILITIA
+
+ return TEAM_UNASSIGNED
}
\ No newline at end of file diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut index 78dec3d1..8e624c14 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_classic_mp_dropship_intro.gnut @@ -125,6 +125,8 @@ void function EndIntroWhenFinished() void function SpawnPlayerIntoDropship( entity player ) { + player.EndSignal( "OnDestroy" ) + if ( IsAlive( player ) ) player.Die() // kill them so we don't have any issues respawning them later @@ -148,7 +150,6 @@ void function SpawnPlayerIntoDropship( entity player ) WaitFrame() player.EndSignal( "OnDeath" ) - player.EndSignal( "OnDestroy" ) // find the player's dropship and seat array<IntroDropship> teamDropships @@ -179,6 +180,7 @@ void function SpawnPlayerIntoDropship( entity player ) // respawn player and holster their weapons so they aren't out player.RespawnPlayer( null ) + HolsterAndDisableWeapons(player) player.DisableWeaponViewModel() // hide hud and fade screen out from black @@ -186,7 +188,7 @@ void function SpawnPlayerIntoDropship( entity player ) ScreenFadeFromBlack( player, 0.5, 0.5 ) // faction leaders are done clientside, spawn them here Remote_CallFunction_NonReplay( player, "ServerCallback_SpawnFactionCommanderInDropship", playerDropship.dropship.GetEncodedEHandle(), file.introStartTime ) - + // do firstperson sequence FirstPersonSequenceStruct idleSequence idleSequence.firstPersonAnim = DROPSHIP_IDLE_ANIMS_POV[ playerDropshipIndex ] @@ -228,6 +230,7 @@ void function PlayerJumpsFromDropship( entity player ) // show weapon viewmodel and hud and let them move again player.MovementEnable() player.EnableWeaponViewModel() + DeployAndEnableWeapons(player) RemoveCinematicFlag( player, CE_FLAG_CLASSIC_MP_SPAWNING ) } }) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_titan_transfer.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_titan_transfer.nut index 7b126cd0..c84e6aba 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_titan_transfer.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_titan_transfer.nut @@ -178,7 +178,12 @@ void function GiveWeaponsFromStoredArray( entity player, array<StoredWeapon> sto UpdateProScreen( player, weapon ) } - string weaponCategory = GetWeaponInfoFileKeyField_GlobalString( weapon.GetWeaponClassName(), "menu_category" ) + string weaponCategory = "" + if ( IsWeaponKeyFieldDefined(weapon.GetWeaponClassName(), "menu_category") ) + { + weaponCategory = GetWeaponInfoFileKeyField_GlobalString( weapon.GetWeaponClassName(), "menu_category" ) + } + if ( weaponCategory == "at" || weaponCategory == "special" ) // refill AT/grenadier ammo stockpile { int defaultTotal = weapon.GetWeaponSettingInt( eWeaponVar.ammo_default_total ) |