[Résolu] Recherche script PNJ faisant face et saluant selon PJ

Répondre
Partager Rechercher
je ne t'en veux pas Ariok, mais je te battrai bien à mort, sans animosité aucune

j'rigole
regarde mon script, il fonctionne très bien. En effet je ne perçois qu'un homme ou qu'un femme à chaque fois. J'enregistre le nombre total de nouveaux joueurs perçus.
pendant les 6 secondes, je comptabilise tout ce qu'il a perçu et ce n'est qu'ensuite que je fais le décompte

Code PHP:

if ((GetGender (oPC) == GENDER_MALE) )) 
    {
     
iHommeSave ++;
     
SetLocalInt (OBJECT_SELF"homme",iHommeSave );
     } 
Citation :
Publié par KorTeX
je ne t'en veux pas Ariok, mais je te battrai bien à mort, sans animosité aucune

j'rigole
regarde mon script, il fonctionne très bien. En effet je ne perçois qu'un homme ou qu'un femme à chaque fois. J'enregistre le nombre total de nouveaux joueurs perçus et au bout de 6 secondes seulement, je fais le décompte
Oui, mais avec le shape, tu peux faire le decompte immediatement, car il se passe quoi si le PJ entre dans le onperceived et en sort au bout de 4 secondes ?

Le PJ va dire bonjour au PJ qui est deja partit

[reedit] j allais dire une connerie


Et l'idée sur les scripts ( a proposer ) tu en penses quoi ?
Tu as raison de soulever le problème..
Bien sûr si l'on veut rajouter des contrôles on peut, mais cela n'a pas été demandé. On peut rajouter un contrôle avant de dire quoique ce soit, du coup la fonction pourrait être comme cela

Code PHP:

void MoiDireBonjour (object oPNJ)
{
string Message
int iHomme GetLocalInt (oPNJ"homme");
int iFemme GetLocalInt (oPNJ"femme");
 
// que des hommes sont perçus
if ((iHomme 0)&&(iFemme == 0))
     {
     
// il n'y a qu'un joueur
     
if (iHomme == 1Message "Ayo mon ptit gars ! ça farte ?"
     
// un groupe d'hommes
     
else Message "Salut les gars ! Vous v'lez d'là binouze ? (NDLR : l'abus d'alcool est dangeruex pour la santé, à consommer avec modération et parcimonie, deux voisines super sympas) "
     
AssignCommand (oPNJPlayAnimation (ANIMATION_FIREFORGET_SALUTE)); 
     }
 
// que des femmes sont perçues
if ((iFemme 0)&&(iHomme == 0))
     {
     
// une seule femme
     
if (iFemme == 1Message "Hey Germaine, Comment qu'ça va t'y bien ma poule ?!"
     
// plusieurs femmes sont perçues
     
else Message "Sapristi de vindiou des couin'ri ! En v'là d'la donzelle toute fraîche !..... ah non final'ment pas si fraîche";
     
AssignCommand (oPNJPlayAnimation (ANIMATION_FIREFORGET_BOW)); 
     }
// un groupe composé d'homme(s) et de femme(s)
if ((iFemme 0)&&(iHomme 0))
     {
     
// une seule femme et plusieurs hommes
     
if (iFemme == 1Message "Aloua ! En v'là d'l'escorte pour la poulette !";
 
     
// un homme et plusieurs femmes
     
else if (iHomme == 1Message "Adiou mon ptit ! t'as app'lé tes copines en renfort ?";
     
// plusieurs hommes et plusieurs femmes
     
else Message "Bien le b'jour M'sieurs Dames ! *hips* (NDLR : l'abus d'alcool est toujours dangereux pour la santé, sauf pour les condamnés à mort dans les citadelles drows)";
     
AssignCommand (oPNJPlayAnimation (ANIMATION_FIREFORGET_BOW)); 
     }
 
// on prend le joueur le plus proche
object oPCControl GetNearestCreature (CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PCoPNJ);
// le PNJ lance sa phrase s'il perçoit un joueur
if (GetObjectSeen (oPCControl oPNJ)) FloatingTextStringOnCreature(MessageoPNJ); 
 
// on réinitialise les compteurs à 0
// on peut utiliser DeleteLocalInt pour libérer 48 octets de mémoire mais à ce
// stade ce n'est plus du paufinage.. c'est du masochisme maniaco impulsif
SetLocalInt (oPNJ"VaDireBonjour"FALSE);
SetLocalInt (OBJECT_SELF"homme",0);
SetLocalInt (OBJECT_SELF"femme"0);

et on change le temps à 3.0 secondes dans le delaycommand, ce qui empêcherait le joueur de faire demi tour trop rapidement..
la fonction principale serait donc

Code PHP:

void main() 

object oPC GetLastPerceived();
int iVar GetLocalInt (oPC"bonjour");
 
// KorTeX : je le placerais ici car même si j'ai déjà dis bonjour à quelqu'un le matin, 
// quand il se pointe vers moi je me retourne.. enfin ça dépend qui aussi :D
if (GetIsPC (oPC)) SetFacingPoint(GetPosition(oPC));
 
// si le PNJ entend quelque chose, il va se retourner, mais s'il ne voit rien, 
// il ne va rien faire
if (!GetLastPerceptionSeen()) return;
 
 
// test pour verifier que la creature perçue est bien un joueur et
// vérifier que la variable a deja ete enregistrée si c est le cas, le npc ne fait rien
if ( (!GetIsPC(oPC)) || (iVar)) return;
 
int iHommeSave GetLocalInt (OBJECT_SELF"homme");
int iFemmeSave GetLocalInt (OBJECT_SELF"femme");
 
if ((
GetGender (oPC) == GENDER_MALE) )) 
    {
     
iHommeSave ++;
     
SetLocalInt (OBJECT_SELF"homme",iHommeSave );
     } 
// on part du postulat que le joueur est soit un homme, soit une femme
// et que les hermaphrodites, les indécis, les scalpés et gros démons baveux 
// sont interdits de connexion au serveur.. 
// c'est pas bien la discrimination mais la vie est rude dans les Contrées de Faërun
// sinon on devrait mettre ((GetGender (oPC) == GENDER_FEMALE) )) 
else 
    {     
    
iFemmeSave ++
    
SetLocalInt (OBJECT_SELF"femme"iFemmeSave );
    } 
 
 
// KorTeX : on sauvegarde une variable afin que le PNJ ne répète pas la fonction 
// à chaque fois mais toutes les 6.0 secondes... on peut le modifier 
// afin de réduire ce temps, mais un round me paraissait bien
int iVaDireBonjour GetLocalInt (OBJECT_SELF"VaDireBonjour");
if (
iVaDireBonjour == FALSE
     {
     
SetLocalInt (OBJECT_SELF"VaDireBonjour"TRUE);
     
DelayCommand (4.0MoiDireBonjour (OBJECT_SELF));
     }
 
// mettre OBJECT_SELF pour appeler la créature qui a lancé le script
SetLocalInt (oPC"bonjour"TRUE);



Après je ne pense pas qu'il y ait de bon ou mauvais script pour ce genre de choses, chacun a ses particularités et se défaults.

Pour le tiens par exemple, on pourrait lui reprocher de ne pas tenir compte d'un distance assez grande (quand je suis un autre joueur, je ne suis que très rarement collé à lui).
On pourrait juste contrôler les membres d'un même groupe

Code PHP:

oPC GetFirstFactionMember (oPC);
while (
oPC != OBJECT_INVALID)
     {
     
// blabla
     
oPC GetNextFactionMember (oPC);
     } 
Mais dans ce cas, si deux groupes se suivent de très près, ou bien si des joueurs marchent ensemble sans faire partie du même groupe, ça pourrait donner des trucs bizarres

Si l'on mets 3-4 secondes d'attente en reprenant mon script, cela permet aux autres joueurs d'arriver, et cela rend un peu plus réaliste aussi l'arrivée : le PNJ examine les joueurs avant de parler. mais on est toujours soumis au fait qu'un moine Speedy Gonzalez Transgénique face un aller retour..

Bref tout ça pour dire que chaque script est la vision de son auteur, et qu'il n'y en a aucun de parfait.


...
et hop transition pour le deuxième sujet (la grande classe à l'américaine)
...

Je suis contre l'idée de la banque de scripts.

Tout d'abord, l'avantage du script et de confronter différentes idées. D'un problème simple comme celui ci, nous sommes arrivés à voir pas mal de petites choses, et c'est justement car notre manière de scripter est différente que la confrontation d'idées est interessante.

Ensuite, faire une banque de scripts, même si c'est utile, n'est pas le but de ce forum : ici j'ose croire que l'on s'entraide pour scripter, pas que l'on nourri les autres en leur fournissant des scripts tout prêts. C'est par la suite ces mêmes personnes qui auront compris et qui utiliseront le script qui pourront nous donner des idées ou nous montrer des choses. Je préfère voir 10 personnes faire tourner ce forum et de qualité que 130 postant des messages "cherche script j'ai rien fais et je ne veux pas savoir faire".

Enfin, les scripts vraiments importants sont postés ici pour en faire profitter tout le monde mais je pense que c'est parce que nous sommes libres de le faire ou non que les scripts postés en sont meilleurs . S'il y a ne serait qu'incitation, le minimum sera fait, ni plus ni moins ; la réglementation limite les excés en toute sorte . En outre le forum de nwn 1 est vraiment une source sans fin d'idée

Voili voilou, je conseille à tout le monde d'aller faire un tour sur les dizaines de pages du forum maskado de JeuxOnLine il y a des posts vraiment intéressants pour apprendre à scripter dont les 6 posts dont le nom ainsi que celui de leur auteur m'échappent... ("apprendre à scripter pour les quiches" ou un truc comme ça)
https://forums.jeuxonline.info/showthread.php?t=239299
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Je te rejoint sur les scripts : Mon but n etait pas de demontrer que le mien est meilleur loin de la, mais j aimais bien l idée de debattre sur un probleme qui peux amener plusieurs solutions

Pour la banque de scripts, je ne voyais pas ca dans le but d une banque de scripts tout fait, mais de mettre des scripts marrant, genre ton donjon aleatoire, genre mon replicateur et enventuellement de les ameliorer.



( ca me fait penser qu il faut que je me penche sur ton systeme aleatoire )
Un p'tit persistant avec tous les liens cités récemment ce serait cool aussi, et là je parle pour celles et ceux qui comme moi ont passé 10 plombes à déloger ce type d'information

Voici ceux que j'ai conservé à titre personnel et que je trouve très enrichissants :

Maskado (tutoriaux scripts NWN1) Merci KorTeX
Liste des Scripts génériques de conversation Merci Anthraxcite
Lexicon NwnScripting Merci KorTeX
Re,

J'essaye de comprendre tout ce que vous avez écrit, et plutôt que de copier-coller vos scripts, j'en prends des bouts, étape par étape et j'essaye de changer le déroulement de la détection et des animations du PNJ.

Je me suis dit que le PNJ allait détecter l'approche d'un PJ, lui coller une variable d'entrée de jeu (destinée à ne plus reproduire l'action si le PJ repasse), identifier si mâle ou femelle et en fonction de ça, lui faire face, le saluer de différentes manières et lui balancer un message d'accueil.

Code PHP:

 void main()
{
string Message
object oPC GetLastPerceived();
int iVar GetLocalInt (oPC"dejavu"); // Ici je veux poser la variable sur le PJ
 
if ((iVar == FALSE) && (GetGender (oPC) == GENDER_MALE) && (GetIsPC (oPC))) // là je vérifie si le PJ a déjà été croisé, et si de sexe masculin je salue puis adresse un message
    
{
    
PlayAnimation (ANIMATION_FIREFORGET_SALUTE);
    
Message "Salutations Messire " GetName (oPC) +", Almur à vos ordres.";
    }
else 
// si pas de sexe masculin, autre salut, autre message
    
{
    
PlayAnimation (ANIMATION_FIREFORGET_BOW);
    
Message "Salutations Madame " GetName (oPC) +", Almur à vos ordres.";
    }
     
SetFacingPoint(GetPosition(oPC)); // là je fais face au PJ
     
FloatingTextStringOnCreature(MessageoPC); // là je colle message sur le PJ et non pas le PNJ
     
SetLocalInt (oPC"dejavu"TRUE); // ici... ce serait pour annuler toute action si PJ déjà croisé 

Mais j'ai plusieurs soucis de rendu (vous devez déjà l'avoir compris, moi hélas pas encore).
. Le texte envoyé est doublé Mâle + Femelle en même temps.
. La non répétition n'agit pas et le PNJ me salue et me parle dès qu'il me voie.
. Le facing marche et l'animation du salute aussi (c'est déjà ça) sinon.

Et quand je remplace le oPC par OBJECT_SELF pour que le message flotte sur le PNJ et non le PJ, y a pas de texte.

Vala, vala...
Citation :
Publié par Eduen
Mais j'ai plusieurs soucis de rendu (vous devez déjà l'avoir compris, moi hélas pas encore).
. Le texte envoyé est doublé Mâle + Femelle en même temps.
1. en fait on a oublié de te le dire
le onperceived se lance dès que le PNJ voit une créature, et aussi quand il l'entend... du coup il se lance souvent 2 fois d'affilées
donc la première fois, s'il t'entend, il te parle comme un homme et ensuite, comme il te voit, il te parle comme pour une femme car ta variable est sur TRUE (voir n°2)

Citation :
Publié par Eduen
. La non répétition n'agit pas et le PNJ me salue et me parle dès qu'il me voie.
2. Y'a un soucis dans tes conditions :

la première : il faut que la créature n'ait pas déjà été vue ET qu'elle soit masculine ET qu'elle soit un PJ
la deuxième : tout le reste donc si la créature est une femme OU si la créature est un PNJ, OU s la créature a déjà été vue..

c'est pour cela que l'on exclue les 2 première conditions dès le début dans notre script, comme cela le test n'est effectué qu'un minimum de fois afin d'optimiser la mémoire

Code PHP:

if ((!GetIsPC (oPC))||(iVar)) return;
// si oPC n'est pas un joueur (le ! devant la condition est égale à "== FALSE" OU
// (le "||" au milieu) si iVar == TRUE (en fait pas besoin de mettre "== TRUE", car
// iVar est un integer qui aura pour valeur 0 (FALSE) ou 1 (TRUE), du coup à elle
// seule cette variable est une condition.. mais pour faciliter 
// la lecture tu peux mettre
// (GetIsPC(oPC)) == FALSE||(iVar == FALSE)) 

Citation :
Publié par Eduen
. Le facing marche et l'animation du salute aussi (c'est déjà ça) sinon.

Et quand je remplace le oPC par OBJECT_SELF pour que le message flotte sur le PNJ et non le PJ, y a pas de texte.
3. moi j'utilise ActionSpeakString plutôt je trouve plus simple
c'est dû à la faction de ton PNJ (dernière variable de la fonction)
Citation :
bBroadcastToFaction: If this is TRUE then only creatures in the same faction as oCreatureToFloatAbove will see the floaty text, and only if they are within range (30 metres).

Les PJs n'étant pas de la même faction que le PNJ, ils ne perçoivent rien sauf si cette variable est à FALSE

Code PHP:

      FloatingTextStringOnCreature(MessageOBJECT_SELFFALSE); 


[Edit] je t'ai répondu en essayant de comprendre quelque chose aux interfaces personnalisés et j'ai modifié une coquille concernant la condition iVar ... bien sûr Ivar doit être FALSE pour que le PNJ fasse quoique ce soit
Eduen il a une autre question.

Je modifie le texte cité par le PNJ dans mon script, je compile, puis j'enregistre mon répertoire. Et malgré tout, mon PNJ continue de dire les anciennes paroles.

J'ai tout fermé, Toolset et jeu, puis relancé. J'ai renommé le script, vérifié que le PNJ a bien son script d'attaché, etc. etc. et pourtant, c'est comme si il prenait en compte une ancienne version du script...

Hier je procédé de même et je voyais mes modifs à chaque fois que je relançais le module. Comment le PNJ peut-il garder un texte qui n'existe plus ?

*part se pendre*
regarde dans ton répertoire, le script est un fichier .NSS du même nom.
Tu peux l'ouvrir avec le bloc-note

dans le pire des cas, tu copies, tu l'effaces et tu recolle le code


(c'est la magie d'Electron )
Déjà fait, le .NSS est ok, il contient le bon texte. J'ai un .NCS aussi, on sait à quoi il correspond lui ?

Et donc, mon script.NSS est bon, mais le jeu, en chargeant le module, semble charger une ancienne version... c'est pas possible pourtant hein...

Je continue à chercher.



Prépare toi à lutter.. Enlève tes habits, et fait un feu avec au centre de la pièce.
Scarifie toi le torse avec une lame de rasoir et danse autour du brasier tout en fredonnant des chants esothériques.

et enregistre le jeu sur un .mod





je sais pas mais ça peut peut être jouer


KorTeX : Maître SAV, bâton magique spécial vaudou force +4, potions anti stress et 3 eme oeil de goule dans le dos
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
J'ai lu en plusieurs endroits (forums FR et US) que le .mod c'était pas top et risqué comparé au travail dans un répertoire.

Et puis, .mod ou répertoire, rien ne pourrait justifier ça. Je dois foirer un truc basique mais pour le moment je ne vois pas quoi.

Mais t'es gentil de vouloir m'aider
de toute façon un jour tu seras obligé de l'enregistrer en .mod, car je ne pense pas que le serveur puisse lancer des répertoires


et pi ce n'est que pour voir si le problème est résolu comme ça
J'ai trouvé la cause de mon souci de texte. Dans le répertoire du module, avec le .NSS il y a donc aussi un .NCS. Ce fichier semble contenir le String Message (pas certain qu'il contienne que ça, en l'ouvrant avec notepad il y a beaucoup de déchets) et on y retrouve le texte.

Bizarrement, la mise à jour du .NSS ne suffisait pas à up le .NCS qui gardait un vieux texte. Je l'ai effacé, puis re compilé le script, ça a créé un nouveau .NCS avec le bon texte.

Vala
Re

A partir de tout ce que vous m'avez expliqué, j'ai écrit le script suivant :
Code PHP:

void main()
{
    
/* on déclare la variable texte Message */
    
string Message;
    
/* on récupère la dernière créature perçue dans une variable */
    
object oPC GetLastPerceived();
    
/* on prévoit de quoi marquer le PJ comme déjà salué */
    
int iVar GetLocalInt (oPC"dejavu");
    
/* est-ce que la créature perçue par le PNJ est un PJ ? A-t-elle déjà été salué ? */
    
if ((GetIsPC (oPC)) && (iVar == FALSE))
    {
    
/* oui c'est un PJ et jamais salué, le PNJ se tourne face à elle */
    
SetFacingPoint(GetPosition(oPC));
        
/* est-ce que le pj est un homme ? */
        
if (GetGender (oPC) == GENDER_MALE)
        {
             
/* le pj est un homme */
             /* animation salutation */
             
PlayAnimation (ANIMATION_FIREFORGET_SALUTE);
             
/* on stocke le message dans la variable Message */
             
Message "Salut truc, ça va ?";
        }
        else
        {
             
/* sinon, le pj est une femme */
             
PlayAnimation (ANIMATION_FIREFORGET_BOW);
             
/* on stocke le message dans la variable Message */
             
Message "Salut ma poule, ça roule ?";
        }
     
FloatingTextStringOnCreature(MessageoPC); 
     
/* on marque le PJ comme déja vu */
     
SetLocalInt (oPC"dejavu"TRUE);
    } 
 } 
La bonne nouvelle, c'est qu'à ce stade, il fonctionne et rend ce que j'attends de lui, ce qui est plus simple que ce que vous aviez obtenu, mais correspond à ma recherche.

1. Le PJ détecte l'approche, vérifie s'il s'agit d'un PJ et s'il l'a déjà vu.
2. Si c'est un homme il envoie une anim + un texte (sur le PJ) si c'est une femme, on varie anim et texte.
3. Le PNJ marque le PJ comme déjà vu.

Suite à cette grande réussite (ben oui, quand même ^^) j'ai décidé de rajouter deux choses.

. Vérification du niveau du PJ en même temps que les vérifications du point 1.

J'ai donc tenté ça :
Code PHP:

 if ((GetIsPC (oPC)) && (iVar == FALSE) && (GetHitDice(oPC) < 15)) return; 

Là, si le PJ est < au niveau 15, le PNJ l'ignore. Par contre, s'il est niveau 15 ou > le PNJ s'adresse à lui. Mais le souci c'est qu'il ne semble plus le marquer comme déjà vu et donc lui reparle etc.

Et je vois pas la relation qui pourrait justifier cette absence de marquage.

Et mon dernier point, que je n'arrive pas à amorcer, c'est comment ficeler l'affaire pour placer quelque chose qui doit ressembler à ça :
Code PHP:

DelayCommand (2.0); 

pour que le PNJ ne lance pas son animation (je parle pas de détection là, il a détecté, il parle mais il ne s'anime pas avant 2 secondes).

Vala, Merci.
Globalement, beaucoup de choses se sont éclairées dans mon esprit.
Je vois que ton texte apparaît sur le joueur par contre... tu devrais mettre ça
Code PHP:

FloatingTextStringOnCreature(MessageOBJECT_SELF ,FALSE); 




quand tu inscrit return cela arrête le script
donc il faudrait que tu rajoutes une ligne juste en dessous de tes vérifications

Code PHP:

 (...) 
if ((
GetIsPC (oPC)) && (iVar == FALSE)) 
    {
    if (
GetHitDice (oPC) < 15) return;
    (...) 
ensuite pour le DelayCommand (fdelay, Voidcommand)
précision il ne fonctionne que pour les fonctions void de type action (dans la liste d'action d'une créature) (donc pas pour les CreateObject et autre qui sont des fonctions object

Tu as 2 choix.

1. Soit rajouter des delay devant toutes tes fonctions

exemple
Code PHP:

if (GetGender (oPC) == GENDER_MALE
        { 
        
DelayCommand (2.0ActionPlayAnimation (ANIMATION_FIREFORGET_SALUTE)); 
        
Message "Salut truc, ça va ?"
        } 
        else 
        { 
        
DelayCommand (2.0ActionPlayAnimation    (ANIMATION_FIREFORGET_BOW)); 
        
Message "Salut ma poule, ça roule ?"
        } 
     
DelayCommand (2.1fActionSpeakString(Message)); 


2. rajouter une fonction qui va tout faire avant ta fonction principale (void main() )

Dans ce cas tu limites le nombres d'instructions en attente et donc la charge... bon ça casse pas des briques mais c'est pour te montrer un peu les principes de l'optimisation que j'ai pu apprendre

Code PHP:

// à rajouter tout en haut du script
void DoSalute (object oCreatureint iAnimstring sMessage);

AssignCommand (oCreaturePlayAnimation (iAnim));
AssignCommand (oCreatureSpeakString(sMessage));


et donc ta fonction principale deviendrait


Code PHP:

 (...) 
int Animation// a rajouter juste avant
if (GetGender (oPC) == GENDER_MALE
        { 
        
Animation ANIMATION_FIREFORGET_SALUTE;
        
Message "Salut truc, ça va ?"
        } 
        else 
        { 
        
Animation ANIMATION_FIREFORGET_BOW
        
Message "Salut ma poule, ça roule ?"
        } 
     
DelayCommand (2.0fDoSalute (OBJECT_SELFAnimationMessage)); 
(...) 


De plus on peut optimiser le script ici.. à chaque fois que ton PNJ va voir une créature, il va tester pour voir si c'est un joueur ET testé pour voir si la créature a une variable.

Code PHP:

 (...) 
if (
GetIsPC (oPC)
    {
    
int iVar GetLocalInt (oPC"dejavu"); 
 
    if (
iVar == FALSE)) 
     {
     
SetFacingPoint(GetPosition(oPC)); 
     if (
GetGender (oPC) == GENDER_MALE
     
(...) 
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Merci encore Monsieur

Je vais re bosser tout ça !

Pour les gens qui comme quoi rament comme des cochons palmés mais s'accrochent tels des morpions affamés, j'ai trouvé ce lien plutôt instructif : Pour se déniaiser un peu ! .
Je suis pas à même d'en évaluer la qualité très précisément mais vu que je comprends petit à petit ce que l'auteur (merci à lui @Acropole) écrit, j'en déduis...
Ahhh j'en ai une autre de question !
Mais je veux juste savoir si c'est faisable, pas comment, je chercherai si je sais que c'est possible

L'idée de mon PNJ c'est de donner une quête. Mais uniquement à des PJ ayant un niveau supérieur à XX.

Or, actuellement, les vérifications pour s'adresser aux PJ's portent sur des variables qui, je pense, ne sont valides que durant une session. Dans le cadre d'un module multijoueurs, à chaque déco/reco (ou reboot serveur) j'imagine que ce que l'on pose sur les PJ's pour les identifier comme déjà vus se perd.

Ma question est donc de savoir s'il est possible de récupérer un élément du journal de quête (la référence à la quête en question donc) plutôt que de poser une variable sur le PJ ? Et à partir de la lecture de cette élément (ou de son absence) de balancer la suite de l'opération...

Merci
en cas de deco reco, les variables posées sur un joueur sont sauvegardées.
C'est seulement quand le serveur reboot que les variables locales sont perdues



Pour ce qui est du journal de quête, je ne comprend pas trop la question, car je pense qu'une variable est posée sur le joueur... mais ne l'utilisant pas ce journal, si tu as la réponse, je veux bien la connaître
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Un exemple parce que c'est la fin de semaine :

Mon PNJ Robert est destiné à lancer une quête qui se nomme Quete_delamort et collecter les items/infos de ses différentes étapes. Mais seuls les PJ de niveau 15 et > peuvent la faire.

Gaston joue sur le serveur, il n'a pas connaissance de la quête mais il est niveau 18. Il passe dans le rayon de détection de Robert. Robert le détecte, voit qu'il est niveau 18. Il regarde alors si Gaston a déjà Quete_delamort dans son journal.

Si c'était le cas, Robert ignorerait Gaston et ne ferait rien à son attention. Mais ce n'est pas le cas, alors Robert lance un message à Gaston et lui dit : "Monsieur Gaston, venez me voir, j'ai une quête pour vous".

Et comme c'est sur le Journal de quête que Robert s'appuie, quand Gaston repassera, même après un reboot du serveur, près de Robert, ce dernier ne lui proposera pas de nouveau.

Suis-je plus clair ?

PS : tu n'utilises pas de journal de quête ? Comment fais-tu pour gérer la progression des quêtes alors ?
le journal de quête n'est pas sauvegardé après reboot du serveur.. Pour cela il existe deux solutions :
- faire un objet persistant (un objet obligatoire pour les joueurs. Ils doivent toujours le porter sur eux et sur ce dernier tu stockes des variables)
- faire une base de données sur laquelle tu stockes les variables
cf. SetCampaignInt, string, location, etc
C'est ce que j'utilise. pour le moment, je prends la base de données Bioware mais le système NWNX permet d'enregistrer tout ceci sur un base SQL, beaucoup plus facile d'accès

Code PHP:

object oRobert OBJECT_SELF;
//Robert aperçoit Gaston
objet oGaston GetLastPerceived();

// Robert réfléchis... a t il déjà vu gaston dans une vie (un reboot) antérieur ??
int iVariableQuete GetCampaignInt ("BaseQuetes"getname(oGaston)+"quêteGaston");
if (
iVariable == 0)
    {
    
// Robert a beau réflechir, Gaston ne lui dit rien du tout
    
ActionSpeakString ("Oh là gaston ! Vienzy voir le gros robert qu'il t'donne une quête dans les dents !");
    
// Robert décide de confier sa mission hautement importante à Gaston
    
SetCampaignint ("BaseQuetes"GetName(oGaston)+"quêteGaston"1); 
// [j'utilise Getame dans les variables persistantes pour différencier les joueurs entre eux.. 
//dans ce cas, il faut faire attentio que 2 joueurs n'ait pas le même nom]
    
return;
    }
else if (
Ivariable == 1)
    {
    
// Robert se souvient de Gaston... Il lui a demandé avant avant hier 
    // d'aller chercher un bâton magique dans les contrées hostile 
    // de la liche royale de Lor'Hein
    
ActionSpeakString ("crévindiou gaston ! Qu'est ce tu fiches ! tu d'vrais être en train d'chercher l'bâton magique !");
    
object oBatonLicheRoyale GetItemPossessedBy (oGaston"Tag_Du_Baton_De_La_Liche_Royale");
    if (
oBatonLicheRoyale != OBJECT_INVALID)
       {
        
// Robert voit un gros sac attaché à la ceinture du PJ
        
DelayCommand(2.0ActionSpeakString ("Sapristi ! Ca s'rait pô l'bâton que j'vois t'y là ??");
        }
    }
else if (
Ivariable == 2)
    {
    
// Robert se souvient de Gaston.. Ce crétin ne lui a pas rapporté le bâton de
    // la liche royale de Lor'Hein mais la quiche lorraine du maton royal... Et bien
    // oui, Gaston n'est pas des plus intelligents
    
ActionSpeakString ("Bon sang de bois ! Va t'en d'là, S'pèce d'animal poilu ! Que j'te r'vois pô dans l'coin, sinon ça va barder des étincelles"); 
PS : j'utilise des variables pour faire les quêtes, je trouve qu'un demi orc avec 6 en intelligence n'a pas la capacité de noter ses quêtes sur un journal, et qu'un personnage joueur, aussi intelligent soit-il, ne peut rien écrire s'il n'a pas de journal et de plume avec un encrier sur lui
Ensuite, mes quêtes peuvent être refaites à chaque reboot, sauf rares exceptions. pour ce qui est des quêtes un peu longue, je donne des objets entre afin que les joueurs puissent faire la 2eme quêtes s'ils ont l'objet de la 1ere

voili voilou
__________________
http://img91.imageshack.us/img91/9666/yingyangwm8jt3.gif
http://simaon.free.fr/
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés