0. Au préalable
Avant toute chose, depuis une certaine MAJ, on trouve dans le dossier Data du jeu un fichier scripts.rar. Si on veut pouvoir compiler des scripts il faut d'abord décompresser ce qu'il y a dedans. Il suffit avec Winrar/winzip/7Zip de faire "Extraire ici".
1. Un script, c'est quoi ?
Un script est un ensemble d'instructions, de fonctions, de propriétés et de variables destiné à ajouter, modifier certaines fonctionnalités du jeu.
Ils sont attachés à un "objet" au sens large, ce peut être un ReferenceAlias, un Actor, ou tout autre élément les acceptant.
Pour attacher un script à un objet, dans le Creation Kit, localisez la section "Scripts" de l'objet en question, et cliquez sur Add.
Une fenêtre s'ouvre, vous permettant d'associer un script déjà existant en le sélectionnant dans la liste, ou d'en créer un nouveau pour l'occasion en sélectionnant [New Script]
Pour réaliser un script, nous éditons un fichier appelé source. Ce fichier source est celui que nous modifions à l'aide de nos petites mains à l'aide de l'éditeur de notre choix.
Il est par défaut stocké dans Data\Scripts\Source et possède l'extension *.psc.
Ce fichier source n'est pas utilisé tel quel par le jeu. Il a besoin d'un script compilé.
Quand nous sauvegardons un script, l'éditeur le compile et génère un fichier compilé. C'est ce fichier qui sera chargé par le jeu.
Il a une extension en *.pex et sera stocké dans Data\Scripts.
C'est le seul fichier nécessaire pour faire fonctionner un mod.
Par contre le fichier source est nécessaire pour l'éditer.
2. Créer un nouveau script
Si vous décidez de créer un nouveau script pour l'occasion en sélectionnant [New Script] au moment de l'assignation d'un script à un objet,
vous serez présenté à ce cadre :
Name est le nom de votre script. Il est conseillé de lui donner un préfixe spécifique à votre mod, à la fois pour vous y retrouver plus facilement, et pour éviter les conflits avec d'autres mods où le moddeur aurait eu la même idée de nom pour son script.
Extends est la "base" de votre script. Il doit généralement correspondre à l'objet auquel vous assignez un script (exemple : Quest pour une quête).
Les cases Hidden et Conditional sont des fonctionnalités plus avancées qui ne seront pas abordées ici.
Le champ Documentation String est utile comme son nom l'indique pour documenter votre script, très utile si vous voulez créez des ressources ré-utilisables par d'autres moddeurs.
Pour ensuite pouvoir écrire le script, clique-droit -> Edit Source
3. Déclarer et assigner des properties
Par défaut, votre script ne peut interagir qu'avec l'objet auquel il est associé. Pour qu'il puisse accéder aux autres éléments du jeu, la méthode conventionnelle est d'utiliser des "properties". :
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
Dans cette fenêtre, vous pouvez assigner chacune des properties à un objet en cliquant dessus puis en cliquant sur "Edit Value". Le petit menu disponible dépend du type de property en question. Dans le cas de nos "MiscObject", il s'agit d'un menu déroulant vous permettant de sélectionner n'importe quel MiscObject disponible dans les plugins chargés dans le CK.
Cette fenêtre vous permet également de rajouter de nouvelles properties à votre script avec le bouton Add Property.
4. Les instructions IMPORT
Celles-ci permettent d'aérer un peu le code source de votre script en vous évitant des saisies supplémentaires.
Par exemple :
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
event oninit()
int toto = game.getplayer().getitemcount(alphaproperty)
int toto1 = game.getplayer().getitemcount(alphaproperty1)
endevent
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
Import game
event oninit()
int toto = getplayer().getitemcount(alphaproperty)
int toto1 = getplayer().getitemcount(alphaproperty1)
endevent
En effet, le compilateur sera celui qui importera l'ensemble de fonction game pour réalisé le fichier compilé.
En clair, la fonction import n'a aucune influence sur le fichier compilé. Elle sert juste à améliorer la lisibilité du script et diminuer la saisie.
5. Optimisation - remplacement des getplayer()
Les fonctions getplayer() sont des fonctions assez lentes si on les compare à l'utilisation de propriétés ou de variables.
Nous allons optimiser un peu notre exemple précédent, nous obtenons :
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
actor property playerref auto
Import game
event oninit()
int toto = playerref.getitemcount(alphaproperty)
int toto1 = playerref.getitemcount(alphaproperty1)
endevent
Il ne faut cependant pas oublier de "remplir" la propriété.
A savoir que le fait d'utiliser une propriété au lieu de directement passer par Game.GetPlayer() "alourdi" légèrement le script, en particulier son poids dans la sauvegarde. Si la portion de script faisant appel à au joueur ne tourne que très occasionnellement, Game.GetPlayer() reste préférable.
6. Nommage des propriétés
Dans l'exemple précédent, nous avons nommé notre propriété de type actor playerref.
Le choix n'a pas été anodin car il permet de remplir de manière automatique la propriété du script.
Il suffit d'ouvrir la fenêtre des propriétés et de cliquer sur "auto-fill all". Une fenêtre apparaîtra précisant le nombre de propriétés remplies.
Il suffit donc de nommer la propriété de la même manière que l'objet du même type que l'on veut y mettre dedans pour qu le CK remplisse les champs tout seul après.
Pratique quand on travaille avec beaucoup de propriétés.
Si le nom de la propriété de correspond pas exactement à l'EditorID d'un objet déjà présent dans le plugin, il faudra l'assigner manuellement. (voir partie précédente)
7. Les définitions de variables
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
actor property playerref auto
Import game
event oninit()
int toto = playerref.getitemcount(alphaproperty)
int toto1 = playerref.getitemcount(alphaproperty1)
endevent
Cependant, on remarquera avec ce type de déclaration que la variable n'est pas partagée par toutes les instances du même script. Pour pouvoir utiliser ces variables en dehors de l'event oninit(), il faut les déclarer avant.
Le code devient donc :
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty1 auto
actor property playerref auto
int toto
int toto1
Import game
event oninit()
toto = playerref.getitemcount(alphaproperty)
toto1 = playerref.getitemcount(alphaproperty1)
endevent
8. Variables globales
Pour le besoin de l'exemple, nous avons besoin de partager une variable avec plusieurs scripts, toto2.
Il faut d'abord créer la variable globale dans le CK (dans la catégorie miscellaneous).
Ensuite il faudra la déclarer en tant que propriété.
Code : Tout sélectionner
miscobject property alphaproperty auto
miscobject property alphaproperty auto
actor property playerref auto
globalvariable property toto2 auto
int toto
int toto1
Import game
event oninit()
if toto2 == 1
toto = playerref.getitemcount(alphaproperty)
toto1 = playerref.getitemcount(alphaproperty1)
endif
endevent
Il existe des fonctions pour lire ou écrire des valeurs dans ces variables globales.
Le script devient :
Code : Tout sélectionner
actor property playerref auto
miscobject property alphaproperty auto
miscobject property alphaproperty auto
globalvariable property toto2 auto
int toto
int toto1
Import game
event oninit()
if toto2.getvalueint() == 1
toto = playerref.getitemcount(alphaproperty)
toto1 = playerref.getitemcount(alphaproperty1)
endif
endevent
Si vous avez des trucs, astuces et explications simples, postez les dans ce topic...