Pour placer dynamiquement des objets dans le jeu, il est tentant d'utiliser la fonction PlaceAtMe, et quand on n'en a plus besoin, de s'en débarrasser avec Disable.
Le gros problème, c'est que la fonction Disable ne fait que "faire disparaitre" l'objet aux yeux du joueur, mais ils restent tout de même présents dans le jeu, ils sont juste désactivés !
Une des conséquences de cet état de fait est qu'ils continuent de consommer de la mémoire vive si on ne prend pas de précautions.
Une seconde conséquence est que la taille des sauvegardes peut croître de façon importante.
La suite de ce post vous propose des solutions pour contourner ces menus problèmes ! Il sera surtout utile à ceux qui usent et abusent de PlaceAtMe et Disable (c'est à dire que ces fonctions sont régulièrement appelées dans le mod), un peu moins pour les autres.
1) Remplacement de PlaceAtMe Pour faire des save nourries au slim fast
La croissance de la taille des sauvegardes est directement liée à PlaceAtMe, qui rajoute des objets alors qu'il n'existe pas la possibilité de les supprimer vraiment.
Spoiler
Pour éviter ce problème, une solution est de remplacer :
Previsualisation du code
Cible.PlaceAtMe ID_de_l_objet nombre distance direction
... par la fonction MoveTo, utilisé sur l'objet ID_de_l_objet sur une référence persistante :
Previsualisation du code
Reference_persistante.MoveTo Cible
Un exemple pour clarifier les idées :
Spoiler
Je veux placer les objet "mouton" dans mon sort scripté d'invocation de mouton, puis au bout d'un moment (durée du sort) faire un disable sur le mouton.
Avec PlaceAtMe/Disable, vous auriez fait :
Script du sort =
Previsualisation du code
Scn SortScript
Begin ScriptEffectStart
mouton.PlaceAtMe 1 50 0
End
Script du mouton =
Previsualisation du code
Scn MoutonScript
float timer
Begin GameMode
if ( timer >= 80 )
Return
endif
Set timer to ( timer + GetSecondsPassed )
if ( timer >= 30 ) ; 30 est la durée du sort en secondes
Disable
Set timer to 80
endif
End
Résultat, un objet "mouton" est créé à chaque lancement du sort !
La solution en version plus mieux : recycler le même mouton à chaque fois ! Attention, le mouton doit être en "reference persist" et est initialement disabled (vous pouvez le placer n'importe où). Ici, sa référence est moutonRef.
Script du sort =
Previsualisation du code
Scn SortScript
Begin ScriptEffectStart
Set moutonRef.timer to 0 ; Réinitialisation du timer du mouton
moutonRef.Enable
moutonRef.Resurrect ; Juste au cas où il est mort à l'invocation précédente
moutonRef.MoveTo player
End
Le script du mouton, lui, ne change pas !
Dans ce cas, on réutilise toujours la même pauvre bête qui n'alourdira donc pas la save à chaque nouvelle invocation !
2) Si vous êtes obligés d'utiliser PlaceAtMe Pour ne pas que les objets bouffent la mémoire vive
Il y a des cas où on est obligé de passer par PlaceAtMe : si les objets doivent s'accumuler (une pile de pièces d'or, par exemple), si il est impossible de réinitialiser correctement la référence persistante (problèmes avec l'AI du mouton), etc... Dans ce cas, pas moyen d'éviter l'obésité de la sauvegarde, MAIS on peut au moins éviter que les objets ne consomment la mémoire vive.
Spoiler
Les objets ne sont généralement lus par le moteur du jeu Oblivionesque que quand le joueur est à proximité. Donc pour éviter que le moteur du jeu ne perde votre mémoire vive à les lire, autant les mettre à distance !
L'idée est de créer une cell "poubelle" qui ne contient qu'un XMarker vers lequel on enverra tous les objets obsolètes. On place les objets avec PlaceAtMe, on les utilise tant qu'on en a besoin, puis juste avant de les disable, on les envoit à la poubelle !
Ze retour de l'exemple :
Spoiler
Le mouton rempile ! (cf l'usage du mod dans le premier exemple pour ceux qui ne comprennent pas ! )
Après moults tests, votre mouton ne veut pas bien se tenir : quand vous le réinvoquez, il vous regarde d'un oeil rancunier (faut dire que les entraînements à l'épée dessus, c'est pas le meilleur moyen de s'attirer son amitié ! ). Enfin le plus génant, c'est que sa mord ces petites bêtes là... Bref, il faut à tout prix s'en débarrasser.
Dans ce cas, plutôt que de passer par un simple Disable, autant le combiner avec MoveTo !
D'abord, vous devez créer un cell qui vous servira de poubelle et y mettre un XMarker qui servira de balise où envoyer les moutons successifs. Dans l'exemple, la référence du XMarker est poubelleRef.
Une fois que c'est fait, voilà le script :
Script du sort =
Previsualisation du code
Scn SortScript
Begin ScriptEffectStart
mouton.PlaceAtMe 1 50 0
End
Script du mouton =
Previsualisation du code
Scn MoutonScript
float timer
Begin GameMode
if ( timer >= 80 )
Return
endif
Set timer to ( timer + GetSecondsPassed )
if ( timer >= 30 ) ; 30 est la durée du sort en secondes MoveTo poubelleRef
Disable
Set timer to 80
endif
End
L'ajout du MoveTo évitera que les moutons disabled "s'empilent" dans la même cell que le joueur et broutent la mémoire vive ! (puisque le joueur n'ira jamais dans la cell poubelle où ils sont envoyés)
Par contre, ça ne règle pas le problème de grossissement des save, il convient donc d'utiliser cette méthode avec modération !