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 19:58:48
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 |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Posté le : 08/01/2004 17:56:59 Sujet du message : Tuer toutes les créatures de la zone SAUF une (et le PJ)
Voilà le truc : je voudrais qu'un PNJ détruise toutes les créatures d'une zone, SAUF lui-même () et le PJ (tant qu'à faire )
Mais j'ai un peu beaucoup de mal avec les boucles , et si j'ai réussis à faire un script qui se compile, in game ça plante avec un TOO MANY INSTRUCTION (pourtant le script semble marcher lorsqu'il y a 2 créatures dans la zone)... Voilà le script que j'ai fait : NWScript :
location lLocation = GetLocation (OBJECT_SELF); object oCreature = GetFirstObjectInArea(); void main() { ActionPauseConversation(); while (oCreature != OBJECT_INVALID) if (GetObjectType (oCreature) == OBJECT_TYPE_CREATURE && GetIsPC(oCreature) == FALSE && GetTag (oCreature) != "Celoriel") { ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER, oCreature); DelayCommand(2.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_FIREBALL),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_DEATH),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),oCreature)); oCreature = GetNextObjectInArea(); } ActionResumeConversation(); } Je me doute que c'est le if et ses && imbriqués dans le while qui doivent poser problème, mais comment puis-je corriger ça ? _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Posté le : 08/01/2004 19:29:27 Sujet du message : Re: Tuer toutes les créatures de la zone SAUF une (et le PJ)
Ton problème est tout simple. Lorsque tu fais une boucle, il faut faire attention à ce que tu puisses en sortir, sinon tu crées ce qu'on appelle une boucle infinie. Or, en mettant le GetNextObjectInArea dans le if tu n'autorises le programme à changer d'objet que si ton IF est valide. Or, le premier objet trouvé dans la zone n'est sans doute pas une créature, le if n'est donc pas valide et oCreature ne peut pas changer de valeur. La condition du while est donc toujours vraie et paf : boucle infinie.
Il faut donc sortir le oCreature=GetNextObjectInArea du bloc de code qui ne s'eécute que si le if est valide. Comme suit : NWScript :
void main() { ActionPauseConversation(); object oCreature = GetFirstObjectInArea(); while (oCreature != OBJECT_INVALID) { if (GetObjectType (oCreature) == OBJECT_TYPE_CREATURE) && (!GetIsPC(oCreature)) && (GetTag (oCreature) != "Celoriel"))/* suspect parenthesis end found !*/ { ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER, oCreature); DelayCommand(2.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_FIREBALL),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_DEATH),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),oCreature)); } oCreature = GetNextObjectInArea(); } ActionResumeConversation(); } A noter qu'il fallait aussi intégrer dans la fonction main la première instruction oCreature = GetFirstObjectInArea sinon tu ne garanti pas l'initialisation de la variable oCreature. Une autre remarque enfin, le parcours systématique de tous les objects d'une zone chargées peut s'avérer assez long, surtout si tu as 2 créatures en dehors du PJ et du PNJ delamorkitu mais plein de plaçable, de portes, d'item au sol ou en équipement, et que sais-je encore... A voir s'il n'y a pas une meilleure méthode pour la performance. _________________ 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 | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Le script ne se compile pas, il me met un UNKNOW STATE IN COMPILER au niveau du if, apparemment il n'aime pas le premier && car quand je le supprime, le script se compile
En effet c'est une méthode qui peut être lourde, mais il n'y a heureusement que peu d'autres objets dans la zone (3 placeables, 4 WP et le PNJ "delamortkitu"). En fait c'est pour la nouvelle version du XPModule, dans la zone où le joueur peut demander au PNJ d'invoquer des créatures pour tester ses capacités. Sur la dernière version, on invoquait en général qu'une seule créature (on pouvait en invoquer plusieurs mais vu que la première nous sautait dessus dès son invocation, on avait en général pas le loisir de terminer le dialogue ), donc le script pour la tuer que PP avait fait ne marchait que sur une seule créature. Là j'ai séparé la zone en deux avec une grande fosse entre les deux, les créatures sont invoquées de l'autre côté et le joueur traverse via un téléporteur. _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Cassin a écrit : Le script ne se compile pas, il me met un UNKNOW STATE IN COMPILER au niveau du if, apparemment il n'aime pas le premier && car quand je le supprime, le script se compile C'est un problème de parenthèsage. Il manquait une parenthèse ouvrante. Désolé.
Voici le correctif: NWScript : void main() { ActionPauseConversation(); object oCreature = GetFirstObjectInArea(); while (oCreature != OBJECT_INVALID) { if ((GetObjectType(oCreature) == OBJECT_TYPE_CREATURE) && (!GetIsPC(oCreature)) && (GetTag(oCreature) != "Celoriel")) { ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER, oCreature); DelayCommand(2.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_FIREBALL),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_DEATH),oCreature)); DelayCommand(2.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),oCreature)); } oCreature = GetNextObjectInArea(); } ActionResumeConversation(); } _________________ 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 | |
Shtong Novice Messages: 15 |
J'ai déja eu l'occasion de constater que l'erreur TOO MANY INSTRUCTIONS n'est pas forcément due à une boucle infinie... il suffit d'une boucle avec pas mal de lignes qui fais trop de passages pour lever cette erreur (houlala, elle m'en a bien fait baver à l'époque )
_________________ Le Projet NeverWinter Classes needs you! Venez beta-tester! |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Shtong a écrit : J'ai déja eu l'occasion de constater que l'erreur TOO MANY INSTRUCTIONS n'est pas forcément due à une boucle infinie... il suffit d'une boucle avec pas mal de lignes qui fais trop de passages pour lever cette erreur (houlala, elle m'en a bien fait baver à l'époque ) Tu pouvais le demander
J'ai déterminé à une époque que le nombre d'instruction maximal enchaîné par un script ne pouvait pas dépasser 32768 (déduction à partir d'un script de test). Il me semble que cette limite a été augmentée depuis (à vérifier). Attention, ce n'est pas nécessairement le nombre de ligne sur lesquels passe l'interpréteur du moteur, mais bien le nombre d'instructions qu'il exécute (il peut y en avoir plusieurs par ligne de code, mais le minimum est 1), ce qui n'est pas la même chose. Par exemple, une fonction comme HasItem n'est pas une instruction car cette fonction, issue d'une bibliothèque fournie par Bioware (#include "nw_i0_plot"), est programmée en NWNScript avec un parcours d'inventaire (donc une boucle) et un nombre d'itération inconnu a priori. En imaginant que l'on place une telle fonction dans une boucle, la multiplication du nombre d'instructions devient considérable. Il en va bien sûr de même quand nous appellons des fonctions que nous aurions réalisés, comme HasItem, dans une boucle. D'où l'intérêt de connaître le nombre de parcours d'une boucle avant de se dire, c'est bon, ca va. Lorsque dans un cas comme celui de Cassin, on parcours un nombre inconnu d'élément, il y a toujours un risque. Je pense toutefois que ce script supportera le choc, à moins d'être particulièrement déraisonnable dans le contenu de la zone _________________ 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 | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Hop, merci bien, ça marche
Quant à être déraisonnable sur le contenu de la zone, ça dépendra surtout du joueur, s'il demande à invoquer 59 dragons, 38 balors et 368 Golems de fer, c'est son problème (bien que je me demande si j'ai fais la zone suffisamment grande pour contenir tout ce beau monde ) _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
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