Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > deplacement controle
deplacement controle
Par daemogorgon le 23/1/2003 à 11:16:50 (#3082493)
void main()
{
object oPNJ = GetNearestObjectByTag("Garde");
object oPJ = GetEnteringObject();
object oPorte = GetNearestObjectByTag("po_gardee");
object oDepart = GetObjectByTag("WP_Garde1") ;
object oArrive = GetObjectByTag("WP_Garde2") ;
vector vPJ = GetPosition(oPJ);
if (GetIsPC(oPJ) == TRUE)
{
DelayCommand(0.1, AssignCommand(oPorte, ActionLockObject(oPorte)));
DelayCommand(0.2, AssignCommand(oPNJ, ActionForceMoveToObject(oArrive)));
DelayCommand(1.3, AssignCommand(oPNJ, SetFacingPoint(vPJ)));
}
}
Par eMRaistlin le 23/1/2003 à 12:12:08 (#3082923)
- Mettre le calcul de [vector vPJ = GetPosition(oPJ);] en DelayCommand, afin que sa position ne soit calculé qu'en temps voulu (et pas immediatement a l'entrée... surtout si c'est une entrée d'aréa et non de trigger)
- Essayer de mettre un ClearAllAction juste avant le SetFacingPoint... des fois qu'il ne le fasse pas a cause ForceMove...
- Au pire, faire un start conversation avec un resref de conversation erroné, ce qui va avoir le même effet que l'effet attendu : le PnJ va faire face au PJ automatiquement.
Voila... desole de pas avoir de reponse plus precise, mais bon...
(en tout cas, a priori, pas de bug repertorie sur le SetFacingPoint() sur le lexicon... ca doit nouiller ailleurs)
Par daemogorgon le 23/1/2003 à 12:15:49 (#3082955)
C'est le ActionForceMove qui marche pas. Le pnj est assis sur une chaise, et quand le PJ passe sur le trigger, il doit se lever et aller à oArrive, mais là, il bouge pas, il se contente de regarder passer le PJ.
Par eMRaistlin le 23/1/2003 à 12:21:19 (#3083001)
Assign un ClearAllActions, pour que le PNJ se leve...
il fera le reste ensuite, normalment :)
Par daemogorgon le 23/1/2003 à 12:26:32 (#3083035)
Par daemogorgon le 23/1/2003 à 21:58:33 (#3087605)
Ce script sert a plusieurs endroits en fonction du nPnj.
La case 0 marche (quand le PJ passe dans un trigger), mais quand j'appelle de nouveau le script a la fin du dialogue du Pnj dans action conséquente... (case1), ben, y'a rien qui se passe.
Dans la foulée, y'a moyen de forcer le Pnj à garder la porte, et non se promener vers le PJ si celui-ci lui parle ?
void main()
{
object oPNJ = GetNearestObjectByTag("PNJ");
int nPnj = GetLocalInt(oPNJ, "place");
object oPJ = GetEnteringObject();
object oPorte = GetNearestObjectByTag("porte");
object oDepart = GetObjectByTag("WP_PNJ1") ;
object oArrive = GetObjectByTag("WP_PNJ2") ;
nPnj += 0;
switch (nPnj)
{
case 0:
if (GetIsPC(oPJ) == TRUE)
{
// Deplacement du Pnj et bloquage de la porte
nPnj = 1;
SetLocalInt(oPNJ, "place", nPnj);
AssignCommand(oPNJ, ClearAllActions());
DelayCommand(0.1, AssignCommand(oPorte, ActionLockObject(oPorte)));
DelayCommand(0.2, AssignCommand(oPNJ, ActionForceMoveToObject(oArrive)));
// Debut du dialogue du Pnj
DelayCommand(2.8, AssignCommand(oPNJ, ActionStartConversation(oPJ)));
}
break;
case 1:
// Deplacement du Pnj vers sa chaise
AssignCommand(oPNJ, ClearAllActions());
DelayCommand(0.1, AssignCommand(oPorte, ActionUnlockObject(oPorte)));
DelayCommand(0.2, AssignCommand(oPNJ, ActionForceMoveToObject(oDepart)));
DelayCommand(2.5, AssignCommand(oPNJ, ClearAllActions()));
// Fais s'asseoir le PNJ
nPnj = 0;
SetLocalInt(oPNJ, "place", nPnj);
pnj_assis(oPNJ);
break;
}
}
Par Azrael07 le 23/1/2003 à 22:12:54 (#3087697)
essaye de mettre des fonctions de debugging un peu partout pour tester ou il va pas....
affiche la valeur de nPnj un peu partout par exemple.
je crois que je vais sortir un tut sur le debugging un de ces 4, j'ai l'impression que ca se fait sentir ^^
bon si après ca tu trouve tjrs pas repost je vais voir si j'en trouve un peu plus ^^
Par daemogorgon le 23/1/2003 à 22:22:30 (#3087751)
J'ai l'impression qu'à la fin du dialogue, il ne va pas dans le script, mais je vois pas pourquoi. Peut-être à tout hazard, le dialogue fini sur le [propriétaire] Pnj.
Sinon, je vois pas.
La valeur nPnj est bonne, elle change quand il faut (enfin, elle passe de 0 à 1).
Par contre, comme le dialogue est lancé dans le script, le pb ne serait pas là des fois ?
Par eMRaistlin le 23/1/2003 à 23:49:00 (#3088218)
A quoi sert t'il ?
Par daemogorgon le 24/1/2003 à 10:03:57 (#3089752)
Par contre, personne a une idée du pb ?
Par eMRaistlin le 24/1/2003 à 10:14:21 (#3089801)
pour moi, il execute Case 0, met la variable a 1, et donc effectue le case 1. (et remet donc NPJ a 0)
essaye :
Soit de refaire un GetNearestObject(oObject,nNth) au debut du Case1, ou bien essaye de changer la variable du nPnj en fin de script seulement.
PS : met des AssignCommand(oPnj,SpeakString("yo !")); dans les 2 case, pour voir quiquic'est qui fé quoi....
Par daemogorgon le 24/1/2003 à 11:36:30 (#3090238)
Comprends plus rien.
Par eMRaistlin le 24/1/2003 à 11:44:12 (#3090281)
je ne t'ai pas demandé... (paske a la fin, on croit que tout le monde sait...)
A tu bien enlevé le ClearAllActions() que Bioware nous a bien mis gentiment a la fin des dialogues, par defaut?
A la fin de chaque dialogue, il y a un ClearAllAction()
*je le dis pas contre toi, demon, je le surligne paske c'est un pb recurrent qu'on oublie tt le temps ^^*
/me se le grave au fer rouge sur la peau, histoire de pas l'oublier la prochaine fois :monstre:
Par daemogorgon le 24/1/2003 à 11:54:23 (#3090358)
Par contre, il est où ce ClearAllActions() à faire sauter ?
Par eMRaistlin le 24/1/2003 à 12:27:18 (#3090597)
Par daemogorgon le 24/1/2003 à 12:43:58 (#3090695)
C'est ça ?
parcequ'il n'y a pas de ClearAllActions dedans !
Par eMRaistlin le 24/1/2003 à 12:57:34 (#3090793)
Personnelement, je fais des delaycommand dnas mes dialogues, pour l'eviter...
Je sais que le ClearAllActions de Bioware est prevu suite aux demandes des joueurs pour qu'un pnj reprenne le walkwaypoint apres un dialogue.
Je suppose donc que oui, cela vient du "nw_wlk_wp" (ou walk_waypoint, comme tu l'aura deviné ^^)
Essaye sinon, de mettre des delay command plus important, dans ton case1
(essaye avec 10sec, puis reduit, au fur et a mesure...)
Par daemogorgon le 24/1/2003 à 17:27:01 (#3092575)
A première vue (ainsi qu'à seconde vue !) , la première fois que le PJ rentre dans le trigger, le script est lancé deux fois, mais je ne vois pas par quoi :confus:
Donc, la variable d'état me donne chaque fois le contraire de l'existant.
Est ce que qq1 à 1 idée pourquoi le script il est lancé deux fois... avant que je le lance, moi, à la poubelle....
Par eMRaistlin le 24/1/2003 à 17:49:45 (#3092750)
Sinon, pour repondre a ta question, je vais retenter ca :Dans le case 0, tu met nPNJ = 1, et dans le case 1, tu nPNJ = 0
pour moi, il execute Case 0, met la variable a 1, et donc effectue le case 1. (et remet donc NPJ a 0)
essaye :
Soit de refaire un GetNearestObject(oObject,nNth) au debut du Case1, ou bien essaye de changer la variable du nPnj en fin de script seulement.
PS : met des AssignCommand(oPnj,SpeakString("yo !")); dans les 2 case, pour voir quiquic'est qui fé quoi....
JOL Archives 1.0.1
@ JOL / JeuxOnLine