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 12:03:43
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 |
Djezebel Héros Messages: 252 |
Bonjour à tous,
Aujourd'hui, je vous proposer d'étudier une quête d'escorte. Effet désiré : Un mendiant vous demande aimablement de l'escorter jusqu'à chez lui sans qu'il se fasse tuer. Voici ce que j'ai utilisé : - Un PNJ ("NW_BEGGMALE") - Deux waypoints ("wp_final1" et "wp_final") - Un trigger autour du wp_final1 - Un autre trigger autour du wp_final Sur le PNJ Le dialogue (version simplifiée) : Citation : - Vous ne servez à rien ! j'aurais pu m'en sortir tout seul ! - Bravo ! Merci, vous m'avez sauvé la vie ! - Voulez-vous m'accompagner ? -- Ok NWScript :
int StartingConditional() { int iVie = GetCurrentHitPoints(OBJECT_SELF); int iMaxVie = GetMaxHitPoints(OBJECT_SELF); if ((iVie <= (iMaxVie / 2)) && (GetLocalInt(OBJECT_SELF,"escorte") == 2)) //s'il arrive avec moins de 10% de ses vies { return TRUE; } else return FALSE; } Sur le Condition de "Bravo !" : NWScript :
//Condition "Bravo!" par kiky.le.magnifique int StartingConditional() { int iVie = GetCurrentHitPoints(OBJECT_SELF); int iMaxVie = GetMaxHitPoints(OBJECT_SELF); if (GetLocalInt(OBJECT_SELF, "escorte") == 2) { return TRUE; } else return FALSE; } Sur le ActionConséquente de "Ok" : NWScript :
void main() { object oWP = GetWaypointByTag("wp_final1"); ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0); SetLocalInt(OBJECT_SELF, "escorte", 1); SetLocalString(OBJECT_SELF, "escorte", "wp_final1"); //On lie sur le PNJ le WP sur lequel il doit aller SetLocalObject(oPJ, "GDC", OBJECT_SELF); } Dans le OnConversation du PNJ j'ai rajouté ceci : NWScript :
if (GetLocalInt(OBJECT_SELF, "escorte") == 1) { SpeakString("Continuons je vous prie"); string sWP = GetLocalString(OBJECT_SELF, "escorte"); ActionForceMoveToObject(GetNearestObjectByTag(sWP), FALSE, 10000.0, 10000.0); } else if { // Le texte de base du OnConversation de nwn } Dans le OnPerception j'ai rajouté dans la partie "si c'est un ennemi qu'il perçoit" : NWScript :
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. Dans le OnCombatRoundEnd, il y a ceci : NWScript :
#include "NW_I0_GENERIC" void main() { if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { location lSelf = GetLocalLocation(OBJECT_SELF, "disturb"); ActionForceMoveToLocation(lSelf, FALSE); string sWP = GetLocalString(OBJECT_SELF, "escorte"); DelayCommand(5.0, ActionForceMoveToObject(GetNearestObjectByTag(sWP), FALSE, 10000.0)); DetermineSpecialBehavior(); } else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) { DetermineCombatRound(); } if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1003)); } } Enfin, sur le OnEnter du trigger qui se trouve autour du WP "wp_final1" : NWScript :
void main() { object oNPC = GetEnteringObject(); object oWP = GetWaypointByTag("wp_final"); if (oNPC == GetObjectByTag("NW_BEGGMALE")) { AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0)); SetLocalString(oNPC, "escorte", "wp_final"); } } Enfin, dans le OnEnter du trigger autour du WP_final : NWScript :
void main() { object oNPC = GetEnteringObject(); object oWP1 = GetWaypointByTag("wp_attack1"); object oWP2 = GetWaypointByTag("wp_attack2"); if (oNPC == GetObjectByTag("NW_BEGGMALE")) { SetLocalInt(oNPC, "escorte", 2); } } Problèmes : Plus aucun de très handicapant : une boucle est faite pour le texte pour qu'il ne le dise qu'une fois. Merci par avance. Dernière édition par Djezebel le 17/07/2006 11:10:57; édité 4 fois
|
Revenir en haut | |
kiky.le.magnifique Homme très gay Messages: 907 Localisation: Camping de la nation martienne... |
J'ai pas bien compris à quoi sert le wp_final1, puisque arrivé là il repart vers le 2, pourquoi ne pas l' avoir envoyé vers le 2 directement???
Enfin peu importe, en ce qui concerne ta demande : 1- reset en cas d'attaque -> Le plus judicieux me semble de lui dire d'aller vers son WP dans son script OnCombatRoundEnd. 2- conversation 1 seule fois -> il te faudra utiliser les variables locales. 3- pas d'accord A partir du moment où il est sain et sauf, le contrat est accomplit. Par contre, si le PNJ arrive blessé, il pourrait considéré qu'il n'a pas été bien protégé Qu'est ce que t'en pense Par exemple : NWScript :
void main() { object oWP = GetWaypointByTag("wp_final1"); object oPJ = GetPCSpeaker(); SetLocalInt(OBJECT_SELF, "versWP", 1); SetLocalObject(oPJ, "GDC", OBJECT_SELF); ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0); } NWScript :
//OnEnter WP1 void main() { object oNPC = GetEnteringObject(); object oWP = GetWaypointByTag("wp_final2"); if (oNPC == GetObjectByTag("NW_BEGGMALE")) //Tag du PNJ { SetLocalInt(oNPC, "versWP", 2); AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionForceMoveToObject(oWP, FALSE, 10000.0, 10000.0)); } } NWScript :
//OnEnter WP2 void main() { object oNPC = GetEnteringObject(); if (oNPC == GetObjectByTag("NW_BEGGMALE")) //Tag du PNJ { object oPJ = GetLocalObject(oNPC, "GDC); SetLocalInt(oNPC, "versWP", 3); AssignCommand(oNPC, ActionStartConversation(oPJ)); } } N'oublions pas le cas des attaques, dans le OnCombatRoundEnd : (j'ai repris le début du script d'origine d'un HenchMan) NWScript :
//OnCombatRoundEnd #include "X0_INC_HENAI" #include "X2_inc_spellhook" void main() { if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1003)); } // Check if concentration is required to maintain this creature X2DoBreakConcentrationCheck(); object oWP1 = GetWaypointByTag("wp_final1"); object oWP2 = GetWaypointByTag("wp_final2"); int iWP = GetLocalInt(OBJECT_SELF, "versWP"); if (iWP == 1) {ActionForceMoveToObject(oWP1, FALSE, 10000.0, 10000.0);} if (iWP == 2) {ActionForceMoveToObject(oWP2, FALSE, 10000.0, 10000.0);} } Après, il nous faudra modifier ton dialogue pour prendre en compte la récompense : Citation : -PersNJ : Je saaiiigne! Je vais mourir! Z'êtes nuuul! Dégagez! -PersNJ : Bravo! Vous m'avez sauvez! -PersNJ : Voulez-vous m'accompagner ? ----Joueur : Ok NWScript :
//Condition "Je Saaiiigne!" int StartingConditional() { int iVie = GetCurrentHitPoints(OBJECT_SELF); int iMaxVie = GetMaxHitPoints(OBJECT_SELF); if ((iVie <= (iMaxVie/10))&& (SetLocalInt(oNPC, "versWP") == 3)) //s'il arrive avec moins de 10% de ses vies { return TRUE; } else return FALSE; } En condition du "Bravo" : NWScript :
//Condition "Bravo!" int StartingConditional() { int iVie = GetCurrentHitPoints(OBJECT_SELF); int iMaxVie = GetMaxHitPoints(OBJECT_SELF); if (SetLocalInt(oNPC, "versWP") == 3) { return TRUE; } else return FALSE; } Libre à toi de donner ce que tu veux en action conséquente du "Bravo!". Bon, je ne sais pas si ça fonctionne, je n'ai pas testé, mais ça te donne au moins une bonne base _________________ http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin! |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Merci beaucoup, je vais tester tout ça !
Pour te réponse : 1 - J'ai édité mon post vu que j'ai continué à travailler dessus, donc c'est effectivement ce que j'ai fais. ^^ (il pose un WP quand il part au combat, et revient dessus quand il a terminé) 2 - Si j'utilise le onCOnversation une seule fois, est-ce qu'il ne me dira pas qu'une seule fois "continuons" au lieu de le répêter à chaque fois que le joueur clique sur lui ? 3 - Il faudrait qu'il détecte si le joueur a fais quelque chose ou que dalle. ^^ Mais merci pour ton idée, je vais tester ça (je n'avais pas encore bien travaillé la fin). Et pourquoi mettre plusieurs WP et non pas un seul : l'endroit à escorter est en coude. Ce qui fait que si je ne mets qu'un seul WP, il avance "dans le mur" jusqu'à trouver son passage, voire s'arrête, donc autant le faire marcher comme un PJ : avec raison. . Merci encore, je teste ça. Edit 15 minutes plus tard : Ca marche très bien, je poste l'ajout dans le topic de base. Merci encore ! Edit encore : Y aurait-il la possibilité que le PNJ donne aléatoirement une phrase dans le genre : Lorsqu'il marche : - Ah, ça fait du bien de se promener un peu. - Je préfère aller droit au but : je n'aime pas parler. - Je ne suis pas bavard pendant le voyage. - C'est fini oui, je ne veux pas parler ! Lorsqu'une créature meurt : - Crève ! pourriture ! (ce genre de choses) |
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