La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 16/05/2024 13:59:14


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Elendil41
Novice
Inscrit le: 08 Oct 2004
Messages: 19
Répondre en citant
Posté le : 19/08/2006 00:31:36 Sujet du message : [Résolu] Problème d'actualisation du Journal

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);
}
}
}
}
Voila. La variable "VariableQueteUlrik" est définie lorsque le PC parle au PNJ et que celui ci l'envoie chercher le Bois. Or quand je teste, si je prend le Bois avant d'avoir parlé au PNJ, le journal s'actualise tout de même...Et je comprend plus.
Dernière édition par Elendil41 le 19/08/2006 16:05:44; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Aladar
Chevalier
Inscrit le: 15 Déc 2004
Messages: 96
Localisation: Tours
Répondre en citant
Posté le : 19/08/2006 02:44:26 Sujet du message :

Une ou deux remarques en vrac Smile

Dans la ligne
NWScript :
if(!(GetLocalInt(GetFirstPC(),"VariableQueteUlrik")==100))
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 :
if(GetLocalInt(oPC, "VariableQueteUlrik") == TRUE)
{
//suite
}
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 Smile

-é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 Embarassed
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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elendil41
Novice
Inscrit le: 08 Oct 2004
Messages: 19
Répondre en citant
Posté le : 19/08/2006 10:45:15 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Aladar
Chevalier
Inscrit le: 15 Déc 2004
Messages: 96
Localisation: Tours
Répondre en citant
Posté le : 19/08/2006 11:50:19 Sujet du message :

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
}
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.

Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elendil41
Novice
Inscrit le: 08 Oct 2004
Messages: 19
Répondre en citant
Posté le : 19/08/2006 12:38:58 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Aladar
Chevalier
Inscrit le: 15 Déc 2004
Messages: 96
Localisation: Tours
Répondre en citant
Posté le : 19/08/2006 14:37:14 Sujet du message :

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);
    }
  }
}
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.


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);
  }
}
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.

Et surement de nombreuses autres façons, mais ce qui est au dessus devrait faire l'affaire Smile

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);
  }
}
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.

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.

Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elendil41
Novice
Inscrit le: 08 Oct 2004
Messages: 19
Répondre en citant
Posté le : 19/08/2006 15:15:27 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Aladar
Chevalier
Inscrit le: 15 Déc 2004
Messages: 96
Localisation: Tours
Répondre en citant
Posté le : 19/08/2006 15:39:01 Sujet du message :

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);
  }
}
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.


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.
Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elendil41
Novice
Inscrit le: 08 Oct 2004
Messages: 19
Répondre en citant
Posté le : 19/08/2006 16:05:23 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 35.701ms