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 est néanmoins facile, en suivant ces quelques méthodes, de créer des menus pour activer/désactiver la plupart des fonctionnalités de chaque mod une par une. Je créérai également un topic si ça intéresse du monde de savoir comment faire un menu.
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é.
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" :
Code : Tout sélectionner
registerforsingleupdate(4)
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 :
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" :
Cela nécessite au moins la version 1.6 de Skyrim pour fonctionner.
Voir les ressources de scripts de Sagittarius22 (scripts tout faits) :
http://www.confrerie-des-traducteurs.fr ... 25&t=13784
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".
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.
Bon, c'est un bon début. Je rajouterai des choses par la suite comme par exemple : comment ajouter des capacités sur le joueur sans polluer les sauvegardes.