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 23/11/2024 21:56:47
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 |
Deekin Acolyte Messages: 32 |
Salut tout le monde ,
De manière à être aussi précis et clair que possible, voici l'intention de ma bouillie de script (désolé ). J'ai créé un déclencheur, au rez-de chaussée d'une maison, dont le but est d'attirer l'attention d'un chien en train d'y effectuer son tour de garde. L'animal arrive vers le PJ en aboyant et vérifie son alignement. Si le PJ est bon, alors le chien aboie en remuant la queue tout en faisant "Warf, warf !" ; prévenu par les jappements de son compagnon qu'il a de la visite, le propriétaire des lieux descend de l'étage et le chien reprend sa ronde, en suivant sagement ses "waypoints". Dans ce cas de figure, la faction de l'occupant de la maison et son chien est naturellement amicale. Par contre, si le PJ est mauvais, alors le chien attend en aboyant que son maître le rejoigne ; puis tous deux, devenant hostiles, passent à l'attaque sans sommation. Et voilà le début du commencement de la mixture de mon script minable : NWScript :
void main() { // Source : Le Bourg de NWN object oPC = GetEnteringObject(); // Mettre le tag du PNJ object oNPC = GetNearestObjectByTag("Tag_du_chien"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); //Verifier l'alignement du PC. Si bon, alors... if (GetAlignmentGoodEvil(oPC >=50) ActionSpeakString(""); { . if (GetAlignmentGoodEvil(oPC <=50) SetIsTemporaryEnemy(GetPCSpeaker());//le PC devient l'ennemi // pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); } } } }/* suspect block end found !*/ /* warning: 2 unclosed parenthesis () */ je sais que ce script est considérablement mal conçu et j'en suis navré. Si quelqu'un veut bien m'aider à le corriger, le simplifier, sans doute, de même que le compléter, je le remercie par avance. |
Revenir en haut | |
Laxam Légende vivante Messages: 425 Localisation: Lyon |
Il faut d'abord vérifier que oPJ est bien un joueur, car tu as mis oPJ = GetEnteringObject(), mais ça peut être le chien qui entre dans le déclencheur, ou bien tout autre chose, il faut donc rajouter une fonction du genre GetIsPC(oPJ), enfin un truc de ce genre.
il doit y avoir une accolade fermante de trop, voilà, je vois rien d'autre.. _________________ Mon site NWN nouvelle version et mon module Boisperdu en ligne ! Et maintenant un FORUM La première version française de la doc du NPC Activities (version 2.0) |
Revenir en haut | |
Deekin Acolyte Messages: 32 |
J'ai ajouté GetIsPC (oPC) au début de mon script et à présent, je travaille sur sa réalisation intégrale.
|
Revenir en haut | |
Deekin Acolyte Messages: 32 |
Salutations à tous ,
Après avoir longuement fouillé, cherché et raisonné, voici ce que donne mon script de chien de garde : NWScript :
void main() { // 1) Faire venir le PNJ "Chien_de_Garde" vers le PJ : object oPC = GetEnteringObject(); GetIsPC(oPC); // Mettre le Tag du PNJ. object oNPC = GetNearestObjectByTag("CABOR"); // Trouver le PNJ. Il est peut-etre mort. if (GetIsObjectValid(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le PNJ vers le joueur ; pour qu'il coure, changer la variable par "TRUE". AssignCommand(oNPC, ActionMoveToObject(oPC, TRUE)); // Verifier l'alignement du PC. Si bon, alors... { if (GetAlignmentGoodEvil(oPC > 50)) PlaySound ("as_an_dogbark1"); ActionSpeakString(""); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); object oWP3 = GetWaypointByTag("WayFou_Etage_3"); object oArea; oArea = GetArea ("LamaisonduFouEtage"); AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); // Depart du PNJ pour se rendre au WP2 en courant AssignCommand(oBudoc, ActionMoveToObject(oWP2, TRUE)); // object oDoor; oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen (oDoor, TRUE)) AssignCommand(oBudoc, ActionMoveToObject(oWP3, FALSE)); if (GetIsOpen (oDoor, FALSE)) DoDoorAction (oTargetDoor, DOOR_ACTION_OPEN); { object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); { // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // { DestroyObject(OBJECT_SELF); // Si l'alignement du PC est mauvais : if (GetAlignmentGoodEvil(oPC < 50)) { PlaySound ("as_an_dogbark5"); ActionSpeakString("(le chien vous lance un regard lourd de menaces)"); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); object oWP3 = GetWaypointByTag("WayFou_Etage_3"); // Depart du PNJ pour aller au WP1 en courant. AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); // Depart du PNJ pour se rendre au WP2 en courant AssignCommand(oBudoc, ActionMoveToObject(oWP2, TRUE)); // object oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen (oDoor, TRUE)) AssignCommand(oBudoc, ActionMoveToObject(oWP3, FALSE)); if (GetIsOpen (oDoor, FALSE)) DoDoorAction (oTargetDoor, DOOR_ACTION_OPEN); // pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); object oArea; oArea = GetArea ("LamaisonduFouEtage"); object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); } // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // {DestroyObject(OBJECT_SELF). } /* warning: 10 unclosed block {} */ J'ai réctifié ce que j'ai pu, en fonction des indications évasives du debugger mais un problème persiste (un ou plusieurs, je me pose la question). En effet, à la dernière ligne, la toute dernière, voici l'erreur affichée : "UNEXPECTED END COMPOUND STATEMENT". Cette erreur concerne la ligne 186 alors que mon script n'en fait que 185. J'avoue que je suis perplexe et perdu ; d'autant plus que je ne sais plus où placer les accolades. Ayant peur de compliquer la situation, je préfère ne plus toucher à rien, dans l'espoir que quelqu'un parmi vous (Laxam, t'es là ? ) acceptera de me donner un petit coup de main. Par la suite, il ne me restera plus qu'à paramétrer mes dialogues et j'en aurai fini avec ce pavé (sans doute le premier d'une longue, longue série ). |
Revenir en haut | |
Starkanas Grand Chevalier Messages: 110 |
Bah rajoute une accolade pour voir si le messsage est à la fin c ptet une bete "}"lol
|
Revenir en haut | |
Starkanas Grand Chevalier Messages: 110 |
Essaie ça :
NWScript : void main() { // 1) Faire venir le PNJ "Chien_de_Garde" vers le PJ : object oPC = GetEnteringObject(); GetIsPC(oPC); // Mettre le Tag du PNJ. object oNPC = GetNearestObjectByTag("CABOR"); // Trouver le PNJ. Il est peut-etre mort. if (GetIsObjectValid(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le PNJ vers le joueur ; pour qu'il coure, changer la variable par "TRUE". AssignCommand(oNPC, ActionMoveToObject(oPC, TRUE)); // Verifier l'alignement du PC. Si bon, alors... { if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD) PlaySound ("as_an_dogbark1"); ActionSpeakString(""); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); object oWP3 = GetWaypointByTag("WayFou_Etage_3"); AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); // Depart du PNJ pour se rendre au WP2 en courant AssignCommand(oBudoc, ActionMoveToObject(oWP2, TRUE)); // object oDoor; oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen(oDoor) == TRUE) AssignCommand(oBudoc, ActionMoveToObject(oWP3, FALSE)); if (GetIsOpen (oDoor) == FALSE) ActionOpenDoor(oDoor); { object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); { // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // { DestroyObject(OBJECT_SELF); // Si l'alignement du PC est mauvais : if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL) { PlaySound ("as_an_dogbark5"); ActionSpeakString("(le chien vous lance un regard lourd de menaces)"); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); object oWP3 = GetWaypointByTag("WayFou_Etage_3"); // Depart du PNJ pour aller au WP1 en courant. AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); // Depart du PNJ pour se rendre au WP2 en courant AssignCommand(oBudoc, ActionMoveToObject(oWP2, TRUE)); // object oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen (oDoor) == TRUE) AssignCommand(oBudoc, ActionMoveToObject(oWP3, FALSE)); if (GetIsOpen (oDoor) == FALSE) ActionOpenDoor(oDoor); // pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); } // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // {DestroyObject(OBJECT_SELF). } } } } } } } } } } } |
Revenir en haut | |
Deekin Acolyte Messages: 32 |
En jetant un oeil rapide à ta correction, j'ai pu voir que dans l'ensemble, je m'étais honnorablement débrouillé. Et ça me fait plaisir de noter que j'apprends. Lentement, mais sûrement. Je te remercie pour ton aide .
|
Revenir en haut | |
Deekin Acolyte Messages: 32 |
D'abord, je souhaitais faire apparaître un texte flottant au-dessus du chien. Or, pour cela, j'ai besoin de la commande "FloatingTextStringOnCreature" au lieu de "ActionSpeakString". Et évidemment, c'est cette seconde que j'ai utilisée. Comment dois-je faire pour paramétrer la première ? Bien entendu, avant de poser ma question, j'ai essayé mais le seul résultat a été une mélasse inutile .
J'ai pensé à faire appel à une ligne de dialogue appelée par un script comme pour les portes fermées par une barre de fer (campagne de NWN). Est-ce le bon moyen ? De plus, comment empêcher un NPC de suivre inlassablement le trajet délimité par ses "Waypoints" ? En effet, alors que le chien devrait faire sa ronde de surveillance, apercevoir le PC, aller vers lui et ne plus bouger de sa position, il effectue bien toutes les manoeuvres sauf qu'ensuite, il reprend son tour de garde. La commande "AssignCommand(oNPC, ClearAllActions());" n'a aucun effet . Enfin, mon NPC propriétaire du chien descend bien de l'étage (situé dans une autre zone) mais il met beaucoup de temps (plusieurs secondes) pour arriver au pied de l'escalier. Je voudrais donc ajouter un autre texte flottant, attribué à la porte par exemple, faisant croire que le NPC en train de descendre dit "j'arrive dans un instant" ou une formule similaire . Pour le reste, tout fonctionne correctement. NWScript : void main() { // 1) Faire venir le PNJ "Chien_de_Garde" vers le PJ : object oPC = GetEnteringObject(); GetIsPC(oPC); // Mettre le Tag du PNJ. object oNPC = GetNearestObjectByTag("CABOR"); // Trouver le PNJ. Il est peut-etre mort. if (GetIsObjectValid(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le PNJ vers le joueur ; pour qu'il coure, changer la variable par "TRUE". AssignCommand(oNPC, ActionMoveToObject(oPC, TRUE)); // Verifier l'alignement du PC. Si bon, alors... { if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD) PlaySound ("as_an_dogbark1"); ActionSpeakString(""); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); object oDoor; oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen(oDoor) == TRUE) AssignCommand(oBudoc, ActionJumpToObject(oWP2, FALSE)); if (GetIsOpen (oDoor) == FALSE) ActionOpenDoor(oDoor); AssignCommand(oBudoc, ActionJumpToObject(oWP2, FALSE)); { object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); { // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); // Si l'alignement du PC est mauvais : if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL) { PlaySound ("as_an_dogbark5"); ActionSpeakString("(le chien vous lance un regard lourd de menaces)"); { object oBudoc = GetObjectByTag("LeFou"); object oWP1 = GetWaypointByTag("WayFou_Etage_1"); object oWP2 = GetWaypointByTag("WayFou_Etage_2"); AssignCommand(oBudoc, ActionMoveToObject(oWP1, TRUE)); // object oDoor; oDoor = GetObjectByTag ("Porte_Fou_Etage"); if (GetIsOpen(oDoor) == TRUE) AssignCommand(oBudoc, ActionJumpToObject(oWP2, FALSE)); if (GetIsOpen (oDoor) == FALSE) ActionOpenDoor(oDoor); AssignCommand(oBudoc, ActionJumpToObject(oWP2, FALSE)); // pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); object oNPC = GetObjectByTag("LeFou"); // Trouver le PNJ. Il est peut etre mort.. if (GetIsObjectValid(oNPC)) { if (!IsInConversation(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(oNPC, ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(oNPC, ActionStartConversation(oPC)); } // Pour que le script ne marche qu'une seule fois // placer la ligne en dessous en la mettant sans commentaire: // DestroyObject(OBJECT_SELF); } } } } } } } } } } } |
Revenir en haut | |
Deekin Acolyte Messages: 32 |
Voici le script enfin terminé, à trois détails près .
En effet, lorsque le PNJ arrive dans la zone où se trouve le PJ, il part d'abord en balade puis revient débuter le dialogue au lieu de venir lui parler directement. Par ailleurs, le "WP2" empêche le PNJ de venir vers le PJ ; j'ai donc mis la commande "ActionMoveToObject" sous forme de commentaire en attendant de savoir pourquoi. Pour finir, je ne sais toujours pas, après plusieurs jours de réflexion intense, comment empêcher le script de se répéter. La commande "DestroyObject(OBJECT_SELF);" empêche le PNJ d'entrer dans la zone où se trouve le PJ. Si l'un d'entre vous a une idée sur les corrections à apporter, je serai heureux de savoir quoi faire pour supprimer ces inconvénients, parce que là, je suis vraiment dans une impasse. NWScript :
void main() { // Faire venir le PNJ "Chien_de_Garde" vers le PJ : object oPC = GetEnteringObject(); GetIsPC(oPC); // Mettre le Tag du PNJ (chien). object oNPC = GetNearestObjectByTag("tag du chien"); // Trouver le PNJ. Il est peut-etre mort. if (GetIsObjectValid(oNPC)) { // stopper les actions en cours du PNJ. AssignCommand(oNPC, ClearAllActions()); // Faire marcher le PNJ vers le joueur ; pour qu'il coure, changer la variable par "TRUE". AssignCommand(oNPC, ActionMoveToObject(oPC, TRUE)); { // 1) Verifier l'alignement du PJ. S'il est bon, alors... if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD) { // Pour que le PNJ (chien) parle au joueur. object oNPC = GetObjectByTag ("tag du chien"); AssignCommand(oNPC, ActionStartConversation(oPC)); } { object o"nom du PNJ" = GetObjectByTag("tag du PNJ"); object oWP1 = GetWaypointByTag(""); object oWP2 = GetWaypointByTag(""); // Pour faire courir le PNJ, remplacer "FALSE" par "TRUE". AssignCommand(o"nom du PNJ", ActionMoveToObject(oWP1, FALSE)); ActionWait(x.x); object oVoix = GetObjectByTag("tag porte rdc"); DelayCommand (x.xf, AssignCommand(oVoix, ActionStartConversation(oPC))); ActionWait(x.x); object oDoor; oDoor = GetObjectByTag ("tag porte etage"); if (GetIsOpen(oDoor) == TRUE) // AssignCommand(o"nom du PNJ", ActionMoveToObject(oWP2, FALSE)); if (GetIsOpen (oDoor) == FALSE) ActionOpenDoor(oDoor); // AssignCommand(o"nom du PNJ", ActionMoveToObject(oWP2, FALSE)); { object o"nom du PNJ" = GetObjectByTag("tag du PNJ"); // Trouver le PNJ. Il est peut etre mort. if (GetIsObjectValid(o"nom du PNJ")) { if (!IsInConversation(o"nom du PNJ")) { // stopper les actions en cours du PNJ. AssignCommand(o"nom du PNJ", ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(o"nom du PNJ", ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(o"nom du PNJ", ActionStartConversation(oPC)); // Prevoir en fin de dialogue ("Actions consequentes") les actions du PNJ //maitre du chien. } } } } } } { // Verifier l'alignement du PC. Si mauvais, alors... if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL) { // Pour que le PNJ (chien) parle au joueur. object oNPC = GetObjectByTag ("tag du chien"); AssignCommand(oNPC, ActionStartConversation(oPC)); // Prevoir en fin de dialogue ("Actions consequentes") ce qu'on veut faire du chien } { object o"nom du PNJ" = GetObjectByTag("tag du PNJ"); // Trouver le PNJ. Il est peut etre mort. if (GetIsObjectValid(o"nom du PNJ")) { if (!IsInConversation(o"nom du PNJ")) { // stopper les actions en cours du PNJ. AssignCommand(o"nom du PNJ", ClearAllActions()); // Faire marcher le NPC vers le joueur. Pour qu'il coure, changer la variable par TRUE. AssignCommand(o"nom du PNJ", ActionMoveToObject(oPC, FALSE)); // Pour que le PNJ parle au joueur. AssignCommand(o"nom du PNJ", ActionStartConversation(oPC)); // Prevoir en fin de dialogue ("Actions consequentes") les actions du PNJ //maitre du chien. } } } } } Une fois le script réalisé, prévoyez deux branches de dialogue ; l'une déterminée par les alignements bon et neutre (utilisez l'assistant de l'onglet "Conditions d'exécution") et l'autre, par l'alignement mauvais. Dans les "Actions conséquentes", creez les scripts qui vous conviennent. |
Revenir en haut | |
Deekin Acolyte Messages: 32 |
Merci pour votre aide.
|
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
Joli script !
Plutot que d'utiliser la commande ActionMoveToObject, utilise la fonction ActionFORCEMoveToObject. J'utilise pratiquement à chaque fois cette derniere Ensuite dans ton script il ya peut être un piege à eviter avec la commande ActionWait. En effet sachant que le OnHeartBeat est relancé toutes les 6 secondes, si la somme du temps d'attente de tous tes actionwait, dépasse les 6 secondes, peut être cela génére t il un embouteillahe ou une confusion d'action à faire pour ton pnj partagé entre son OnHeartBeat et son Trigger (qui le commande) Ensuite tu as mis les ActionWait sans AssignCommand. Peut être un AssignCommand(oNPC, ActionWait(1.0)); reglera certains pb (la je suis pas sur mais à la lecture de ton script, ces actionWait seuls m'ont marqué. Alors je t'en fait part Ensuite pour empécher l'animation de se répéter, je te conseillerai plutot la mise en place d'un variable SetLocalInt(). Elle passe à un quand l'animation est enclenché et via un DelayCommand par exemple, ou via un autre trigger ou encore via une branche de ton dialogue tu as la possibilité de la refaire passer à 0. Je ne sais pas comment tu voudrais procéder mais tu peux stocker la variable sur le Pj, Pnj, trigger, etc....... En espérant avoir vu juste et pu t'aider _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
Pour éviter qu'une action se répéte il y a surtout 2 méthodes principales et faciles !
La premiere tu l'as déjà trouvé : détruire l'objet déclenchant le script avec la fonction DestroyObject(object); La deuxieme est de coller une variable (ou vulgurairement parlant un mouchard ) avec l'utilisation de 2 fonctions : SetLocalInt(); //donne la valeur à la variable et GetLocalInt(); //regarde la valeur de la variable Pour ton script si l'idee pour ne pas qu'il se répete est d'empecher que le chien vienne voir le joueur une énieme fois, je te conseil de mettre ceci : if (!GetLocalInt(oPC, "UneFois")) { Ici tu mets tout ton script avec en plus cette ligne juste apres tes lignes de script suivantes : // Pour que le PNJ parle au joueur. AssignCommand(o"nom du PNJ", ActionStartConversation(oPC)); Donc tu rajoutes : SetLocalInt(oPC,"UneFois", 1); } (n'oublie pas les accolades) Attention avec ceci le trigger ne remarchera plus sur CE joueur! Mais le trigger est toujours en fonction pour les autres joueurs! _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
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