La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 22:21:29


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 29/08/2003 14:35:52 Sujet du message : Objet equipé et inventaire

Salut,

j'ai un script qui est execute dans un dialogue lors d'une action consequente.
Dans ce script, je teste si un perso a une arme particuliere dans les mains, et si c'est le cas je la retire avec AssignCommand(GetPCSpeaker()UnequipItem(...)) (ou similaire, j'ai oublie le nom exact).
Immediatement apres, je parcours l'inventaire a la recherche de cette arme et j'ai deux cas:
- soit l'arme n'etait pas equipee et dans ce cas pas de probleme je la trouve bien dans l'inventaire.
- soit l'arme etait dans la main et dans ce cas, malgre la reussite de UnequipeItem(), je ne trouve pas l'arme dans l'inventaire (pourtant elle y est bien quand le dialogue se termine).

Je voudrai savoir si le deuxieme cas est normal, c'est a dire que par exemple UnequipeItem() a un temps de latence avant d'effectivement placer l'arme dans l'inventaire. Si c'est le cas, comment puis-je contourner le problème ?

Désolé de ne pas pouvoir donner le code du script, je ne suis pas sur ma machine personnelle.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Faelar
Héros
Inscrit le: 08 Juil 2003
Messages: 253
Localisation: Amiens
Répondre en citant
Posté le : 29/08/2003 14:39:38 Sujet du message :

Si tu places un delais d'execution avant la deuxième fonction ça devrait marcher non ? genre 1 second.
_________________
"Le temps c'est comme l'argent, on en a jamais assez..."
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Numéro ICQ Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 29/08/2003 15:10:28 Sujet du message :

ActionUnequipItem, comme son nom l'indique, est une Action. Cela signifie qu'elle ne s'éxécutera que dans la queue d'action d'un personnage (qu'il soit PJ ou PNJ). Si pour une raison X la queue d'action n'est pas vide, cette action sera inévitablement retardée, puisque mise à la suite. Même si la queue d'action est vide, son résultat n'est pas forcément immédiat par rapport au script dans lequel il l'exécute. L'action est immédiate, mais le script s'exécute plus vite que cette fonction du moteur. Pour cela je te convie à relire mes remarques sur la gestion de la queue d'action et les notion de processus synchrones et asynchrones dans ce sujet. Je ne crois pas me contredire en disant que tout ce qui se place dans la queue d'action devient asynchrone par rapport au script qui l'y a placé. C'est pour cette raison que l'extrait de script suivant donne un résultat parfois surprenant :
Code :

  ActionWait(3.0);
  ActionSpeakString("Ceci est ma première phrase");
  SpeakString("Ceci est ma seconde phrase");

Surprenant car la seconde phrase sera dite immédiatement et la première 3 secondes plus tard. Toute action transmise à la queue d'action n'est plus sous le contrôle du script qui l'y a placé, et le déclenchement de l'action à proprement parlé peu effectivement avoir un temps de latence par rapport au script (de plus equipé ou déséquiper un objet n'est pas instantanné puisqu'il y a une animation lié à l'action).

Plusieurs solution s'offre à toi. Je t'en propose une qui ne dépend pas de ce que tu comptes réellement faire (je te dis ça, car si tu décrivais précisément tes intentions vis-à-vis de l'objet que du déséquipe, il y aurait peut-être moyen de trouver mieux).
Code :

void CheckInventory(object oPC)
{
  object oItem=GetFirstItemInInventory(oPC); //chercher le premier objet de l'inventaire
  while (GetIsObjectValid(oItem))
  {
    // traiter l'objet trouvé dans l'inventaire
    oItem=GetNextItemInInventory(oPC); //passage au suivant
  }
}

void main()
{
  //Procédure principale du script
  object oPC=GetFirstPC(); //ou un autre moyen de trouver le PJ selon les cas
  object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
  AssignCommand(oPC, ActionUnequipItem(oItem));
  AssignCommand(oPC, ActionDoCommand(CheckInventory(oPC)));
}


De cette manière, ton scan d'inventaire devient une action qui est placée dans la queue d'action après le UnequipItem. Donc tu es sur que l'objet est bien déséquippé lorsque tu commences ton scan. C'est plus prudent que le DelayCommand (dont il est difficile d'évaluer le délai précis) même si cela comporte le risque que le PJ annule l'action de scan. Il existe toutefois une parade en rendant le PJ incontrôlable (avec SetCommandable) et ne lui restituer le contrôle qu'une fois le scan fini.
Note au passage que le DelayCommand devrait aussi faire l'affaire. A toi de choisir la méthode qui te convient le mieux.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 29/08/2003 19:07:10 Sujet du message :

J'ai encore du mal à maîtriser les histoires de queue d'action (manque de pratique...) mais ta réponse est nickel, c'est tout à fait ce qu'il me faut.
Merci encore!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 30/08/2003 15:00:13 Sujet du message :

J'avais eu un problème similaire, et Lendraste avait fort bien expliquer tout ça déjà (encore merci Lendraste Wink)

En fait la queue d'action c'est très simple : quand tu cliques à un endroit pour déplacer ton personnage, tu as une icone avec une étoile qui apparaît en haut à gauche de ton écran : une action est en court. De même que quand tu vas ouvrir une porte, une icone de porte apparaît, ou quand tu attaques, une icone d'épée apparaît.

Tu peux cliquer sur 12 portes d'affilée, tu auras 12 icônes de portes en haut à gauche de ton écran, qui vont disparaître les unes après les autres au fur et à mesure que tes portes seront ouvertes : eh ben c'est ça la queue d'action. Elles s'effectuent les unes après les autres, dans l'ordre dans lequel tu as cliqué.

Sauf que pour certaines action de script (comme ActionSpeakString() par exemple) l'icone n'est pas visible, mais il y a bien une action dans la queue d'action. Quand je fais un script avec diverses actions à effectuer dans un certain ordre, je me représente justement cette série d'icones qu'on ne voit pas pour ne pas me planter dans l'ordre, c'est une petit truc qui facilite les choses Very Happy
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 91.41ms