Remove load order/sorting from ModLoader (#584)

* - Remove modloader sorting
- remove order.json
- remove LoadBefore and
LoadAfter
- Remove unused var
- Remove unused locals
- Rename vars
- localize new warnings

* revert test change
This commit is contained in:
Cj
2025-09-05 05:03:02 -04:00
committed by GitHub
parent 8197e5c124
commit fafbfeb291
29 changed files with 40 additions and 324 deletions
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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 ファイルである必要があります。",
@@ -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 파일을 설정해야합니다",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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 файл",
@@ -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",
@@ -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",
@@ -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 файл",
@@ -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 中發現錯誤, 將使用預設載入順序",
@@ -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文件",
@@ -30,7 +30,7 @@ public abstract record AbstractModMetadata
/// <summary>
/// People who have contributed to this mod
/// </summary>
public abstract List<string>? Contributors { get; set; }
public abstract List<string>? Contributors { get; init; }
/// <summary>
/// Semantic version of this mod, this uses the semver standard: https://semver.org/
@@ -39,7 +39,7 @@ public abstract record AbstractModMetadata
/// <br/>
/// Version = new Version("1.0.0.0"); is not
/// </summary>
public abstract Version Version { get; }
public abstract Version Version { get; init; }
/// <summary>
/// SPT version this mod was built for, this uses the semver standard: https://semver.org/
@@ -48,39 +48,29 @@ public abstract record AbstractModMetadata
/// <br/>
/// Version = new Version("4.0.0.0"); is not
/// </summary>
public abstract Version SptVersion { get; }
/// <summary>
/// List of mods this mod should load before
/// </summary>
public abstract List<string>? LoadBefore { get; set; }
/// <summary>
/// List of mods this mod should load after
/// </summary>
public abstract List<string>? LoadAfter { get; set; }
public abstract Version SptVersion { get; init; }
/// <summary>
/// List of mods not compatible with this mod
/// </summary>
public abstract List<string>? Incompatibilities { get; set; }
public abstract List<string>? Incompatibilities { get; init; }
/// <summary>
/// Dictionary of mods this mod depends on.
///
/// Mod dependency is the key, version is the value
/// </summary>
public abstract Dictionary<string, Version>? ModDependencies { get; set; }
public abstract Dictionary<string, Version>? ModDependencies { get; init; }
/// <summary>
/// Link to this mod's mod page, or GitHub page
/// </summary>
public abstract string? Url { get; set; }
public abstract string? Url { get; init; }
/// <summary>
/// Does this mod load bundles
/// </summary>
public abstract bool? IsBundleMod { get; set; }
public abstract bool? IsBundleMod { get; init; }
/// <summary>
/// Name of the license this mod uses
@@ -1,9 +0,0 @@
using System.Text.Json.Serialization;
namespace SPTarkov.Server.Core.Models.Spt.Mod;
public class ModOrder
{
[JsonPropertyName("order")]
public List<string> Order { get; set; }
}
-124
View File
@@ -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<string, AbstractModMetadata> LoadOrder = new();
protected Dictionary<string, AbstractModMetadata> Mods = new();
protected Dictionary<string, AbstractModMetadata> ModsAvailable = new();
public Dictionary<string, AbstractModMetadata> SetModList(Dictionary<string, AbstractModMetadata> mods)
{
this.Mods = mods;
ModsAvailable = cloner.Clone(this.Mods);
LoadOrder.Clear();
var visited = new HashSet<string>();
// 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<string> GetLoadOrder()
{
return [.. LoadOrder.Keys];
}
public HashSet<string> GetModsOnLoadBefore(string modGuid)
{
if (!Mods.TryGetValue(modGuid, out var config))
{
throw new Exception($"The mod: {modGuid} does not exist!");
}
var loadBefore = new HashSet<string>(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<string> 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<string>(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);
}
}
+17 -112
View File
@@ -7,81 +7,20 @@ using LogLevel = SPTarkov.Server.Core.Models.Spt.Logging.LogLevel;
namespace SPTarkov.Server.Modding;
public class ModValidator(
ISptLogger<ModValidator> logger,
ServerLocalisationService localisationService,
ISemVer semVer,
ModLoadOrder modLoadOrder,
JsonUtil jsonUtil,
FileUtil fileUtil
)
public class ModValidator(ISptLogger<ModValidator> logger, ServerLocalisationService localisationService, ISemVer semVer, FileUtil fileUtil)
{
protected const string BasePath = "user/mods/";
protected const string ModOrderPath = "user/mods/order.json";
protected readonly Dictionary<string, SptMod> Imported = [];
protected readonly Dictionary<string, int> Order = [];
protected readonly HashSet<string> SkippedMods = [];
public List<SptMod> ValidateAndSort(IEnumerable<SptMod> mods)
public List<SptMod> ValidateMods(IEnumerable<SptMod> 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<SptMod>();
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 [];
}
public string GetModPath(string mod)
{
return $"{BasePath}{mod}/";
}
protected void ValidateMods(IEnumerable<SptMod> 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>(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<string, bool>();
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<string, bool> 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();
}
/// <summary>
@@ -245,22 +155,6 @@ public class ModValidator(
return true;
}
/// <summary>
/// Read loadorder.json (create if doesn't exist) and return sorted list of mods
/// </summary>
/// <returns>string array of sorted mod names</returns>
public List<string> SortModsLoadOrder()
{
// if loadorder.json exists: load it, otherwise generate load order
var loadOrderPath = $"{BasePath}loadorder.json";
if (fileUtil.FileExists(loadOrderPath))
{
return jsonUtil.Deserialize<List<string>>(fileUtil.ReadFile(loadOrderPath));
}
return modLoadOrder.GetLoadOrder();
}
/// <summary>
/// Compile mod and add into class property "imported"
/// </summary>
@@ -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);
+5 -6
View File
@@ -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<ModValidator>), typeof(SptLogger<ModValidator>))
.AddScoped(typeof(ISemVer), typeof(SemanticVersioningSemVer))
.AddSingleton<ModValidator>()
.AddSingleton<ModLoadOrder>()
.BuildServiceProvider();
var modValidator = provider.GetRequiredService<ModValidator>();
return modValidator.ValidateAndSort(mods);
return modValidator.ValidateMods(mods);
}
private static void SetConsoleOutputMode()
+8 -10
View File
@@ -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<string>? Contributors { get; set; }
public override Version Version { get; } = new("1.0.0");
public override Version SptVersion { get; } = new("4.0.0");
public override List<string>? LoadBefore { get; set; }
public override List<string>? LoadAfter { get; set; }
public override List<string>? Incompatibilities { get; set; }
public override Dictionary<string, Version>? 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<string>? 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<string>? Incompatibilities { get; init; }
public override Dictionary<string, Version>? 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)]