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 23/11/2024 22:21:29
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 |
nunch Grand Sage du Conseil Messages: 966 Localisation: Dans la gueule du Lyon |
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 | |
Faelar Héros Messages: 253 Localisation: Amiens |
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 | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
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 | |
nunch Grand Sage du Conseil Messages: 966 Localisation: Dans la gueule du Lyon |
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 | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
J'avais eu un problème similaire, et Lendraste avait fort bien expliquer tout ça déjà (encore merci Lendraste )
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 _________________ » 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 | |
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