Aller au contenu


Compatibilité - Propreté : Trucs Et Astuces

TUTO Modding propreté

  • Veuillez vous connecter pour répondre
3 réponses à ce sujet

#1 Gérauld

Gérauld

Posté 29 août 2012 - 05:50

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. :)
L'ours blanc est l'un des plus grands carnivores de Nirn. Les poils du pelage sont translucides et creux. C'est la réfraction de la lumière visible sur la surface interne des poils creux et incolores qui les fait paraître blancs. Cette particularité lui permet de se camoufler dans son environnement de neige et de glace, afin de mieux surprendre ses proies. Ce plantigrade vit exclusivement en Bordeciel et sur l'île de Solstheim.

#2 Azgarmoth

Azgarmoth

Posté 29 août 2012 - 08:47

Bonjour,

je ne sais pas si je peux me permettre de poster sur le sujet d'un tuto...

bref, tout d'abord merci pour tes 2 tutos, clairs et précis, c'est très intéressant. Pour l'instant ma vie IRL ne me permet pas de jouer, alors apprendre à scripter... :cry:

Cependant, il me vient des questions concernant les scripts :

- les commentaires derrière les points-virgules ne sont pas utiliser par le script, c'est juste pour expliquer tes actions, tu n'a pas besoins de le mettre réellement dans le script?

- De l'utilisation des majuscules, par exemple tes formlist, 2 fois en minuscules, 1 fois avec un "F" et 1 "L" majuscule. Erreur? Faute de frappe? Obligations? Intérêt pour distinguer des propriétés différentes?

- dernière question (probablement débile) : ta variableglobaleMOD, tu la créée où et comment? (Oui elle est c** ma question mais je ne comprend pas tout désolé...)

Voilà en tout cas merci pour les tutos (mais aussi pour tes excellents mods)

Azgarmoth

Modifié par Azgarmoth, 29 août 2012 - 08:48.

L'espérance ternit l'observation. Franck Herbert. Dune.



#3 Gérauld

Gérauld

Posté 29 août 2012 - 11:25

Les petites réponses à tes questions :

- Les commentaires ne servent à rien dans le script. Ils sont juste là pour apporter des explications. Tout ce qui se trouve après un point-virgule peut être enlevé (tout comme le point-virgule s'il n'y a plus rien derrière).

- Les majuscules ou minuscules n'ont aucune importance dans Papyrus. Le compileur ne se formalise pas te ne râlera pas.

- Pour créer une variable globale dans le CK, il faut aller dans l'explorateur d'objets, choisir dans la partie de droite "Miscellaneous" puis "Global" , faire un clic droit dans la fenêtre de droite et "new". Il suffit ensuite de faire correspondre la propriété et de s'assurer quelle soit bien remplie avant de lancer le script en jeu. Il est également possible de mettre une valeur par défaut à une variable globale ou la rendre constante à la création (dans ce cas, aucun script ne peut changer sa valeur).
L'ours blanc est l'un des plus grands carnivores de Nirn. Les poils du pelage sont translucides et creux. C'est la réfraction de la lumière visible sur la surface interne des poils creux et incolores qui les fait paraître blancs. Cette particularité lui permet de se camoufler dans son environnement de neige et de glace, afin de mieux surprendre ses proies. Ce plantigrade vit exclusivement en Bordeciel et sur l'île de Solstheim.

#4 Azgarmoth

Azgarmoth

Posté 29 août 2012 - 13:23

Encore une fois merci des explications.
L'espérance ternit l'observation. Franck Herbert. Dune.







Aussi étiqueté avec TUTO, Modding, propreté

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)