La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 02/05/2024 07:30:10


  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 : 26/12/2002 08:54:04 Sujet du message : Candélabre et contenant ... la suite ...

Merci à Serguai pours ces réponses à mon post précédent.
Je vous expose mes 2 nouveaux problèmes:

- En placant des objets(objet1 et objets 2) dans des contenants(contenant1 et contenant2), un objet(TheObject) est créé à un way point(ca ca fonctionne). Ce que je cherche à produire : Une fois cet objet créé, je souhaite que les objets placés dans les contenants soient automatiquement détruis. J'ai pas réussi à trouver la soluce Crying or Very sad . Quelqu'un peut m'aider ?

- 2 candélabres(candelabre1 et candelabre2) sont allumés. En les éteignants(tous les 2), il ouvre une porte(TheDoor) (ca ca fonctionne). Ce que je cherche à produire : une fois la porte ouverte, lorsque celle-ci se referme, je voudrais que les candélabres se rallument. Là aussi j'ai pas trouvé la solution Crying or Very sad , si quelqu'un en à une je suis preneur.

a+ Razz
 
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 : 26/12/2002 13:24:25 Sujet du message : On continue :-)

Very Happy

Je n'ai pas répondu à la suite de tes posts pour cause de fêtes de fin d'année, mais maintenant que ma panse est pleine, je vais pouvoir essayer de t'aider pour la suite.
Alors pour le premier problème, on va modifier un peu les scripts précédents. En fait tu pourrai très bien faire des DestroyObject sur les objets des contenants au moment de la création de theobject, celà suppose que tu connais le tag des objets dans les contenants, et je suppose que tu a déjà essayé cette solution. Donc la solution c'est de garder en mémoire la trace des objets qui sont dans les contenants, grâce à la fonction SetLocalObject. Ca donne donc :

premier script:
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;
           SetLocalObject(GetModule(), "objet1", inventory);
      }
      /*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);
             DestroyObject(GetLocalObject(GetModule(), "objet1");
             DestroyObject(GetLocalObject(GetModule(), "objet2"); 
       }
   }
   else SetLocalInt(GetModule(),"hasitem1",0);
}


deuxième script:
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;
           SetLocalObject(GetModule(), "objet2", inventory);
      }
      /*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);
             DestroyObject(GetLocalObject(GetModule(), "objet1");
             DestroyObject(GetLocalObject(GetModule(), "objet2");   
       }
   }
   else SetLocalInt(GetModule(),"hasitem2",0);
}
 


Voilà, j'ai juste rajouté 3 lignes pour chacun des scripts:
Une ligne au moment ou l'on a trouvé l'objet et qui le stocke (différent selon le script):
Code :
SetLocalObject(GetModule(), "objet1", inventory);

et
Code :
SetLocalObject(GetModule(), "objet2", inventory);


et deux lignes au moment ou l'on cree theobjet qui détruit les deux objets stockés (la même pour les deux scripts):
Code :
DestroyObject(GetLocalObject(GetModule(), "objet1");
DestroyObject(GetLocalObject(GetModule(), "objet2");


Encore une fois j'écris ca directement sans le tester, mais j'ai déjà fait des choses similaires pour mon module et c'est comme ca que j'ai procédé.
 
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 : 26/12/2002 13:33:14 Sujet du message : Deuxième problème.

Pour le coup de la lumière qui s'éteind, place le script suivant dans le onclose de la porte:

Code :

void main()
{
        object c1=GetObjectByTag("candelabre1");
        object c2=GetObjectByTag("candelabre2");

        //Allumer les chandelles
        SetPlaceableIllumination(c1, TRUE);
        AssignCommand(c1, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
        SetPlaceableIllumination(c2, TRUE);
        AssignCommand(c2,ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));

        //Recalculer l'éclairage
        RecomputeStaticLighting(GetArea(OBJECT_SELF));
}


A+
Dernière édition par Serguai le 26/12/2002 20:36:03; édité 2 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
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 26/12/2002 18:31:10 Sujet du message :

Hello Serguai,
merci d'être fidèle au poste.

J'ai testé l'histoire des contenants... ca semble pas marcher. En fait, si TheObject est créé, c'est que les object des contenant sont les bons et par conséquence je connais leur tag, aussi quelle est ta soluce à ppartir de la création de TheObject. N'oublie pas de me mentionner ou placer le script.

Pour les candélabres.. ou dois je placer ton script ? Dans le OnOpen de la porte j'ai déjà un script pour la refermer automatiquement, si je met ton script à la suite ca donne rien... ou dois je mettre ?

Merci
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 : 26/12/2002 19:37:22 Sujet du message : Bizzare ...

Pour les contenants, utilise ma solution et non pas les tags, c'est bien plus sûr de marcher je pense. Sinon il suffit que tu aie un objet avec le même tag ailleurs, il se pourrait que ca détruise celui ci et non pas celui que tu veux.
Avec le SetLocalObject, tu es certain que tu détruit celui qui est dans le contenant.
En tout cas j'ai procédé ainsi dans mon module et ca a toujours marché.

Je relis mon script à tout hasard, mais je ne vois pas d'erreur ...

Pour le coup des candelabres, je suis encore plus surpris que ca ne fonctionne pas car j'ai fait un copier coller d'un script de mon module...
Effectivement tu ne peux peut être pas le mettre dans le onclose de ta porte si elle se referme par un script (bien que ca m'étonne). Dans ce cas, ca devrait fonctionner si tu le met à la suite de ton script de fermeture. Vérifie bien tes tags.
Tu n'as qu'a me copier coller le code ici de ta fermeture de porte fusionné avec mon script, et je regarderai si je trouve ce qui ne va pas ...
(au passage si tu veux mettre les couleurs, il faut utiliser le bouton Code de la barre d'outil quand tu tape tes posts).
 
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 : 26/12/2002 20:02:59 Sujet du message : oups

Pour le coup des candelabres, c'est parce que j'ai mis FALSE au lieu de TRUE (dans mon module, je les éteind !!!).
C'est le danger du copier coller Smile
J'édite tout de suite le post pour le corriger...
 
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 : 26/12/2002 20:56:50 Sujet du message :

Serguai, voici mes scripts,
je commence par les contenants:

1er contenant:

Code :
void main()
{

   int hasitem1 = GetLocalInt(GetModule(),"hasitem1");
   object inventory = GetFirstItemInInventory();
   object FontaineA = GetLocalObject(GetModule(),"FontaineA");

   //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) == "PierreA")
           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();
   SetLocalObject(GetModule(), "PierreA", inventory);
   }

   /*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,"NW_IT_GEM002",GetLocation(GetWaypointByTag("wp_gemme")));
             DestroyObject(GetLocalObject(GetModule(), "PierreA"));
       }
   }
   else SetLocalInt(GetModule(),"hasitem1",0);

}


2eme contenant:

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) == "PierreB")
           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,"NW_IT_GEM002",GetLocation(GetWaypointByTag("wp_gemme")));
             DestroyObject(GetLocalObject(GetModule(), "PierreA"));
             
 //            SetLocalInt(GetModule(),"created",1);
       }
   }
   else SetLocalInt(GetModule(),"hasitem2",0);


}


Dans mon code seul l'objet PierreA devrait être détruit... mais il se passe rien. Tout le reste fonctionne bien.

Passons aux candélabres:

sur le OnOpen de la porte voici mon code:

Code :

void main()
{


DelayCommand(20.0, ActionCloseDoor(OBJECT_SELF));//Ferme la porte apres 20 seconde d'ouverture
        object c1=GetObjectByTag("candelabre1");
        object c2=GetObjectByTag("candelabre2");

        //Eteindre les chandelles
        SetPlaceableIllumination(c1, TRUE);
        AssignCommand(c1, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
        SetPlaceableIllumination(c2, TRUE);
        AssignCommand(c2, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));

        //Recalculer l'éclairage
        RecomputeStaticLighting(GetArea(OBJECT_SELF));


}


Voilà si tu as la soluce explique la moi.

a+

J'ai essayé pour les couleurs mais je crois que c'est pas ca !!!!

Edit de Gorkk : j'ai rectifié les balises code Wink
Explicatif de l'utilisation du bouton code au-dessus de l'encart d'écriture de messaage :
- tu cliques une fois dessus avant de commencer ton script, ça te fait apparaitre [ code ] (sans les espaces) dasn ton message, et ça met une petite * à côté de code au-dessus de la fenêtre.
- tu mets ton script
- tu cliques à nouveau sur code : la balise [ /code ] (sans les espaces) apparait dans ton message, et l'* disparait à côté de 'code' pour dire que la balise a été fermée Wink
Voilà Cool
 
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 : 26/12/2002 23:28:14 Sujet du message :

Pour afficher correctement les couleurs: le premier appuie sur le bouton marque le début de ton code et le deuxième appuie sur le bouton marque la fin de ton code ... ou alors tu peux séléctionner tout ton code et cliquer sur le bouton, ca devrait mettre les balises comme il faut.

Passons à notre problème:

Déjà pour les candelabre, regarde bien la correction, j'ai changé le FALSE en TRUE mais aussi le DEACTIVATE en ACTIVATE.

Pour les contenants fait attention avec ton CreateObject; ce que tu dois lui donner en argument c'est le template et non pas le tag (contrairement au GetObjectByTag qui se fait avec le tag). Souvent le tag et le template sont identiques mais ce n'est pas toujours le cas. De plus , les templates sont en minuscule alors que tu as mis NW_IT_GEM002 en majuscule... du coup ça m'étonne que ca marche vu que le langage est case sensitive ... mais bon, on ne va pas y toucher vu que ça fonctionne.
Ensuite je ne comprend pas bien, dans les deux contenants tu détruit la PierreA, alors que dans le deuxième contenant tu devrais détruire la PierreB non ? Il me semble qu'il y'a une confusion de ce coté là, c'est sans doute pour ça que ca ne marche pas ...
Si c'est bien ce que tu voulais faire, alors reexplique moi en détail ce que tu veux faire... moi je pensais que lorsque les deux contenants possédaient les pierres, il fallait créer l'objet, et détruire les pierres qui sont dans les contenants. Auquel cas, chacun des contenants doit avoir le code suivant ?
Code :
DestroyObject(GetLocalObject(GetModule(), "PierreA"));
DestroyObject(GetLocalObject(GetModule(), "PierreB"));
 
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 : 27/12/2002 10:27:44 Sujet du message :

M'enfin !
Ca fonctionne !
Voici ce qui clochait :

- pour les contenants c'est le fait d'avoir mis le tag et non le template de l'objet à créer qui devait perturber le code qui suivait. J'ai juste remplacé le tag par le template et ca marche impec. Question subsidiaire : j'ai ôté la partie de ton code qui impliquait le fait que l'objet créé puisse être créé qu'une seule fois (moi j'ai ré-initialisé les variables) car j'avais peur qu'en multijoueur chaque joueur ne puisse pas recréer ledit objet. Qu'en penses-tu ?

voici mon code pour les contenants : (dans le OnClose pour chacun)
contenant 1


Code :
void main ()
{


   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) == "PierreA")
      {
           hasitem1 = 1;
           SetLocalObject(GetModule(), "PierreA", inventory);
      }
      /*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,"it_gem003",GetLocation(GetWaypointByTag("wp_gemme")));
             DestroyObject(GetLocalObject(GetModule(), "PierreA"));
             DestroyObject(GetLocalObject(GetModule(), "PierreB"));
             SetLocalInt(GetModule(),"hasitem1",0);
             SetLocalInt(GetModule(),"hasitem2",0);
       }
   }
   else SetLocalInt(GetModule(),"hasitem1",0);
}


contenant 2

Code :
void main ()

{

     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) == "PierreB"){
           hasitem2 = 1;
           SetLocalObject(GetModule(), "PierreB", inventory);
      }
      /*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,"it_gem003",GetLocation(GetWaypointByTag("wp_gemme")));
             DestroyObject(GetLocalObject(GetModule(), "PierreA"));
             DestroyObject(GetLocalObject(GetModule(), "PierreB"));
             SetLocalInt(GetModule(),"hasitem1",0);
             SetLocalInt(GetModule(),"hasitem2",0);
       }
   }
   else SetLocalInt(GetModule(),"hasitem2",0);
}


- côté candélabre avec ton code modifié à TRUE et ACTIVATE ça fonctionne. J'ai alors rencontré un autre pb : les candélabres se rallumaient aussitôt (moi je voulais qu'ils se rallument lors de la fermeture de la porte, qui elle restait ouverte 20 secondes) si je mettait le code dans le OnOpen de ma porte et en plus , il suffisait ensuite d'en éteindre un seul pour que la porte s'ouvre de nouveau. J'ai résolu ces 2 petits pbs en mettant le code suivant dans le OnClose de la porte :

Code :
void main()
{


        object c1=GetObjectByTag("candelabre1");
        object c2=GetObjectByTag("candelabre2");

        //Allumer les chandelles
        SetPlaceableIllumination(c1, TRUE);
        AssignCommand(c1, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
        SetPlaceableIllumination(c2, TRUE);
        AssignCommand(c2, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));

        //Recalculer l'éclairage
        RecomputeStaticLighting(GetArea(OBJECT_SELF));
        SetLocalInt(GetModule(),"candelabre1",1);
        SetLocalInt(GetModule(),"candelabre2",1);


}


Voilà. Un grand MERCI à Serguai pour son aide précieuse.

J'espère que pour les couleurs c'est mieux !

Si tu as du temps jette un oeil (voir les 2!) à mon post : Un PNJ la nuit .

Merci

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 : 27/12/2002 13:18:00 Sujet du message : Cool :-)

Bon ben content que ça fonctionne Smile
Tu a très bien fait de virer le localint si ca ne correspondait pas a ce que tu voulais, moi au départ je pensais que tu voulais que le truc ne fonctionne qu'une seule fois.
Je jetterai un coup d'oeil sur ton autre post, mais plus tard parce que pour le moment j'ai un repas qui se prépare.

A+
 
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
 
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 33.19ms