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 17:36:05


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 17/01/2006 01:33:14 Sujet du message : Des Torches qui s'allument, mais qui ne s'éteignent pas

Bon, je suis sur un système tout bête depuis un bout de temps, et je n'arrive pas à le faire marcher entièrement.

Des torches sont repartis dans un couloir, sur les côtés. Quand le PJ passe, les torches (Tag unique "Torche") s'allument au fur et à mesure, gràce à ce script, placé dans le OnEnter d'un trigger finement placé.

NWScript :
void main()
{
    object oPC = GetEnteringObject();
            if (!GetIsPC(oPC)) return;

    string sTorche = "Torche";
    object oTorche1 = GetNearestObjectByTag(sTorche, oPC, 1);
    object oTorche2 = GetNearestObjectByTag(sTorche, oPC, 2);
    effect eLumiere = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
    int nPermanent = DURATION_TYPE_PERMANENT;
    int nAllume = ANIMATION_PLACEABLE_ACTIVATE;

            AssignCommand(oTorche1, PlayAnimation(nAllume));
            AssignCommand(oTorche2, PlayAnimation(nAllume));

            ApplyEffectToObject(nPermanent, eLumiere, oTorche1);
            ApplyEffectToObject(nPermanent, eLumiere, oTorche2);
}
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.


Jusque là tout va bien, mais je souhaite que les torches s'eteignent lorsque le PJ quitte la zone couverte par les torches, et voilà le script que cela donne:

NWScript :
void main()
{
    object oPC = GetEnteringObject();
            if (!GetIsPC(oPC)) return;

    int n;
    string sTorches = "Torche";
    object oTorche = GetNearestObjectByTag(sTorches, OBJECT_SELF, n);
    effect eLumiere = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
    int nEteint = ANIMATION_PLACEABLE_DEACTIVATE;

            for(n = 1; oTorche == OBJECT_INVALID; n++)
          {
            AssignCommand(oTorche, PlayAnimation(nEteint));
            RemoveEffect(oTorche, eLumiere);
          }
}
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.


Malheuresement ce script se compile, mais ne fait rien du tout. J'ai essayé de le modifier de long en large et ca ne donne rien.
Donc, j'implore votre aide, et au passage si vosu avez des conseils pour optimiser le système, je suis preneur. Merci Smile!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 17/01/2006 04:23:14 Sujet du message : Que la lumiere soit !

Bonsoir, l'Erudit !
Je sais combien c'est dur de bloquer sur des scripts, surtout avec des boucles. On a vite l'impression de tourner en rond et c'est vrai que c'est agaçant d'avoir l'impression d'avancer dans le noir.
En fait, tu avais commis deux petites erreurs dans ton deuxième script, remplace-le par celui là et elles t'apparaîtront clairement !

NWScript :
void main()
{
    object oPC = GetEnteringObject();
            if (!GetIsPC(oPC)) return;

    int n;
    string sTorches = "Torche";
    object oTorche = GetNearestObjectByTag(sTorches, OBJECT_SELF, n);
    effect eLumiere = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
    int nEteint = ANIMATION_PLACEABLE_DEACTIVATE;

            for(n = 0; oTorche!=OBJECT_INVALID ; n++)
                    {

            oTorche = GetObjectByTag(sTorches,n);
            AssignCommand(oTorche, PlayAnimation(nEteint));
            RemoveEffect(oTorche, eLumiere);
          }
}
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.



J'espère avoir éclairé ta lanterne !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 17/01/2006 05:19:01 Sujet du message :

Merci beaucoup ! Gràce à tes corrections, j'ai pu refiare un script qui marche à présent.
Mais j'aimerais identifier mes fautes.

La première, et la plus idiote (surement la fatigue): le "== OBJECT_INVALID" au lieu de "!= OBJECT_INVALID".
La seconde et moins facile à déceler: Si je reprend mon script qui ne marche pas en rectifiant la premiere faute, et que je teste, il y a un TooManyInstruction qui s'affiche.
Alors là, je ne sais pas d'où il vient, mais ce que je sais c'est qu'en incluant "oTorche = GetNearestObjectByTag(sTorches, OBJECT_SELF, n);" dans la boucle, puis en référencant "object oTorche = GetObjectByTag(sTorches);" au départ (sans quoi la condition de fin de boucle est remplie avant son lançement), le tout marche.
Je me demande si le "for" initie dabord la valeur de "n" à 1, ou s'il teste d'abord la condition de boucle.
Et à priori, le "for" n'aime pas aller chercher les références à ses exécutions, hors des crochets (je pense au oTorche du premier script qui ne marchait pas).

Peut être que le "while" ou le "do while" auraient été plus approprié pour ce script?

Au fait, voilà le nouveau script. Vous pouvez voir les flambeaux s'allumer au fur et à mesure de votre avancée dans le couloir (vori plus haut le script qui marche), puis s'éteindre dès que vous quittez le couloir (script qui marche a présent, merci Enki ^^).
C'est magnifique Very Happy !

NWScript :
void main()
{
    object oPC = GetEnteringObject();
            if (!GetIsPC(oPC)) return;

    int n;
    string sTorches = "Torche";
    object oTorche = GetObjectByTag(sTorches);
    effect eLumiere = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
    int nEteint = ANIMATION_PLACEABLE_DEACTIVATE;

            for(n = 1; oTorche != OBJECT_INVALID; n++)
          {
            oTorche = GetNearestObjectByTag(sTorches, OBJECT_SELF, n);
            AssignCommand(oTorche, PlayAnimation(nEteint));
            RemoveEffect(oTorche, eLumiere);
          }
}
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.
 
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 56.529ms