diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ar.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ar.json
index c67cc14c..15ddc9d9 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ar.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/ar.json
@@ -130,11 +130,9 @@
"modloader-checking_mod": "يتم التحقق: %s\n\n\n\n\n\n\n",
"modloader-cyclic_dependency": "تم اكتشاف تبعية دائرية. يجب حل هذا الخطأ. لا يمكن للخادم أن يبدأ حتى يتم حل هذا وسيتم إيقاف التشغيل.\n\n\n\n\n\n\n",
"modloader-dependency_container_not_initalized": "تم طلب حاوية التبعية ولكنها لم تتم مبادرتها.\n\n\n\n\n\n\n",
- "modloader-error_parsing_mod_load_order": "حدث خطأ أثناء تحليل ترتيب المودات.\n\n\n\n\n\n\n",
"modloader-incompatibilities_not_string_array": "يجب أن يكون Mod %s package.json الخاصية 'incompatibilities' مصفوفة سلاسل",
"modloader-incompatible_mod_found": "المود {{author}}-{{name}} غير متوافق مع {{incompatibleModName}}.\n\n\n\n\n\n\n",
"modloader-is_client_mod": "المود (%s) هو مود خاص بالعميل ويجب وضعه في المجلد التالي: /spt/bepinex/plugins\n\n\n\n\n\n\n",
- "modloader-load_order_conflict": "{{modOneName}} و {{modTwoName}} لديهما متطلبات تعارض في ترتيب التحميل، لا يمكن للخادم أن يبدأ حتى يتم حل هذا وسيتم إيقاف التشغيل.\n\n\n\n\n\n\n",
"modloader-loaded_mod": "الإضافة: الإصدار {{name}}: {{version}} من قبل {{author}} تم تحميلها",
"modloader-loading_mods": "محمل الإضافات: جاري تحميل %s إضافة إلى الخادم...",
"modloader-main_property_not_js": "يجب أن تكون الخاصية الرئيسية للإضافة %s ملفًا من نوع .js في الملف package.json",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/cs.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/cs.json
index 2a16d8c3..972cea2b 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/cs.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/cs.json
@@ -203,13 +203,11 @@
"modloader-checking_mod": "kontroluji: %s",
"modloader-cyclic_dependency": "Zjištěna cyklická závislost. Tato chyba musí být opravena. Server se nemůže spustit, dokud nebude chyba opravena a vypne se",
"modloader-dependency_container_not_initalized": "Kontejner dependencí byl vyžádán, ale nebyl inicializován",
- "modloader-error_parsing_mod_load_order": "Chyba parsování načítání pořadí módů",
"modloader-incompatibilities_not_string_array": "Vlastnost módu %s package.json 'incompatibility' by měla být pole pro řetězec",
"modloader-incompatible_mod_found": "Modifikace {{author}}-{{name}} je nekompatibilní s {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod: %s obsahuje neplatný semver string v sptVersion field. Příklady platných hodnot: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mód (%s) je klientský mód a měl by být umístěn v následující složce: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod (%s) je určen pro verzi serveru před 4.0.0. Najdi prosím odpovídající verzi nebo počkej na aktualizaci.",
- "modloader-load_order_conflict": "`{{modOneName}}` a `{{modTwoName}}` mají protichůdné požadavky na pořadí načítání, server není schopen spustit, dokud nebude opraven a nebude vypnut",
"modloader-loaded_mod": "Mód: {{name}} verze: {{version}} od: {{author}} načten",
"modloader-loading_mods": "ModLoader: načítání modů %s serveru...",
"modloader-main_property_not_js": "Mód %s package.json musí bát soubor typu .js",
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 ed7a8476..13200b0d 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
@@ -197,12 +197,10 @@
"modloader-checking_mod": "Überprüfung: %s",
"modloader-cyclic_dependency": "Zyklische Abhängigkeit erkannt. Dieser Fehler muss behoben werden. Der Server kann erst gestartet werden, wenn das Problem behoben ist, und wird heruntergefahren",
"modloader-dependency_container_not_initalized": "Der Abhängigkeitscontainer wurde angefordert, aber nicht initialisiert",
- "modloader-error_parsing_mod_load_order": "Fehler beim Parsen der Mod-Ladereihenfolge",
"modloader-incompatibilities_not_string_array": "Die Mod %s package.json Eigenschaft 'Inkompatibilitäten' sollte ein String-Array sein",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} ist nicht kompatibel mit {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod: %s enthält eine ungültige ´semver´ Zeichenkette im ´sptversions´ Feld. Beispiele für gültige Werte: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mod (%s) ist ein Client-Mod und sollte im folgenden Ordner abgelegt werden: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "'{{modOneName}}' und '{{modTwoName}}' haben widersprüchliche Anforderungen an die Ladereihenfolge. Der Server kann erst gestartet werden, wenn dies behoben ist, und wird heruntergefahren",
"modloader-loaded_mod": "Mod: {{name}} Version: {{version}} von: {{author}} geladen",
"modloader-loading_mods": "ModLoader: %s Server-Mods werden geladen...",
"modloader-main_property_not_js": "Die Haupteigenschaft von Mod %s package.json muss eine .js Datei sein",
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 2a638923..77f6af2e 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
@@ -205,13 +205,11 @@
"modloader-checking_mod": "έλεγχος: %s",
"modloader-cyclic_dependency": "Εντοπίστηκε κυκλική εξάρτηση. Αυτό το σφάλμα πρέπει να διορθωθεί. Ο διακομιστής δεν μπορεί να ξεκινήσει μέχρι αυτό να διορθωθεί και να τερματιστεί",
"modloader-dependency_container_not_initalized": "Το εξαρτώμενο δοχείο ζητήθηκε αλλά δεν εκκινήθηκε",
- "modloader-error_parsing_mod_load_order": "Σφάλμα κατά την ανάλυση της σειράς φόρτωσης πρόσθετου (mod)",
"modloader-incompatibilities_not_string_array": "Στο πρόσθετο %s package.json η ιδιότητα \"ασυμβατότητες\" θα πρέπει να είναι μία συστοιχία συμβολοσειρών",
"modloader-incompatible_mod_found": "Το πρόσθετο {{author}}-{{name}} δεν είναι συμβατό με το {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Το πρόσθετο %s περιέχει μία μη έγκυρη semver συμβολοσειρά στο πεδίο sptVersion. Παραδείγματα έγκυρων τιμών: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Το πρόσθετο (%s) είναι ένα πρόσθετο πελάτη και θα πρέπει να τοποθετηθεί στον ακόλουθο φάκελο: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Το Mod (%s) είναι μια λειτουργία διακομιστή προ της έκδοσης 4.0.0. Παρακαλώ βρείτε την κατάλληλη έκδοση ή περιμένετε για μια ενημέρωση.",
- "modloader-load_order_conflict": "Τα `{{modOneName}}` και `{{modTwoName}}` έχουν αντικρουόμενες απαιτήσεις σειράς φόρτωσης, ο διακομιστής δεν μπορεί να ξεκινήσει μέχρι να αυτό διορθωθεί και θα τερματιστεί",
"modloader-loaded_mod": "Πρόσθετο: {{name}} έκδοση: {{version}} από: {{author}} φορτώθηκε",
"modloader-loading_mods": "ModLoader: φόρτωση πρόσθετων %s διακομιστή...",
"modloader-main_property_not_js": "Η κύρια ιδιότητα του πρόσθετου %s package.json πρέπει να είναι ένα αρχείο .js",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/en.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/en.json
index a3647da2..2c3d87c9 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/en.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/en.json
@@ -205,18 +205,18 @@
"modloader-checking_mod": "checking: %s",
"modloader-cyclic_dependency": "Cyclic dependency detected. This error needs to be fixed. The server is unable to start until this is fixed and will shut down",
"modloader-dependency_container_not_initalized": "The dependency container was requested but it wasn't initialized",
- "modloader-error_parsing_mod_load_order": "Error parsing mod load order",
"modloader-incompatibilities_not_string_array": "Mod %s package.json property 'incompatibilities' should be a string array",
"modloader-incompatible_mod_found": "Mod: {{author}}-{{name}} is incompatible with: {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod: %s contains an invalid semver string in the sptVersion field. Examples of valid values: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mod (%s) is a client mod and should be placed in the following folder: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod (%s) is a pre-4.0.0 server mod. Please find the appropriate version or wait for an update.",
- "modloader-load_order_conflict": "`{{modOneName}}` and `{{modTwoName}}` have conflicting load order requirements, the server is unable to start until this is fixed and will shut down",
"modloader-loaded_mod": "Mod: {{name}} version: {{version}} by: {{author}} loaded",
"modloader-loading_mods": "ModLoader: loading: %s server mods...",
"modloader-main_property_not_js": "Mod %s package.json main property must be a .js file",
"modloader-main_property_points_to_nothing": "Mod %s package.json main property points to non-existing file",
"modloader-missing_dependency": "Mod: {{mod}} requires: {{modDependency}} to be installed.",
+ "modloader-self_dependency": "Mod {{mod}} depends on itself, please remove it from your own dependency list",
+ "modloader-self_incompatibility": "Mod {{mod}} is incompatible with itself, please remove it from your own incompatibilities list",
"modloader-missing_package_json": "Mod: (%s) is missing a package.json. Make sure you have checked the mods hub page for install instructions",
"modloader-missing_package_json_property": "Mod: {{modName}} package.json requires {{prop}} property",
"modloader-missing_sptversion_field": "Mod %s is missing the sptVersion field, most likely due to being out of date and incompatible with the current version of SPT",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/es-es.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/es-es.json
index fc363943..c2c3514d 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/es-es.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/es-es.json
@@ -198,13 +198,11 @@
"modloader-checking_mod": "comprobando: %s",
"modloader-cyclic_dependency": "Dependencia cíclica detectada",
"modloader-dependency_container_not_initalized": "El contenedor de dependencias fue solicitado pero no estaba inicializado",
- "modloader-error_parsing_mod_load_order": "Error al traducir el orden de las modificaciones",
"modloader-incompatibilities_not_string_array": "La propiedad 'incompatibilities' de la modificacion %s package.json deberia ser un arreglo de string",
"modloader-incompatible_mod_found": "La modificación {{author}}-{{name}} no es compatible con {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod %s contiene una cadena semver inválida en el campo sptVersion. Ejemplos de valores válidos: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "La modificación (%s) es de cliente, esta debería ponerse en el directorio: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "El Mod (%s) es para una versión anterior a la 4.0.0 del servidor. Por favor encuentre la versión adecuada o espere a una actualización.",
- "modloader-load_order_conflict": "`{{modOneName}}` y `{{modTwoName}}` tienen un conflicto de requerimientos en orden de carga, el servidor en incapaz de iniciarse asta que se solucione y se apagara",
"modloader-loaded_mod": "Modificacion {{name}} version {{version}} de {{author}} cargada",
"modloader-loading_mods": "ModLoader: cargando %s modificaciones...",
"modloader-main_property_not_js": "La propiedad 'main' de la modificacion %s package.json debe ser un archivo .js",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/fr.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/fr.json
index 9aa8ce2f..dbdbc1df 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/fr.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/fr.json
@@ -203,13 +203,11 @@
"modloader-checking_mod": "Vérification de : %s",
"modloader-cyclic_dependency": "Dépendance cyclique détectée. Cette erreur doit être résolue. Le serveur s'éteindra automatiquement tant que cela n'est pas corrigé",
"modloader-dependency_container_not_initalized": "Le conteneur de dépendances a été demandé, mais n'était pas initialisé",
- "modloader-error_parsing_mod_load_order": "SPT-AKI n'a pas réussi à déterminer l'ordre correct des mods",
"modloader-incompatibilities_not_string_array": "la propriété 'incompatibilities' dans le fichier package.json du mod %s doit être un tableau de chaînes de caractères",
"modloader-incompatible_mod_found": "Le mod {{author}}-{{name}} est incompatible avec {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Le mod %s contient une chaîne de caractères semver invalide dans le champ sptVersion. Exemples de chaînes correctes: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Le mod (%s) est un mod client et doit être placé dans le dossier suivant : /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod (%s) est un mod server pour versions antérieures à 4.0.0. Trouvez une version appropriée ou attendez que le mod soit à jour.",
- "modloader-load_order_conflict": "`{{modOneName}}` et `{{modTwoName}}` ont des ordres de chargement en conflit, le serveur ne peut pas démarrer tant que ceci n'est pas corrigé et s'arrêtera",
"modloader-loaded_mod": "Mod : {{name}} version : {{version}} par : {{author}} est chargé",
"modloader-loading_mods": "ModLoader: Chargement des mods du serveur %s...",
"modloader-main_property_not_js": "Mod %s package.json : la propriété principale doit être un fichier .js",
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 6aad597e..054af03a 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
@@ -171,11 +171,9 @@
"modloader-checking_mod": "ellenőrzés: %s",
"modloader-cyclic_dependency": "Ciklikus függőséget észleltünk. Ezt a hibát javítani kell. A szerver nem tud elindulni amíg ez meg nem történik, és le fog állni",
"modloader-dependency_container_not_initalized": "A dependency container lekérve, de nincs inicializálva",
- "modloader-error_parsing_mod_load_order": "Hiba a mod betöltési sorrendjének elemzésekor",
"modloader-incompatibilities_not_string_array": "A Mod %s package.json „incompatibilities” tulajdonságának karakterlánc tömbnek kell lennie",
"modloader-incompatible_mod_found": "{{author}}-{{name}} mod nem kompatibilis a következővel: {{incompatibleModName}}",
"modloader-is_client_mod": "A következő mod (%s) egy kliens mod és a következő mappába kell helyezni: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "`{{modOneName}}` és`{{modTwoName}}` modoknak ellentmondásos betöltési sorrend követelményei vannak, a szerver nem tud elindulni amíg ezt nem javítják, és leáll",
"modloader-loaded_mod": "Mod: {{name}} verzió: {{version}} by: {{author}} betöltve",
"modloader-loading_mods": "ModLoader: %s szervermodok betöltése...",
"modloader-main_property_not_js": "A mod %s package.json fő tulajdonsága egy .js fájl kell legyen",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/id.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/id.json
index a03d1cf2..7e58f368 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/id.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/id.json
@@ -180,11 +180,9 @@
"modloader-checking_mod": "sedang mengecek: %s",
"modloader-cyclic_dependency": "Dependensi siklik terdeteksi. Masalah ini perlu dibenarkan. Server tidak bisa mulai hingga masalah ini diperbaiki dan akan dimatikan",
"modloader-dependency_container_not_initalized": "Kontainer dependensi telah diminta tapi belum diinisialisasi",
- "modloader-error_parsing_mod_load_order": "Permasalahan dalam penguraian urutan pemuatan mod",
"modloader-incompatibilities_not_string_array": "Mod %s data package.json 'incompatibilities' harus string array",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} tidak compatibel dengan {{incompatibleModName}}",
"modloader-is_client_mod": "Mod (%s) merupakan mod client dan harus dipasang dalam folder: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "'{{modOneName}}' dan '{{modTwoName}}' memiliki urutan pemuatan yang bertentangan, server tidak bisa mulai hingga masalah ini diperbaiki dan akan dimatikan",
"modloader-loaded_mod": "Mod: {{name}} versi: {{version}} oleh: {{author}} dimuat",
"modloader-loading_mods": "ModLoader: loading %s server mods...",
"modloader-main_property_not_js": "Mod %s properti utama package.json harus berupa file .js",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/it.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/it.json
index 10f6c4b7..0c1767f4 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/it.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/it.json
@@ -205,13 +205,11 @@
"modloader-checking_mod": "controllo: %s",
"modloader-cyclic_dependency": "Dipendenza ciclica individuata. Questo errore va risolto. Il server non potrà partire finché questo non sarà risolto e si arresterà",
"modloader-dependency_container_not_initalized": "Il contenitore di dipendenze è richiesto ma non è inizializzato",
- "modloader-error_parsing_mod_load_order": "Errore nel processare l'ordine di caricamento della mod",
"modloader-incompatibilities_not_string_array": "Le proprietà 'incompatibilities' della mod %s, nel package.json, devono essere uno string array",
"modloader-incompatible_mod_found": "La mod {{author}}-{{name}} è incompatibile con {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "La mod %s contiene una stringa semver non valida nel campo akiVersion. Esempi di valori validi: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "La mod (%s) è una mod del client e dovrebbe essere posizionata nella seguente cartella: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "La Mod (%s) è una server mod pre-4.0.0. Si prega di utilizzare la versione appropriata della mod o aspettare che venga aggiornata.",
- "modloader-load_order_conflict": "Il server si spegnerà perché i requisiti dell'ordine di carico per `{{modOneName}}` e `{{modTwoName}}` sono in conflitto. Sistemali prima di avviare",
"modloader-loaded_mod": "Caricata la mod {{name}}, versione{{version}}, di {{author}} ",
"modloader-loading_mods": "ModLoader: caricamento %s mods del server...",
"modloader-main_property_not_js": "La proprietà 'main' del package.json della mod %s deve essere un file .js",
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 5f4fdc53..0079777b 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
@@ -185,13 +185,11 @@
"modloader-checking_mod": "チェック中: %s",
"modloader-cyclic_dependency": "循環依存が検出されました。",
"modloader-dependency_container_not_initalized": "依存関係コンテナーが要求されましたが、初期化されませんでした",
- "modloader-error_parsing_mod_load_order": "mod ロード順の解析中にエラーが発生しました。",
"modloader-incompatibilities_not_string_array": "Mod %s package.json プロパティ '非互換性' は文字列配列でなければなりません。",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} is incompatible with {{incompatibleModName}}。",
"modloader-invalid_sptVersion_field": "Mod %s の sptVersion フィールドで不正な Semver 文字列が使用されています。正しい例はこちら: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "モッド %s はクライアントタイプのモッドです。正しいインストール先はこちら: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod %s は 4.0.0 より前のバージョン向けのModです。適切なバージョンを見つけるか、アップデートされるまでお待ちください。",
- "modloader-load_order_conflict": "`{{modOneName}}` と `{{modTwoName}}` のロードの順序の条件が競合しています。 これが修正されるまでサーバーを起動できずシャットダウンします",
"modloader-loaded_mod": "モッド {{name}} バージョン{{version}} 作者 {{author}} 読み込む完了。",
"modloader-loading_mods": "モッド読み込むツール: %s 個のモッド読み込む中...",
"modloader-main_property_not_js": "モッド %s のpackage.jsonの主要プロパティは .js ファイルである必要があります。",
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 75963e8c..3479c509 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
@@ -203,13 +203,11 @@
"modloader-checking_mod": "모드 확인 중: %s",
"modloader-cyclic_dependency": "순환 종속되는 모드가 발견되었습니다",
"modloader-dependency_container_not_initalized": "종속되는 컨테이너를 요청했으나 컨테이너의 초기화가 되어있지 않았습니다",
- "modloader-error_parsing_mod_load_order": "모드 순서를 가져오는데 오류가 발생하였습니다",
"modloader-incompatibilities_not_string_array": "모드 %s 의 package.json 파일 중 'incompatibilities' 속성은 문자 배열 타입이어야 합니다",
"modloader-incompatible_mod_found": "모드 {{author}}-{{name}} 는 {{incompatibleModName}} 모드와 호환되지 않습니다",
"modloader-invalid_sptVersion_field": "모드 %s 가 sptVersion 필드에 부적합한 semver 스트링 값을 보유하고 있습니다. 올바른 값들의 예시: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "모드 (%s) 는 클라이언트 모드로 '/spt/bepinex/plugins' 폴더에 위치해야 합니다",
"modloader-is-old-js-mod": "%s 모드는 4.0 이전 버전용 서버모드입니다. 올바른 버전을 찾아 다시 설치하거나 모드가 업데이트 되기를 기다리세요.",
- "modloader-load_order_conflict": "`{{modOneName}}` 과 `{{modTwoName}}` 는 요구되는 모드 순서가 서로 충돌됩니다, 이 문제를 해결하기 전까지 서버를 실행할 수 없으며 서버가 종료됩니다",
"modloader-loaded_mod": "모드 {{name}} 버전 {{version}} by {{author}} 불러옴",
"modloader-loading_mods": "ModLoader: 총 %s 개의 모드 불러오는 중...",
"modloader-main_property_not_js": "모드 %s 의 package.json 파일 중 main 속성은 무조건 .js 파일을 설정해야합니다",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/nl.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/nl.json
index e75b7387..8ce13e9e 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/nl.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/nl.json
@@ -205,13 +205,11 @@
"modloader-checking_mod": "wordt gecontroleerd: %s",
"modloader-cyclic_dependency": "Cyclische dependency gedetecteerd",
"modloader-dependency_container_not_initalized": "De afhankelijkheid container was opgevraagd werd maar niet geïnitialiseerd",
- "modloader-error_parsing_mod_load_order": "Fout tijdens het parsen van de mod laadvolgorde",
"modloader-incompatibilities_not_string_array": "Mod %s package.json property 'incompatibilities' moet een string array zijn",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} is niet compatibel met {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod: %s bevat een ongeldige semver string in het sptVersion veld. Voorbeelden van geldige waarden: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mod (%s) is een client mod en moet in de volgende map geplaatst worden: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod (%s) is een pre-4.0.0 server mod. Zoek de juiste versie of wacht op een update.",
- "modloader-load_order_conflict": "`{{modOneName}}` en`{{modTwoName}}` hebben een conflict in de volgorde van laden, de server kan niet opstarten tot het conflict is opgelost. De server word gestopt",
"modloader-loaded_mod": "Mod {{name}} versie{{version}} door {{author}} is geladen",
"modloader-loading_mods": "ModLoader: %s mods worden ingeladen op server...",
"modloader-main_property_not_js": "Mod %s package.json main property moet een .js bestand zijn",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/no.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/no.json
index 19f68c4b..661dec20 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/no.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/no.json
@@ -126,11 +126,9 @@
"modloader-checking_mod": "sjekker: %s",
"modloader-cyclic_dependency": "Syklisk avhengighet oppdaget. Denne feilen må løses. Serveren kan ikke starte før dette er fikset og vil stoppe",
"modloader-dependency_container_not_initalized": "Avhengighetsbeholderen ble forespurt, men den ble ikke initialisert",
- "modloader-error_parsing_mod_load_order": "Feil under parsing av mod lastings rekkefølge",
"modloader-incompatibilities_not_string_array": "Mod %s package.json egenskaps 'inkompatibiliteter' bør være en streng array",
"modloader-incompatible_mod_found": "Mod {{author}}–{{name}} er inkompatibel med {{incompatibleModName}}",
"modloader-is_client_mod": "Mod (%s) er en klientmod og skal plasseres i følgende mappe: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "`{{modOneName}}` og `{{modTwoName}}` har motstridende krav for innlastingsrekkefølge. serveren kan ikke starte før dette er fikset og vil slå seg av",
"modloader-loaded_mod": "Mod: {{name}} versjon: {{version}} av: {{author}} lastet inn",
"modloader-loading_mods": "ModLoader: laster inn %s server mods...",
"modloader-main_property_not_js": "Mod %s package.json hovedegenskap må være en .js-fil",
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 63914124..019faec2 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
@@ -203,13 +203,11 @@
"modloader-checking_mod": "sprawdzanie: %s",
"modloader-cyclic_dependency": "Wykryto cykliczną zależność. Ten błąd powinien zostać naprawiony. Serwer nie może wystartować, dopóki błąd występuje i zostanie teraz wyłączony",
"modloader-dependency_container_not_initalized": "Kontener zależności został wywołany, ale nie został zainicjowany",
- "modloader-error_parsing_mod_load_order": "Błąd analizowania kolejności ładowania modów",
"modloader-incompatibilities_not_string_array": "Mod %s właściwość package.json 'incompatibilities' powinna być tabelą string",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} jest niezgodny z {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "Mod %s zawiera nieprawidłowy string semver w polu sptVersion. Przykłady prawidłowych wartości: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mod (%s) jest modem klienta i powinien zostać umieszczony w następującym folderze: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Modyfikacja (%s) jest modem serwera sprzed wersji 4.0.0. Znajdź odpowiednią wersję lub poczekaj na aktualizację.",
- "modloader-load_order_conflict": "`{{modOneName}}` and `{{modTwoName}}` mają sprzeczne wymagania dotyczące kolejności ładowania, serwer nie może się uruchomić, dopóki błąd występuje i zostanie teraz wyłączony",
"modloader-loaded_mod": "Załadowany mod: {{name}} wersja: {{version}} autor: {{author}}",
"modloader-loading_mods": "ModLoader: ładowanie %s modów serwera...",
"modloader-main_property_not_js": "Główna właściwość package.json modu %s musi być plikiem .js",
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 9e25dcf2..1359af8a 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
@@ -197,13 +197,11 @@
"modloader-checking_mod": "verificando: %s",
"modloader-cyclic_dependency": "Detecção de dependência cíclica. Este erro precisa ser corrigido. O servidor não conseguirá iniciar até que isso seja resolvido e será encerrado",
"modloader-dependency_container_not_initalized": "O contêiner de dependência foi solicitado, mas não foi inicializado",
- "modloader-error_parsing_mod_load_order": "Erro ao analisar a ordem de carregamento do mod",
"modloader-incompatibilities_not_string_array": "A propriedade 'incompatibilities' do arquivo package.json do mod %s deveria ser uma matriz de strings",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} é incompatível com {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "O mod %s contém uma string semver inválida no campo sptVersion. Exemplos de valores válidos: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "O mod (%s) é um mod de cliente e deve ser colocado na seguinte pasta: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "O mod (%s) foi feito para servidores pré-4.0.0. Por favor, busque a versão apropriada ou espere por uma atualização.",
- "modloader-load_order_conflict": "{{modOneName}} e {{modTwoName}} têm requisitos de ordem de carregamento conflitantes. O servidor não conseguirá iniciar até que isso seja corrigido e será encerrado",
"modloader-loaded_mod": "Mod: {{name}} versão: {{version}} por: {{author}} carregado",
"modloader-loading_mods": "ModLoader: carregando mods do servidor %s...",
"modloader-main_property_not_js": "O arquivo package.json do mod %s deve ter a propriedade main como um arquivo .js",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-pt.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-pt.json
index e9366a5e..00632b41 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-pt.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/pt-pt.json
@@ -131,11 +131,9 @@
"modloader-checking_mod": "verificando: %s",
"modloader-cyclic_dependency": "Dependência cíclica detetada entre 2 mods. Este erro precisa de ser corrigido. O servidor é incapaz de iniciar até isto ser corrigido e será desligado",
"modloader-dependency_container_not_initalized": "O dependency container foi solicitado, mas ele não foi inicializado",
- "modloader-error_parsing_mod_load_order": "Erro ao analisar ordem de carregamento de mods",
"modloader-incompatibilities_not_string_array": "A propriedade 'incompatibilities' no package.json do mod %s deve ser um array de strings",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} é incompatível com {{incompatibleModName}}",
"modloader-is_client_mod": "Mod (%s) é um mod de cliente e deve ser colocado na seguinte pasta: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "O '{{modOneName}}' e '{{modTwoName}}' têm requisitos de ordem de carregamento que entram em conflito. O servidor é incapaz de iniciar e será desligado até isto ser corrigido",
"modloader-loaded_mod": "Mod: {{name}} versão: {{version}} por: {{author}} carregado",
"modloader-loading_mods": "ModLoader: carregando %s mods de servidor...",
"modloader-main_property_not_js": "A propriedade main no package.json do mod %s deve ser um ficheiro .js",
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 24e0fd8c..2f8a18d8 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
@@ -203,13 +203,11 @@
"modloader-checking_mod": "проверка: %s",
"modloader-cyclic_dependency": "Обнаружена циклическая зависимость",
"modloader-dependency_container_not_initalized": "Был запрошен контейнер зависимостей, но он не был инициализирован",
- "modloader-error_parsing_mod_load_order": "Ошибка парсинга порядка загрузки модов",
"modloader-incompatibilities_not_string_array": "В файле package.json мода %s свойство 'incompatibilities' должно быть массивом строк",
"modloader-incompatible_mod_found": "Мод {{author}}-{{name}} не совместим с модом {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "В поле sptVersion мода %s содержится некорректная семвер-строка. См. примеры корректных значений: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Мод (%s) является модом для клиента и должен находиться в следующей папке: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Мод (%s) - это серверный мод, выпущенный до версии 4.0.0. Пожалуйста, найдите подходящую версию или дождитесь обновления.",
- "modloader-load_order_conflict": "`{{modOneName}}` и `{{modTwoName}}` имеют конфликтующие требования к порядку загрузки, сервер не запустится и закроется, пока это не будет исправлено",
"modloader-loaded_mod": "Мод {{name}} версии {{version}} от {{author}} загружен",
"modloader-loading_mods": "Загрузчик модов: загружаем %s мод(ов/а)...",
"modloader-main_property_not_js": "В файле package.json мода %s в свойстве 'main' должен быть указан .js файл",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/sv-se.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/sv-se.json
index d228fea0..9fde1e12 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/sv-se.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/sv-se.json
@@ -138,11 +138,9 @@
"modloader-checking_mod": "kontrollerade: %s",
"modloader-cyclic_dependency": "Cykliskt beroende upptäckt",
"modloader-dependency_container_not_initalized": "Beroendebehållaren efterfrågades men den initierades inte",
- "modloader-error_parsing_mod_load_order": "Fel vid analys av modladdningsordning",
"modloader-incompatibilities_not_string_array": "Mod %s package.json-egenskapen 'incompatibilities' bör vara en strängmatris",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}} är inkompatibel med {{incompatibleModName}}",
"modloader-is_client_mod": "Mod (%s) är en klientmod och bör placeras i följande mapp: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "`{{modOneName}}` och `{{modTwoName}}` har motstridiga laddordningskrav, servern kan inte starta förrän detta är fixat och kommer att stängas ner",
"modloader-loaded_mod": "Mod {{name}} version{{version}} av {{author}} har laddats",
"modloader-loading_mods": "ModLoader: laddar %s mods...",
"modloader-main_property_not_js": "Mod %s package.json huvudegenskap måste vara en .js-fil",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/tr.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/tr.json
index 19db243c..844511a1 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/tr.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/tr.json
@@ -203,13 +203,11 @@
"modloader-checking_mod": "kontrol ediliyor: %s",
"modloader-cyclic_dependency": "Döngüsel bağımlılık algılandı",
"modloader-dependency_container_not_initalized": "`{{modOneName}}` ve `{{modTwoName}}` yük sırası gereksinimleri çakışıyor, bu sorun giderilene kadar sunucu başlayamıyor ve kapanacak",
- "modloader-error_parsing_mod_load_order": "Mod yükleme sırası ayrıştırılırken hata oluştu",
"modloader-incompatibilities_not_string_array": "Mod %s package.json özelliği 'incompatibilities' bir dize dizisi olmalıdır",
"modloader-incompatible_mod_found": "Mod {{author}}-{{name}}, {{incompatibleModName}} ile uyumsuz",
"modloader-invalid_sptVersion_field": "Mod %s, sptVersion alanında geçersiz bir semver dizesi içeriyor. Geçerli değerlere örnekler: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Mod (%s) bir istemci modudur ve aşağıdaki klasöre yerleştirilmelidir: /spt/bepinex/plugins",
"modloader-is-old-js-mod": "Mod (%s) 4.0.0 öncesi bir sunucu modudur. Lütfen uygun sürümü bulun veya bir güncelleme bekleyin.",
- "modloader-load_order_conflict": "`{{modOneName}}` ve `{{modTwoName}}` yük sırası gereksinimleri çakışıyor, bu sorun giderilene kadar sunucu başlayamıyor ve kapanacak",
"modloader-loaded_mod": "Mod: {{name}} sürüm: {{version}} tarafından: {{author}} yüklendi",
"modloader-loading_mods": "ModLoader: %s sunucu modları yükleniyor...",
"modloader-main_property_not_js": "Mod %s package.json ana özelliği bir .js dosyası olmalıdır",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/uk.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/uk.json
index bc02b6c9..340cfce5 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/uk.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/uk.json
@@ -196,12 +196,10 @@
"modloader-checking_mod": "перевірка: %s",
"modloader-cyclic_dependency": "Виявлено циклічну залежність. Цю помилку необхідно виправити. Сервер не зможе запуститися, доки це не буде виправлено, і буде вимкнений",
"modloader-dependency_container_not_initalized": "Було запитано контейнер залежностей, але його не було ініціалізовано",
- "modloader-error_parsing_mod_load_order": "Помилка розбору порядку завантаження модулів",
"modloader-incompatibilities_not_string_array": "У файлі package.json мода %s властивість 'incompatibilities' має бути масивом рядків",
"modloader-incompatible_mod_found": "Мод:{{author}}-{{name}} не сумісний з:{{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "У полі sptVersion мода %s міститься некоректний семвер рядок. Див. приклади коректних значень: https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "Мод (%s) є модом для клієнта і повинен знаходитися в такій папці: /spt/bepinex/plugins",
- "modloader-load_order_conflict": "`{{modOneName}}` і `{{modTwoName}}` мають конфліктуючи вимоги до порядку завантаження, сервер не запуститься і закриється, поки це не буде виправлено",
"modloader-loaded_mod": "Мод {{name}} версії {{version}} от {{author}} завантажено",
"modloader-loading_mods": "ModLoader: завантажуємо %s мод(ів/а)...",
"modloader-main_property_not_js": "У файлі package.json мода %s у властивості 'main' має бути вказано .js файл",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-TW.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-TW.json
index 183f33d2..6bc7ca8a 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-TW.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-TW.json
@@ -84,7 +84,6 @@
"modloader-checked": "已檢查",
"modloader-checking_mod": "檢查中: %s",
"modloader-cyclic_dependency": "發現Cyclic dependency(循環依賴). 此錯誤必須修復. 修復前伺服器無法啟動, 伺服器將關閉",
- "modloader-load_order_conflict": "模組 `{{modOneName}}` 和模組 `{{modTwoName}}` 發現載入順序的衝突, 修復前伺服器無法啟動, 伺服器將關閉",
"modloader-loading_mods": "ModLoader: 載入伺服器模組 %s 中...",
"modloader-mod_has_no_main_property": "ModLoader: 模組 (%s) 不相容. 缺少一個 'main' 屬性",
"modloader-mod_order_error": "ModLoader: order.json 中發現錯誤, 將使用預設載入順序",
diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-cn.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-cn.json
index d52a0b89..83a99b54 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-cn.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/locales/server/zh-cn.json
@@ -205,13 +205,11 @@
"modloader-checking_mod": "正在检查:%s",
"modloader-cyclic_dependency": "检测到循环依赖。此错误需要修复。服务器无法启动并将关闭,直到错误修复",
"modloader-dependency_container_not_initalized": "已请求所依赖容器,但其尚未初始化",
- "modloader-error_parsing_mod_load_order": "分析模组加载顺序时出错",
"modloader-incompatibilities_not_string_array": "模组%s package.json属性“incompatibilities”应该是字符串数组",
"modloader-incompatible_mod_found": "模组 {{author}}-{{name}} 不兼容 {{incompatibleModName}}",
"modloader-invalid_sptVersion_field": "模组 %s 在sptVersion字段中包含无效的semver字符串。有效值示例:https://github.com/npm/node-semver#versions",
"modloader-is_client_mod": "模组 %s 是一个客户端模组,应该被放置在这个文件夹:/spt/bepinex/plugins",
"modloader-is-old-js-mod": "模组 (%s) 是 4.0.0 版本前的服务端模组,请使用对应版本的客户端或等待该模组更新适配。",
- "modloader-load_order_conflict": "模组`{{modOneName}} `和`{{modTwoName}} `存在载入顺序冲突,在解决此冲突前服务器将因无法正常启动而关闭",
"modloader-loaded_mod": "模组:{{name}} 版本{{version}} 作者:{{author}} 已加载",
"modloader-loading_mods": "模组加载器:正在加载%s个客户端模组……",
"modloader-main_property_not_js": "模组 %s package.json的main属性必须时一个.js文件",
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
index 06a3c3ac..a8e9bd70 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
@@ -30,7 +30,7 @@ public abstract record AbstractModMetadata
///
/// People who have contributed to this mod
///
- public abstract List? Contributors { get; set; }
+ public abstract List? Contributors { get; init; }
///
/// Semantic version of this mod, this uses the semver standard: https://semver.org/
@@ -39,7 +39,7 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("1.0.0.0"); is not
///
- public abstract Version Version { get; }
+ public abstract Version Version { get; init; }
///
/// SPT version this mod was built for, this uses the semver standard: https://semver.org/
@@ -48,39 +48,29 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("4.0.0.0"); is not
///
- public abstract Version SptVersion { get; }
-
- ///
- /// List of mods this mod should load before
- ///
- public abstract List? LoadBefore { get; set; }
-
- ///
- /// List of mods this mod should load after
- ///
- public abstract List? LoadAfter { get; set; }
+ public abstract Version SptVersion { get; init; }
///
/// List of mods not compatible with this mod
///
- public abstract List? Incompatibilities { get; set; }
+ public abstract List? Incompatibilities { get; init; }
///
/// Dictionary of mods this mod depends on.
///
/// Mod dependency is the key, version is the value
///
- public abstract Dictionary? ModDependencies { get; set; }
+ public abstract Dictionary? ModDependencies { get; init; }
///
/// Link to this mod's mod page, or GitHub page
///
- public abstract string? Url { get; set; }
+ public abstract string? Url { get; init; }
///
/// Does this mod load bundles
///
- public abstract bool? IsBundleMod { get; set; }
+ public abstract bool? IsBundleMod { get; init; }
///
/// Name of the license this mod uses
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/ModOrder.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/ModOrder.cs
deleted file mode 100644
index e8ae10c8..00000000
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/ModOrder.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System.Text.Json.Serialization;
-
-namespace SPTarkov.Server.Core.Models.Spt.Mod;
-
-public class ModOrder
-{
- [JsonPropertyName("order")]
- public List Order { get; set; }
-}
diff --git a/SPTarkov.Server/Modding/ModLoadOrder.cs b/SPTarkov.Server/Modding/ModLoadOrder.cs
deleted file mode 100644
index 2f9bb16d..00000000
--- a/SPTarkov.Server/Modding/ModLoadOrder.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using SPTarkov.Server.Core.Models.Spt.Mod;
-using SPTarkov.Server.Core.Utils.Cloners;
-
-namespace SPTarkov.Server.Modding;
-
-public class ModLoadOrder(ICloner cloner)
-{
- protected readonly Dictionary LoadOrder = new();
- protected Dictionary Mods = new();
- protected Dictionary ModsAvailable = new();
-
- public Dictionary SetModList(Dictionary mods)
- {
- this.Mods = mods;
- ModsAvailable = cloner.Clone(this.Mods);
- LoadOrder.Clear();
-
- var visited = new HashSet();
-
- // invert loadBefore into loadAfter on specified mods
- foreach (var (modGuid, modConfig) in ModsAvailable)
- {
- if ((modConfig.LoadBefore ?? []).Count > 0)
- {
- InvertLoadBefore(modGuid);
- }
- }
-
- foreach (var modGuid in ModsAvailable.Keys)
- {
- GetLoadOrderRecursive(modGuid, visited);
- }
-
- return LoadOrder;
- }
-
- public List GetLoadOrder()
- {
- return [.. LoadOrder.Keys];
- }
-
- public HashSet GetModsOnLoadBefore(string modGuid)
- {
- if (!Mods.TryGetValue(modGuid, out var config))
- {
- throw new Exception($"The mod: {modGuid} does not exist!");
- }
-
- var loadBefore = new HashSet(config.LoadBefore);
- foreach (var loadBeforeModGuid in loadBefore)
- {
- if (!Mods.ContainsKey(loadBeforeModGuid))
- {
- loadBefore.Remove(loadBeforeModGuid);
- }
- }
-
- return loadBefore;
- }
-
- protected void InvertLoadBefore(string modGuid)
- {
- var loadBefore = GetModsOnLoadBefore(modGuid);
-
- foreach (var loadBeforeMod in loadBefore)
- {
- var loadBeforeModConfig = ModsAvailable[loadBeforeMod];
-
- loadBeforeModConfig.LoadAfter ??= [];
- loadBeforeModConfig.LoadAfter.Add(modGuid);
-
- ModsAvailable.Add(loadBeforeMod, loadBeforeModConfig);
- }
- }
-
- protected void GetLoadOrderRecursive(string modGuid, HashSet visited)
- {
- // Validate package
- if (LoadOrder.ContainsKey(modGuid))
- {
- return;
- }
-
- if (visited.Contains(modGuid))
- {
- // Additional info to help debug
- throw new Exception($"Cyclic dependency detected for mod: {modGuid}!");
- }
-
- // Check dependencies
- if (!ModsAvailable.TryGetValue(modGuid, out var config))
- {
- throw new Exception("modloader-error_parsing_mod_load_order");
- }
-
- config.LoadAfter ??= [];
- config.ModDependencies ??= [];
-
- var dependencies = new HashSet(config.ModDependencies.Keys);
-
- foreach (var modAfterGuid in config.LoadAfter)
- {
- if (ModsAvailable.TryGetValue(modAfterGuid, out var value))
- {
- if (value?.LoadAfter?.Contains(modGuid) ?? false)
- {
- throw new Exception("modloader-load_order_conflict");
- }
-
- dependencies.Add(modAfterGuid);
- }
- }
-
- visited.Add(modGuid);
-
- foreach (var nextModGuid in dependencies)
- {
- GetLoadOrderRecursive(nextModGuid, visited);
- }
-
- visited.Remove(modGuid);
- LoadOrder.Add(modGuid, config);
- }
-}
diff --git a/SPTarkov.Server/Modding/ModValidator.cs b/SPTarkov.Server/Modding/ModValidator.cs
index 3e300b48..0e57b3ab 100644
--- a/SPTarkov.Server/Modding/ModValidator.cs
+++ b/SPTarkov.Server/Modding/ModValidator.cs
@@ -7,81 +7,20 @@ using LogLevel = SPTarkov.Server.Core.Models.Spt.Logging.LogLevel;
namespace SPTarkov.Server.Modding;
-public class ModValidator(
- ISptLogger logger,
- ServerLocalisationService localisationService,
- ISemVer semVer,
- ModLoadOrder modLoadOrder,
- JsonUtil jsonUtil,
- FileUtil fileUtil
-)
+public class ModValidator(ISptLogger logger, ServerLocalisationService localisationService, ISemVer semVer, FileUtil fileUtil)
{
- protected const string BasePath = "user/mods/";
- protected const string ModOrderPath = "user/mods/order.json";
protected readonly Dictionary Imported = [];
- protected readonly Dictionary Order = [];
protected readonly HashSet SkippedMods = [];
- public List ValidateAndSort(IEnumerable mods)
+ public List ValidateMods(IEnumerable mods)
{
- if (ProgramStatics.MODS())
+ if (!ProgramStatics.MODS())
{
- ValidateMods(mods);
-
- var sortedModLoadOrder = modLoadOrder.SetModList(
- Imported.ToDictionary(m => m.Value.ModMetadata.ModGuid, m => m.Value.ModMetadata)
- );
- var finalList = new List();
- foreach (var orderMod in SortModsLoadOrder())
- {
- if (!Imported.TryGetValue(orderMod, out var loadedMod))
- {
- throw new Exception($"Unable to find mod {orderMod} in loaded mods");
- }
-
- finalList.Add(loadedMod);
- }
-
- return finalList;
+ return [];
}
- return [];
- }
-
- public string GetModPath(string mod)
- {
- return $"{BasePath}{mod}/";
- }
-
- protected void ValidateMods(IEnumerable mods)
- {
logger.Info(localisationService.GetText("modloader-loading_mods", mods.Count()));
- // Mod order
- if (!fileUtil.FileExists(ModOrderPath))
- {
- logger.Info(localisationService.GetText("modloader-mod_order_missing"));
-
- // Write file with empty order array to disk
- fileUtil.WriteFile(ModOrderPath, jsonUtil.Serialize(new ModOrder { Order = [] }));
- }
- else
- {
- var modOrder = File.ReadAllText(ModOrderPath);
- try
- {
- var modOrderArray = jsonUtil.Deserialize(modOrder).Order;
- for (var i = 0; i < modOrderArray.Count; i++)
- {
- Order.Add(modOrderArray[i], i);
- }
- }
- catch (Exception e)
- {
- logger.Error(localisationService.GetText("modloader-mod_order_error"), e);
- }
- }
-
// Validate and remove broken mods from mod list
var validMods = GetValidMods(mods).ToList(); // ToList now so we can .Sort later
@@ -123,20 +62,7 @@ public class ModValidator(
if (errorsFound)
{
logger.Error(localisationService.GetText("modloader-no_mods_loaded"));
- return;
- }
-
- // sort mod order
- var missingFromOrderJSON = new Dictionary();
- validMods.Sort((prev, next) => SortMods(prev, next, missingFromOrderJSON));
-
- // log the missing mods from order.json
- if (logger.IsLogEnabled(LogLevel.Debug))
- {
- foreach (var missingMod in missingFromOrderJSON.Keys)
- {
- logger.Debug(localisationService.GetText("modloader-mod_order_missing_from_json", missingMod));
- }
+ return [];
}
// Add mods
@@ -150,24 +76,8 @@ public class ModValidator(
AddMod(mod);
}
- }
- protected int SortMods(SptMod prev, SptMod next, Dictionary missingFromOrderJson)
- {
- // mod is not on the list, move the mod to last
- if (!Order.TryGetValue(prev.ModMetadata!.Name!, out var previndex))
- {
- missingFromOrderJson[prev.ModMetadata.Name!] = true;
- return 1;
- }
-
- if (!Order.TryGetValue(next.ModMetadata!.Name!, out var nextindex))
- {
- missingFromOrderJson[next.ModMetadata.Name!] = true;
- return -1;
- }
-
- return previndex - nextindex;
+ return Imported.Select(mod => mod.Value).ToList();
}
///
@@ -245,22 +155,6 @@ public class ModValidator(
return true;
}
- ///
- /// Read loadorder.json (create if doesn't exist) and return sorted list of mods
- ///
- /// string array of sorted mod names
- public List SortModsLoadOrder()
- {
- // if loadorder.json exists: load it, otherwise generate load order
- var loadOrderPath = $"{BasePath}loadorder.json";
- if (fileUtil.FileExists(loadOrderPath))
- {
- return jsonUtil.Deserialize>(fileUtil.ReadFile(loadOrderPath));
- }
-
- return modLoadOrder.GetLoadOrder();
- }
-
///
/// Compile mod and add into class property "imported"
///
@@ -299,6 +193,12 @@ public class ModValidator(
return true;
}
+ // Mod depends on itself, throw a warning but continue anyway.
+ if (pkg.ModDependencies.ContainsKey(pkg.ModGuid))
+ {
+ logger.Warning(localisationService.GetText("modloader-self_dependency", new { mod = pkg.Name }));
+ }
+
// used for logging, dont remove
var modName = $"{pkg.Author}-{pkg.Name}";
@@ -339,6 +239,12 @@ public class ModValidator(
return true;
}
+ // Mod is marked as incompatible with itself, throw a warning but continue anyway
+ if (modToCheck.Incompatibilities.Contains(modToCheck.ModGuid))
+ {
+ logger.Warning(localisationService.GetText("modloader-self_incompatibility", new { mod = modToCheck.Name }));
+ }
+
foreach (var incompatibleModGuid in modToCheck.Incompatibilities)
{
// Raise dependency version incompatible if any incompatible mod is found
@@ -371,7 +277,6 @@ public class ModValidator(
protected bool ValidMod(SptMod mod)
{
var modName = mod.ModMetadata.Name;
- var modPath = GetModPath(modName);
var modIsCalledBepinEx = string.Equals(modName, "bepinex", StringComparison.OrdinalIgnoreCase);
var modIsCalledUser = string.Equals(modName, "user", StringComparison.OrdinalIgnoreCase);
diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs
index 1b424cef..d16fb171 100644
--- a/SPTarkov.Server/Program.cs
+++ b/SPTarkov.Server/Program.cs
@@ -53,12 +53,12 @@ public static class Program
// Search for mod dlls
loadedMods = ModDllLoader.LoadAllMods();
// validate and sort mods, this will also discard any mods that are invalid
- var sortedLoadedMods = ValidateMods(loadedMods);
+ var validatedLoadedMods = ValidateMods(loadedMods);
- // update the loadedMods list with our validated sorted mods
- loadedMods = sortedLoadedMods;
+ // update the loadedMods list with our validated mods
+ loadedMods = validatedLoadedMods;
- diHandler.AddInjectableTypesFromAssemblies(sortedLoadedMods.SelectMany(a => a.Assemblies));
+ diHandler.AddInjectableTypesFromAssemblies(validatedLoadedMods.SelectMany(a => a.Assemblies));
}
diHandler.InjectAll();
@@ -187,10 +187,9 @@ public static class Program
.Services.AddScoped(typeof(ISptLogger), typeof(SptLogger))
.AddScoped(typeof(ISemVer), typeof(SemanticVersioningSemVer))
.AddSingleton()
- .AddSingleton()
.BuildServiceProvider();
var modValidator = provider.GetRequiredService();
- return modValidator.ValidateAndSort(mods);
+ return modValidator.ValidateMods(mods);
}
private static void SetConsoleOutputMode()
diff --git a/Testing/TestMod/TestMod.cs b/Testing/TestMod/TestMod.cs
index 3828cc19..ef600a54 100644
--- a/Testing/TestMod/TestMod.cs
+++ b/Testing/TestMod/TestMod.cs
@@ -11,16 +11,14 @@ public record TestModMetadata : AbstractModMetadata
public override string ModGuid { get; init; } = "com.sp-tarkov.test-mod";
public override string Name { get; init; } = "test-mod";
public override string Author { get; init; } = "SPTarkov";
- public override List? Contributors { get; set; }
- public override Version Version { get; } = new("1.0.0");
- public override Version SptVersion { get; } = new("4.0.0");
- public override List? LoadBefore { get; set; }
- public override List? LoadAfter { get; set; }
- public override List? Incompatibilities { get; set; }
- public override Dictionary? ModDependencies { get; set; }
- public override string? Url { get; set; }
- public override bool? IsBundleMod { get; set; }
- public override string? License { get; init; } = "MIT";
+ public override List? Contributors { get; init; }
+ public override Version Version { get; init; } = new("1.0.0");
+ public override Version SptVersion { get; init; } = new("4.0.0");
+ public override List? Incompatibilities { get; init; }
+ public override Dictionary? ModDependencies { get; init; }
+ public override string? Url { get; init; }
+ public override bool? IsBundleMod { get; init; }
+ public override string License { get; init; } = "MIT";
}
[Injectable(TypePriority = OnLoadOrder.PostDBModLoader + 1)]