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 29/12/2024 01:16:06
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 |
Fantome Ecuyer Messages: 63 |
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 | |
Serguai Grand Chevalier Messages: 104 |
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 | |
Serguai Grand Chevalier Messages: 104 |
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 | |
Fantome Ecuyer Messages: 63 |
Merci Serguai pour ta précieuse aide. Je teste, si j'ai un pb je te le dis.
A+ |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
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. a+ Edit de Gorkk : je t'ai mis les couleurs pour que ce soit plus lisible 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 |
Revenir en haut | |
Serguai Grand Chevalier Messages: 104 |
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 |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
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 | |
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