La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 01/11/2024 02:26:45
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Elendil41 Novice Messages: 19 |
Aprés des longues recherches infructueuses sur le site je me résoud à quémander une aide directe...
Bon mon problème va sembler ultra simple à baucoup mais voila je débute juste dans l'éditeur et c'est franchement pas simple... Voici mon souçi: J'ai crée une quête dans laquelle un PNJ envoie le PJ chercher du Bois de Fer Spécial. Ce que je voudrais faire c'est que lorsque le PJ trouve et prend du Bois de Fer spécial, le journal s'actualise en conséquence, mais uniquement si le PJ a accepté la quête. Or j'ai bien réussi à déclencher l'actualisation, mais celle ci s'effectue même si le PJ n'a pas parlé au PNJ déclencheur. J'ai donc tenté de jouer avec les variables: j'ai défini une variable locale directement sur le PJ lors du dialogue, et je demande ensuite au jeu de tester cette variable lorsque le PJ prend le Bois. Enfin c'est la théorie, parce que ca ne fonctionne pas...Alors, erreur de script, de raisonnement, de logique? Voici le script que j'ai mis dans le OnAcquire de mon module: Citation : void main () { object oItem=GetModuleItemAcquired(); string ItemTag=GetTag(oItem); { //Je vérifie que le PJ a bien déclenché la quête ,en inspectant les variables sur le PC if(!(GetLocalInt(GetFirstPC(),"VariableQueteUlrik")==100)) { //Je précise de quel objet il s'agit if(ItemTag=="BoisdeFer") { //Si tout est bon je déclenche l'actualisation object oPC=GetNearestObject(); AddJournalQuestEntry("AlarechercheduBoisdeFer",2,oPC,TRUE,TRUE); } } } } Dernière édition par Elendil41 le 19/08/2006 16:05:44; édité 1 fois
|
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Une ou deux remarques en vrac
Dans la ligne NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. ta condition est : Si la variable vaut autre chose que 100, on arrête tout. Je pense que tu voudrais : Si la variable existe (== TRUE), on continu. Auquel cas elle s'écrirait plutôt comme ça; NWScript :
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème. Pour info, le " ! " dans ta condition veut dire "n'est pas" if(!1 == 0) est vrai, car 1 n'est pas égal à 0. Pour rester avec cette ligne, tu utilise GetFirstPC pour récuperer le PJ, dans un mod solo ça va, en multi c'est moins bien, cette fonction va chercher le premier PJ de la liste et non forcement celui qui récupere le bois. GetModuleItemAcquiredBy est bien mieux, puisque la fonction va chercher le PJ qui vient de ramasser le dernier item à avoir été ramassé. Par ailleur, cette condition devrait passer après la deuxieme condition qui récupere le dernier item qu'un pj va ramasser. En gros, ton script se présenterait ainsi ; Code : Si l'objet qui vient d'être ramassé est de TAG == "boisdefer"
{ Si le PJ a la variable "VariableQueteUlrik" == TRUE { mise a jour du journal } } Ah oui et dernière chose, utilise les balises [nwnscript] pour afficher tes scripts, c'est plus beau ^^ Je peux rien faire de plus, j'ai absolument jamais utilisé le journal de nwn (qui est merdique, mais c'est une question de point de vue !). Bonne bidouille -édit- Je viens tout juste de remarquer le GetNearestObject, si tu mets ton script dans le OnAcquire du module, la fonction va chercher l'objet le plus proche ... du module Donc c'est pas bon. Par ailleur, GetNearestObject récupere l'objet le plus proche, mais pour aurora, absolument tout est un objet, que ce soit un placeable, un gobelin, un WP ou un Dm, et accéssoirement, un PJ. Oh et puis je crois que j'ai dis une ou deux anneries plus haut, ce sera confirmé par les vrais scripteurs, je vais aller dormir avant de reposter... |
Revenir en haut | |
Elendil41 Novice Messages: 19 |
Merci des infos, mais je crois que je n'ai pas bien précisé une chose, ce que je veux c'est que le journal s'actualise si la variable VariableQueteUlrik est définie au niveau 100, valeur définie sur le PJ lorsque celui-ci accepte la quete. Je ne veux pas que le journal s'actualise seulement si la variable existe parce qu'elle prend plusieurs valeurs différentes, je risquerais de retrouver mon souci d'actualisation intempestive...
Autre chose, si le GetNearestObject est pas bon, je dois utiliser quoi?? |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Ok, peux tu donner quelques précisions, à savoir comment le PJ récupere t'il le bois (OnUsed d'un placeable, trigger à traverser... ) ?
module solo ou multijoueur ? GetNearestObject sert à aller chercher l'objet le plus proche du porteur du script, donc on ne peux pas trop l'utiliser dans OnAcquire, ou sur tout autre "module event". Cette fonction s'utilise sur des placeables ou bien sur des créatures. Donc dans le OnAcquire, comme je l'ai écris plus haut, GetModuleItemAcquiredBy() ira chercher le PJ (ou pnj) qui a ramassé l'item. NWScript :
void main() { object oItem = GetModuleItemAcquired(); object oPC = GetModuleItemAcquiredBy(); // le PJ qui vient de le mettre dans son inventaire } |
Revenir en haut | |
Elendil41 Novice Messages: 19 |
OK, alors pour les précisions: l'itam à trouver est dans une forêt, il suffit que le PJ cherche un peu et il le trouvera, je le placerai dans un contenant du style tas de bois ou autre. Donc le PJ prend l'objet, et le journal de la quete s'actualise. Mais si il n'a pas déclenché la quete et qu'il trouve tout de même l'item, il ne faut pas que le journal s'actualise.
Pour ce qui est du script alors, il faut utiliser GetModuleItemAcquired ou GetModuleItemAcquiredBy? Ou les deux? Et stringItemTag=GetTag(oItem) ne sert à rien alors? |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
En gros, tu veux qu'il soit possible de trouver le Bois de Fer n'importe quand, mais que le journal ne s'actualise que si la quête est activée.
Personellement j'aurais crée le bois de fer par script uniquement si le pj à activé la quête, mais restons sur ta solution. GetModuleItemAcquired va chercher l'item, GetModuleItemAcquiredBy va chercher le pj qui vient de récuperer cet objet. Les deux fonctions sont donc à utiliser, elles ont chacune leur utilité. sItemTag(oItem) est très bien là ou il est, puisqu'il va chercher le tag de l'item récuperé avec GetModuleItemAcquired. Le script peut s'écrire comme ça ; NWScript :
void main () { object oPC = GetModuleItemAcquiredBy(); // Le pj object oItem = GetModuleItemAcquired(); // L'item string sItemTag = GetTag(oItem); // le tag de l'item // On commence par verifier le tag de l'item if(sItemTag == "BoisdeFer") { //Si le tag est "BoisdeFer", on test la variable sur le pj if(GetLocalInt(oPC, "VariableQueteUlrik") == 100) { AddJournalQuestEntry("AlarechercheduBoisdeFer", 2, oPC, TRUE, TRUE); } } } Ou comme ça; NWScript :
void main () { object oPC = GetModuleItemAcquiredBy(); // Le pj object oItem = GetModuleItemAcquired(); // L'item string sItemTag = GetTag(oItem); // le tag de l'item // On test le TAG de l'item et la variable en meme temps if((sItemTag == "BoisdeFer") && (GetLocalInt(oPC, "VariableQueteUlrik") == 100)) { AddJournalQuestEntry("AlarechercheduBoisdeFer", 2, oPC, TRUE, TRUE); } } Et surement de nombreuses autres façons, mais ce qui est au dessus devrait faire l'affaire Pour revenir à ma petite préference, à savoir ne créer l'item que si le pj à activé la quête, ça se passerait sur le OnUsed du placeable ou est contenu le bois. Ca donnerait ça; NWScript :
void main () { object oPC = GetLastUsedBy(); // Le pj if(GetLocalInt(oPC, "VariableQueteUlrik") == 100) { CreateItemOnObject("BoisdeFer", oPC); //Cette fonction a besoin du RESREF de l'objet, et non de son tag AddJournalQuestEntry("AlarechercheduBoisdeFer", 2, oPC, TRUE, TRUE); } } L'avantage est que tu n'as pas besoin de bidouiller dans le OnAcquire du module qui est souvent assez gros, en revanche cela t'oblige à créer un script uniquement pour cela, c'est une question de choix. |
Revenir en haut | |
Elendil41 Novice Messages: 19 |
Je n'avais pas pensé à cette solution, qui est tout de même meilleure...de toute façon j'aurais été incapable de le faire moi meme. Un débutant, jvous dit!!
Alors j'ai testé ta solution, et là ca fonctionne: pas de bois si la quete est pas lancée. Mais par contre ya un ptit bug: lorsque une fois la quete lancée le PJ va sur le placeable et l'ouvre, le bois de fer est directment placé dans l'inventaire du PJ, en double exemplaire qui plus est, mais n'est pas visible dans l'inventaire du placeable... EDIT: le premier script fonctionne. Mais j'aimerais bien résoudre le petit bug de ta seconde proposition, cela me permettrait d'avoir deux façons de faire en fonction des quetes. Aprés tout, si le PJ a deja du bois de fer lorsque la quete est lancée ca n'est pas grave, il sautera juste une étape du journal; par contre pour d'autres quetes cela pourrait etre plus problèmatique... |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
En effet, puisque rien ne dit au script de ne pas créer le bois si le PJ a déjà fait cette étape.
Pour résoudre le probleme, il faut modifier la valeur de la variable, la passer à 101 par exemple, pour que le code ne se relance pas si il l'a déjà fait. NWScript :
void main () { object oPC = GetLastUsedBy(); // Le pj if(GetLocalInt(oPC, "VariableQueteUlrik") == 100) { CreateItemOnObject("BoisdeFer", OBJECT_SELF, 1); SetLocalInt(oPC, "VariableQueteUlrik", 101); AddJournalQuestEntry("AlarechercheduBoisdeFer", 2, oPC, TRUE, TRUE); } } Là le bois sera placé dans le placeable et en 1 seul exemplaire (théoriquement !), et comme tu change la valeur de la variable, le code ne se relancera pas. |
Revenir en haut | |
Elendil41 Novice Messages: 19 |
Trés bien, ca fonctionne! J'ai fait un mix des deux: Le bois ne se crée que si la quete est lancée, mais le journal ne s'actualise que si le PJ prend effectivement le Bois dans son inventaire...Voila, merci beaucoup!!Reste à mettre le plaçable en intrigue pour éviter une destruction inopinée...
|
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Page 1 sur 1 ¤
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum