mirror of
https://github.com/sp-tarkov/server.git
synced 2025-02-12 22:30:43 -05:00
Merge branch 'master' of https://dev.sp-tarkov.com/SPT-AKI/Server into 3.9.0-DEV
# Conflicts: # project/assets/configs/core.json # project/package.json # project/src/models/eft/common/IGlobals.ts # project/src/routers/dynamic/BundleDynamicRouter.ts
This commit is contained in:
commit
d95423b0f1
@ -1283,9 +1283,9 @@
|
||||
"FaceCover": 75
|
||||
},
|
||||
"equipmentMods": {
|
||||
"left_side_plate": 90,
|
||||
"right_side_plate": 90,
|
||||
"mod_equipment": 75,
|
||||
"left_side_plate": 95,
|
||||
"right_side_plate": 95,
|
||||
"mod_equipment": 85,
|
||||
"mod_equipment_000": 80,
|
||||
"mod_equipment_001": 75,
|
||||
"mod_equipment_002": 90,
|
||||
@ -1293,7 +1293,7 @@
|
||||
},
|
||||
"weaponMods": {
|
||||
"mod_scope": 95,
|
||||
"mod_muzzle": 75,
|
||||
"mod_muzzle": 85,
|
||||
"mod_muzzle_000": 95,
|
||||
"mod_muzzle_001": 95
|
||||
},
|
||||
|
@ -84,13 +84,13 @@
|
||||
"right_side_plate": 75
|
||||
},
|
||||
"weaponMods": {
|
||||
"mod_barrel": 100,
|
||||
"mod_barrel": 75,
|
||||
"mod_bipod": 100,
|
||||
"mod_catch": 25,
|
||||
"mod_charge": 60,
|
||||
"mod_flashlight": 75,
|
||||
"mod_foregrip": 65,
|
||||
"mod_gas_block": 100,
|
||||
"mod_gas_block": 75,
|
||||
"mod_hammer": 25,
|
||||
"mod_handguard": 85,
|
||||
"mod_launcher": 20,
|
||||
@ -2496,7 +2496,9 @@
|
||||
"LuckyCharmT",
|
||||
"Rena-chan",
|
||||
"HB",
|
||||
"John Pork"
|
||||
"John Pork",
|
||||
"Big Chungus",
|
||||
"Floppa"
|
||||
],
|
||||
"generation": {
|
||||
"items": {
|
||||
|
@ -81,13 +81,13 @@
|
||||
"right_side_plate": 75
|
||||
},
|
||||
"weaponMods": {
|
||||
"mod_barrel": 100,
|
||||
"mod_barrel": 75,
|
||||
"mod_bipod": 100,
|
||||
"mod_catch": 25,
|
||||
"mod_charge": 60,
|
||||
"mod_flashlight": 75,
|
||||
"mod_foregrip": 65,
|
||||
"mod_gas_block": 100,
|
||||
"mod_gas_block": 75,
|
||||
"mod_hammer": 25,
|
||||
"mod_handguard": 85,
|
||||
"mod_launcher": 20,
|
||||
@ -2493,7 +2493,9 @@
|
||||
"LuckyCharmT",
|
||||
"Rena-chan",
|
||||
"HB",
|
||||
"John Pork"
|
||||
"John Pork",
|
||||
"Big Chungus",
|
||||
"Floppa"
|
||||
],
|
||||
"generation": {
|
||||
"items": {
|
||||
|
@ -199,6 +199,7 @@
|
||||
"repeatable-difficulty_was_nan": "Wiederholbar - Belohnungsgenerierung: Schwierigkeitsgrad wurde nicht als Zahl angegeben. Stelle ein auf 1.",
|
||||
"repeatable-no_reward_item_found_in_price_range": "Wiederholbar - Belohnungsgenerierung: Kein Artikel im Preisbereich {{minPrice}} bis {{roublesBudget}} gefunden",
|
||||
"repeatable-quest_handover_failed_condition_already_satisfied": "Quest-Übergabefehler: Bedingung bereits erfüllt? qid: {{questId}}, Bedingung: {{conditionId}}, ProfileCounter:{{profileCounter}}, Wert:{{value}}",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "Übergabefehler bei der Quest: Bedingung nicht gefunden oder fehlerhafter Wert. qid: {{body.qid}}, Bedingung: {{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "Die Quest kann nicht angenommen werden. Weitere Informationen finden Sie im Serverprotokoll",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "Quest kann nicht angenommen werden: {{questId}}. Nachrichtentext für gestartete Quest mit der ID: {{messageId}} kann nicht gefunden werden",
|
||||
"route_onupdate_no_response": "onUpdate: %s Weg meldet weder Erfolg noch Fehler",
|
||||
@ -530,6 +531,8 @@
|
||||
"pmcresponse-killer_negative_28": "Keine Sorge, ich habe deine Ausrüstung im Haus deiner Mutter versteckt",
|
||||
"pmcresponse-killer_negative_29": "Hast du es überhaupt versucht",
|
||||
"pmcresponse-killer_negative_30": "Ich wette, du hast tatsächlich 250 große für die neue Edition ausgegeben",
|
||||
"pmcresponse-killer_negative_31": "Von einer Ratte erwischt",
|
||||
"pmcresponse-killer_negative_32": "Rattenangriff",
|
||||
"pmcresponse-killer_plead_1": "Ich habe versucht, einen Questgegenstand bei mir und du warst mir im Weg",
|
||||
"pmcresponse-killer_plead_2": "Ich habe Fass-Caches geplündert und du warst im Weg, sorry",
|
||||
"pmcresponse-killer_plead_3": "Ich brauche PMC-Kills, du hast sicher Verständnis",
|
||||
|
@ -199,6 +199,7 @@
|
||||
"repeatable-difficulty_was_nan": "Génération des récompenses : la difficulté est NaN. Remis à 1.",
|
||||
"repeatable-no_reward_item_found_in_price_range": "Génération de Récompenses Répétitives: Aucun objet trouvé dans la fourchette de prix {{minPrice}} à {{roublesBudget}}",
|
||||
"repeatable-quest_handover_failed_condition_already_satisfied": "Erreur sur item de quête: la condition est déjà remplie? qid: {{questId}}, condition: {{conditionId}}, profileCounter:{{profileCounter}}, value:{{value}}",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "Erreur de transmission de quête : condition introuvable ou valeur incorrecte. qid : {{body.qid}}, condition : {{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "Impossible d'accepter la quête, plus de détail dans le serveur log",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "Impossible d'acepter la quête: {{questId}} le message de démarrage de quête est introuvable. Son ID id: {{messageId}}",
|
||||
"route_onupdate_no_response": "onUpdate: %s route ne reporte pas succès ou échec",
|
||||
@ -208,7 +209,7 @@
|
||||
"scheduled_event_failed_to_run": "événement programmé : '%s' n'a pas été lancé avec succès.",
|
||||
"seasonal-missing_equipment_slot_on_bot": "Impossible de retirer l'item spécial Noël: {{equipmentSlot}} car il n'a pas été trouvé sur le bot: {{botRole}}",
|
||||
"seasonal-missing_loot_container_slot_on_bot": "Impossible de retirer le loot spécial Noël dans: {{lootContainer}} car il n'a pas été trouvé sur le bot: {{botRole}}",
|
||||
"server_running": "Le serveur est lancé",
|
||||
"server_running": "Le serveur est en cours d'exécution, ne le fermez pas pendant que vous jouez à SPT",
|
||||
"server_start_meme_1": "Vie, Ris, Aime",
|
||||
"server_start_meme_2": "Les animés c'est sympa non ?",
|
||||
"server_start_meme_3": "ACHTUNG ! C'EST LA GUEEEEEERRE\nSi tu peux m'entendre , tu as besoin de te réveiller",
|
||||
@ -309,25 +310,25 @@
|
||||
"pmcresponse-victim_positive_45": "Propre ton kill {{playerName}}, j'étais planqué mais tu as trouvé le bon angle",
|
||||
"pmcresponse-victim_positive_46": "J'ai même pas vu d'où tu tirais, tu te cachais où ?",
|
||||
"pmcresponse-victim_positive_47": "Ta planque est excellente, tu as quelques conseils sur comment les choisir ?",
|
||||
"pmcresponse-victim_positive_48": "Ton timing était impeccable, j'aimerai de connaître ta stratégie",
|
||||
"pmcresponse-victim_positive_48": "Ton timing était impeccable, j'aimerais bien connaître ta stratégie",
|
||||
"pmcresponse-victim_positive_49": "Je ne peux pas croire que tu m'aies contourné aussi facilement... quel est ton secret ?",
|
||||
"pmcresponse-victim_positive_50": "Ta visée est impressionnante, t'as des conseils à donner ?",
|
||||
"pmcresponse-victim_positive_51": "Toi tu gères comment te diriger sur la map. Comment t'as eu ces infos ?",
|
||||
"pmcresponse-victim_positive_52": "Comment tu fais pour être aussi silencieux pendant que tu bouge ?",
|
||||
"pmcresponse-victim_positive_51": "Toi tu sais bien te diriger sur la map. T'as des conseils ?",
|
||||
"pmcresponse-victim_positive_52": "Comment tu fais pour être aussi silencieux pendant que tu bouges ?",
|
||||
"pmcresponse-victim_positive_53": "Ton temps de réaction était vraiment rapide ! T'as des conseils pour que je m'améliore ?",
|
||||
"pmcresponse-victim_positive_54": "On dirait que tu connais les meilleurs endroits pour les embuscades. Ça te dirait de partager ?",
|
||||
"pmcresponse-victim_positive_55": "J'ai remarqué que tu maitrises bien cette arme, qu'est-ce que tu me conseilles ?",
|
||||
"pmcresponse-victim_positive_56": "Comment t'as fait pour te faufiler derrière moi sans que je puisse t'entendre ?",
|
||||
"pmcresponse-victim_positive_57": "T'as manié ce combat d'une main de maitre. Ta des conseils",
|
||||
"pmcresponse-victim_positive_57": "Tu as manié ce combat d'une main de maitre. Tu as des conseils ?",
|
||||
"pmcresponse-victim_positive_58": "Ta visée est dingue, t'as quoi comme souris ?",
|
||||
"pmcresponse-victim_positive_59": "Comment t'as fait pour passer incognito ? T'es un ninja ou quoi ?",
|
||||
"pmcresponse-victim_positive_60": "Comment diable as tu cette faculté aussi sournoise que silencieuce de te deplacer ainsi ?",
|
||||
"pmcresponse-victim_positive_59": "Mec, t'es un vrai ninja dans ce jeu. Comment es-tu devenu si bon ?",
|
||||
"pmcresponse-victim_positive_60": "Quel diable sournois ! Des conseils sur la furtivité ?",
|
||||
"pmcresponse-victim_positive_61": "Tu as été plus rapide que moi. C'est quoi ton truc ?",
|
||||
"pmcresponse-victim_positive_62": "Tu te cache vraiment comme un caméléon. Balance moi t'es infos",
|
||||
"pmcresponse-victim_positive_63": "Comment tu fais pour être aussi bon avec cette arme ?",
|
||||
"pmcresponse-victim_positive_62": "Tu te caches vraiment comme un caméléon. Balance-moi tes infos",
|
||||
"pmcresponse-victim_positive_63": "Comment tu fais pour être aussi bon avec cette arme ? Va falloir m'expliquer là",
|
||||
"pmcresponse-victim_positive_64": "Tu étais imperceptible comme une ombre. Apprends-moi",
|
||||
"pmcresponse-victim_positive_65": "J'arrive pas à croire comment tu m'as eu. Bien joué",
|
||||
"pmcresponse-victim_positive_66": "Tu joue vraiment bien ! On devrait jouer en duo si ça te tente",
|
||||
"pmcresponse-victim_positive_66": "Tu joues vraiment bien ! On devrait jouer en duo si ça te tente",
|
||||
"pmcresponse-victim_positive_67": "Toi tu sais ce que tu fais, faisons un raid ensemble un de ces 4",
|
||||
"pmcresponse-victim_negative_1": "Sympa ton aimbot",
|
||||
"pmcresponse-victim_negative_2": "Mouais facile le kill",
|
||||
@ -349,17 +350,17 @@
|
||||
"pmcresponse-victim_negative_18": "J'espère que tu t'es bien planté sur le flea en vendant mon loot",
|
||||
"pmcresponse-victim_negative_19": "Si j'avais ton level j'aurais mieux joué que toi",
|
||||
"pmcresponse-victim_negative_20": "Ptain mon arme s'est enrayée t'as du pot",
|
||||
"pmcresponse-victim_negative_21": "Mais t'es trop un camper wesh",
|
||||
"pmcresponse-victim_negative_21": "Guette la taille du rat",
|
||||
"pmcresponse-victim_negative_22": "bien de camper comme ça ? Tu ne sais pas jouer autrement ?",
|
||||
"pmcresponse-victim_negative_23": "Je te souhaite de te péter l'orteil sur un coin de meuble",
|
||||
"pmcresponse-victim_negative_24": "Mais pourquoi tu m'as tué ?? Je vais aller le dire à ma mère",
|
||||
"pmcresponse-victim_negative_25": "Je t'ai report, bien fait",
|
||||
"pmcresponse-victim_negative_26": "Ma mère pense que j'aurais du gagner",
|
||||
"pmcresponse-victim_negative_26": "Ma mère pense que j'aurais dû gagner",
|
||||
"pmcresponse-victim_negative_27": "Wow tuer un joueur débutant, tu dois te sentir tellement fort hein ?",
|
||||
"pmcresponse-victim_negative_28": "Je parie que tu joues à Spt car tu triches en ligne ",
|
||||
"pmcresponse-victim_negative_29": "Bah oui le head-eyes, mr le tricheur",
|
||||
"pmcresponse-victim_negative_30": "Sympa le cheat pour taper la tête direct",
|
||||
"pmcresponse-victim_negative_31": "Si j'étais pas pauvre ingame je t'aurais eclaté",
|
||||
"pmcresponse-victim_negative_31": "Si je n'étais pas pauvre ingame je t'aurais éclaté",
|
||||
"pmcresponse-victim_negative_32": "Tu m'as tué mais t'avais vu que j'avais une black keycard lol, j'suis sûr que non",
|
||||
"pmcresponse-victim_negative_33": "Tu m'as eu mais t'as pas vu que j'avais planqué une thermique ahah",
|
||||
"pmcresponse-victim_negative_34": "Mais putain j'ai arrêté de jouer sur le Live et y'a encore des cheaters sur SPT ! Sérieux ?",
|
||||
@ -391,15 +392,15 @@
|
||||
"pmcresponse-victim_negative_60": "J'ai tout juste eu le temps de me foutre mes items dans le cul, et ouais pas de loot pour toi",
|
||||
"pmcresponse-victim_negative_61": "Ma gamma était remplie, j'suis sur que la tienne non",
|
||||
"pmcresponse-victim_negative_62": "Tu fais le rat",
|
||||
"pmcresponse-victim_negative_63": "Gros rat que t'es",
|
||||
"pmcresponse-victim_negative_63": "Guette la taille du rat",
|
||||
"pmcresponse-victim_negative_64": "T'as réussi à m'avoir parce que le jeu lag, sache que je ne perds jamais",
|
||||
"pmcresponse-victim_negative_65": "Eh bah, t'aime bien abuser de la desync toi",
|
||||
"pmcresponse-victim_negative_66": "Il était temps que tu fasse un kill Titouan",
|
||||
"pmcresponse-victim_negative_67": "Je parrie que t'as reglé L'IA sur 'tres facile'",
|
||||
"pmcresponse-victim_negative_66": "Il était temps que tu fasses un kill Titouan",
|
||||
"pmcresponse-victim_negative_67": "Je parie que t'as réglé L'IA sur 'très facile'",
|
||||
"pmcresponse-victim_negative_68": "Tu as juste gagné parce que j'étais occupé",
|
||||
"pmcresponse-victim_negative_69": "Moule shot",
|
||||
"pmcresponse-victim_negative_70": "T'as surement pas été rentable d'avoir tiré autant de balles pour me looter",
|
||||
"pmcresponse-victim_negative_71": "Ah ouais tu joue ta vie tellement que ton ratio est naze",
|
||||
"pmcresponse-victim_negative_71": "Ah ouais tu joues ta vie tellement que ton ratio est naze",
|
||||
"pmcresponse-victim_negative_72": "Un mec qui utilise la meta de 2019, Ouah la honte",
|
||||
"pmcresponse-victim_negative_73": "Ouaaah tu ma eu, tay trow faure apren moi komen on jou",
|
||||
"pmcresponse-victim_negative_74": "Je déteste les campeurs dans ton genre qui ruine le jeu",
|
||||
@ -430,9 +431,10 @@
|
||||
"pmcresponse-victim_negative_99": "Ton ordi est tellement nul que tu ne dépasses pas les 20 fps dans rues",
|
||||
"pmcresponse-victim_negative_100": "Je parie que tu as installé SAIN et que tu as dû l’enlever parce que tu te faisais trop tuer",
|
||||
"pmcresponse-victim_negative_101": "Qu'est-ce que tu viens de putain de dire de moi le p'tit Scav? Je te ferais savoir que j'ai été diplômé premier de ma classe dans le corps USEC, que j'ai fait partie de nombreux raids secrets sur les {{playerSide}}s et que j'ai plus de 300 kills confirmés ! Je suis formé au combat guérilla et je suis le meilleur sniper de toutes les forces USEC. Tu n'est rien d'autre qu'une cible comme un autre pour moi. Je vais te putain de bousiller avec une précision comme tu n'en as jamais vu dans ce raid, marque mes putains de mots! Tu pense que tu peux tu me peux dire cette merde dans la fenetre de chat? Et bien détrompe toi connard. Je suis en train de contacter mon réseau secret d'espions sur Customs et ton stash est en train d'être tracé à l'instant donc tu devrais de préparer pour l'orage asticot. L'orage qui va anéantir la chose pathétique que tu appelle ta vie. T'es putain de mort Scav. Je peux être partout, tout le temps et je peux te tuer de plus de spet-cents façons et ça ce n'est qu'avec mes mains nues. Non seulement je suis intensivement formé dans le combat à mains nues mais j'ai accès à l'arsenal entier du corps USEC et je vais l'utiliser dans son étendue complète pour effacer ta face misérable de la carte petite merde. Si seulement t'aurais pu savoir le châtiment impie que ton petit kill 'intelligent' allait abatre sur toi tu l'aurais peut-être fermée. Mais tu n'as pas pu, tu ne l'as pas fait, et maintenant tu en paies le prix sombre imbecile. Je vais te chier ma furie dessus et tu vas te noyer dedans. T'es putain de mort, Scav.",
|
||||
"pmcresponse-victim_negative_102": "Je parie que tu as acheté cette nouvelle édition juste pour les poches plus grandes",
|
||||
"pmcresponse-victim_plead_1": "Mais putain laissez-moi faire cette quête de merde",
|
||||
"pmcresponse-victim_plead_2": "Non mais je veux juste faire la quête, laisse-moi tranquille quoi",
|
||||
"pmcresponse-victim_plead_3": "Et voilà maintenant j'ai plus de tunne ingame, merci mec",
|
||||
"pmcresponse-victim_plead_3": "Et voilà maintenant j'ai plus de thune ingame, merci mec",
|
||||
"pmcresponse-victim_plead_4": "Tu fous quoi frère, je viens de commencer le jeu !",
|
||||
"pmcresponse-victim_plead_5": "Non mais sérieux ! J'arriverai jamais à finir cette quête à la con. VDM",
|
||||
"pmcresponse-victim_plead_6": "T'as planqué mon loot au moins ?",
|
||||
@ -444,7 +446,7 @@
|
||||
"pmcresponse-victim_plead_12": "J'étais parti me faire à bouffer, pourquoi tu m'as tué là ?",
|
||||
"pmcresponse-victim_plead_13": "mec sérieux...",
|
||||
"pmcresponse-victim_plead_14": "Allez vas-y, je vais revenir avec des mods de fou, tu vas prendre trop cher",
|
||||
"pmcresponse-victim_plead_15": "Faut pas tirer que je suis friendly, abusé quoi",
|
||||
"pmcresponse-victim_plead_15": "T'en bas les couilles du wiggle ou ? je suis friendly abusé quoi",
|
||||
"pmcresponse-victim_plead_16": "Ok jpp de SPT, je repars jouer à roblox",
|
||||
"pmcresponse-victim_plead_17": "Le wiggle c'est pour dire que je suis friendly, tu ne comprends rien toi",
|
||||
"pmcresponse-victim_plead_18": "MEC POURQUOI ??",
|
||||
@ -528,6 +530,9 @@
|
||||
"pmcresponse-killer_negative_27": "Loot facile du jour",
|
||||
"pmcresponse-killer_negative_28": "Ne t'inquiète pas, j'ai stocker ton équipement chez ta mère",
|
||||
"pmcresponse-killer_negative_29": "Essayez-vous même",
|
||||
"pmcresponse-killer_negative_30": "Je parie que tu as vraiment payé 250 gros billets pour cette nouvelle édition",
|
||||
"pmcresponse-killer_negative_31": "Se faire ratonner",
|
||||
"pmcresponse-killer_negative_32": "Attaque de rat",
|
||||
"pmcresponse-killer_plead_1": "Ah déso mais j'avais un objet de quête sur moi, pas le temps de faire le con",
|
||||
"pmcresponse-killer_plead_2": "J'étais en train de loot et tu me gênais, c'est moche hein ?",
|
||||
"pmcresponse-killer_plead_3": "J'ai besoin de kill PMC pour mon ratio, heureusement que t'es là",
|
||||
@ -576,6 +581,7 @@
|
||||
"pmc-name_prefix_33": "Chef",
|
||||
"pmc-name_prefix_34": "Futé",
|
||||
"pmc-name_prefix_35": "Sérieux",
|
||||
"pmc-name_prefix_36": "Portable",
|
||||
"pmc-name_prefix_37": "Douteux",
|
||||
"pmc-name_prefix_38": "Gênant",
|
||||
"pmc-name_prefix_39": "Humide",
|
||||
@ -590,11 +596,11 @@
|
||||
"pmc-name_prefix_48": "Gonflé",
|
||||
"pmc-name_prefix_49": "Louche",
|
||||
"launcher-profile_standard": "Edition Standard, stash basique (10x28), 500 000 roubles",
|
||||
"launcher-profile_leftbehind": "Edition Left Behind, stash moyenne (10x38), équipement en plus, 500 dollars",
|
||||
"launcher-profile_leftbehind": "Similaire à la Standard Edition avec; une stash plus grande (10x38), plus d'équipements/items, 500 dollars",
|
||||
"launcher-profile_preparetoescape": "Edition Prepare for Escape, stash grande (10x48), plus d'équipement, meilleure rép de démarrage vendeurs, 250 euros",
|
||||
"launcher-profile-edgeofdarkness": "Edition EoD, stash de taille maximale (10x68), un max d'équipement, gros boost avec la rép des traders, 1000 dollars, 500 euros",
|
||||
"launcher-profile_spteasystart": "Beaucoup de Roubles/Dollars/Euros, quelques skills QdV au level 20, la réputation des marchands est maxée, démarrage level 15, pas de quêtes complétées. ",
|
||||
"launcher-profile_sptzerotohero": "SPT zero to hero ! Tu démarres avec rien, juste ta bite et ton couteau ! Aucune quête validée",
|
||||
"launcher-profile_sptzerotohero": "Débute avec presque rien, pas d'argent, pas de rép traders, 1 couteau, aucune quête complétée",
|
||||
"launcher-profile_sptdeveloper": "SPT dév/testing/debug, lvl 69, max Roubles/Dollars/Euros, USEC ==> toutes les quêtes prêtes à être débutées, BEAR ==> toutes les quêtes terminées prêtes à être validées, item balaclava d'invincibilité",
|
||||
"launcher-missing_property": "Profile: %s, propriété descriptionLocaleKey manquante",
|
||||
"release-beta-disclaimer": "En appuyant sur OK vous acceptez qu'aucune aide ne sera fournie et que cette version est uniquement prévue pour du débogage. PAS pour actuellement jouer. Les mods sont desactivés. Créer un nouveau profil peut être souvent nécessaire. Signalez tous les bugs dans le channel discord adéquat ou sur les pages dédiées du site web. Si vous ne pressez pas OK dans le temps imparti, le jeu se fermera.",
|
||||
|
@ -199,6 +199,7 @@
|
||||
"repeatable-difficulty_was_nan": "Herhaalbare beloning generatie: Moeilijkheid was NaN. Wordt op 1 gezet.",
|
||||
"repeatable-no_reward_item_found_in_price_range": "Herhaalbare beloning generatie: Geen item gevonden in prijs bereik {{minPrice}} tot {{roublesBudget}}",
|
||||
"repeatable-quest_handover_failed_condition_already_satisfied": "Missie overhandiging error: conditie is al behaald? qid: {{questId}}, condition: {{conditionId}}, profileCounter:{{profileCounter}}, value:{{value}}",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "Quest overdrachtsfout: voorwaarde niet gevonden of onjuiste waarde. qid: {{body.qid}}, voorwaarde: {{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "Kon missie niet accepteren, zie server log voor details",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "Kon missie niet accepteren: {{questId}} kan geen missie gestart bericht vinden met id: {{messageId}}",
|
||||
"route_onupdate_no_response": "onUpdate: %s route rapporteert geen success of faal",
|
||||
@ -530,6 +531,8 @@
|
||||
"pmcresponse-killer_negative_28": "Vrees niet, ik heb jouw spullen bij jouw moeder opgeslagen",
|
||||
"pmcresponse-killer_negative_29": "Deed je wel er moeite voor",
|
||||
"pmcresponse-killer_negative_30": "Ik wed dat je eigenlijk 250 grote euro's betaald hebt voor die nieuwe editie",
|
||||
"pmcresponse-killer_negative_31": "Gerat worden",
|
||||
"pmcresponse-killer_negative_32": "Rataanval",
|
||||
"pmcresponse-killer_plead_1": "Ik probeerde een missie item uit de raid te halen en je stond in de weg",
|
||||
"pmcresponse-killer_plead_2": "Ik was een vat aan het looten en je stond in de weg, sorry",
|
||||
"pmcresponse-killer_plead_3": "Ik heb PMC kills nodig, maar dat snap je wel",
|
||||
|
@ -199,6 +199,7 @@
|
||||
"repeatable-difficulty_was_nan": "Geração de Recompensa repetível: dificuldade foi NaN. Definindo para 1.",
|
||||
"repeatable-no_reward_item_found_in_price_range": "Geração de Recompensa repetível: nenhum item encontrado no intervalo de preços {{minPrice}} para {{roublesBudget}}",
|
||||
"repeatable-quest_handover_failed_condition_already_satisfied": "Erro de entrega de missões: condição já está satisfeita? qid: {{questId}}, condição: {{conditionId}}, profileCounter:{{profileCounter}}, valor:{{value}}",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "Erro na entrega da missão: condição não encontrada ou valor incorreto. qid: {{body.qid}}, condição: {{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "Não foi possível aceitar a missão, consulte o log do servidor para obter detalhes",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "Não é possível aceitar a missão: {{questId}} não é possível encontrar o texto da mensagem inicial com id: {{messageId}}",
|
||||
"route_onupdate_no_response": "onUpdate: %s route não relatou sucesso ou falha",
|
||||
@ -530,6 +531,8 @@
|
||||
"pmcresponse-killer_negative_28": "Não te preocupes, guardei o teu equipamento na casa da tua mãe",
|
||||
"pmcresponse-killer_negative_29": "Nem sequer estavas a tentar",
|
||||
"pmcresponse-killer_negative_30": "Aposto que você realmente pagou 250 pela nova edição",
|
||||
"pmcresponse-killer_negative_31": "Pego por um rato",
|
||||
"pmcresponse-killer_negative_32": "Ataque de rato",
|
||||
"pmcresponse-killer_plead_1": "Estava a tentar extrair com um item de missão e estavas no meu caminho",
|
||||
"pmcresponse-killer_plead_2": "Estava a dar loot em alguns caches e estavas no caminho, desculpa",
|
||||
"pmcresponse-killer_plead_3": "Preciso de matar alguns PMCs, espero que entendas",
|
||||
@ -596,7 +599,17 @@
|
||||
"launcher-profile_leftbehind": "O mesmo que a edição Standard com; inventário maior (10x38), itens/equipamento extra, 500 dólares",
|
||||
"launcher-profile_preparetoescape": "O mesmo que a edição Left Behind com; inventário maior (10x48), itens/equipamento extra, maior reputação com comerciantes, 250 euros",
|
||||
"launcher-profile-edgeofdarkness": "O mesmo que a edição Prepare To Escape com; inventário maior (10x68), itens/equipamento extra, maior reputação com comerciantes, 1000 dólares, 500 euros",
|
||||
"launcher-profile_spteasystart": "Muitos rublos/dólares/euros, algumas habilidades de QoL estão no nível 20, reputação com os comerciantes maximizada, nível inicial é 15, nenhuma missão completada",
|
||||
"launcher-profile_sptzerotohero": "Começa com quase nada, sem Rublos/Dólares/Euros, sem reputação com comerciantes, 1 faca, nenhuma missão concluída",
|
||||
"launcher-profile_sptdeveloper": "Perfil de teste, nível inicial 69, muitos Rublos/Dólares/Euros, USEC iniciam com todas missões prontas para começar, BEAR começam com todas missões prontas para entregar, balaclava de invencibilidade",
|
||||
"launcher-missing_property": "Perfil: %s não tem a propriedade descriptionLocaleKey"
|
||||
"launcher-missing_property": "Perfil: %s não tem a propriedade descriptionLocaleKey",
|
||||
"release-beta-disclaimer": "Ao pressionar OK, você concorda que não será oferecido suporte e que isso é apenas para teste de bugs. NÃO é para jogo real. Mods estão desativados. Novos perfis podem ser necessários com frequência. Reporte todos os bugs no canal de relatórios no Discord ou na página de problemas no site. Se você não pressionar OK até o tempo especificado, o jogo será fechado.",
|
||||
"release-beta-disclaimer-mods-enabled": "Ao pressionar OK, você concorda que nenhum suporte será oferecido e que isso é apenas para teste de bugs. NÃO é para jogo real. Mods estão ativados, NÃO reporte problemas com mods. NÃO peça aos autores dos mods por atualizações. Reporte todos os bugs no canal de relatórios no Discord ou na página de problemas no site. Se você não pressionar OK até o tempo especificado, o jogo será fechado.",
|
||||
"release-beta-disclaimer-accept": "O utilizador aceitou a declaração de beta",
|
||||
"release-server-mods-loaded": "Existem um ou mais mods de servidor num build com mods ativados, os relatórios serão inválidos até que sejam removidos. Veja no topo do servidor os mods de servidor carregados para remover e poder reportar problemas novamente.",
|
||||
"release-server-mods-debug-message": "Mods de servidor carregados",
|
||||
"release-plugins-loaded": "Existem um ou mais plugins num build com mods ativados, os relatórios serão inválidos até que sejam removidos. Consulte a lista seguinte para saber o que remover para poder reportar problemas novamente:",
|
||||
"release-plugins-loaded-debug-message": "Mods de cliente carregados",
|
||||
"release-illegal-plugins-loaded": "Foram detectados um ou mais plugins não autorizados. Mods não são permitidos nas versões BleedingEdge do SPT. Plugins ilegais:",
|
||||
"release-illegal-plugins-exception": "Foram detectados mods de cliente não-debug. Mods não são permitidos nas versões BleedingEdge do SPT - por favor, remova-os antes de jogar!"
|
||||
}
|
||||
|
@ -199,6 +199,7 @@
|
||||
"repeatable-difficulty_was_nan": "Повторяемая Генерация Вознаграждений: Сложность была NaN. Ставим на 1.",
|
||||
"repeatable-no_reward_item_found_in_price_range": "Генерация вознаграждений за оперативные задачи: Не найден предмет в ценовом диапазоне от {{minPrice}} до {{roublesBudget}}",
|
||||
"repeatable-quest_handover_failed_condition_already_satisfied": "Ошибка выдачи квеста: условие уже выполнено? qid: {{questId}}, условие: {{conditionId}}, profileCounter:{{profileCounter}}, значение:{{value}}",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "Ошибка передачи задания: условие не найдено или содержит неверное значение. qid: {{body.qid}}, condition: {{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "Не удалось принять квест, подробности см. в логе сервера",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "Невозможно принять квест: {{questId}} не удается найти текст сообщения о начале квеста с id: {{messageId}}",
|
||||
"route_onupdate_no_response": "onUpdate: %s маршрут не сообщает об успехе или неудаче",
|
||||
@ -530,6 +531,8 @@
|
||||
"pmcresponse-killer_negative_28": "Не волнуйся, я твой лут твоей мамке раскинул",
|
||||
"pmcresponse-killer_negative_29": "Ты даже не старался",
|
||||
"pmcresponse-killer_negative_30": "Базарю ты реально отдал 250 бачей за новое издание игры",
|
||||
"pmcresponse-killer_negative_31": "Закрысили",
|
||||
"pmcresponse-killer_negative_32": "Крыса атакует",
|
||||
"pmcresponse-killer_plead_1": "Я пытался добыть квестовый предмет, а ты оказался у меня на пути",
|
||||
"pmcresponse-killer_plead_2": "Пока я лутал схроны ты встал у меня на пути, извини",
|
||||
"pmcresponse-killer_plead_3": "мне были нужны ЧВК, думаю ты понимаешь к чему я",
|
||||
|
@ -59,8 +59,13 @@
|
||||
"executing_startup_callbacks": "服務端:啓動回調執行中...",
|
||||
"importing_database": "正在導入資料庫…",
|
||||
"importing_database_finish": "資料庫導入完成",
|
||||
"validation_error_file": "檔案驗證失敗: %s",
|
||||
"importing_spt_configs": "導入配置中…",
|
||||
"inventory-edit_trader_item": "無法編輯商人的物品",
|
||||
"inventory-no_stash_space": "物品庫空間不足",
|
||||
"inventory-unable_to_find_stash": "找不到物品庫",
|
||||
"inventory-stash_not_found": "無法在數據庫中找到物品庫 %s",
|
||||
"location-generated_success": "已生成地點 %s",
|
||||
"modloader-checked": "已檢查",
|
||||
"modloader-checking_mod": "檢查中: %s",
|
||||
"modloader-cyclic_dependency": "發現Cyclic dependency(循環依賴). 此錯誤必須修復. 修復前伺服器無法啟動, 伺服器將關閉",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -523,7 +523,7 @@ export class HideoutController
|
||||
|
||||
const request: IAddItemDirectRequest = {
|
||||
itemWithModsToAdd: [itemToReturn],
|
||||
foundInRaid: !!itemToReturn.upd.SpawnedInSession,
|
||||
foundInRaid: !!itemToReturn.upd?.SpawnedInSession,
|
||||
callback: null,
|
||||
useSortingTable: false,
|
||||
};
|
||||
|
@ -263,11 +263,11 @@ export class BotEquipmentModGenerator
|
||||
const platesFromDb = existingPlateTplPool.map(plateTpl => this.itemHelper.getItem(plateTpl)[1]);
|
||||
|
||||
// Filter plates to the chosen level based on its armorClass property
|
||||
const filteredPlates = platesFromDb.filter(item => item._props.armorClass === chosenArmorPlateLevel);
|
||||
if (filteredPlates.length === 0)
|
||||
const platesOfDesiredLevel = platesFromDb.filter(item => item._props.armorClass === chosenArmorPlateLevel);
|
||||
if (platesOfDesiredLevel.length === 0)
|
||||
{
|
||||
this.logger.debug(
|
||||
`Plate filter was too restrictive for armor: ${armorItem._id}, unable to find plates of level: ${chosenArmorPlateLevel}. Using mod items default plate`,
|
||||
`Plate filter was too restrictive for armor: ${armorItem._name} ${armorItem._id}, unable to find plates of level: ${chosenArmorPlateLevel}. Using mod items default plate`,
|
||||
);
|
||||
|
||||
const relatedItemDbModSlot = armorItem._props.Slots.find(slot => slot._name.toLowerCase() === modSlot);
|
||||
@ -305,7 +305,7 @@ export class BotEquipmentModGenerator
|
||||
|
||||
// Only return the items ids
|
||||
result.result = Result.SUCCESS;
|
||||
result.plateModTpls = filteredPlates.map(item => item._id);
|
||||
result.plateModTpls = platesOfDesiredLevel.map(item => item._id);
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -548,8 +548,9 @@ export class BotEquipmentModGenerator
|
||||
*/
|
||||
protected modIsFrontOrRearSight(modSlot: string, tpl: string): boolean
|
||||
{
|
||||
if (modSlot === "mod_gas_block" && tpl === "5ae30e795acfc408fb139a0b")
|
||||
{ // M4A1 front sight with gas block
|
||||
// Gas block /w front sight is special case, deem it a 'front sight' too
|
||||
if (modSlot === "mod_gas_block" && tpl === "5ae30e795acfc408fb139a0b") // M4A1 front sight with gas block
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -949,22 +950,23 @@ export class BotEquipmentModGenerator
|
||||
if (modSpawnResult === ModSpawn.DEFAULT_MOD)
|
||||
{
|
||||
const matchingPreset = this.getMatchingPreset(weaponTemplate, parentTemplate._id);
|
||||
const matchingMod = matchingPreset._items.find(item =>
|
||||
const matchingModFromPreset = matchingPreset?._items.find(item =>
|
||||
item?.slotId?.toLowerCase() === modSlot.toLowerCase(),
|
||||
);
|
||||
|
||||
// Only filter mods down to single default item if it already exists in existing itemModPool, OR the default item has no children
|
||||
// Filtering mod pool to item that wasnt already there can have problems;
|
||||
// You'd have a mod being picked without any sub-mods in its chain, possibly resulting in missing required mods not being added
|
||||
if (matchingMod)
|
||||
if (matchingModFromPreset)
|
||||
{
|
||||
// Mod is in existing mod pool
|
||||
if (itemModPool[modSlot].includes(matchingMod._tpl))
|
||||
if (itemModPool[modSlot].includes(matchingModFromPreset._tpl))
|
||||
{
|
||||
// Found mod on preset + it already exists in mod pool
|
||||
return [matchingMod._tpl];
|
||||
return [matchingModFromPreset._tpl];
|
||||
}
|
||||
|
||||
// Get an array of items that are allowed in slot from parent item
|
||||
// Check the filter of the slot to ensure a chosen mod fits
|
||||
const parentSlotCompatibleItems = parentTemplate._props.Slots?.find(slot =>
|
||||
slot._name.toLowerCase() === modSlot.toLowerCase(),
|
||||
@ -972,16 +974,19 @@ export class BotEquipmentModGenerator
|
||||
|
||||
// Mod isnt in existing pool, only add if it has no children and matches parent filter
|
||||
if (
|
||||
this.itemHelper.getItem(matchingMod._tpl)[1]._props.Slots.length === 0
|
||||
&& parentSlotCompatibleItems.includes(matchingMod._tpl)
|
||||
parentSlotCompatibleItems.includes(matchingModFromPreset._tpl)
|
||||
&& this.itemHelper.getItem(matchingModFromPreset._tpl)[1]._props.Slots.length === 0
|
||||
)
|
||||
{
|
||||
// Mod has no children and matches parent filters, can be used
|
||||
return [matchingMod._tpl];
|
||||
return [matchingModFromPreset._tpl];
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.debug(`No default: ${modSlot} mod found on template: ${weaponTemplate._id}`);
|
||||
if (itemModPool[modSlot]?.length > 1)
|
||||
{
|
||||
this.logger.debug(`No default: ${modSlot} mod found on template: ${weaponTemplate._name} and multiple items found in existing pool`);
|
||||
}
|
||||
|
||||
// Couldnt find default in globals, use existing mod pool data
|
||||
return itemModPool[modSlot];
|
||||
@ -1000,21 +1005,19 @@ export class BotEquipmentModGenerator
|
||||
* Get default preset for weapon, get specific weapon presets for edge cases (mp5/silenced dvl)
|
||||
* @param weaponTemplate
|
||||
* @param parentItemTpl
|
||||
* @returns
|
||||
* @returns Default preset found
|
||||
*/
|
||||
protected getMatchingPreset(weaponTemplate: ITemplateItem, parentItemTpl: string): IPreset
|
||||
{
|
||||
// Edge case - using mp5sd reciever means default mp5 handguard doesnt fit
|
||||
const isMp5sd = parentItemTpl === "5926f2e086f7745aae644231";
|
||||
|
||||
// Edge case - dvl 500mm is the silenced barrel and has specific muzzle mods
|
||||
const isDvl500mmSilencedBarrel = parentItemTpl === "5888945a2459774bf43ba385";
|
||||
|
||||
if (isMp5sd)
|
||||
{
|
||||
return this.presetHelper.getPreset("59411abb86f77478f702b5d2");
|
||||
}
|
||||
|
||||
// Edge case - dvl 500mm is the silenced barrel and has specific muzzle mods
|
||||
const isDvl500mmSilencedBarrel = parentItemTpl === "5888945a2459774bf43ba385";
|
||||
if (isDvl500mmSilencedBarrel)
|
||||
{
|
||||
return this.presetHelper.getPreset("59e8d2b386f77445830dd299");
|
||||
|
@ -85,6 +85,24 @@ export class BotLootGenerator
|
||||
// Limits on item types to be added as loot
|
||||
const itemCounts = botJsonTemplate.generation.items;
|
||||
|
||||
if(!itemCounts.backpackLoot.weights
|
||||
|| !itemCounts.pocketLoot.weights
|
||||
|| !itemCounts.vestLoot.weights
|
||||
|| !itemCounts.specialItems.weights
|
||||
|| !itemCounts.healing.weights
|
||||
|| !itemCounts.drugs.weights
|
||||
|| !itemCounts.food.weights
|
||||
|| !itemCounts.drink.weights
|
||||
|| !itemCounts.currency.weights
|
||||
|| !itemCounts.stims.weights
|
||||
|| !itemCounts.grenades.weights
|
||||
)
|
||||
{
|
||||
this.logger.warning(`Unable to generate bot loot for ${botRole} as bot.generation.items lacks data, skipping`);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const backpackLootCount = Number(
|
||||
this.weightedRandomHelper.getWeightedValue<number>(itemCounts.backpackLoot.weights),
|
||||
);
|
||||
|
@ -58,8 +58,7 @@ export class BundleLoader
|
||||
|
||||
public addBundles(modpath: string): void
|
||||
{
|
||||
const bundleManifestArr
|
||||
= this.jsonUtil.deserialize<BundleManifest>(this.vfs.readFile(`${modpath}bundles.json`)).manifest;
|
||||
const bundleManifestArr = this.jsonUtil.deserialize<BundleManifest>(this.vfs.readFile(`${modpath}bundles.json`)).manifest;
|
||||
|
||||
for (const bundleManifest of bundleManifestArr)
|
||||
{
|
||||
|
@ -8,13 +8,10 @@ export class BundleDynamicRouter extends DynamicRouter
|
||||
constructor(@inject("BundleCallbacks") protected bundleCallbacks: BundleCallbacks)
|
||||
{
|
||||
super([
|
||||
new RouteAction(
|
||||
".bundle",
|
||||
async (url: string, info: any, sessionID: string, output: string): Promise<string> =>
|
||||
{
|
||||
return this.bundleCallbacks.getBundle(url, info, sessionID);
|
||||
},
|
||||
),
|
||||
new RouteAction("/files/bundle", (url: string, info: any, sessionID: string, output: string): any =>
|
||||
{
|
||||
return this.bundleCallbacks.getBundle(url, info, sessionID);
|
||||
}),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -19,10 +19,14 @@ export class BundleSerializer extends Serializer
|
||||
|
||||
public override serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): void
|
||||
{
|
||||
this.logger.info(`[BUNDLE]: ${req.url}`);
|
||||
|
||||
const key = decodeURI(req.url.split("/bundle/")[1]);
|
||||
const bundle = this.bundleLoader.getBundle(key);
|
||||
if (!bundle)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
this.logger.info(`[BUNDLE]: ${req.url}`);
|
||||
|
||||
this.httpFileUtil.sendFile(resp, `${bundle.modpath}/bundles/${bundle.filename}`);
|
||||
}
|
||||
|
@ -79,9 +79,14 @@ export class HttpServer
|
||||
const sessionId = this.getCookies(req).PHPSESSID;
|
||||
this.applicationContext.addValue(ContextVariableType.SESSION_ID, sessionId);
|
||||
|
||||
// Extract headers for original IP detection
|
||||
const realIp = req.headers["x-real-ip"] as string;
|
||||
const forwardedFor = req.headers["x-forwarded-for"] as string;
|
||||
const clientIp = realIp || (forwardedFor ? forwardedFor.split(",")[0].trim() : req.socket.remoteAddress);
|
||||
|
||||
if (this.httpConfig.logRequests)
|
||||
{
|
||||
const isLocalRequest = this.isLocalRequest(req.socket.remoteAddress);
|
||||
const isLocalRequest = this.isLocalRequest(clientIp);
|
||||
if (typeof isLocalRequest !== "undefined")
|
||||
{
|
||||
if (isLocalRequest)
|
||||
@ -91,7 +96,7 @@ export class HttpServer
|
||||
else
|
||||
{
|
||||
this.logger.info(this.localisationService.getText("client_request_ip", {
|
||||
ip: req.socket.remoteAddress,
|
||||
ip: clientIp,
|
||||
url: req.url.replaceAll("/", "\\"), // Localisation service escapes `/` into hex code `/`
|
||||
}));
|
||||
}
|
||||
|
@ -394,6 +394,13 @@ export class FenceService
|
||||
{
|
||||
// Find the root item
|
||||
const newRootItem = itemWithChildren.find(item => item.slotId === "hideout");
|
||||
if (!newRootItem)
|
||||
{
|
||||
const firstItem = itemWithChildren.find(x => x);
|
||||
this.logger.error(`Unable to process fence assort as root item is missing, ${firstItem?._tpl}, skipping`);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Find a matching root item with same tpl in existing assort
|
||||
const existingRootItem = existingFenceAssorts.items.find(item =>
|
||||
|
Loading…
x
Reference in New Issue
Block a user