La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/09/2024 18:25:18


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Cassin
Papa-poule(t) & poissard intemporel
Inscrit le: 16 Sep 2002
Messages: 7471
Localisation: 6 bis rue de la Couveuse, Poulailler 39b
Répondre en citant
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 (Very Happy) et le PJ (tant qu'à faire Very Happy)

Mais j'ai un peu beaucoup de mal avec les boucles Embarassed, 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();
}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 : 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();
}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Cassin
Papa-poule(t) & poissard intemporel
Inscrit le: 16 Sep 2002
Messages: 7471
Localisation: 6 bis rue de la Couveuse, Poulailler 39b
Répondre en citant
Posté le : 08/01/2004 20:46:47 Sujet du message :

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 Very Happy), 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. Wink
_________________
Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ?

http://cassin1306.spaces.live.com
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 : 08/01/2004 20:57:06 Sujet du message :


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

_________________
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
 
Shtong
Novice
Inscrit le: 07 Jan 2004
Messages: 15
Répondre en citant
Posté le : 09/01/2004 00:15:30 Sujet du message :

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 Smile )
_________________
Le Projet NeverWinter Classes needs you! Venez beta-tester!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger 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 : 09/01/2004 08:57:32 Sujet du message :


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 Smile )
Tu pouvais le demander Smile
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 Mr. Green
_________________
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
 
Cassin
Papa-poule(t) & poissard intemporel
Inscrit le: 16 Sep 2002
Messages: 7471
Localisation: 6 bis rue de la Couveuse, Poulailler 39b
Répondre en citant
Posté le : 09/01/2004 13:34:57 Sujet du message :

Hop, merci bien, ça marche Wink


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 Very Happy (bien que je me demande si j'ai fais la zone suffisamment grande pour contenir tout ce beau monde Very Happy)
_________________
Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ?

http://cassin1306.spaces.live.com
 
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 44.493ms