[Débutant] Verifier un level et Script pour une quête dans un dialogue.

Répondre
Partager Rechercher
Vu que la fonction de recherche est hors service je post.

Durant un dialogue j'aimerai que le script vérifie le level du PC et en conséquence, lui donne X xp.

Je vous montre ce que j'ai fais :

Code PHP:

void main()
{
ActionWait (1.5);
effect eHarm EffectVisualEffect(VFX_FNF_MASS_HEAL);
object oPC GetPCSpeaker ();
object oWP GetWaypointByTag ("arrivee");
location lWP GetLocation (oWP);
location lPC GetLocation (oPC);
AssignCommand (oPCActionJumpToLocation (lWP));
ApplyEffectAtLocation 10 eHarm lPC);
int nXP Random (10);
if (
GetLevelByClass (AnyoPC) == 1);
          
GiveXPToCreature (oPC500*nXP);

Mais ca ne compile pas :s et en fouillant dans les differentes commandes possible je ne trouve pas d'alternative. ET de plus, le ActionWait ne fonctionne pas, car en fait j'aimerai que le joueur ai le temps de lire la phrase du NPC (peut être que la commande est positionné au mauvais endroit...)
Eclairez moi, j'vous en prie

Merci pour vos réponses.

Mimi
Oui en effet dans la fonction "GetLevelByClass(...)" tu passe comme premier paramètre "Any", correspond t'il à une variable int déclarée dans ton code.
La fonction "GetLevelByClass(...)" retourne le niveau du personnage pour une classe donnée, tu doit donc préciser sa classe. Autrement utilise la fonction "GetXP(object oCreature)" qui te donnera le nombre d'xp qu'a le personnage et tu pourra en déduire son niveau.
Code PHP:

if (GetLevelByClass (AnyoPC) == 1); <-----// aprés la condition d'if 
//jamais de point virgule.. 
le Any ne passera pas non plus comme dit nuanda..

enfin j'ais trop chercher mais j'ai pas trouvé de fonction prenant le level genérale du PJ
en tout cas elle n'existe pas hors #include.

mais elle reste simple a faire avec GetLevelByPosition et une petite boucle..
Citation :
En plus, ActionWait() utilisé comme ça ne donnera pas grand chose. Plus généralement, tous les ActionXXX s'appliquent à un objet. Si tu ne spécifies pas lequel, ça ira s'empiler n'importe où et au mieux, ça ne fera rien, au pire, ça mettra le souk dans ton module.
C'est pas loin, juste en dessous
Ce qu'il y a de bien avec toi, c'est que tu lis clairement ce qu'on te conseille. Ne t'étonnes donc pas si je/d'autres renonce(nt) devant l'inutilité de ce qui est conseillé.

Et puis, "ça ne compile pas", c'est joli, mais ça ne sert à rien. Il y a deux mille trois cent cinquante quatre raisons (image) possibles pour qu'un script ne compile pas. La moindre des choses serait de donner les messages du compilateur, ça permettrait au lecteur d'avoir une piste au lieu de deviner.
Bref, je renonce pour ma part.
Angry
Et bin désolé de rien savoir Azmathiel mais selon un modérateur c'est un forum d'entraide, donc pour apprendre à ceux qui ne connaissent rien ou pas grand chose... Enfin si j'ai bien compris le but du forum, sinon j'ai rien à faire ici.
Et puis ton message à propos de l'ActionWait je ne l'ai pas oublié, mais malgrés tout ça et bien j'ai tenté d'écrire dans tout les sens ce script sans succés, donc que je ne comprenne pas beaucoup est un peu normal, enfin je pense car on ne peut pas tout comprendre d'un coup.
Pour info le script
Code PHP:

void main()
{

effect eHarm EffectVisualEffect(VFX_FNF_MASS_HEAL);
object oPC GetPCSpeaker ();
object oWP GetWaypointByTag ("arrivee");
location lWP GetLocation (oWP);
location lPC GetLocation (oPC);
ApplyEffectAtLocation 10 eHarm lPC);
ActionWait (1.0);
AssignCommand (oPCActionJumpToLocation (lWP));

if (
GetLevelByClass (AnyoPC) == 1)
int nXP Random (5000);

GiveXPToCreature (oPCnXP);


Ne compile pas car il me donne cette erreur ci :
Citation :
dial_gardien2.nss(14): ERREUR : VARIABLE DEFINED WITHOUT TYPE
Si , malgrés ce que vous pouvez penser d'un nouveau sur le forum (genre : "Il croit qu'on va lui faire son script" ) et bien c'est faux , personellement je suis plutôt la pour apprendre car j'aimais ça, j'aime ça et je me suis pris un peu de temps pour m'y remettre.

Aprés, comme on dit chez nous, t'fé com t'veu.

Mais sachez que votre aide m'est trés précieuse car sans vous je ne serez pas allé bien loin dans mon module (bien que je ne sois toujours pas bien loin).
Donc je remercie beaucoup tout les gens qui m'aident et aussi ceux qui m'aident pas car ils m'aident quand même, indirectement.

Mimi
Citation :
dial_gardien2.nss(14): ERREUR : VARIABLE DEFINED WITHOUT TYPE
c'est ton Any de ta ligne :
Code PHP:

if (GetLevelByClass (AnyoPC) == 1
qui n'est pas déclaré. l'erreur est la suivant voici la définition de la fonction
Citation :
Publié par GetLevelByClass
// Determine the levels that oCreature holds in nClassType.
// - nClassType: CLASS_TYPE_*
// - oCreature
int GetLevelByClass(int nClassType, object oCreature=OBJECT_SELF)
donc le premier argument de la fonction prend en parametre une constante de type de classe CLASS_TYPE_ que tu peut trouver a droite de l'éditeur de script dans la partie constante

mais revenons a nos montons si j'ai bien compris tu veut que si le joueur est au level 1 (quelques soit ca classe) tu lui donne aléatoirement des xp de 0 a 5000 !

pour ca suffit comme la posté Deyonara de se servir de la fonction GetHitDice(object oCreature) qui renvois le nombre de Dé de vie d'une créature et ho miracle vu que toute les classe on 1 seul Dé de vie par niveau, le nombre de Dé de vie du personnage correspondra donc a son level !
si c'est bien ca que tu faire, remplace ton if par
Code PHP:

if (GetHitDice(oPC) == 1
et le tour est jouer !
Si un if ... n'est pas entoure d'accolades alors seule la première instruction derrière le if s'executera si la condition est vraie. Ici dans ton script seule la déclaration de la variable nXP est incluse dans ton if si le joueur est au level 1. Si tu veux qu'un bloc d'instructions s'applique au if, il faut l'entourer d'accolades.

Par ailleurs si une variable est définie dans un bloc d'instruction, elle n'est connue que de ce bloc. Dans ton cas, le nXP n'est pas "connu" lorsque tu fais GiveXPToCreature (oPC, nXP);

Afin que cette variable soit connue (nXP) il faudrait que tu écrives ceci :

Code PHP:

if (GetLevelByClass (AnyoPC) == 1) { 
   
int nXP Random (5000);
   
GiveXPToCreature (oPCnXP);

Ou :

Code PHP:

if (GetLevelByClass (AnyoPC) == 1
   
GiveXPToCreature (oPCRandom(5000)); 
Par ailleurs comme le signale tout le monde (Jorimad et Nuanda ), la variable Any n'existe pas pour GetLevelByClass.

Je réécrirais donc cette partie de code ainsi :

Code PHP:

if (GetHitDice(oPC) == 1
   
GiveXPToCreature (oPCRandom(5000)); 
En espérant que cela résolve tes problèmes.
Ok je vous remercie beaucoup . En fait j'avoue que je n'avais pas bien compris la fonction GetHitDice, mais maintenant c'est bon.

Merci beaucoup encore à Deyonara, Nuanda, Jorimad , Biboule et Azmathiel.


Sinon, je me permet de posé une question à part du sujet, c'est à propos, encore une fois d'une condition pour executer un script.
En fait dans un dialogue, un PNJ donne une quête, lorsqu'il la donne il place aussi une valeur sur le PC avec la fonction :
Code PHP:

object oPC GetPCSpeaker ();
SetLocalInt (oPC"RATS"1); 
Jusque la ca marche mais ce que j'aimerai c'est un script pour qu'il ne donne la quête qu'une fois, donc sur une phrase avant celle ou le PNJ donne la quête j'ai mis ceci:

Code PHP:

int StartingConditional()
{

int nDone GetLocalInt(GetPCSpeaker(), "RATS") >= 1;


Mais je ne sais pas quoi mettre pour que si c'est supérieur ou égal à 1 et bien il ne continue pas le dialogue.
Donc j'ai mis ce script sur une phrase du dialogue, mais lorsque je test dans le jeu, le PNJ stoppe la conversation.
Je sais qu'il me manque quelque chose mais je ne sais pas comment le faire. Car c'est logique que si on pose la variable aprés, on ne peut pas l'avoir avant.

J'ai trifouillé dans les scripts mais je ne trouve qui pourrait faire en sorte de voir si il y a eu la variable définie sur le PC, car si elle n'y est pas c'est que le PC n'a pas encore la quête, donc le dialogue continue.

Merci pour votre aide.
Mimi
je veut pas dire de connerie comme je n'ais pas l'éditeur sous les yeux mais le principe est simple...

quand le PJ donne la quete tu fait ce qu'il faut, dans les Action conséquente de la phrase tu met une varaible à 1.

il suffit ensuite carément a la premier branche [propriétaire] du dialogue qui donne la quete de mettre dans les Condition d'excution cette fois (si la phrase sera dite ou pas).

si ma variable est inferieur de 1
je renvoie VRAI
sinon je renvoi FAUX

il y a plusieur syntax possible pour faire cela..
Code PHP:

int StartingConditional() 
{
object oPC=GetPCSpeaker();
 if (
GetLocalInt (oPC"RATS")<1// SI le pc n'a pas enclenché la quete logiquement 
//la premiere fois il n'aura meme pas la varaible comme tu le remarque mais c'est pas
// grave une varibble inexistante renvera toujours 0 qui est égale à = FAUX / FALSE
    
{
     return 
TRUE// fait aparaitre la phrase
    
}
else 
//SINON
   
{
    return 
FALSE// ne fait pas aparaitre la phrase 
   
}

(je met bien les accolade meme si théoriquement il n'y en pas besoin aprés mon if et mon else vu qu'il n'y a qu'une instruction a réalisé mais c'est plus propre)
j'utilise inférieur a 1 en passant qu'il peut y avoir plusieur étape a la quete : 1,2,3,4 etc..

tu peut remarque que tout les script des condition d'excution ne sont pas entre balise void main() void ne représentant rien pas besoin de renvoyer de valeur.

int StartingConditional() demande a ce qu'on revois une valeur meme des valeur sois FRAI soi FAUX...
quand le dialogue s'ouvre il regarde les branche du dialogue une par une en partant de haut en bas dans l'éditeur de dialogue.
si ta premier branche renvoi VRAI sur sa condition d'excution il l'affichera..
si elle renvoi FAUX il passe a la deuxieme et regarde encore ce que renvoie les condition d'excution de cette nouvelle branche..
meme principe branche par branche par branche..(de haut en bas puis de gauche a droite)
Je ne te reproche pas de ne rien savoir (ce qui n'est pas le cas) mais de ne pas tenir compte de ce qu'on t'a déjà dit. Mettons ça sur le compte de l'ignorance... Soit.

Je vais revenir sur deux choses:

1) Les messages d'erreur de l'éditeur de scripts:
Ils sont en anglais, c'est sûr, mais si on prend la peine de les lire, ils sont dans 99% des cas clairs sur l'erreur commise.
Dans le cas ci-dessus, le message te dit que tu as commis une erreur dans une déclaration de variable. Comme tu le dis toi-même, on ne peut pas utiliser quelque chose qui n'existe pas (qui n'est pas déclaré).
Le conseil que je peux donner ici c'est de lire et d'essayer de comprendre les messages d'erreur donnés. A force d'habitude, tu verras rapidement ce que tu as laissé passer.
Il y a eu un fil sur les différents messages d'erreur de l'éditeur, mais malgré avoir fait une recherche, je n'arrive pas à remettre la main dessus.


2) Les empilements d'actions:
Vu que ça te pose un réel problème, je vais tenter d'expliquer comment ça fonctionne.

(EDIT)
Imaginons un graveur de CD à chargeur. Tu empiles dedans des CD pour faire des images de ta compilation. Le premier CD empilé sera le premier gravé. Et tant qu'il y aura des CD dans la pile, la machine gravera. L'empilement d'actions fonctionne sur le même principe. D'abord on empile des actions (Toutes les fonctions commençant par "Action" sont des fonctions s'empilant), puis on attend qu'elles sortent de la pile pour s'exécuter dans l'ordre où on les y a mises.

Je prends un exemple:

Je veux qu'un personnage fasse 3 actions consécutives et rythmées.
1) il se baisse et se relève après 3 secondes
2) il attend 3 secondes
3) il se dirige vers une barrique placée à côté de lui (sur la même zone)

D'abord, pour être sûr qu'il va faire les choses dans l'ordre, je vide complètement sa pile avec ClearAllActions() puis je peux empiler les actions à faire sans me soucier du déroulement, puisque ce sera chronométré avec mes instructions.

En voici le script:
Code PHP:

         void main()
         {
             
object oNPC GetNearestObjectByTag("TAG_PNJ");
             
object oBarrique GetNearestObjectByTag("barrique_pnj");
             
// Cela peut s'appliquer à n'importe quel PNJ qu'on trouve par son TAG
             
AssignCommand(oPNJClearAllActions());
             
// Je vide sa pile d'actions
             // Attention, ces scripts peuvent être perturbés par les OHB par défaut des créatures
             // Une solution consiste à supprimer le script OHB de ce PNJ
             // Une autre est de le remplacer par un script personnel adapté
         
             
AssignCommand(oPNJActionPlayAnimation(ANIMATION_LOOPING_GET_LOW1.03.0));
             
// Je fais se baisser mon PNJ pendant 3 secondes
             
AssignCommand (oPNJActionWait(3.0));
             
// Je fais attendre mon PNJ pendant 3 secondes pendant lesquelles il ne fera rien
             // si son OHB ne vient pas le perturber
             
AssignCommand(oPNJActionForceMoveToObjectoBarriqueTRUE1.015.0));
             
// Pour finir, il doit se déplacer vers la barrique en courant jusqu'à s'approcher de 1m
             // Il a 15 secondes pour le faire après quoi il abandonnera.
         


Pour montrer l'utilisation possible et l'application de ce genre de fonctions, voici un lien qui est, je le pense, instructif sur la question:
lexicon qui se fait certes un peu vieux, mais toujours aussi pratique quand on cherche quelque chose de précis.


Pour arriver à faire ce que tu veux avec ActionWait() tel que tu l'utilises, à savoir mettre en pause un script, il faut procéder différemment.
Il faut écrire la partie à différer comme une fonction et l'appeler avec un DelayCommand().
Comme par exemple dans:
Code PHP:

        // Applique 99999 pts de degat magiques a oPNJ
        
void TuerMonPNJ(object oPNJ);
        
        
        
        
void main()
        {
            
object oMob GetLastUsedBy();
            
// On appliquera 99999 points de degat magique au dernier ayant ouvert
            // le placable avec ce script sur son OnUsed 45 secondes apres qu'il l'ait utilise
            
DelayCommand(45.0TuerMonPNJ(oMob));
        }
        
        
        
void TuerMonPNJ(object oPNJ)
        {
            
effect eTuer EffectDamage(99999DAMAGE_TYPE_MAGICALDAMAGE_POWER_PLUS_TWENTY);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeTueroPNJ0.0);
        } 
Bonne lecture et bon apprentissage

EDIt: j'ai dit une connerie avec mes assiettes... Je vais prendre un autre exemple que j'espère plus clair...
Non non ne croyez pas ça.
Vous êtes comme mes profs au lycée, dés qu'on assimile pas quelque chose tout de suite, c'est pas bon... Mais comme j'ai déjà dis, c'est pas si facile pour quelqu'un qui débute.
Répondre

Connectés sur ce fil

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