Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
ModDoctor
Trouve le mod qui pose problème : nomme le mod en cours quand le jeu se fige, attribue chaque erreur à son mod, explique les mods non chargés et les conflits. Côté client.
By DalekMC
| Last updated | 3 hours ago |
| Total downloads | 4 |
| Total rating | 0 |
| Categories | Tools AI Generated |
| Dependency string | DalekMC-ModDoctor-1.0.0 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2305README
ModDoctor : trouve le mod qui pose problème
Avec beaucoup de mods, il arrive que tout se bloque sans rien dans la console : le jeu se fige, un chargement ne finit jamais, ou des erreurs défilent sans dire quel mod les cause. ModDoctor surveille la partie et nomme le mod responsable, dans la console, dans un rapport et à l'écran.
Il est côté client et n'a besoin de rien chez les autres joueurs.
Ce qu'il détecte
| Problème | Ce que ModDoctor fait |
|---|---|
| Le jeu se fige (boucle infinie, attente sans fin…) | Un thread à part remarque que le jeu ne produit plus d'image et écrit tout de suite, sans attendre que le jeu reparte, la méthode de mod en cours d'exécution, les dernières méthodes de mods appelées et les dernières erreurs. Si le jeu repart, c'est noté aussi. |
| Le jeu a été fermé de force pendant un blocage | Au lancement suivant, le suspect de la session précédente est affiché. |
| Exceptions | Chaque erreur est reliée au mod dont le code apparaît dans la pile d'appels. Si elle a lieu dans une méthode du jeu modifiée par Harmony, les mods qui la modifient sont indiqués. |
| Erreurs en boucle | Une erreur répétée plusieurs fois par seconde est signalée à part : c'est souvent elle qui « bloque » un chargement ou une action. |
| Mod non chargé | Il dit pourquoi : dépendance absente ou trop ancienne, incompatibilité déclarée, mod d'un autre jeu. |
| Mod qui plante au démarrage | Erreur dans son Awake. |
| Doublons | Le même mod présent deux fois dans plugins (ancienne copie oubliée). |
| Conflits Harmony | Méthodes du jeu modifiées par plusieurs mods, dont un peut annuler la méthode d'origine, ou que plusieurs mods réécrivent. |
| « Pas de log dans la console » | Il signale si la console BepInEx est désactivée, si les erreurs Unity ne sont pas copiées dans le journal, ou si la console masque les erreurs. |
Où lire les résultats
- Console BepInEx : chaque problème sur une ligne (en rouge s'il est grave), puis un résumé une fois les mods chargés.
- En jeu : une petite alerte en haut à gauche pendant 15 s quand un nouveau problème apparaît. F9 ouvre la liste, les plus graves d'abord. F10 masque complètement ModDoctor à l'écran (et le réaffiche) ; le choix est retenu pour les parties suivantes, et la surveillance comme le rapport continuent.
BepInEx/ModDoctor/rapport.txt: tout le détail, plus la liste des mods chargés et celle des conflits Harmony.rapport-precedent.txtcontient la session d'avant.BepInEx/ModDoctor/blocage-<date>.txt: un fichier par blocage, écrit pendant que le jeu est figé.
Avec r2modman, le dossier BepInEx est celui du profil (Paramètres → « Browse profile folder »).
Exemple de rapport de blocage
=== BLOCAGE : le jeu ne répond plus depuis 8 s ===
Scène : MainMenu
Suspect principal : BuggyMod › BuggyMod.BuggyBehaviour.FreezeRoutine (coroutine)
Pourquoi : le thread principal est à l'intérieur de cette méthode.
Installation
Avec r2modman / Thunderstore Mod Manager : installer ModDoctor dans le profil qui pose problème.
À la main : installer BepInExPack 5.4.2305, puis copier ModDoctor.dll dans BepInEx/plugins/.
Réglages
BepInEx/config/emeric.moddoctor.cfg :
SecondesAvantAlerte(8) : durée sans image avant de parler de blocage. Un long chargement peut déclencher une fausse alerte ; le rapport indique alors que le jeu est reparti.SuivreLesMods(oui) : suit l'exécution des mods pour nommer celui qui bloque (voir plus bas).MethodesSuiviesMax(6000),ModsExclus(GUID séparés par des virgules) : à utiliser si le suivi gêne un mod.ErreursEnBoucleParSeconde(20) : seuil des erreurs en boucle.AlerteEnJeu(mis à jour par F10),ToucheRapport(F9),ToucheMasquer(F10),DureeAlerte(15 s, 0 = jusqu'à ouverture de la liste),ConflitsDansLAlerte.
Testé
- Jeu : build Steam 22825947 (Unity 2022.3.62), BepInEx 5.4.23.5, au menu principal, en LAN.
- Test automatique avec un faux mod volontairement bogué. Vérifié :
- blocage détecté et écrit pendant que le jeu est figé, avec la bonne coroutine ;
- reprise après le blocage ;
- suspect de la session précédente après une fermeture forcée ;
- exceptions dans un
Updateet dans un patch Harmony, erreur du journal BepInEx et erreur en boucle, toutes attribuées au bon mod ; - mod non chargé (dépendance absente), plantage au démarrage, conflit Harmony ;
- touches F9 et F10.
- Pas encore testé avec une grosse liste de vrais mods : on ne connaît pas encore le temps de mise en place du suivi, ni le risque de fausses alertes pendant les chargements longs. Pas testé non plus en partie à plusieurs : rien n'est synchronisé, chaque joueur a son propre diagnostic.
Comment ça marche (et limites)
-
Suivi des mods : ModDoctor ajoute, avec Harmony, un repère d'entrée et de sortie à certaines méthodes des mods :
- les messages Unity des MonoBehaviour (
Update,LateUpdate,FixedUpdate,OnGUI,Awake,Start,OnEnable,OnDisable,OnDestroy) ; - les coroutines ;
- les méthodes de patch Harmony ;
- les hooks MonoMod
On.*; - les méthodes du jeu réécrites par un transpiler.
C'est fait par petits lots juste après le chargement, puis à chaque changement de scène. Le coût par appel est très faible, mais pas nul.
- les messages Unity des MonoBehaviour (
-
Ce que le suivi ne voit pas : un blocage dans du code de mod appelé autrement, par exemple un événement ou une méthode appelée par une autre méthode du mod. Dans ce cas, le rapport nomme le dernier mod exécuté, souvent le bon. Un blocage dans le code natif du jeu n'est pas attribuable.
-
Plugins chargés avant ModDoctor : leurs erreurs de démarrage sont relues dans
LogOutput.log. En revanche, un blocage pendant leur chargement n'est pas surveillé. Dans ce cas, la dernière ligne « Loading [...] » deLogOutput.logindique le coupable. -
Lenteurs : un chargement de plus de 8 s sans image (génération d'une lune avec beaucoup de mods, par exemple) est signalé comme blocage, puis comme « reparti ». Augmente
SecondesAvantAlertesi ça arrive trop souvent. -
ModDoctor indique un suspect, pas une preuve. Pour confirmer, retire ce mod et relance.
Compiler, tester, empaqueter
- La référence « publicisée » du jeu est dans
lib/Assembly-CSharp.dll(copie de celle de SoundBox, même version du jeu). dotnet build -c Release: produitbin/Release/netstandard2.1/ModDoctor.dllet le copie dans le profil r2modman « ModDoctor » s'il existe.tests/BuggyMod: faux mod volontairement bogué, qui n'est jamais empaqueté (dotnet build -c Releasedans ce dossier le copie dans le même profil). Il provoque toutes les pannes ci-dessus.powershell -File autotest.ps1: premier lancement où BuggyMod fige le jeu pour de bon (le jeu est tué après le rapport de blocage), puis second lancement qui vérifie que chaque panne est reconnue et attribuée au bon mod, ainsi que la détection de la session précédente.powershell -File package.ps1: produitdist/ModDoctor-<version>.zip.