La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/04/2024 19:55:20


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 23/12/2002 12:41:25 Sujet du message : contenants et candélabres...

Bonjour à Tous,

2 questions aujourd'hui:

1) Je souhaite faire apparaitre un objet (tag: ObjetApp) quant (et seulment dans ce cas) dans le contenant 1 (tag: contenant1) il y a un objet (tag:objet1) et dans le contenant 2 (tag: contenant2) il y a un objet (tag:objet2). Quels scripts et ou les placer ?

2) j'ai 2 candélabres (tag : candelabre1 et candelabre2) qui sont alumés, et une porte (tag: porte). Je souhaite que la porte reste fermée(impossible de l'ouvrir) tant que les 2 candélabres sont alumés. Et dès que les 2 candélabres sont éteints, la porte puisse être ouverte. Quels scripts et ou les placer ?

Merci pour votre aide.

a+
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Serguai
Grand Chevalier
Inscrit le: 07 Déc 2002
Messages: 104
Répondre en citant
Posté le : 23/12/2002 19:05:54 Sujet du message : Voyons :-)

Alors voyons ce qu'on peux faire pour le 1), je m'occupe du 2) dans le post suivant

Dans le OnClose de tes deux conteneurs, il faudrait mettre les script suivant:

Premier conteneur:

Code :


void main
{
   //On n'a besoin de créer l'objet qu'une seule fois
   if(GetLocalInt(GetModule(),"created")==1)
      return;
 
   int hasitem1 = GetLocalInt(GetModule(),"hasitem1");
   object inventory = GetFirstItemInInventory();

   //On s'assure que l'objet est dans l'inventaire
   while(inventory != OBJECT_INVALID && hasitem1 == 0){
      /*Si on trouve l'objet on met la variable a 1 et on peux arrêter la vérification*/
      if(GetTag(inventory) == "objet1")
           hasitem1 = 1;
      /*Si on a parcouru tout l'inventaire sans trouver l'objet on met la variable à 0*/
      if(inventory == OBJECT_INVALID)
          hasitem1 = 0;

      inventory = GetNextItemInInventory();
   }

   /*Une fois la vérification faite on affecte les variables globales (pour que l'autre conteneur sache ci celui ci contient l'objet), et si l'autre conteneur a l'objet on effectue la création du nouvel objet*/
   if(hasitem1 == 1)
   {
       SetLocalInt(GetModule(),"hasitem1",1);
       if(GetLocalInt(GetModule(),"hasitem2")==1){
             CreateObject(OBJECT_TYPE_ITEM,"templatedetonobjet",GetLocation(GetWaypointByTag("wp_outuveuxcreertonobjet")));
             SetLocalInt(GetModule(),"created",1);
       }
   }
   else SetLocalInt(GetModule(),"hasitem1",0);
}



Deuxième conteneur:

Code :


void main
{
   //On n'a besoin de créer l'objet qu'une seule fois
   if(GetLocalInt(GetModule(),"created")==1)
      return;
 
   int hasitem2 = GetLocalInt(GetModule(),"hasitem2");
   object inventory = GetFirstItemInInventory();

   //On s'assure que l'objet est dans l'inventaire
   while(inventory != OBJECT_INVALID && hasitem2 == 0){
      /*Si on trouve l'objet on met la variable a 1 et on peux arrêter la vérification*/
      if(GetTag(inventory) == "objet2")
           hasitem2 = 1;
      /*Si on a parcouru tout l'inventaire sans trouver l'objet on met la variable à 0*/
      if(inventory == OBJECT_INVALID)
          hasitem2 = 0;

      inventory = GetNextItemInInventory();
   }

   /*Une fois la vérification faite on affecte les variables globales (pour que l'autre conteneur sache ci celui ci contient l'objet), et si l'autre conteneur a l'objet on effectue la création du nouvel objet*/
   if(hasitem2 == 1)
   {
       SetLocalInt(GetModule(),"hasitem2",1);
       if(GetLocalInt(GetModule(),"hasitem1")==1){
             CreateObject(OBJECT_TYPE_ITEM,"templatedetonobjet",GetLocation(GetWaypointByTag("wp_outuveuxcreertonobjet")));
             SetLocalInt(GetModule(),"created",1);
       }
   }
   else SetLocalInt(GetModule(),"hasitem2",0);
}



Voilà et ca doit marcher. Reste a le tester et peut être corriger qq erreurs parce que je ne l'ai pas essayé, mais je l'ai relu et ca me semble correct.
Dernière édition par Serguai le 25/12/2002 13:11:15; édité 1 fois
 
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
 
Serguai
Grand Chevalier
Inscrit le: 07 Déc 2002
Messages: 104
Répondre en citant
Posté le : 23/12/2002 19:33:18 Sujet du message : Maintenant, le 2)

Voici un script a placer dans le OnUse de tes chandelles. Je suppose que tes chandelles sont useable et qu'on peux les allumer et les éteindre en cliquant dessus.
Les scripts suivant sont donc à fusionner avec le script prédéfini qui allume les chandelles.
(tu n'as qu'a rajouter le code prédéfini en première ligne de mon script)

Première chandelle:
Code :

void main()
{
       //On va placer islight1 a 1 si la chandelle est eteinte, 0 si elle est allumée     
       if(GetLocalInt(GetModule(),"islight1") == 0){
           SetLocalInt(GetModule(),"islight1",1); //On allume la chandelle
           if(GetLocalInt(GetModule(),"islight2")==1) //On vérifie l'autre chandelle
               SetLocked(GetObjectByTag("porte"), FALSE);
       }
       else{
            SetLocalInt(GetModule(),"islight1",0);
            SetLocked(GetObjectByTag("porte"), TRUE);
       }
}


Deuxième chandelle:
Code :

void main()
{
       //On va placer islight2 a 1 si la chandelle est eteinte, 0 si elle est allumée     
       if(GetLocalInt(GetModule(),"islight2") == 0){
           SetLocalInt(GetModule(),"islight2",1); //On allume la chandelle
           if(GetLocalInt(GetModule(),"islight1")==1) //On vérifie l'autre chandelle
               SetLocked(GetObjectByTag("porte"), FALSE);
       }
       else{
            SetLocalInt(GetModule(),"islight2",0);
            SetLocked(GetObjectByTag("porte"), TRUE);
       }
}


Valà valà, pareil que le premier script, c'est à tester mais ca doit être bon.

A+

Serguai
 
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
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 24/12/2002 08:27:24 Sujet du message :

Merci Serguai pour ta précieuse aide. Je teste, si j'ai un pb je te le dis.

A+
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 24/12/2002 17:02:54 Sujet du message :

Serguai, j'ai testé tes scripts.

Pour le premier ca fonctionne, il y a juste un truc... si on place dans un des contenants (n'importe) lequel un objet qui a strictement rien à voir avec celui que le contenant attend... ce message d'erreur apparait:
Scipt NomduScript, OID:80000019, Tag: tagducontenant, Erreur : TOO MANY INSTRUCTIONS.

Sais tu comment éviter ce pb ?(ce pb ne gêne pas le fonctionnement mais ca fait pas très propre que d'avoir un truc pareil qui s'affiche!!)

J'ai essayé d'approfondir tes scripts afin de faire en sorte qu'une fois l'objet créer, les objets placés dans les contenants soient détruis ! J'y suis pas arrivé, as tu une idée ?

Pour le second, celui des candélabres, impossible de faire fonctionner tes scripts, mais grâce à eux, j'ai modifié celui donné de base par NWN et ca fonctionne. (au début je mettais candélabre1 et candélabre2 à 0 ou à 1, mais lors du premier clique pour éteindre le premier candélabre, la porte s'ouvrait. Je pense que le système doit par défaut initialiser les variables à 0, aussi j'ai opté pour candélabre1 et candélabre2 à 1 ou 2. Et là plus de souci ca fonctionne parfaitement même la première fois). Voici le code:

sur le OnUse du premiercandélabre:

Code :

void main()
{
    if (GetLocalInt( OBJECT_SELF,"NW_L_AMION") == 0)
    {
        PlayAnimation( ANIMATION_PLACEABLE_ACTIVATE);
        DelayCommand(0.4,SetPlaceableIllumination( OBJECT_SELF, TRUE));
        SetLocalInt( OBJECT_SELF,"NW_L_AMION",1);
        DelayCommand( 0.5,RecomputeStaticLighting( GetArea( OBJECT_SELF)));
        SetLocalInt( GetModule(), "Candelabre1",1);

    }
    else
    {
        PlayAnimation( ANIMATION_PLACEABLE_DEACTIVATE);
        DelayCommand( 0.4, SetPlaceableIllumination( OBJECT_SELF, FALSE));
        SetLocalInt( OBJECT_SELF, "NW_L_AMION",0);
        DelayCommand( 0.9, RecomputeStaticLighting( GetArea( OBJECT_SELF)));
        SetLocalInt( GetModule(), "Candelabre1",2);
        if( GetLocalInt( GetModule(), "Candelabre2") == 2)
        {
            ActionOpenDoor( GetObjectByTag( "p_porte"));
        }
    }
}


et pour le second candélabre, toujoursdans le OnUse:

Code :

void main()
{
    if (GetLocalInt( OBJECT_SELF,"NW_L_AMION") == 0)
    {
        PlayAnimation( ANIMATION_PLACEABLE_ACTIVATE);
        DelayCommand( 0.4,SetPlaceableIllumination( OBJECT_SELF, TRUE));
        SetLocalInt( OBJECT_SELF,"NW_L_AMION",1);
        DelayCommand( 0.5,RecomputeStaticLighting( GetArea( OBJECT_SELF)));
        SetLocalInt( GetModule(),"Candelabre2",1);

    }
    else
    {
        PlayAnimation( ANIMATION_PLACEABLE_DEACTIVATE);
        DelayCommand( 0.4,SetPlaceableIllumination( OBJECT_SELF, FALSE));
        SetLocalInt( OBJECT_SELF,"NW_L_AMION",0);
        DelayCommand( 0.9,RecomputeStaticLighting( GetArea( OBJECT_SELF)));
        SetLocalInt( GetModule(),"Candelabre2",2);
        if(GetLocalInt( GetModule(),"Candelabre1") == 2)
        {
            ActionOpenDoor( GetObjectByTag("p_porte"));
        }
    }
}



Désolé pour les couleurs... je sais pas comment faire pour les mettre.
Pour aller plus loin... Pour les candélabres, une fois la porte ouverte, celle-ci reste ouverte X secondes et se referme. Je voudrais que conjointement à la fermeture de la porte, les candélabres se rallument ! Auriez vous une idée ?

Merci pour votre aide. Et encore merci à Serguai.
Razz

a+


Edit de Gorkk : je t'ai mis les couleurs pour que ce soit plus lisible Wink Pour le faire c'est très facile, il te suffit de mettre la balise [ code ] (sans les espaces) avant ton script et la balise [ /code ] (toujours sans les espaces) après ton script Wink
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Serguai
Grand Chevalier
Inscrit le: 07 Déc 2002
Messages: 104
Répondre en citant
Posté le : 24/12/2002 17:10:56 Sujet du message : Pour le premier script

J'ai oublié une ligne et du coup les while bouclent à l'infini d'où le message d'erreur:

Donc il faut rajouter à la fin du while:

inventory = GetNextItemInInventory();

Et là ca doit fonctionner sans soucis.

Pour le deuxième script, effectivement j'aurai du faire plus attention aux valeurs utilisées (en effet les valeurs sont initialisées a 0)
Mais si ca marche c cool Smile
 
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
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 24/12/2002 17:17:04 Sujet du message :

Serguai pas d'idée pour mes 2 autres questions ?

- J'ai essayé d'approfondir tes scripts afin de faire en sorte qu'une fois l'objet créer, les objets placés dans les contenants soient détruis ! J'y suis pas arrivé, as tu une idée ?

- Pour aller plus loin... Pour les candélabres, une fois la porte ouverte, celle-ci reste ouverte X secondes et se referme. Je voudrais que conjointement à la fermeture de la porte, les candélabres se rallument ! Auriez vous une idée ?

Merci pour votre aide.
 
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 27.813ms