Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Question pour un Timer au cours d'une quete
Question pour un Timer au cours d'une quete
Par Aspion le 5/11/2002 à 17:50:59 (#2487853)
- Le joueur accepte la quete -> Timer de 60 minutes sur le NPC
- Un autre joueur veut parler de la quete au NPC -> phrase non visible dans le dialogue si les 60 minutes ne sont pas terminees
J'ai rien trouvé sur les autres posts , qq1 pourrait-il me dire comment faire ? :aide:
2 eme petite chose , je voudrais que le joueur termine la quete dans les 60 min , sinon il doit la recommencer .
Merci d'avance :)
Par Frolo Xeres le 5/11/2002 à 18:10:58 (#2488079)
Bon 60 minutes de jeu ?
-> Une heure sur le PC je veux dire ?
Alors voilà ce que je te propose :
-> Quand le premier PC accepte la quête tu met un marqueur sur le PNJ.
Par exemple un entier : qui a comme valeur : GetTimeHour()
Résultat quand, un nouveau PC arrive hop tu vérifie si l'heure est passée (avec GetTimeHour() ). Bon si çà ce passe sur plusieurs jours tu peux rajouter des tests sur GetCalandarDay() et GetCalandarMonth().
Si le test echoue tu propose la quete et tu réinitialise les variables.
Bon si tu me laisse quelques minutes je te sort le script !
Par Aspion le 5/11/2002 à 18:20:30 (#2488190)
C'est super cool si tu peux me faire un petit script , car j'avais bien eu l'idee , mais je debute donc je galere un petit peu des fois ;)
Un petit script
Par Frolo Xeres le 5/11/2002 à 18:43:41 (#2488448)
// Si c'est pas çà t'as qu'a changer les coef multiplicateur.
// Quand le PJ a accepte la quete
void main() {
SetLocalInt( OBJECT_SELF, "iMinut", GetTimeMinute() );
SetLocalInt( OBJECT_SELF, "iHour", GetTimeHour() );
SetLocalInt( OBJECT_SELF, "iJour", GetCalendarDay() );
SetLocalInt( OBJECT_SELF, "iMois", GetCalendarMonth() );
SetLocalInt( OBJECT_SELF, "iAnnee", GetCalendarYear() );
}
// Dans la condition d'apparition de quete dans le discours
int StartingConditional() {
object oPNJ = GetObjectByTag( "Tag_de_ton_PNJ" );
float fAncien = IntToFloat( GetLocalInt( oPNJ, "iAnnee" ) ) * 13547520.0f
+ IntToFloat( GetLocalInt( oPNJ, "iMois" ) ) * 40320.0f
+ IntToFloat( GetLocalInt( oPNJ, "iJour" ) ) * 1440.0f
+ IntToFloat( GetLocalInt( oPNJ, "iHour" ) ) * 60.0f
+ IntToFloat( GetLocalInt( oPNJ, "iMinut" ) );
float fNouveau = IntToFloat( GetCalendarYear() ) * 13547520.0f
+ IntToFloat( GetCalendarMonth() ) * 40320.0f
+ IntToFloat( GetCalendarDay() ) * 1440.0f
+ IntToFloat( GetTimeHour() ) * 60.0f
+ IntToFloat( GetTimeMinute() );
return fNouveau > fAncien + 60.0f;
// Renvoi FAUX si l'heure n'est pas encore passee !
}
Par Aspion le 5/11/2002 à 19:48:12 (#2489156)
Je vais tester tout ca !
Par Jedaï le 5/11/2002 à 20:38:46 (#2489714)
à mettre sur le Action Taken de la phrase du NPC qui donne la quête:
void main()
{
object o = OBJECT_SELF;
object oPlaceable = GetObjectByTag("Unplaceablequelconque");
SetLocalInt(o, "nQueteChrono", TRUE);
AssignCommand(oPlaceable,DelayCommand(HoursToSeconds(1), DeleteLocalInt(o, "nQueteChrono")));
}
et sur le When...
int StartingConditional()
{
object o = OBJECT_SELF;
return !GetLocalInt(o, "nQueteChrono");
}
Si je fais un AssignCommand() sur un placeable c'est pour éviter qu'un ClearAllActions() ne perturbe le DelayCommand().
Par Aspion le 5/11/2002 à 21:03:58 (#2489973)
Imaginons que le NPC disent au joueur qu'il doit attendre encore x Minutes avant de revenir le voir car la quete est en cours avec un autre joueur :D
C'est facile a faire ?
Des fois je me dis que je suis a peine jamais content :ange:
Par Jedaï le 5/11/2002 à 21:21:30 (#2490145)
ActionTaken :
void main()
{
object o = OBJECT_SELF;
object oPlaceable = GetObjectByTag("Unplaceablequelconque");
int n,nSeconds;
nSeconds = FloatToInt(HoursToSeconds(1));
SetLocalInt(o, "nQueteChrono", TRUE);
AssignCommand(oPlaceable,DelayCommand(IntToFloat(nSeconds), DeleteLocalInt(o, "nQueteChrono")));
for(n = 0;n <= nSeconds;n+=10)
{
AssignCommand(oPlaceable,DelayCommand(IntToFloat(n), SetCustomToken(666, IntToString(nSeconds - n))));
}
}
Le when ne change pas, sauf que maintenant, l'autre branche du dialogue ressemblera à ça : "Désolé, un peu de patience, plus que secondes à patienter avant de connaître le résultat de votre prédécesseur !"
Par eMRaistlin le 5/11/2002 à 21:33:07 (#2490293)
Par Frolo Xeres le 6/11/2002 à 11:33:01 (#2493752)
Ben là je vois que mes détracteurs était loin de la vérité...
Si j'ai une nouvelle usine à gaz à proposer, je la passerais d'abord au compresseur, promis !
Par Aspion le 6/11/2002 à 17:33:59 (#2497457)
Ni l'un ni l'autre ne marche :(
Help me please :sanglote:
Par Jedaï le 6/11/2002 à 19:51:19 (#2498880)
Le Action Taken de la phrase où tu donne la quête pour :
void main()
{
object o = OBJECT_SELF;
//remplacer "Unplaceablequelconque" par le tag d'une armoire ou d'un coffre...
//qui ne risque pas d'être détruit(à la limite un objet invisible)
object oPlaceable = GetObjectByTag("Unplaceablequelconque");
int n,nSeconds;
nSeconds = FloatToInt(HoursToSeconds(1));
SetLocalInt(o, "nQueteChrono", TRUE);
AssignCommand(oPlaceable,DelayCommand(IntToFloat(nSeconds), DeleteLocalInt(o, "nQueteChrono")));
for(n = 0;n <= nSeconds;n+=10)
{
AssignCommand(oPlaceable,DelayCommand(IntToFloat(n), SetCustomToken(666, IntToString(nSeconds - n))));
}
}
Et le AppearWhen... de cette même phrase pour :
int StartingConditional()
{
object o = OBJECT_SELF;
return !GetLocalInt(o, "nQueteChrono");
}
Tu met une alternative à cette phrase qui ressemble à : "Désolé, un peu de patience, plus que secondes à patienter avant de connaître le résultat de votre prédécesseur !"
Par Jedaï le 6/11/2002 à 19:52:51 (#2498888)
Ca marche !!!!!!
Par Aspion le 6/11/2002 à 20:34:42 (#2499310)
J'avais un pb avec mon tag du placeable que j'avais modifie , mais pas mis a jour pour l'objet qui etait déja en place :D
Juste une petite chose :
Je modifie quoi pour modifier le temps que je veux mettre ?
c'est le 1 que je modifie de cette ligne ?nSeconds = FloatToInt(HoursToSeconds(1));
Si oui , le 1 correspond a 1 heure du jeu , c'est ca ?
Encore Merci pour ce petit coups de main , qui va servir a toutes mes quetes ou presque :amour:
Par Jedaï le 6/11/2002 à 22:51:51 (#2500552)
L'avantage de HoursToSeconds() c'est qu'elle prend en compte les paramètres temporels du module.
Encore moi
Par Aspion le 7/11/2002 à 17:49:40 (#2506329)
Si je veux reprendre ce timer sur un autre perso , je dois faire comment ? :aide:
Merci a l'avance ;)
Par Aspion le 7/11/2002 à 19:31:38 (#2507226)
C'est possible au moin ? :D
Ca me terminerais completement ma quete , alors j'espere :p
Par Jedaï le 7/11/2002 à 21:10:47 (#2508223)
Voila , en fait j'ai remarque que le script de condition , marche que sur le perso qui a lance le timer .
Logiquement, vu que le LocalInt est stocké sur le NPC, le script doit donner la même réponse à tous, mais c'est surement pas ça que tu voulais dire ?
Sinon, une petite amélioration :
void main()
{
object o = OBJECT_SELF;
//remplacer "Unplaceablequelconque" par le tag d'une armoire ou d'un coffre...
//qui ne risque pas d'être détruit(à la limite un objet invisible)
object oPlaceable = GetObjectByTag("Unplaceablequelconque");
int n,nSeconds;
nSeconds = FloatToInt(HoursToSeconds(1));
object oPC = GetPCSpeaker();
SetLocalObject(o, "nQueteChrono_PC", oPC);
AssignCommand(oPlaceable,DelayCommand(IntToFloat(nSeconds), DeleteLocalObject(o, "nQueteChrono_PC")));
for(n = 0;n <= nSeconds;n+=10)
{
AssignCommand(oPlaceable,DelayCommand(IntToFloat(n), SetCustomToken(666, IntToString(nSeconds - n))));
}
}
int StartingConditional()
{
object o = OBJECT_SELF;
return !GetIsObjectValid(GetLocalObject(o, "nQueteChrono_PC"));
}
Ca fait presque la même chose mais maintenant il est facile de faire apparaître une branche de dialogue spéciale pour le PC qui est en train de faire la quête, avec ce script dans le Appear When...:
int StartingConditional()
{
object o = OBJECT_SELF;
return GetPCSpeaker() == (GetLocalObject(o, "nQueteChrono_PC"));
}
Tu voulais bien qu'un seul PC puisse tenter la quête à un instant donné ?:confus:
Par Aspion le 7/11/2002 à 21:15:06 (#2508261)
Je pense a trop de choses a la fois et voila , on dit des c**neries :rolleyes:
Et encore merci , car tu as repondu a ma question en fait ;)
Merci Merci Merci :merci: :merci: :merci:
Par Aspion le 7/11/2002 à 23:39:56 (#2509361)
Bon je vais essayer de m'expliquer clairement
il y a 2 NPC dans la quete
Le premier est celui a qui on demande la quete : Si qq1 fait deja la quete , il dit de revenir plus tard (le premier script que j'ai demande et qui marche super bien :)
Le 2 eme NPC est celui qu'on doit voir avant que l'heure soit ecoulée , et je voudrait en fait me servir du meme timer que pour le premier NPC
I - Je demande la quete a NPC1 et j'accepte ==> Personne ne peux demander la quete avant une heure
II - Je suis le joueur qui fait la quete , j'ai une heure pour voir le PNC2 ==> J'arrive trop tard , le NPC dit de refaire a 0 la quete , je remet ma variable quete a 0 pour que le PC puisse redemander la quete (si personne a demande la quete entre temps cf.I )
Merci si qq1 peut me donner la solution :)
J'espere avoir ete claire :D
Merci d'avance
Par Jedaï le 8/11/2002 à 7:59:07 (#2510527)
Pour que le NPC2 reconnaisse le PC qui est en train de faire la quête, le troisième script avec une légère modification peut aller :
int StartingConditional()
{
object o = GetObjectByTag("Le_Tag_Du_NPC1");
return GetPCSpeaker() == (GetLocalObject(o, "nQueteChrono_PC"));
}
Ce script dans le Appear when... de la phrase où il félicite le PC d'avoir réussi la quête.
Comme phrase alternative (en-dessous) un truc du style : "Désolé, retournez voir le NPC1"
Par Aspion le 8/11/2002 à 13:33:47 (#2512581)
:merci: :merci: :merci: ...:merci:
JOL Archives 1.0.1
@ JOL / JeuxOnLine