diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/gifts.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/gifts.json index cccd20c2..43f306dc 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/gifts.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/configs/gifts.json @@ -8805,7 +8805,7 @@ "messageText": "New year present!", "collectionTimeHours": 72, "associatedEvent": "Promo", - "maxToSendPlayer": 5 + "maxToSendPlayer": 1 }, "TOKTOK1M": { "items": [ diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json index ba94c730..0f2542d2 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/bear.json @@ -2401,7 +2401,6 @@ "Stealthsuit", "CWX", "Kaeno", - "Paulov", "Revingly", "jbs4bmx", "aleves", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json index 3a2ad17f..14b3edd3 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/bots/types/usec.json @@ -2392,7 +2392,6 @@ "Stealthsuit", "CWX", "Kaeno", - "Paulov", "Revingly", "jbs4bmx", "aleves", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/de.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/de.json index 3ecc1ed8..e12631d1 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/de.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/de.json @@ -57,6 +57,7 @@ "bot-weapon_missing_mod_slot": "Slot: '{{modSlot}}' existiert nicht für Waffe: {{weaponId}} {{weaponName}} auf {{botRole}}", "bot-weapons_required_slot_missing_item": "Erforderlicher Slot '{{modSlot}}' auf {{modName}} {{slotId}} war leer auf {{botRole}}", "build-unable_to_delete_preset": "Voreinstellung kann nicht gelöscht werden, %s kann nicht in Waffen, Ausrüstung oder Magazinvorlagen gefunden werden", + "cultistcircle-unable_to_find_stash_id": "Keine ID für den Kultist Kreis im Inventar gefunden [HideoutBereichInventare]! Es wurden keine Belohnungen generiert", "chat-unable_to_register_command_already_registered": "Bereits registrierter Befehl konnte nicht registriert werden: %s", "client_request": "[Client-Anfrage] %s", "client_request_ip": "[Client-Anfrage] {{ip}} {{url}}", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/el.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/el.json index 0512a1ad..09c5257c 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/el.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/el.json @@ -62,6 +62,14 @@ "chat-unable_to_register_command_already_registered": "Αδυναμία καταγραφής ήδη καταχωρημένης εντολής: %s", "client_request": "[Αίτημα Πελάτη] %s", "client_request_ip": "[Αίτημα Πελάτη] {{ip}} {{url}}", + "websocket_request": "[Αίτηση WebSocket] %s", + "websocket_request_ip": "[Αίτηση WebSocket] {{ip}} {{url}}", + "custom-quest-service_quest_id_already_exists": "Μία αποστολή με την ταυτότητα: {{questId}} υπάρχει ήδη.", + "custom-quest-service_no_languages_for_quest": "Καμία γλώσσα δεν έχει προστεθεί για την εξατομικευμένη αποστολή με ταυτότητα: {{questId}}", + "custom-quest-service_no_entries_for_language": "Δεν έχουν προστεθεί καταχωρίσεις τοπικών ρυθμίσεων για το κλειδί γλώσσας: {{languageKey}}, ήταν σκόπιμο αυτό;", + "custom-quest-service_could_not_find_language_key": "Αδύνατη η εύρεση κλειδιού γλώσσας: {{languageKey}} σε παγκόσμιες γλώσσες κατά την προσθήκη μιας προσαρμοσμένης αποστολής. Αυτό είναι είτε ένα τυπογραφικό λάθος, είτε αυτή η γλώσσα δεν υποστηρίζεται.", + "custom-quest-service_locale_data_null": "Τα δεδομένα τοπικών ρυθμίσεων είναι μηδενικά για τη γλώσσα: {{languageKey}}", + "custom-quest-service_invalid_side": "Ταυτότητα αποστολής: {{questId}} Ο όρος Savage δεν είναι έγκυρος ως δευτερεύων για μια κλειδωμένη δευτερεύουσα αποστολή.", "customisation-item_already_purchased": "Το Στοιχείο Ένδυσης {{itemId}} {{itemName}} ήδη αγοράστηκε", "customisation-suit_lacks_upd_or_stack_property": "Το ένδυμα με tpl: %s δε διαθέτει μια ιδιότητα upd αντικειμένου ή stackobjectcount", "customisation-unable_to_find_clothing_item_in_inventory": "Δε βρέθηκε στοιχείο ένδυσης στο απόθεμα του παίκτη με ταυτότητα: %s", @@ -215,6 +223,8 @@ "modloader-main_property_not_js": "Η κύρια ιδιότητα του πρόσθετου %s package.json πρέπει να είναι ένα αρχείο .js", "modloader-main_property_points_to_nothing": "Η κύρια ιδιότητα του πρόσθετου %s package.json πρέπει να παραπέμπει σε μη υπάρχον αρχείο", "modloader-missing_dependency": "Το πρόσθετο {{mod}} απαιτεί την εγκατάσταση του {{modDependency}}.", + "modloader-self_dependency": "Η τροποποίηση {{mod}} εξαρτάται από τον εαυτό της, αφαιρέστε την από τη δική σας λίστα εξαρτήσεων", + "modloader-self_incompatibility": "Η τροποποίηση {{mod}} είναι ασυμβίβαστη με την ίδια, αφαιρέστε την από τη δική σας λίστα ασυμβίβαστων", "modloader-missing_package_json": "Το Πρόσθετο (%s) λείπει το package.json. Βεβαιωθείτε ότι έχετε ελέγξει την κομβική σελίδα πρόσθετων για τις οδηγίες εγκατάστασης", "modloader-missing_package_json_property": "Το πρόσθετο {{modName}} package.json απαιτεί την ιδιότητα {{prop}}", "modloader-missing_sptversion_field": "Από το πρόσθετο %s λείπει το πεδίο sptVersion, πιθανότατα λόγω έλλειψης ενημέρωσης και μη συμβατότητας με την τρέχουσα έκδοση του SPT", @@ -652,8 +662,10 @@ "repair-unable_to_find_item_repair_cost": "Αδύνατη η εύρεση του κόστους επισκευής για το αντικείμενο: %s", "repair-unable_to_find_trader_details_by_id": "Αδύνατη η εύρεση στοιχείων επισκευής στον έμπορο: %s", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Αποδοχή μίας επαναλαμβανόμενης αποστολής: %s που δεν ήταν δυνατό να βρεθεί στον πίνακα των activeQuests. Παρακαλώ να αναφέρετε αυτό το σφάλμα", + "repeatable-completion_config_no_template": "Αδυναμία εύρεσης της διαμόρφωσης ολοκλήρωσης για το επίπεδο του pmc: {{pmcLevel}}", "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive": "Δημιουργία Ολοκλήρωσης Αποστολής: Δεν υπάρχουν εναπομείναντα αντικείμενα. Είτε η λευκή λίστα είναι πολύ μικρή ή η μαύρη λίστα πολύ περιοριστική", "repeatable-difficulty_was_nan": "Γέννεση Επαναλαμβανόμενης Ανταμοιβής: Βαθμός δυσκολία ήταν NaN. Ορισμός τιμής στο 1.", + "repeatable-exploration_config_no_template": "Αδυναμία εύρεσης της διαμόρφωσης εξερεύνησης για το επίπεδο του pmc: {{pmcLevel}}", "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}}, συνθήκη: {{body.conditionId}}", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/hu.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/hu.json index eec25963..4b2fdbf5 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/hu.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/hu.json @@ -6,6 +6,7 @@ "baseclass-item_not_found_failed": "Tétel %s még mindig nem létezik a tárgyak gyorsítótárjában újgenerálás után", "baseclass-missing_db_no_cache": "Az adatbázis üres volt, nem lehetett a tételek alapvető gyorsítótárját elkészíteni", "bleeding_edge_build": "BLEEDINGEDGE", + "btr-unable_to_find_items_in_dialog_template": "", "bot-bot_preset_count_value_missing": "Nem sikerült preset count értéket találni a következő bot-hoz: %s, 30-as alapértékre állitva", "bot-compatibility_check_missing_props": "Érvénytelen tétel: {{id}} {{name}} ezen a helyen {{slot}} fel lehet szerelni, hiányzik egy _props érték", "bot-generation_failed": "bot generálása sikertelen, lásd a szerver naplót további részletekért", @@ -605,6 +606,7 @@ "release-server-mods-debug-message": "Szerver modok betöltve", "release-server-mods-loaded": "Egy vagy több szerver mod található egy modokat engedélyező buildben, a jelentések érvénytelenek lesznek, amíg el nem távolítják őket. A problémák újbóli jelentéséhez tekintsd meg a szerver elején, hogy melyik betöltött modokat kell eltávolítani.", "repair-item_not_found_unable_to_repair": "Tétel: %s nem található a leltárban. Nem lehet megjavítani", + "repair-repair_kit_not_found_in_inventory": "", "repair-unable_to_find_item_in_db": "Nem lehet javítani a tárgyat: %s, nem található az adatbázisban, nem lehet javítási képességpontokat hozzáadni", "repair-unable_to_find_item_in_inventory_cant_repair": "Nem találja az elemet: %s nem tudja javítani a tárgyat", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Elfogadtál egy ismételhető küldetést: %s, amely nem található az activeQuests tömbben. Kérjük, jelentsd ezt a hibát", @@ -619,6 +621,8 @@ "scav-missing_karma_level_getting_default": "getScavKarmaLevel() sikertelen, nem található Fence a profile.traderInfo-ban. Alapértelmezett 0 karmaszintre állítva", "scav-missing_karma_settings": "Nem sikerült lekérni a karma beállításokat a %s szint számára", "scheduled_event_failed_to_run": "Az ütemezett esemény: '%s' nem futott le sikeresen.", + "season-no_matching_season_found_for_date": "Nem található évszak a jelenlegi dátumra, nyárra állítva", + "season-event_is_active": "Esemény: %s aktív", "seasonal-missing_equipment_slot_on_bot": "Nem lehet eltávolítani a karácsonyi felszerelést a következő helyről: {{equipmentSlot}}, mert nem található a következő boton: {{botRole}}", "seasonal-missing_loot_container_slot_on_bot": "Nem lehet eltávolítani a karácsonyi zsákmányt a következő helyről: {{lootContainer}}, mert nem található a következő boton: {{botRole}}", "server_running": "A szerver fut, ne zárd be, amíg az SPT-vel játszol", @@ -647,6 +651,7 @@ "server_start_meme_8": "its morbin time", "server_start_meme_9": "S-step scav? M-mit csinálsz?", "server_start_player_active_botreload_skill": "A karaktereden aktíválva van a 'BotReload' képesség, ami miatt a fegyvereid természetellenesen gyorsan fognak újratölteni. Ha ez szándékos, hagyd figyelmen kívül ezt az üzenetet", + "server_start_success": "A szerver elindult, jó játékot", "started_webserver_success": "Webkiszolgáló elindítva itt: %s", "weightedrandomhelper-supplied_data_doesnt_match": "WeightedRandom() {{itemCount}} elemeket és {{weightCount}} súlyokat kapott, nem tudott véletlenszerű súlyt választani.", "trader-missing_durability_threshold_value": "Nem található élettartam küszöbérték a kereskedőhöz: {{traderId}}, visszaállás az alapértelmezett értékre: {{value}}", @@ -673,6 +678,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NE JELENTSD", "watermark-free_of_charge": "Ez a munka ingyenes", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server-csharp/", "watermark-modding_disabled": "Ez a verzió nem támogatja a szerver moddolást", "watermark-no_support": "Nem adunk semmilyen segítséget", "watermark-not_an_issue": "EZ NEM PROBLÉMA", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ja.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ja.json index 67f6aca4..3c2322b9 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ja.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ja.json @@ -62,6 +62,7 @@ "chat-unable_to_register_command_already_registered": "既に登録されているコマンドは登録できません: %s", "client_request": "[Client Request] %s", "client_request_ip": "[Client Request] {{ip}} {{url}}", + "custom-quest-service_no_languages_for_quest": "カスタムクエストIDに言語が追加されていません: {{questId}}", "customisation-item_already_purchased": "アイテム {{itemId}} {{itemName}} は既に購入されています", "customisation-suit_lacks_upd_or_stack_property": "衣装のtpl %s に upd object または stackobjectcount のプロパティが見つかりません", "customisation-unable_to_find_clothing_item_in_inventory": "衣装アイテムID: %s の在庫がありません", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ko.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ko.json index 653a1a9a..7c5e74a8 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ko.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ko.json @@ -62,6 +62,10 @@ "chat-unable_to_register_command_already_registered": "%s 커맨드는 이미 등록되어 있어 재등록 할 수 없습니다", "client_request": "[클라이언트 요청] %s", "client_request_ip": "클라이언트 요청{{ip}}{{url}}", + "websocket_request": "[웹소켓 리퀘스트] %s", + "websocket_request_ip": "[웹소켓 리퀘스트] {{ip}} {{url}}", + "custom-quest-service_quest_id_already_exists": "id 값이 {{questId}} 인 퀘스트가 이미 존재합니다.", + "custom-quest-service_no_languages_for_quest": "id: {{questId}} 인 커스텀 퀘스트에는 추가된 언어가 없습니다", "customisation-item_already_purchased": "의류 아이템 {{itemId}} {{itemName}} 은(는) 이미 구매했습니다", "customisation-suit_lacks_upd_or_stack_property": "Suit with tpl: %s가 upd 오브젝트나 stackobjectcount 값이 없습니다", "customisation-unable_to_find_clothing_item_in_inventory": "%s 해당 아이디를 가진 옷가지 아이템을 인벤토리에서 찾을 수 없었습니다", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pl.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pl.json index a8bfb4c0..20352f7b 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pl.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pl.json @@ -62,6 +62,7 @@ "chat-unable_to_register_command_already_registered": "Nie można zarejestrować już zarejestrowanej komendy: %s", "client_request": "[Żądanie klienta] %s", "client_request_ip": "[Żądanie klienta] {{ip}} {{url}}", + "websocket_request_ip": "[Żądanie WebSocket] {{ip}} {{url}}", "customisation-item_already_purchased": "Element ubioru {{itemId}} {{itemName}} został już zakupiony", "customisation-suit_lacks_upd_or_stack_property": "Stroju z tpl: %s brakuje obiektu upd lub właściwości stackobjectcount", "customisation-unable_to_find_clothing_item_in_inventory": "Przedmiot ubioru nie został znaleziony w ekwipunku z id: %s", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-br.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-br.json index 04b2603d..4ea38ccf 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-br.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-br.json @@ -6,6 +6,7 @@ "baseclass-item_not_found_failed": "O item %s não foi encontrado no cache base depois da recuperação", "baseclass-missing_db_no_cache": "A Base de Dados está vazia, incapaz de gerar um cache base de item", "bleeding_edge_build": "Ainda em desenvolvimento", + "btr-unable_to_find_items_in_dialog_template": "Não foi Possível encontrar itemsDelivered em dialogueTemplates para o jogador: %s", "bot-bot-cache_has_zero_bots_of_requested_type": "AVISO - O cache do bot não possui um bot pré-gerado do tipo %s, será necessário gerá-lo. Configure a propriedade de configuração bot.json (presetBatch) para um valor mais alto", "bot-bot_preset_count_value_missing": "Não foi possível encontrar uma contagem predefinida para gerar para o bot: %s, padrão definido para 30", "bot-compatibility_check_missing_props": "Incapaz de validar o item: {{id}} {{name}} no slot: {{slot}} pode ser equipado, está faltando o valor _props", @@ -56,9 +57,19 @@ "bot-weapon_missing_mod_slot": "Slot: {{modSlot}}' não existe para a arma: {{weaponId}} {{weaponName}} em {{botRole}}", "bot-weapons_required_slot_missing_item": "O slot obrigatório '{{modSlot}}' em {{modName}} {{slotId}} estava vazio em {{botRole}}", "build-unable_to_delete_preset": "Não foi possível excluir o preset, não é possível encontrar %s nos presets de arma, equipamento ou carregador", + "cultistcircle-unable_to_find_stash_id": "Não foi possível encontrar o ID do estoque do círculo cultista dentro do inventário [HideoutAreaStashes]! Nenhuma recompensa foi gerada", + "cultistcircle-no_matching_threshhold_found": "Não foi possível encontrar o valor limite do círculo cultista correspondente ao valor da rota: ({{rewardAmountRoubles}}), usando o recurso de 12 horas de criação", "chat-unable_to_register_command_already_registered": "Não foi possível registrar o comando já registrado: %s", "client_request": "[Client Request] %s", "client_request_ip": "[Pedido do cliente] {{ip}} {{url}}", + "websocket_request": "[Solicitação do WebSocket] %s", + "websocket_request_ip": "[Solicitação do WebSocket] {{ip}} {{url}}", + "custom-quest-service_quest_id_already_exists": "Uma missão com o Id: {{questId}} já Existe.", + "custom-quest-service_no_languages_for_quest": "Nenhum idioma foi adicionado a Missão personalizada de Id: {{questId}}", + "custom-quest-service_no_entries_for_language": "Nenhuma Entrada Local foi Adicionada para a chave do Idioma: {{languageKey}}, Isso era Intencional?", + "custom-quest-service_could_not_find_language_key": "Não foi possível encontrar a chave de idioma: {{languageKey}} nos locais globais ao adicionar uma missão personalizada. Este é um erro de digitação ou este idioma não é suportado.", + "custom-quest-service_locale_data_null": "Dados de localidade são nulos para o idioma: {{languageKey}}", + "custom-quest-service_invalid_side": "Id de Missão: {{questId}} Scav não é o lado valido para o lado da Missão Bloqueada.", "customisation-item_already_purchased": "Item de vestuário {{itemId}} {{itemName}} já comprado", "customisation-suit_lacks_upd_or_stack_property": "O traje com tpl: %s não possui um objeto upd ou a propriedade stackobjectcount", "customisation-unable_to_find_clothing_item_in_inventory": "Item de vestuário não encontrado no inventário com id: %s", @@ -72,6 +83,7 @@ "dialog-chatbot_id_already_exists": "O chatbot: %s já está registrado, impossível registrar o bot novamente", "dialog-missing_item_template": "Não foi possível localizar o item tpl {{tpl}} no banco de dados, não é possível enviar mensagem do tipo {{type}}, ignorando", "dialogue-unable_to_find_dialogs_in_profile": "Objeto de diálogo não encontrado no perfil: {{sessionId}}", + "dialogue-list_from_client_empty": "Nenhum objeto de diálogo enviado do cliente: {{sessionId}}", "dialogue-unable_to_find_in_profile": "Nenhum diálogo no perfil: {{sessionId}} encontrado com o ID: {{dialogueId}}", "event-unhandled_event": "[EVENTO NÃO TRATADO] %s", "executing_startup_callbacks": "Servidor: executando retornos de chamada de inicialização...", @@ -93,6 +105,7 @@ "hideout-missing_recipe_for_area": "Não foi possível encontrar a receita: %s para o tipo de área", "hideout-missing_recipe_in_db": "Falha ao localizar a receita com o _id: %s", "hideout-no_bitcoins_to_collect": "Nenhum bitcoin está pronto para ser coletado", + "hideout-bitcoin_craft_missing": "A fabricação da farm de Bitcoin não foi encontrada, incapaz de atualizar o tempo de criação", "hideout-unable_to_apply_stashsize_bonus_no_stash_found": "Não é possível aplicar o bônus de tamanho do stash, o stash com o ID: %s não foi encontrado no perfil", "hideout-unable_to_find_area": "Não foi possível encontrar o hideout: %s no perfil", "hideout-unable_to_find_area_in_database": "Não foi possível localizar a área: %s no banco de dados", @@ -149,6 +162,7 @@ "inventory-unable_to_toggle_item_not_found": "Não foi possível alternar o item de inventário com id: %s, item não encontrado", "item-durability_value_invalid_use_default": "getRepairableItemQualityValue() para a arma tpl: %s. O valor de durabilidade é inválido, revertendo para 1", "item-invalid_tpl_item": "Não foi possível encontrar um item com modelo de: %s no banco de dados", + "item-helper_no_items_for_barter": "Nenhum item encontrado para a Id de troca: %s", "launcher-missing_property": "O perfil: %s está sem a propriedade descriptionLocaleKey", "launcher-profile-edgeofdarkness": "Igual ao Prepare To Escape plus; tamanho de esconderijo maior (10x68), equipamentos/itens extras, reputação inicial mais alta com comerciantes, 1000 dólares, 500 euros", "launcher-profile-tournament": "Possui um contêiner seguro de torneio e uma faca ER Fulcrum Bayonet. Flea e Fance bloqueados. Todas as roupas de Ragman desbloqueadas. Envie o código 'TOURNAMENTGIFT' para SPT na lista de amigos para desbloquear todas as funcionalidades do perfil.", @@ -186,6 +200,8 @@ "loot-default_preset_not_found_using_random": "Preset padrão para a arma: %s não encontrado, escolhendo aleatoriamente uma do mesmo tipo de arma em vez disso", "loot-item_missing_parentid": "Item: %s não possui um valor de parentId, incapaz de usar o item como saque", "loot-non_item_picked_as_sealed_weapon_crate_reward": "Arma inválida: %s, foi escolhida como recompensa por uma caixa de arma selada, não é possível criar o loot", + "loot-preset_pool_is_empty": "Não foi possível encontrar uma predefinição aleatória no conjunto fornecido, pois ele está vazio. Ignorando", + "loot-chosen_preset_missing_encyclopedia_value": "Predefinição escolhida: %s não possui propriedade de enciclopédia, ignorando", "mail-unable_to_find_message_sender_by_id": "Não foi possível encontrar o remetente do correio de mensagens com o ID: %s", "mail-unable_to_give_gift_not_handled": "Não é possível dar presente ao jogador, recompensa: %s não tratada pelo servidor", "mailsend-missing_npc_dialog": "Não foi possível enviar mensagem de: %s para o jogador. Um objeto de diálogo para eles não existe", @@ -207,6 +223,8 @@ "modloader-main_property_not_js": "O arquivo package.json do mod %s deve ter a propriedade main como um arquivo .js", "modloader-main_property_points_to_nothing": "A propriedade principal mod %s package.json aponta para um arquivo inexistente", "modloader-missing_dependency": "O mod {{mod}} requer a instalação de {{modDependency}}.", + "modloader-self_dependency": "O Mod: {{mod}} É dependente dele mesmo, por favor remova da sua lista de dependências", + "modloader-self_incompatibility": "O Mod: {{mod}} é incompatível com ele mesmo, remova da sua própria lista de incompatibilidades", "modloader-missing_package_json": "O Mod (%s) está sem o arquivo package.json. Certifique-se de ter verificado a página de instruções de instalação no hub de mods", "modloader-missing_package_json_property": "Mod {{modName}} package.json requer a propriedade {{prop}}", "modloader-missing_sptversion_field": "O mod %s está sem o campo sptVersion, provavelmente devido a estar desatualizado e incompatível com a versão atual do SPT", @@ -644,8 +662,10 @@ "repair-unable_to_find_item_repair_cost": "Não foi possível encontrar o custo de reparo para o item: %s", "repair-unable_to_find_trader_details_by_id": "Não foi possível encontrar os detalhes de reparo do comerciante: %s", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Aceitou uma missão repetível: %s que não pôde ser encontrada no array de activeQuests. Por favor, relate este bug", + "repeatable-completion_config_no_template": "Não foi possível encontrar a configuração de conclusão para o nível do pmc: {{pmcLevel}}", "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive": "Gerar missão de conclusão: Nenhum item permanece. Ou a lista branca é muito pequena ou a lista negra é muito restritiva", "repeatable-difficulty_was_nan": "Geração de recompensa repetível: A dificuldade era NaN. Configuração para 1.", + "repeatable-exploration_config_no_template": "Não foi possível encontrar a configuração de exploração para o nível do pmc: {{pmcLevel}}", "repeatable-no_reward_item_found_in_price_range": "Geração de recompensa repetível: Nenhum item encontrado na faixa de preço {{minPrice}} a {{roublesBudget}}", "repeatable-quest_handover_failed_condition_already_satisfied": "Erro de entrega de missão: a condição já foi atendida? qid: {{questId}}, condition: {{conditionId}}, profileCounter:{{profileCounter}}, value:{{value}}", "repeatable-quest_handover_failed_condition_invalid": "Erro de entrega da missão: condição não encontrada ou valor incorreto. qid: {{body.qid}}, condição: {{body.conditionId}}", @@ -661,9 +681,18 @@ "repeatable-unable_choose_exit_pool_empty": "Não foi possível escolher uma extração específica para o mapa: %s pois a lista de extrações está vazia", "repeatable-eliminationQuestGenerationData-is-null": "Dados de geração para Eliminação são nulos", "repeatable-no-bot-types-remain": "Nenhuma categoria de bot restante na lista. Pulando a geração de missões de Eliminação", + "repeatable-unable-targets-are-null": "Não é possível gerar gerador de missões de eliminação, os alvos são nulos", "repeatable-unable-get-target-pool": "Não foi possível obter targetLocationPool para a categoria de bot: %s", "repeatable-unable-get-location-key": "Não foi possível obter locationKey para a categoria de bot: %s", "repeatable-elimination-config-not-found": "Não foi possível encontrar as configurações de Eliminação", + "repeatable-elimination-any-not-found": "Não estamos visando um local específico e “qualquer” não foi encontrado nos locais", + "repeatable-elimination-specific-weapon-null": "Categoria específica da Arma permitida são nulas", + "repeatable-quest_helper_template_not_found": "Modelo de missão repetível não encontrado para o tipo: %s", + "repeatable-quest_helper_template_name_not_found": "Não foi possível resolver o nome do modelo para: %s", + "repeatable-quest_helper_no_status": "Nenhum status de missão encontrado para o tipo: %s", + "repeatable-quest_helper_no_loc_id": "Nenhum local encontrado no LocationIdMap para a chave: %s", + "reward-type_not_handled": "Tipo de recompensa: {{rewardType}} não tratada para missão/conquista: {{questId}}", + "reward-unable_to_find_matching_hideout_production": "Não foi possível encontrar desbloqueio de craft do esconderijo para a missão/conquista: {{questId}}, correspondências encontradas: {{matchCount}}", "route_onupdate_no_response": "onUpdate: A rota %s não relata sucesso ou falha", "scav-missing_karma_level_getting_default": "getScavKarmaLevel() falhou, não foi possível encontrar o comerciante Fence nas informações do perfil. Padrão para nível de karma 0", "scav-missing_karma_settings": "Não foi possível obter as configurações de karma para o nível %s", @@ -701,6 +730,10 @@ "server_start_player_active_botreload_skill": "Seu personagem tem a habilidade 'BotReload' ativa, isso fará com que suas armas recarreguem de maneira anormal mais rápida. Ignore esta mensagem se for intencional", "server_start_success": "O servidor iniciou. Bom jogo", "started_webserver_success": "Iniciado o servidor Web em %s", + "scavcase-no_cartridges_found_matching_price": "Não é possível obter uma lista de munição que corresponde aos critérios desejados para recompensa da Caixa Scav", + "weightedrandomhelper-supplied_items_empty": "WeightedRandom() recebeu 0 itens, impossível escolher um peso aleatório", + "weightedrandomhelper-supplied_weights_empty": "WeightedRandom() recebeu peso 0, impossível escolher um peso aleatório", + "weightedrandomhelper-supplied_data_doesnt_match": "WeightedRandom() recebeu {{itemCount}} itens e {{weightCount}} pesos, impossível escolher um peso aleatório", "trader-missing_durability_threshold_value": "Não foi possível encontrar o valor do limite de durabilidade para o negociante: {{traderId}}, retornando ao padrão de: {{value}}", "trader-missing_repair_property_using_default": "O comerciante {{traderId}} {{nickname}} está sem um objeto de reparo, adicionando os valores padrão", "trader-missing_repair_quality_property_using_default": "Comerciante: {{traderId}} {{nickname}} não possui uma propriedade de qualidade de reparo, adicionando o valor padrão", @@ -712,6 +745,8 @@ "trader-unable_to_find_trader_by_id": "Não foi possível encontrar a oferta com o ID: %s", "trader-unable_to_find_trader_in_enum": "Não foi possível encontrar o comerciante: %s no perfil", "trader-unable_to_purchase_item_limit_reached": "Não é possível comprar o item do comerciante: {{traderId}} pois o limite de compra de: {{limit}} foi alcançado", + "trader-unable_to_find_selltotrader_counter": "Não foi possível encontrar [sellToTrader] contador para: %s Missão no Banco de Dados, contador não será incrementado", + "trader-unable_to_find_inventory_item_for_selltotrader_counter": "Não Foi possível encontrar o Item do Inventário: %s para vender, contador de incremento, ignorado", "trader-unable_to_add_custom_trader": "Não foi possível adicionar o comerciante personalizado: {{traderId}}, {{stackTrace}}", "unhandled_response": "[NAO_MANIPULADO][%s]", "unknown_request": "Solicitação desconhecida!", @@ -723,6 +758,7 @@ "watermark-discord_url": "https://discord.sp-tarkov.com", "watermark-do_not_report": "NÃO RELATE ISSO", "watermark-free_of_charge": "Esse trabalho é gratuito", + "watermark-issue_tracker_url": "https://github.com/sp-tarkov/server-csharp/", "watermark-modding_disabled": "ESTA VERSÃO TEM OS MODS DO SERVIDOR DESATIVADO", "watermark-no_support": "NÃO SERÁ FORNECIDO NENHUM SUPORTE", "watermark-not_an_issue": "ISSO NÃO É UM PROBLEMA", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ru.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ru.json index 3003bb15..cbfc92cc 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ru.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ru.json @@ -662,8 +662,10 @@ "repair-unable_to_find_item_repair_cost": "Не удалось найти стоимость ремонта для предмета: %s", "repair-unable_to_find_trader_details_by_id": "Не удается найти данные о ремонте у торговца: %s", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Принят повторяющийся квест: %s, который не удалось найти в массиве activeQuests. Пожалуйста, сообщите об этой ошибке", + "repeatable-completion_config_no_template": "Не удалось найти конфигурацию оперативного задания Исследование для ЧВК уровня: {{pmcLevel}}", "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive": "Создание Завершения Задания: Предметов не осталось. Либо белый список слишком мал, либо черный список слишком ограничен.", "repeatable-difficulty_was_nan": "Повторяемая Генерация Вознаграждений: Сложность была NaN. Ставим на 1.", + "repeatable-exploration_config_no_template": "Не удалось найти конфигурацию оперативного задания Исследование для ЧВК уровня: {{pmcLevel}}", "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}}", diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/vi.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/vi.json index f21b3460..3fd893ec 100644 --- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/vi.json +++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/vi.json @@ -20,5 +20,12 @@ "bot-unable_to_find_ammo_item": "Không tìm được mẫu băng đạn với tpl: %s", "bot-unable_to_find_default_magazine_item": "Không tìm được mẫu băng đạn: %s trong cơ sở dữ liệu", "bot-unable_to_find_magazine_item": "Không tìm được mẫu băng đạn: %s trong cơ sở dữ liệu", - "hideout-unable_to_find_area_in_database": "Không tìm được khu vực: %s trong cơ sở dữ liệu" + "hideout-unable_to_find_area_in_database": "Không tìm được khu vực: %s trong cơ sở dữ liệu", + "pmcresponse-suffix_20": ":)", + "pmcresponse-suffix_21": "(:", + "pmcresponse-suffix_22": ":))))))", + "pmcresponse-victim_negative_100": "Tao cá rằng mày tải SAIN và phải xóa nó đi vì mày luôn tục bị giết quá nhiều", + "pmcresponse-victim_negative_19": "1v1 tao thằng mọt sách, tao sẽ thắng", + "pmcresponse-victim_negative_22": "Wow trốn trong góc như một con chuột, tuyệt vời", + "server_start_success": "Máy chủ đã khởi chạy, chúc vui vẻ" } diff --git a/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs index 5d8d6f3e..a912c83f 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/PrestigeHelper.cs @@ -105,14 +105,23 @@ public class PrestigeHelper( // Copy transferred items foreach (var transferRequest in prestige.Items ?? []) { - var item = prePrestigePmc?.Inventory?.Items?.FirstOrDefault(item => item.Id == transferRequest.Id); - if (item is null) + // Get item with its attached children (if it has any) + var itemWithChildren = prePrestigePmc?.Inventory?.Items?.GetItemWithChildren(transferRequest.Id); + if (itemWithChildren is null) { logger.Error($"Unable to find item with id: {transferRequest.Id} in profile: {sessionId}, skipping"); continue; } - itemsToTransfer.Add(item); + // Get root item so we can check its pin/lock state + var rootItem = itemWithChildren.FirstOrDefault(item => item.Id == transferRequest.Id); + if (rootItem.Upd?.PinLockState is PinLockState.Pinned or PinLockState.Locked) + { + // Item has been pinned/locked and needs to be unpinned before sending to player, otherwise they can't transfer item into stash + rootItem.Upd.PinLockState = PinLockState.Free; + } + + itemsToTransfer.AddRange(itemWithChildren); } if (itemsToTransfer.Count > 0) @@ -156,6 +165,7 @@ public class PrestigeHelper( newPmcStats.Eft.CarriedQuestItems = []; newPmcStats.Eft.FoundInRaidItems = []; newPmcStats.Eft.LastSessionDate = 0; + newPmcStats.Eft.DroppedItems = []; // TODO: find evidence scav stats are copied over in live //var newScavStats = newProfile.CharacterData.ScavData.Stats; diff --git a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs index 57ca1b5c..ba22bc06 100644 --- a/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/CreateProfileService.cs @@ -177,7 +177,7 @@ public class CreateProfileService( // Process handling if the account is forced to prestige, or if the account currently has any pending prestiges if (request.SptForcePrestigeLevel is not null || account.SptData?.PendingPrestige is not null) { - var pendingPrestige = account.SptData.PendingPrestige ?? new PendingPrestige { PrestigeLevel = request.SptForcePrestigeLevel }; + var pendingPrestige = account.SptData?.PendingPrestige ?? new PendingPrestige { PrestigeLevel = request.SptForcePrestigeLevel }; prestigeHelper.ProcessPendingPrestige(account, profileDetails, pendingPrestige); } diff --git a/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs b/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs index d27be8da..ffbc4f4c 100644 --- a/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/RaidTimeAdjustmentService.cs @@ -7,6 +7,7 @@ using SPTarkov.Server.Core.Models.Eft.Game; using SPTarkov.Server.Core.Models.Enums; using SPTarkov.Server.Core.Models.Spt.Config; using SPTarkov.Server.Core.Models.Spt.Location; +using SPTarkov.Server.Core.Models.Spt.Logging; using SPTarkov.Server.Core.Models.Utils; using SPTarkov.Server.Core.Servers; using SPTarkov.Server.Core.Utils; @@ -35,9 +36,12 @@ public class RaidTimeAdjustmentService( { if (raidAdjustments.DynamicLootPercent < 100 || raidAdjustments.StaticLootPercent < 100) { - logger.Debug( - $"Adjusting dynamic loot multipliers to {raidAdjustments.DynamicLootPercent}% and static loot multipliers to {raidAdjustments.StaticLootPercent}% of original" - ); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug( + $"Adjusting dynamic loot multipliers to: {raidAdjustments.DynamicLootPercent}% and static loot multipliers to: {raidAdjustments.StaticLootPercent}% of original" + ); + } } // Change loot multiplier values before they're used below @@ -60,7 +64,10 @@ public class RaidTimeAdjustmentService( var exitToChange = mapBase.Exits.FirstOrDefault(exit => exit.Name == exitChange.Name); if (exitToChange is null) { - logger.Debug($"Exit with Id: {exitChange.Name} not found, skipping"); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug($"Exit with Id: {exitChange.Name} not found, skipping"); + } return; } @@ -123,10 +130,12 @@ public class RaidTimeAdjustmentService( wave.TimeMin -= (int)Math.Max(startSeconds, 0); wave.TimeMax -= (int)Math.Max(startSeconds, 0); } - - logger.Debug( - $"Removed: {originalWaveCount - mapBase.Waves.Count} wave from map due to simulated raid start time of {raidAdjustments.SimulatedRaidStartSeconds / 60} minutes" - ); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug( + $"Removed: {originalWaveCount - mapBase.Waves.Count} wave from map due to simulated raid start time of: {raidAdjustments.SimulatedRaidStartSeconds / 60} minutes" + ); + } } /// @@ -170,12 +179,17 @@ public class RaidTimeAdjustmentService( spawn.Time = (double)Math.Max(spawn.Time.GetValueOrDefault(1) - pmcStartSeconds, 1); } - logger.Debug($"Offset PMC spawns by {pmcStartSeconds} seconds"); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug($"Offset PMC spawns by: {pmcStartSeconds} seconds"); + } + } + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug( + $"Removed: {originalPmcWaveCount - mapBase.BossLocationSpawn.Count} boss waves from map due to simulated raid start time of: {raidAdjustments.SimulatedRaidStartSeconds / 60} minutes" + ); } - - logger.Debug( - $"Removed: {originalPmcWaveCount - mapBase.BossLocationSpawn.Count} boss waves from map due to simulated raid start time of {raidAdjustments.SimulatedRaidStartSeconds / 60} minutes" - ); } /// @@ -223,17 +237,17 @@ public class RaidTimeAdjustmentService( var raidTimeRemainingPercent = 100 - chosenRaidReductionPercent; // How many minutes raid will last - var newRaidTimeMinutes = Math.Floor(randomUtil.ReduceValueByPercent(baseEscapeTimeMinutes ?? 1, chosenRaidReductionPercent)); + var newRaidTimeMinutes = Math.Floor(randomUtil.ReduceValueByPercent(baseEscapeTimeMinutes ?? 1d, chosenRaidReductionPercent)); // Time player spawns into the raid if it was online var simulatedRaidStartTimeMinutes = baseEscapeTimeMinutes - newRaidTimeMinutes; - result.SimulatedRaidStartSeconds = simulatedRaidStartTimeMinutes * 60; + result.SimulatedRaidStartSeconds = simulatedRaidStartTimeMinutes * 60d; result.RaidTimeMinutes = newRaidTimeMinutes; - // Calculate how long player needs to be in raid to get a `survived` extract status + // Calculate how long player needs to be in raid to get a `survived` extract status, never falls below 0 result.NewSurviveTimeSeconds = Math.Max( - result.OriginalSurvivalTimeSeconds.Value - (baseEscapeTimeMinutes.Value - newRaidTimeMinutes) * 60, - 0 + (result.OriginalSurvivalTimeSeconds - ((baseEscapeTimeMinutes - newRaidTimeMinutes) * 60)) ?? 0d, + 0d ); if (mapSettings.ReduceLootByPercent) @@ -242,16 +256,13 @@ public class RaidTimeAdjustmentService( result.StaticLootPercent = Math.Max(raidTimeRemainingPercent, mapSettings.MinStaticLootPercent); } - logger.Debug($"Reduced: {request.Location} raid time by: {chosenRaidReductionPercent}% to {newRaidTimeMinutes} minutes"); - - // Calculate how long player needs to be in raid to get a `survived` extract status - result.NewSurviveTimeSeconds = Math.Max( - result.OriginalSurvivalTimeSeconds - (baseEscapeTimeMinutes - newRaidTimeMinutes) * 60 ?? 0, - 0D - ); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug($"Reduced: {request.Location} raid time by: {chosenRaidReductionPercent}% to {newRaidTimeMinutes} minutes"); + } var exitAdjustments = GetExitAdjustments(mapBase, newRaidTimeMinutes); - if (exitAdjustments.Any()) + if (exitAdjustments.Count != 0) { result.ExitChanges.AddRange(exitAdjustments); } @@ -336,9 +347,12 @@ public class RaidTimeAdjustmentService( { exitChange.Chance = 0; - logger.Debug( - $"Train Exit: {exit.Name} disabled as new raid time {newRaidTimeMinutes} minutes is below {mostPossibleTimeRemainingAfterDeparture} minutes" - ); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug( + $"Train Exit: {exit.Name} disabled as new raid time: {newRaidTimeMinutes} minutes is below: {mostPossibleTimeRemainingAfterDeparture} minutes" + ); + } result.Add(exitChange); @@ -349,7 +363,10 @@ public class RaidTimeAdjustmentService( exitChange.MinTime = Math.Max(exit.MinTime - reductionSeconds ?? 0, 0); exitChange.MaxTime = Math.Max(exit.MaxTime - reductionSeconds ?? 0, 0); - logger.Debug($"Train appears between: {exitChange.MinTime} and {exitChange.MaxTime} seconds raid time"); + if (logger.IsLogEnabled(LogLevel.Debug)) + { + logger.Debug($"Train appears between: {exitChange.MinTime} and: {exitChange.MaxTime} seconds raid time"); + } result.Add(exitChange); } diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs index 43d22c0c..5e91a48d 100644 --- a/SPTarkov.Server/Program.cs +++ b/SPTarkov.Server/Program.cs @@ -42,38 +42,54 @@ public static class Program } catch (Exception e) { - if (e.Message.Contains("could not load file or assembly", StringComparison.InvariantCultureIgnoreCase)) + if ( + e.Message.Contains( + "could not load file or assembly 'sptarkov.server.core, version=", + StringComparison.InvariantCultureIgnoreCase + ) + ) { - Console.WriteLine( - "=========================================================================================================" - ); - Console.BackgroundColor = ConsoleColor.DarkRed; - Console.ForegroundColor = ConsoleColor.Black; - Console.WriteLine( - "You may have forgotten to install a requirement for one of your mods, please check the mod page again and install any dependencies listed. Read the below error message CAREFULLY to find the name of the mod you need to install" - ); - - Console.ResetColor(); - Console.WriteLine(e); - Console.WriteLine( - "=========================================================================================================" + ShowRedConsoleMessage( + e, + "You may have installed a mod that needs a newer version of of SPT installed. Please try updating SPT" ); Console.ReadLine(); return; } - Console.WriteLine("========================================================================================================="); - Console.WriteLine( + if (e.Message.Contains("could not load file or assembly", StringComparison.InvariantCultureIgnoreCase)) + { + ShowRedConsoleMessage( + e, + "You may have forgotten to install a requirement for one of your mods, please check the mod page again and install any dependencies listed. Read the below error message CAREFULLY to find the name of the mod you need to install" + ); + + Console.ReadLine(); + return; + } + + ShowRedConsoleMessage( + e, "The server has unexpectedly stopped, reach out to #spt-support in our Discord server. Include a screenshot of this message + the below error" ); - Console.WriteLine(e); - Console.WriteLine("========================================================================================================="); Console.WriteLine("Press any key to exit..."); Console.ReadLine(); } } + private static void ShowRedConsoleMessage(Exception e, string message) + { + Console.WriteLine("========================================================================================================="); + Console.BackgroundColor = ConsoleColor.DarkRed; + Console.ForegroundColor = ConsoleColor.Black; + Console.WriteLine(message); + + Console.ResetColor(); + Console.WriteLine(e); + Console.WriteLine("========================================================================================================="); + } + public static async Task StartServer(string[] args) { Console.OutputEncoding = Encoding.UTF8;