Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Question pour un Timer au cours d'une quete

Par Aspion le 5/11/2002 à 17:50:59 (#2487853)

Voila , mon idee est de faire une quete , qu'un seul joueur peut faire a la fois .:eureka:

- 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)

Alors là je crois que j'ai un truc tout simple !

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)

J'avais bien pense a cette solution , mais si un joueur commence la quete a 3h59 (par exemple) , a 4h01 le 2eme PC va pouvoir faire la quete non ?

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)

// Bon a ce que je sais, 28 jour par mois et 336 jours par an dans NWN !
// 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 te remercie :)
Je vais tester tout ca !

Par Jedaï le 5/11/2002 à 20:38:46 (#2489714)

Blup, blup, blup... tu sais Frolo Xeres, y a plus simple hein...

à 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)

Merci a tous les 2 , mais j'ai une petite question :rolleyes:

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)

Bon, d'abord je te signale que par défaut ces scripts ne laisse que 2 minutes au joueur pour accomplir sa quête. Pour ta nouvelle question, c'est faisable, plus facile avec celui de Frolo, néanmoins en supposant de garder ma logique et si tu accepte d'avoir une réponse à dix secondes près (déjà faut le temps qu'il réponde :D ), ça donne ça :

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)

Une belle solution elegante ^^

Par Frolo Xeres le 6/11/2002 à 11:33:01 (#2493752)

M'a toujours dit que je codais trop complexe !
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)

Je suis désolé de vous dire ca , mais soit je suis nul , ou alors il y a un probleme avec les 2 scripts !
Ni l'un ni l'autre ne marche :(
Help me please :sanglote:

Par Jedaï le 6/11/2002 à 19:51:19 (#2498880)

C'est curieux, tu les mets aux bons endroit ?
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)

Et tu met cette alternative en-dessous (dans l'éditeur de conversation) de ta première phrase ?

Ca marche !!!!!!

Par Aspion le 6/11/2002 à 20:34:42 (#2499310)

La betise venait de moi :rolleyes:
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)

Effectivement, HoursToSeconds(n) donne le nombre réel de secondes que dure n heures de jeu. Si je l'ai utilisé c'est parce que tu avais demandé pour 1 heure mais on peut mettre n'importe quel nombre entier de seconde.
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)

Voila , en fait j'ai remarque que le script de condition , marche que sur le perso qui a lance le timer .
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)

J'ai oublie de demander :

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)

Moi pas comprendre :confus:


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)

:D Desolé , mais je voulais dire NPC au lieu de perso :D
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)

En fait ca marche pas comme je voulais :

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)

Alors, le 1 est déjà fait, c'est les deux premiers scripts.

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)

Je te remercie 1000 fois :)

:merci: :merci: :merci: ...:merci:

JOL Archives 1.0.1
@ JOL / JeuxOnLine