Compatibilité - propreté : trucs et astuces
Salut, vous avez tous remarqué que de nombreux mods ne sont pas compatibles car modifiant la même chose.
Le but de ce sujet est de vous donner quelques pistes pour modifier des objets du jeu de manière "propre" afin d'éviter au maximum les soucis de compatibilité.
Cependant, deux mods ayant des fonctionnalités très voisines ou opposées resteront incompatibles.
Il n'est pas compliqué, en suivant ces quelques méthodes, de créer par la suite des menus pour activer/désactiver la plupart des fonctionnalités de chaque mod une par une.
Si l'objet du mod est la modification en profondeur d'un objet, n'hésitez cependant pas à le modifier directement. Si c'est pour ajouter un objet en se basant sur un existant, bossez sur une copie de l'objet original.
Il n'y a aucune règle en modding. Ce ne sont que des pistes qui sont données en dessous.
Il est nécessaire d'avoir quelques bases sur le CK pour tout suivre.
I. Modifier un objet (objectreference) ou un perso (actor) dont le joueur sans soucis de compatibilité.
Certaines modifications comme placer un scipt, ajouter des objets dans l'inventaire ou un keyword peuvent être faite sans toucher directement l'objet.
Il suffit de créer une quête, de quitter la fenêtre d'édition de quête.
De réouvrir la fenêtre d'édition de cette quête, de créer un referencealias dans l'onglet "Quest aliases".
Il faut de nouveau fermer les fenêtres d'édition d'alias et de quête pour les réouvrir toutes les deux.
Ensuite, il faut placer l'alias sur l'objet que l'on veut :
- s'il s'agit d'une référence à un objet du jeu, il faut choisir "specific reference" et renseigner la cell et la référence de l'objet. Il est aussi possible de sélectionner l'objet dans la render window.
- s'il s'agit d'un acteur unique, choisir unique actor et choisir dans la liste à côté.
- Si c'est lié à un alias d'une autre quête : External Alias Reference (renseigner la quête et l'alias).
Il suffit d'ajouter le script que l'on veut, les objets que l'on veut dans l'inventaire, des keywords, des sorts ou capacités si c'est un actor.
Si on veut que les modifications soient prises en compte dès le début du jeu, il suffit de cocher "Start game enable" dans le premier onglet de la fenêtre d'édition de quête.
Si cela touche le joueur, il est conseillé d'ajouter une consition à cet alias du genre getstage MQ101 >= 250 pour éviter des bugs. Le mieux étant de faire un menu en jeu permettant d'activer/désactiver les modifications. Il suffit de démarrer ou stopper la quête via un script pour le faire.
Une même quête peut avoir plusieurs alias.
Il ne faut pas oublier de cocher la case optionnal de l'alias sinon la quête peut planter s'il n'est pas rempli pour une raison x ou y.
Il est possible d'ajouter des conditions aux alias.
Par exemple, on peut assigner un script au joueur, ajouter des sorts en fonction de la race.
II. Modifier tous les objets d'un même type ou d'une même formlist autour du joueur ou faire des modifications à intervalles réguliers
Tout d'abord, il va falloir créer une variable globale (que j'appelerai variableglobaleMOD ici) ayant une valeur par défaut à 1. C'est très important pour le fonctionnement de ce qui suit et pour supprimer les traces du mod dans les saves à la désinstallation.
Nous utiliserons toujours des alias mais deux quêtes.
La première quête se construit comme la précédente (avec les ouvertures et fermetures de fenêtres d'édition pour éviter les bugs).
La différence se situera dans la manière de remplir les alias.
Si les alias doivent contenir des objets de type actor, il faudra créer un alias ciblant le joueur et ne surtout pas cocher la case "Allow reuse in quest". Les cases "Optionnal", "Allow reserved" (grisée si la quête est "start game enable"), "allow disable" et "allow dead" peuvent être cochées sans soucis.
Pour les autres alias, il faudra choisir : "Find Matching Reference" et cocher les cases "In loaded Area" et "closest". Cocher également les cases "Optionnal", "Allow reserved" (grisée si la quête est "start game enable") et "allow dead" (si la modif concerne des objets de type actor morts).
Le mieux est de créer plusieurs alias et ne surtout pas cocher la case "allow reuse in quest". Plus il y aura d'alias, moins on aura besoin de rafraichir souvent la quête.
Appliquer les scripts et modififications voulues aux alias. Il est possible de faire des modifications via le oninit() du script.
Ensuite créer une deuxième quête qui servira à mettre à jour les alias de la 1ère.
Après avoir créé la quête, fermer et réouvrir la fenêtre d'édition de cette quête.
Onglet "Quest Data" Mettre "priority 99", cocher "start game enable" si les modifs doivent être effectives dès le début du jeu (dans le cas contraire, c'est un script qui démarrera cette quête), cocher la case "Allow repeated stages".
Onglet "quest stages" : créer un INDEX (clic droit + new), puis un "log entry" (laisser EMPTY), cocher "startup stage" et placer dans la "fenêtre papyrus fragment" :
registerforsingleupdate(4)où 4 peut être remplacé par la période de rafraichissement des alias en secondes.
Cliquer sur le bouton "Compile"
Onglet "Scripts" :
cliquer sur "Add" puis "new script", entrer le nom de votre nouveau script.
Editer la source du script et y coller ceci :
quest property quete1 auto ;correspond à la première quête avec les alias globalvariable property variableglobaleMOD auto ;correspond à une variable globale ajoutée par le mod ayant 1 comme valeur par défaut. event onupdate() if variableglobaleMOD.getvalueint() == 1 ;si le mod est toujours activé on poursuit, sinon c'est fini. quete1.stop() ; stoppe la quête utility.wait(0.1) ; attend la fin de la quête. quete1.start() ; démarre la quête remettant ainsi à jour les alias. registerforsingleupdate(4) ; 4 est la période en secondes endif endevent
Il suffit de remplir les propriétés en mettant la quête créé précédemment pour quete1 et la variable globale crée tout à l'heure dans variableglobaleMOD.
III. EVITER LES REGISTERFORUPDATE() et REGISTERFORUPDATEGAMETIME()
Un registerforupdate() reste actif dans la sauvegarde même si l'esp est désactivé. Si le script est encore présent sur le disque dur, il se lancera encore et encore...
Le seul moyen d'être sûr d'arrêter ces instructions est de les remplacer par des registerforSINGLEupdate() et registerforSINGLEupdategametime() ET de conditionner la réutilisation de ces instruction avec une variable globale ajoutée par le mod.
Un exemple de script "sale" :
event oninit() registerforupdate(4) endevent event onupdate() ;le script ici se déroule toutes les 4 secondes sans refaire un appel endevent
La même chose de manière "propre" :
globalvariable property variableglobaleMOD auto ;correspond à une variable globale ajoutée par le mod ayant 1 comme valeur par défaut.
event oninit() registerforSINGLEupdate(4) endevent event onupdate() ;le script ici se déroule toutes les 4 secondes if variableglobaleMOD.getvalueint() == 1 ;si le mod toujours activé on refait un appel, sinon fini. registerforSINGLEupdate(4) ; 4 est la période en secondes endif endevent
Le principe est de conditionner le registerforupdate avec un truc qui n'est là que quand le mod est activé.
IV. Modifier les leveleditems de manière propre
Cela nécessite au moins la version 1.6 de Skyrim pour fonctionner.
Les modifications des leveled items par les scripts ne sont pas sauvegardées. Pour l'instant, nous allons voir comment remplacer les modifications qui auraient été faites directement dans le CK par un script.
Cela est un peu plus long à faire mais garantit une parfaite compatibilité avec d'autres mods modifiant les mêmes objets. En effet, si un objet a déjà été retiré par un autre mod, le script se contentera de retourner un "false" qui de toute façon n'est pas testé donc c'est sans douleur.
Tout d'abord, il nous faut créer une quête (comme cité plusieurs fois) et créer un referencealias sur le joueur. Créer un nouveau script et s'inspirer de l'exemple en s'assurant bien que la première ligne commençant par "Scriptname" se termine par "extends referencealias".
objectreference property coffreHelgen auto ;référence d'un coffre où je veux ajouter quelque chose de manière propre book property modelPARCHEMINSbook auto ;un objet créé par le mod miscobject property modelcarqiron auto ;idem formlist property modelcarquoisLIST auto ; une liste d'objets créés par le mod formlist property modelsacadosLIST auto ; idem FormList Property modelebandLIST Auto ; idem leveleditem property LItemBanditShield auto ;ensuite ce sont des existantes Leveleditem Property WE17BanditOutfitList1 Auto Leveleditem Property WE17BanditOutfitList2 Auto Leveleditem Property WE17BanditOutfitList3 Auto leveleditem property LItemBlacksmithMinimum auto leveleditem property LItemMiscVendorArmor75 auto leveleditem property LItemBookClutter auto leveleditem property LItemBook0All auto Int Index Event OnInit() coffreHelgen.additem(modelcarqiron,1,true) ;ici j'ajoute un objet dès le début dans un conteneur. Cette modif sera sauvegardée. EndEvent Event OnPlayerLoadGame() LItemBookClutter.addform(modelPARCHEMINSbook,1,1) ;j'ajoute mon livre à une leveledlist LItemBook0All.addform(modelPARCHEMINSbook,1,1) ;puis à une autre ;ajout des carquois dans les listes de niveau des forgerons index = 0 While Index <= modelcarquoisLIST.GetSize() LItemBlacksmithMinimum.AddForm(modelcarquoisLIST.GetAt(Index),1,1) Index += 1 endWhile index = 0 ;ajout des bandoulières à la liste de niveau des bandits. While Index <= modelebandLIST.GetSize() WE17BanditOutfitList2.AddForm(modelebandLIST.GetAt(Index),1,1) WE17BanditOutfitList3 .AddForm(modelebandLIST.GetAt(Index),1,1) Index += 1 endWhile ;ajout des sacs à dos aux listes des vendeurs While Index <= modelsacadosLIST.GetSize() LItemMiscVendorArmor75.AddForm(modelsacadosLIST.GetAt(Index),1,1) Index += 1 endWhile EndEvent
Cet exemple ne contient pas tout le script. Il est possible d'utiliser plusieurs formlists pour ajouter des objets à des niveaux différents d'un leveled item. Il suffira de refaire la routine pour chaque formlist et de modifier les paramètres d'ajout à la liste de niveau.
Le fait que les modifications soient faites à chaque chargement du jeu permet de s'affranchir du fait que ces modifs ne sont pas sauvegardées.
Il n'est pas possible de retirer directement des objets d'une leveled list. Il faut utiliser des alias de quête placés sur les conteneurs concernée (méthode du chapitre I ou du chapitre II) et lors du oninit() vérifier la présence des objets à virer et les virer le cas échéant. Il faut ensuite ajouter un event onitemadded() qui virera tous les objets non désirés et les enverra en Oblivion. Il faut juste tester que le aksourcecontainer ne soit pas le joueur s'il s'agit du coffre d'un vendeur.
Concernant les capacités placées sur le joueur, je vous renvoie au sujet de Thanatos :
http://forum.wiwilan...methode-propre/
Ce qui est valable pour les modAV l'est pour le reste.
Bon modding à tous.