je propose donc ici un petit truc pour ceux qui ne sont pas encore à l'aise avec les scripts ( bien que cela soit extrêmement évident pour ceux qui ont appris un tant soit peu la programmation ; mais bon, il faut bien un début à tout )
En effet, à moins de passer par le Morrowind Scripting Extender, puisqu'il y a bien la fonction Xadditem, ID, var_short , où ID est l'ID de l'objet en question et var_short une variable quelconque de type short, il n'y a pas 36 solutions pour ajouter et enlever des objets à un NPC/container : mettre une boucle while ( ou une condition if, si la variable est très grande. )
en pratique ça donne ça :
Begin Mon_Script short nombreObjets; le nombre d'objets que vous voulez ajouter short i; ( j'utilise i par pure convention, et par rapidité, vous pouvez mettre ce que vous voulez) while( i < nombreObjets ) Additem, ID, 1 set i to i + 1 endwhile end
en l'appellant, le script va executer le contenu de la boucle while ( en une frame ), tant que i sera inférieur à nombreObjets.
pour de grandes valeurs, imaginons que le joueur achète une demeure, dont le prix est un nombre aléatoire ( un peu de role play ! ) entre 100 000 et 150 000, le fait de boucler d'aussi grandes valeurs risque de faire geler l'écran ( je rappelle que while s'exécute jusqu'a ce que la condition soit vraie en une Frame.
faire un if simple ne serait pas non plus une bonne idée, car pour d'aussi grandes sommes, le script ajouterai/retirerai au fur et a mesure, et étendu sur un aussi grand laps de temps, ça serait suicidaire ( ça vous rappelle quelque chose, dans vos premiers scripts buggués quand un objet s'ajoutait indéfiniment dans l'inventaire du joueur ? )
pour palier à ce problème, il faut utiliser une condition if, doublé d'une boucle while :
Begin Mon_script short nombreObjets short nombreParEtape; variable définissant le nombre d'objets a ajouter/retirer par étape short nombreEtapes; nombre d'étapes short nombreREstant; nombre d'objets restant ( pour faire l'appoint ) short i short n; pareil que dans l'exemple 1, mettez ce que vous voulez if( nombreEtapes == 0 ) set nombreEtapes to ( nombreObjets / nombreParEtape ) endif if( n < nombreEtapes ) while( i < nombreParEtape ) Additem, ID, 1 set i to i + 1 endwhile set i to 0 set n to n + 1 else set nombreRestant to ( nombreObjets - ( n * nombreParEtape )) while( i < nombreRestant ) Additem, ID, 1 set i to i + 1 endwhile stopscript, Mon_script endif end
Il faut renseigner deux valeurs : nombreObjets pour le nombre d'objets a ajouter/retirer et nombreParEtape pout le nombre d'étapes désirées.
le principe est le même que l'exemple 1 : on exécute une boucle qui va ajouter le nombre d'objets demandé (nombreObjets) divisé par le nombre d'étapes (nombreParEtape). le décimal obtenu sera arrondi à l'inferieur, et l'exécution de la boucle recommencera à chaque frame jusqu'a ce que le nombre d'objets ajouté/retiré atteigne approximativement la valeur voulue; puis en dernier, on réalise l'appoint manquant.
par contre, les variables du script dépendent de votre cpu : ne donnez pas à nombreParEtape un nombre trop élevé, a moins de geler chaque frame du jeu... vous pouvez aussi différer l'execution sur un nombre de frames donné ou sur un temps donné.
*on peut aussi mettre un nombre plus grand à Additem / removeitem ( 100, 1000 par exemple ), mais il faudra réaliser l'appoint à la fin, de préférence avec 1
ce script est valable pour ceux qui veulent utiliser des variables et pour ceux qui ne veulent pas :
j'ai remarqué que les fonctions Additem et Removeitem étaient partiellement buggées : a partir d'une certaine valeur ( je pense 65536, à vérifier ), le nombre d'objets ajoutés ou retirés n'est pas le même que la valeur inscrite. en faisant une boucle pour ajouter/retirer des objets, le problème ne se pose plus.
voila, en espérant avoir aidé certains
Edit : petite précision ajoutée. (voir * )
Modifié par Snaïpe, 10 septembre 2009 - 19:16.