Guide de Modding pour Skyrim : Assurer la Compatibilité de Vos Mods en Cours de Partie

Rendre votre mod Skyrim compatible en cours de partie

L’importance de la compatibilité en cours de partie

Les joueurs de Skyrim sont connus pour leur dévouement, investissant souvent des centaines, voire des milliers d’heures dans une seule partie. Exiger de ces joueurs qu’ils recommencent une nouvelle partie pour profiter de votre mod, ou même pour une simple mise à jour, peut être un frein majeur. Du point de vue de l’utilisateur, recommencer signifie perdre d’innombrables heures de progression et potentiellement passer à côté de votre mod.

Ce guide est conçu pour les auteurs de mods, en particulier ceux qui sont familiers avec le Creation Kit et les bases du modding. Nous allons explorer comment mettre en œuvre des techniques qui permettent à votre mod d’être installé ou mis à jour en cours de partie, assurant ainsi une expérience plus fluide et plus agréable pour vos utilisateurs.

Gestion des mises à jour et des installations

La clé de la compatibilité en cours de partie réside dans la compréhension de la gestion des scripts, des quêtes et des références d’objets lors d’une mise à jour ou d’une première installation d’un mod. Étant donné que ces scénarios partagent les mêmes principes, nous les aborderons ensemble.

Le timing est primordial : exécuter votre logique

  • Événement OnInit : Une approche simple consiste à utiliser la fonction OnInit dans une nouvelle quête spécifiquement conçue pour les mises à jour/installations. Cette quête doit être marquée comme "Activée au démarrage du jeu" dans l’onglet Données de la quête du Creation Kit (Creation Kit Quest Data Tab). Attachez un script à cette quête via l’onglet Scripts (Scripts Tab) et placez votre code de mise à jour/installation dans la fonction OnInit.

  • Événement OnPlayerLoadGame : Pour les mises à jour, l’événement OnPlayerLoadGame offre une alternative. Créez un alias dans l’onglet Alias (Alias Tab), forcez-le à référencer le joueur et attachez un script (étendant le script ReferenceAlias) à cet alias. Implémentez votre logique de mise à jour dans la fonction OnPlayerLoadGame. Gardez à l’esprit que cet événement ne se déclenche que lors du chargement d’une sauvegarde, et non lors de l’initialisation d’une nouvelle quête. Cependant, OnInit s’exécutera toujours pour ce script d’alias lorsque la quête démarrera.

  • Événement OnCellAttach : Certaines fonctions, comme GetDistance ou FindClosestReferenceOfAnyTypeInListFromRef, nécessitent des références d’objets chargées. Si votre logique de mise à jour/installation en dépend, utilisez la fonction OnCellAttach.

Démystifier les scripts

Les scripts sont souvent une source d’inquiétude pour les auteurs de mods soucieux de la compatibilité en cours de partie. Cependant, à moins qu’un script ne soit activement en cours d’exécution pendant le processus de sauvegarde (ce qui est rare), son code et son état d’exécution ne sont pas sauvegardés. Les scripts s’exécutent généralement rapidement, surtout si vous utilisez RegisterForSingleUpdate et OnUpdate pour les longs délais au lieu de Utility.Wait.

La principale préoccupation réside dans les propriétés et les variables d’instance des scripts, qui sont sauvegardées. Heureusement, celles-ci sont gérables :

  • Propriétés : Définissez directement leurs valeurs à l’état souhaité à l’aide de Papyrus.

  • Variables d’instance : Étant donné qu’elles sont privées à leur script, créez des fonctions de définition pour les mettre à jour :

    int maVariableInstance = 5
    
    Function DefinirMaVariableInstance(int nouvelleValeur)
      maVariableInstance = nouvelleValeur
    EndFunction
    

Point important, les propriétés nouvellement ajoutées à un script déjà initialisé prendront automatiquement la valeur par défaut spécifiée dans votre plugin, vous n’avez donc qu’à ajuster les propriétés existantes.

Travailler avec les quêtes

Une fois qu’une quête est en cours d’exécution (pas seulement visible dans le journal), ses étapes, les propriétés de ses scripts et ses alias deviennent fixes. Voici comment gérer cela :

  • Alias : Facilement mis à jour à l’aide de la fonction ForceRefTo. Ajoutez la nouvelle référence en tant que propriété de script dans votre logique de mise à jour/installation et utilisez ForceRefTo pour pointer votre alias vers elle.

  • Étapes de la quête :

    1. Évitez les changements inutiles : Idéalement, conservez votre séquence d’index d’étapes d’origine. Concevez votre quête avec suffisamment d’ID d’étapes pour tenir compte des ajouts futurs.
    2. Envisagez le remplacement de la quête : Pour les refontes majeures, terminez la quête d’origine à l’aide de Stop et introduisez une toute nouvelle quête.
    3. Reconstruction de la quête : Si vous devez reconstruire une quête existante en utilisant le même formulaire, utilisez Stop, Reset et SetStage pour guider le joueur vers l’état souhaité après la mise à jour.

Gestion des références d’objets

Les mods qui modifient le monde du jeu peuvent provoquer des conflits de placement d’objets, ce qui conduit souvent les auteurs à exiger une nouvelle sauvegarde. Cela est dû au fait que les références persistantes ont leurs positions sauvegardées.

N’oubliez pas que seules les références d’objets persistants sont un problème. Les objets temporaires se mettront automatiquement à jour à leurs nouvelles positions car ils ne sont pas sauvegardés.

  • Objets déplaçables : La plupart des objets persistants comme les activateurs, les conteneurs, les objets statiques déplaçables et les marqueurs peuvent être déplacés à l’aide de scripts. La fonction MoveToMyEditorLocation est particulièrement utile pour cela.

  • Objets inamovibles : Les arbres, la flore, les objets statiques et les meubles ne peuvent pas être déplacés via un script. Voici quelques solutions :

    1. Désactiver et remplacer : Si l’objet n’est pas utilisé par d’autres mods, désactivez l’ancien et ajoutez-en un nouveau à l’emplacement souhaité. Assurez-vous que tous les alias de quête ou propriétés de script faisant référence à ces objets sont mis à jour en conséquence.
    2. Exigence de Save Unbaker : Ajoutez le mod Save Unbaker comme exigence. Cet outil déplace automatiquement ces objets vers leurs nouvelles positions.

Autres enregistrements persistants

Gardez à l’esprit ces enregistrements supplémentaires qui persistent dans les sauvegardes :

Exemple : Script de mise à jour rétroactive

ScriptName CorrectionRetroactiveAlias Extends ReferenceAlias

MyQuestScript Property maQuête Auto
ObjectReference Property maPropriétéQuête1Ref Auto
ObjectReference Property maPropriétéQuête2Ref Auto

ReferenceAlias Property monAlias1 Auto
ReferenceAlias Property monAlias2 Auto
ObjectReference Property monAlias1Ref Auto
ObjectReference Property monAlias2Ref Auto

ObjectReference Property maRef1 Auto
ObjectReference Property maRef2 Auto

ObjectReference Property monActeur1 Auto
Outfit Property tenueMonActeur1 Auto

int versionActuelle = -1

Event OnInit()
  GérerInstallationOuMisesAJour()
EndEvent

Event OnPlayerLoadGame()
  GérerInstallationOuMisesAJour()
EndEvent

Function GérerInstallationOuMisesAJour()
  If versionActuelle != 2
    maQuête.maPropriétéQuête1 = maPropriétéQuête1Ref
    maQuête.maPropriétéQuête2 = maPropriétéQuête2Ref

    monAlias1.ForceRefTo(monAlias1Ref)
    monAlias2.ForceRefTo(monAlias2Ref)

    maRef1.MoveToMyEditorLocation()
    maRef2.MoveToMyEditorLocation()

    monActeur1.SetOutfit(tenueMonActeur1)

    versionActuelle = 2
  EndIf
EndFunction

Exemple : Correction d’une référence d’objet après le chargement d’une cellule

ScriptName CorrectionRetroactiveObjetReference extends ObjectReference

int versionActuelle = -1
ObjectReference Property maRef Auto
FormList Property mesTypesRef Auto

Event OnInit()
  ; Initialisé sur la version 2, aucune correction nécessaire
  versionActuelle = 2
EndEvent

Event OnCellAttach()
  If versionActuelle != 2
    maRef = Game.FindClosestReferenceOfAnyTypeInListFromRef(mesTypesRef, self, 100.0)
    versionActuelle = 2
  EndIf
EndEvent

Conclusion

Bien que ce guide ne couvre pas tous les scénarios, il fournit une base solide pour rendre votre mod Skyrim plus accessible et convivial. N’oubliez pas que si la compatibilité parfaite en cours de partie peut être difficile à atteindre, même de petits pas dans cette direction peuvent améliorer considérablement l’expérience de vos utilisateurs.

Analytics