Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Escorte de PJ
Escorte de PJ
Par flyingman le 19/12/2002 à 18:43:23 (#2833413)
Petit souci mais j'ai pas trouvé ma réponse. Voilà le tableau :
Une salle protégé d'accès par un garde. Dès que le PJ s'approche un peu trop, le garde s'approche de lui en courant et entame un dialogue. A la fin du dialogue, je voudrais que le PJ soit forcé (sans interaction possible à la souris) de se déplacer en un waypoint sur la meme zone (un peu plus loin en fait, hors de la vue du garde).
Voilà voilà...
J'avais bien pensé à un ActionForceMoveToLocation mais en fait, si je fais ça, c'est le garde qui bouge pas le PJ.
une idée?
Par coolstar le 19/12/2002 à 19:28:47 (#2833848)
// Set whether oTarget's action stack can be modified
void SetCommandable(int bCommandable, object oTarget=OBJECT_SELF)
Voir aussi ce Topic pour un exemple d'utilisation... ;)
PS: Et encore merci à mobi qui avait fourni l'info! :D
Par flyingman le 19/12/2002 à 19:57:32 (#2834100)
Bon, j'ai rien compris à ta réponse désolé! :confus:
En fait pour résumé (j'ai un peu avancé à l'instant) :
Je suis ok pour la partie garde s'approche et entame discussion.
Je suis aussi ok pour la partie après la conversation (le PJ est forcé à se déplacer vers un Waypoint avec un setcommandable false)
Mais le souci, c'est que je déclenche le setcommandable false et le début du mouvement du PJ grâce à un déclencheur au sol.
Y'a t'il moyen que je déclenche cette action plutot à la fin de la conversation automatiquement? Parce qu'en fait toutes les actions de fin de dialogue sont appliqués au PNJ et pas au PJ.
C'est là que je galère... Si à la fin de la conversation, mon PNJ pouvait automatiquement entamer l'action setcommandable false et le reste ce serait nickel.
Allez Coolstar, fais moi un coup de Coolstar power!
Merci encore pour ton aide en tout cas (et aux autres aussi qui supportent les noob...)
Par flyingman le 19/12/2002 à 20:30:15 (#2834439)
J'ai tout simplement remplacé le onenteringobject par un getlastspeaker et j'ai mis ça dans le dernier cran du dialogue.
Comme quoi, des fois, on pose des questions et on ferait mieux de chercher un peu avant.
N'empeche 5xp pour le script réussi!
Ca progresse, ca progresse... :D
Par coolstar le 20/12/2002 à 13:07:57 (#2839158)
Par flyingman le 20/12/2002 à 13:25:27 (#2839331)
Comment je fais pour qu'après avoir parlé à mon PJ, mon garde ne le considère plus comme perceived pendant un certains temps?
Parce que là, même quand mon PJ s'éloigne hors de la portée du garde, ce dernier revient quand même le choper.
Par coolstar le 20/12/2002 à 13:29:30 (#2839370)
// Set oObject's local integer variable sVarName to nValue
void SetLocalInt(object oObject, string sVarName, int nValue)
// Get oObject's local integer variable sVarName
// * Return value on error: 0
int GetLocalInt(object oObject, string sVarName)
;)
Par flyingman le 20/12/2002 à 13:39:34 (#2839471)
J'ai encore rien compris à ton message ! :sanglote:
Mais je vais potasser ces 2 fonctions... Tu fais déjà un module toi Coolstar où tu es juste à dispo des ploucs comme moi pour répondre à leurs questions de noob?
Par flyingman le 20/12/2002 à 13:47:09 (#2839516)
void main()
{
object oPC = GetLastPerceived();
ActionSpeakString ("Ho, vous la-bas!");
ActionStartConversation (oPC);
}
Donc à la fin de la conversation, mon garde retourne à son poste de garde et mon PJ est forcé à se déplacer vers un point X situé dans la même mais hors de la vue du garde.
Tu sais comment je peux faire concrétement pour que mon garde "oublie" qu'il a vu mon PJ une fois la discussion close? (jusqu'à la dernière fois où il le chopera effectivement bien sur...)?
Par coolstar le 20/12/2002 à 13:53:54 (#2839577)
/* Action ne se déroulant qu'une seule fois grâce à l'utilisation des 'Variables'...
OnPerception : */
void main()
{
// Déclaration des 'Variables' :
object oVu = GetLastPerceived();
int nValue = TRUE;
// On vérifie que "oVu" c'est un PC et que l'événement n'a pas déjà eu lieu :
if (GetIsPC(oVu) && GetLocalInt(oVu, "vu") != nValue)
// Placer ici tout événement désiré en conséquence...
ActionSpeakString ("Ho, vous la-bas!");
ActionStartConversation (oVu);
// On marque le PC pour que le NPC puisse se souvenir de son passage.
SetLocalInt(oVu, "vu", nValue);
}
PS : Effectivement, je me voue plutôt à aider les Quiches... comme moi (j'ai commencé il y a peu à découvrir les Codes!)... ;)
Par RAT le 20/12/2002 à 14:04:22 (#2839663)
Au fait,merci à vous deux, je ne savais pas qu'on pouvait bloquer un PC comme ça, bon j'avoue, je n'avais pas encore cherché :p. Mais ca va me permettre de faire pas mal de truc huhu ^^.
Par flyingman le 20/12/2002 à 14:17:05 (#2839763)
Par contre, tu me confirmes qu'avec ça, le garde viendra à nouveau à la rencontre du PJ ci celui-ci repasse dans son champ de perception? Il ne va pas le marquer définitivement et ne plus l'inquiéter s'il s'en approche à nouveau? Ce qui lui permettrait tranquillement de revenir une deuxième fois et d'ouvrir ma porte (je veux pas qu'ils l'ouvrent ma porte tous ces PJ avares ;) ! Ils faudra qu'ils soient un peu subtils donc cachés et silencieux, pour ne pas se faire choper...)
Par coolstar le 20/12/2002 à 14:22:38 (#2839811)
...
Par flyingman le 20/12/2002 à 14:31:19 (#2839874)
Bon voilà la situation :
Mon garde est dans un couloir, il protège un accès à une porte qui se trouve dane une salle derrière lui. La perception du garde a été descendu à "courte". Le couloir est assez large pour qu'un PJ puis passer à coté du garde sans se faire remarquer s'il est en mode furtif. Il est aussi assez long pour que, dans tous les cas, le PJ ne soit pas vu tant qu'il n'est pas DANS le couloir.
En gros, seul les persos qui passeront innapercu pourront aller ouvrir la porte.
En cas de planquage raté, le garde part à la rencontre du PJ et entame une conversation. 0 la fin de la conversation, je force le PJ à retourner sur ses pas et à sortir du couloir.
Il est bien entendu que si le PJ retente de forcer le passage, le garde le rechope et il est reconduit hors du couloir.
Le problème concret est le suivant : après reconduite du PJ, le garde retourne à son point de garde mais retourne malgré tout juste après choper le PJ même s'il est hors perception (j'en suis sur, il est assez loin!)
J'aimerais donc que mon garde "ignore" le PJ le temps que l'un soit forcé à sortir du couloir et que l'autre rejoigne son waypoint de garde.
Je sais que c'est un peu tordu mais on essaye de mettre un peu "d'intelligence" dans notre mod.
Merci encore...
Par Jedaï le 20/12/2002 à 19:52:14 (#2842462)
//met ici le délai, en secondes, de "non-réaction" du garde après la conversation :
float fDelay = 15.0;
//ici je suppose que oPC est la variable contenant le PC
DelayCommand(fDelay, DeleteLocalInt(oPC, "vu"))
Si ça ne marche pas, allonge le délai, ça devrai le faire.
[Edit] Ceci suppose que tu utilise déjà la solution de Coolstar.
Par Jedaï le 20/12/2002 à 19:59:15 (#2842518)
/* Action ne se déroulant qu'une seule fois grâce à l'utilisation des 'Variables'...
OnPerception : */
void main()
{
// Déclaration des 'Variables' :
object oVu = GetLastPerceived();
// On vérifie que "oVu" c'est un PC et que l'événement n'a pas déjà eu lieu :
if (GetIsPC(oVu) && !GetLocalInt(oVu, "vu"))
{
// Placer ici tout événement désiré en conséquence...
ActionSpeakString ("Ho, vous la-bas!");
ActionStartConversation (oVu);
// On marque le PC pour que le NPC puisse se souvenir de son passage.
SetLocalInt(oVu, "vu", TRUE);
}
//On pourrait marquer ici les actions qui doivent toujours se dérouler
}
J'en profite d'ailleurs pour rappeler au canard que TRUE et FALSE ne sont pas des fonctions mais bien des constantes, que donc elle ne consomme pas plus de temps-machine que l'appel à une variable. Ce n'est donc pas la peine de les mettre dans des variables, comme ici :int nValue = TRUE;
JOL Archives 1.0.1
@ JOL / JeuxOnLine